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