Home | History | Annotate | Download | only in common
      1 /*-------------------------------------------------------------------------
      2  * OpenGL Conformance Test Suite
      3  * -----------------------------
      4  *
      5  * Copyright (c) 2016 Google Inc.
      6  * Copyright (c) 2016 The Khronos Group Inc.
      7  *
      8  * Licensed under the Apache License, Version 2.0 (the "License");
      9  * you may not use this file except in compliance with the License.
     10  * You may obtain a copy of the License at
     11  *
     12  *      http://www.apache.org/licenses/LICENSE-2.0
     13  *
     14  * Unless required by applicable law or agreed to in writing, software
     15  * distributed under the License is distributed on an "AS IS" BASIS,
     16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     17  * See the License for the specific language governing permissions and
     18  * limitations under the License.
     19  *
     20  */ /*!
     21  * \file
     22  * \brief CTS rendering configuration list utility.
     23  */ /*-------------------------------------------------------------------*/
     24 
     25 #include "glcConfigListEGL.hpp"
     26 
     27 #include "deUniquePtr.hpp"
     28 #include "glcConfigList.hpp"
     29 
     30 #include <typeinfo>
     31 
     32 #include "deUniquePtr.hpp"
     33 #include "egluNativeDisplay.hpp"
     34 #include "egluPlatform.hpp"
     35 #include "egluUtil.hpp"
     36 #include "eglwDefs.hpp"
     37 #include "eglwEnums.hpp"
     38 #include "tcuPlatform.hpp"
     39 
     40 #if !defined(EGL_OPENGL_ES3_BIT_KHR)
     41 #define EGL_OPENGL_ES3_BIT_KHR 0x0040
     42 #endif
     43 
     44 #if !defined(EGL_COLOR_COMPONENT_TYPE_EXT)
     45 #define EGL_COLOR_COMPONENT_TYPE_EXT 0x3339
     46 #endif
     47 
     48 #if !defined(EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT)
     49 #define EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT 0x333B
     50 #endif
     51 
     52 #if !defined(EGL_YUV_BUFFER_EXT)
     53 #define EGL_YUV_BUFFER_EXT 0x3300
     54 #endif
     55 
     56 namespace glcts
     57 {
     58 
     59 static void getDefaultEglConfigList(tcu::Platform& eglPlatform, glu::ApiType type, ConfigList& configList)
     60 {
     61 	deUint32 renderableMask = 0;
     62 	deUint32 conformantMask = 0;
     63 
     64 	if (type == glu::ApiType::es(2, 0))
     65 	{
     66 		renderableMask = EGL_OPENGL_ES2_BIT;
     67 		conformantMask = EGL_OPENGL_ES2_BIT;
     68 	}
     69 	else if (type == glu::ApiType::es(3, 0))
     70 	{
     71 		renderableMask = EGL_OPENGL_ES3_BIT_KHR;
     72 		conformantMask = EGL_OPENGL_ES3_BIT_KHR;
     73 	}
     74 	else if (type == glu::ApiType::es(3, 1))
     75 	{
     76 		renderableMask = EGL_OPENGL_ES3_BIT_KHR;
     77 		conformantMask = EGL_OPENGL_ES3_BIT_KHR;
     78 	}
     79 	else if (type == glu::ApiType::es(3, 2))
     80 	{
     81 		renderableMask = EGL_OPENGL_ES3_BIT_KHR;
     82 		conformantMask = EGL_OPENGL_ES3_BIT_KHR;
     83 	}
     84 	else if (type.getProfile() == glu::PROFILE_CORE)
     85 	{
     86 		renderableMask = EGL_OPENGL_BIT;
     87 		conformantMask = EGL_OPENGL_BIT;
     88 	}
     89 	else
     90 	{
     91 		throw tcu::Exception("Unsupported context type");
     92 	}
     93 
     94 	de::UniquePtr<eglu::NativeDisplay> nativeDisplay(
     95 		eglPlatform.getEGLPlatform().getNativeDisplayFactoryRegistry().getDefaultFactory()->createDisplay());
     96 	const eglw::Library&		 library = nativeDisplay->getLibrary();
     97 	eglw::EGLDisplay			 display = eglu::getAndInitDisplay(*nativeDisplay);
     98 	std::vector<eglw::EGLConfig> configs = eglu::getConfigs(library, display);
     99 	bool supportFloatConfigs			 = eglu::hasExtension(library, display, "EGL_EXT_pixel_format_float");
    100 	bool supportYUVConfigs				 = eglu::hasExtension(library, display, "EGL_EXT_yuv_surface");
    101 
    102 	for (std::vector<eglw::EGLConfig>::iterator cfgIter = configs.begin(); cfgIter != configs.end(); cfgIter++)
    103 	{
    104 		int		 id				= eglu::getConfigAttribInt(library, display, *cfgIter, EGL_CONFIG_ID);
    105 		deUint32 renderableBits = eglu::getConfigAttribInt(library, display, *cfgIter, EGL_RENDERABLE_TYPE);
    106 		deUint32 conformantBits = eglu::getConfigAttribInt(library, display, *cfgIter, EGL_CONFORMANT);
    107 		deInt32  redSize		= eglu::getConfigAttribInt(library, display, *cfgIter, EGL_RED_SIZE);
    108 		deInt32  greenSize		= eglu::getConfigAttribInt(library, display, *cfgIter, EGL_GREEN_SIZE);
    109 		deInt32  blueSize		= eglu::getConfigAttribInt(library, display, *cfgIter, EGL_BLUE_SIZE);
    110 		deInt32  alphaSize		= eglu::getConfigAttribInt(library, display, *cfgIter, EGL_ALPHA_SIZE);
    111 		deInt32  depthSize		= eglu::getConfigAttribInt(library, display, *cfgIter, EGL_DEPTH_SIZE);
    112 		deInt32  stencilSize	= eglu::getConfigAttribInt(library, display, *cfgIter, EGL_STENCIL_SIZE);
    113 		deInt32  numSamples		= eglu::getConfigAttribInt(library, display, *cfgIter, EGL_SAMPLES);
    114 
    115 		bool isRenderable = (renderableBits & renderableMask) == renderableMask;
    116 		bool isConformant = (conformantBits & conformantMask) == conformantMask;
    117 		bool isAOSPOk	 = isRenderable && isConformant;
    118 		bool isFloatType  = supportFloatConfigs ?
    119 							   (eglu::getConfigAttribInt(library, display, *cfgIter, EGL_COLOR_COMPONENT_TYPE_EXT) ==
    120 								EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT) :
    121 							   false;
    122 		bool isYUV =
    123 			supportYUVConfigs ?
    124 				(eglu::getConfigAttribInt(library, display, *cfgIter, EGL_COLOR_BUFFER_TYPE) == EGL_YUV_BUFFER_EXT) :
    125 				false;
    126 		bool isOk = isRenderable && isConformant && (numSamples == 0) && !isFloatType && !isYUV;
    127 
    128 		deUint32 surfaceBits  = eglu::getConfigAttribInt(library, display, *cfgIter, EGL_SURFACE_TYPE);
    129 		deUint32 surfaceTypes = ((surfaceBits & EGL_WINDOW_BIT) ? SURFACETYPE_WINDOW : 0) |
    130 								((surfaceBits & EGL_PIXMAP_BIT) ? SURFACETYPE_PIXMAP : 0) |
    131 								((surfaceBits & EGL_PBUFFER_BIT) ? SURFACETYPE_PBUFFER : 0);
    132 
    133 		if (isAOSPOk)
    134 		{
    135 			configList.aospConfigs.push_back(AOSPConfig(CONFIGTYPE_EGL, id, surfaceTypes, redSize, greenSize, blueSize,
    136 														alphaSize, depthSize, stencilSize, numSamples));
    137 		}
    138 
    139 		if (isOk)
    140 		{
    141 			configList.configs.push_back(Config(CONFIGTYPE_EGL, id, surfaceTypes));
    142 		}
    143 		else
    144 		{
    145 			DE_ASSERT(!isRenderable || !isConformant || (numSamples != 0) || isFloatType || isYUV);
    146 			configList.excludedConfigs.push_back(
    147 				ExcludedConfig(CONFIGTYPE_EGL, id,
    148 							   !isRenderable ? EXCLUDEREASON_NOT_COMPATIBLE :
    149 											   !isConformant ? EXCLUDEREASON_NOT_CONFORMANT :
    150 															   (numSamples != 0) ?
    151 															   EXCLUDEREASON_MSAA :
    152 															   isFloatType ? EXCLUDEREASON_FLOAT : EXCLUDEREASON_YUV));
    153 		}
    154 	}
    155 }
    156 
    157 void getConfigListEGL(tcu::Platform& platform, glu::ApiType type, ConfigList& configList)
    158 {
    159 	try
    160 	{
    161 		getDefaultEglConfigList(platform, type, configList);
    162 	}
    163 	catch (const std::bad_cast&)
    164 	{
    165 		throw tcu::Exception("Platform is not tcu::EglPlatform");
    166 	}
    167 }
    168 
    169 } // glcts
    170