148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/*------------------------------------------------------------------------- 248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * OpenGL Conformance Test Suite 348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * ----------------------------- 448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Copyright (c) 2016 Google Inc. 648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Copyright (c) 2016 The Khronos Group Inc. 748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License"); 948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * you may not use this file except in compliance with the License. 1048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * You may obtain a copy of the License at 1148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 1248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * http://www.apache.org/licenses/LICENSE-2.0 1348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 1448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Unless required by applicable law or agreed to in writing, software 1548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS, 1648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * See the License for the specific language governing permissions and 1848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * limitations under the License. 1948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 2084322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin */ /*! 2148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * \file 2248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * \brief CTS rendering configuration list utility. 2384322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin */ /*-------------------------------------------------------------------*/ 2448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 2584322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin#include "glcConfigListEGL.hpp" 2648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 2748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "deUniquePtr.hpp" 2848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "glcConfigList.hpp" 2948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 3048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include <typeinfo> 3148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 3248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "deUniquePtr.hpp" 3348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "egluNativeDisplay.hpp" 3448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "egluPlatform.hpp" 3548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "egluUtil.hpp" 3648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "eglwDefs.hpp" 3748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "eglwEnums.hpp" 3848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "tcuPlatform.hpp" 3948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 4048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#if !defined(EGL_OPENGL_ES3_BIT_KHR) 4148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#define EGL_OPENGL_ES3_BIT_KHR 0x0040 4248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#endif 4348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 444777cb3a175dc29f1302ec3b98710d423abfcc0eWeiwan Liu#if !defined(EGL_COLOR_COMPONENT_TYPE_EXT) 454777cb3a175dc29f1302ec3b98710d423abfcc0eWeiwan Liu#define EGL_COLOR_COMPONENT_TYPE_EXT 0x3339 464777cb3a175dc29f1302ec3b98710d423abfcc0eWeiwan Liu#endif 474777cb3a175dc29f1302ec3b98710d423abfcc0eWeiwan Liu 484777cb3a175dc29f1302ec3b98710d423abfcc0eWeiwan Liu#if !defined(EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT) 494777cb3a175dc29f1302ec3b98710d423abfcc0eWeiwan Liu#define EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT 0x333B 504777cb3a175dc29f1302ec3b98710d423abfcc0eWeiwan Liu#endif 514777cb3a175dc29f1302ec3b98710d423abfcc0eWeiwan Liu 52c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville#if !defined(EGL_YUV_BUFFER_EXT) 53c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville#define EGL_YUV_BUFFER_EXT 0x3300 54c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville#endif 55c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville 5648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosnamespace glcts 5748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 5848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 5948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstatic void getDefaultEglConfigList(tcu::Platform& eglPlatform, glu::ApiType type, ConfigList& configList) 6048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 6148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos deUint32 renderableMask = 0; 6248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos deUint32 conformantMask = 0; 6348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 6448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (type == glu::ApiType::es(2, 0)) 6548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 6648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos renderableMask = EGL_OPENGL_ES2_BIT; 6748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos conformantMask = EGL_OPENGL_ES2_BIT; 6848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 6948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else if (type == glu::ApiType::es(3, 0)) 7048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 7148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos renderableMask = EGL_OPENGL_ES3_BIT_KHR; 7248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos conformantMask = EGL_OPENGL_ES3_BIT_KHR; 7348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 7448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else if (type == glu::ApiType::es(3, 1)) 7548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 7648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos renderableMask = EGL_OPENGL_ES3_BIT_KHR; 7748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos conformantMask = EGL_OPENGL_ES3_BIT_KHR; 7848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 7948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else if (type == glu::ApiType::es(3, 2)) 8048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 8148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos renderableMask = EGL_OPENGL_ES3_BIT_KHR; 8248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos conformantMask = EGL_OPENGL_ES3_BIT_KHR; 8348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 8448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else if (type.getProfile() == glu::PROFILE_CORE) 8548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 8648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos renderableMask = EGL_OPENGL_BIT; 8748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos conformantMask = EGL_OPENGL_BIT; 8848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 8948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 9048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 9148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos throw tcu::Exception("Unsupported context type"); 9248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 9348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 9448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos de::UniquePtr<eglu::NativeDisplay> nativeDisplay( 9548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos eglPlatform.getEGLPlatform().getNativeDisplayFactoryRegistry().getDefaultFactory()->createDisplay()); 9648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const eglw::Library& library = nativeDisplay->getLibrary(); 9748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos eglw::EGLDisplay display = eglu::getAndInitDisplay(*nativeDisplay); 9848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos std::vector<eglw::EGLConfig> configs = eglu::getConfigs(library, display); 994777cb3a175dc29f1302ec3b98710d423abfcc0eWeiwan Liu bool supportFloatConfigs = eglu::hasExtension(library, display, "EGL_EXT_pixel_format_float"); 100c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville bool supportYUVConfigs = eglu::hasExtension(library, display, "EGL_EXT_yuv_surface"); 10148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 10248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (std::vector<eglw::EGLConfig>::iterator cfgIter = configs.begin(); cfgIter != configs.end(); cfgIter++) 10348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 10448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos int id = eglu::getConfigAttribInt(library, display, *cfgIter, EGL_CONFIG_ID); 10548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos deUint32 renderableBits = eglu::getConfigAttribInt(library, display, *cfgIter, EGL_RENDERABLE_TYPE); 10648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos deUint32 conformantBits = eglu::getConfigAttribInt(library, display, *cfgIter, EGL_CONFORMANT); 10748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos deInt32 redSize = eglu::getConfigAttribInt(library, display, *cfgIter, EGL_RED_SIZE); 10848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos deInt32 greenSize = eglu::getConfigAttribInt(library, display, *cfgIter, EGL_GREEN_SIZE); 10948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos deInt32 blueSize = eglu::getConfigAttribInt(library, display, *cfgIter, EGL_BLUE_SIZE); 11048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos deInt32 alphaSize = eglu::getConfigAttribInt(library, display, *cfgIter, EGL_ALPHA_SIZE); 11148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos deInt32 depthSize = eglu::getConfigAttribInt(library, display, *cfgIter, EGL_DEPTH_SIZE); 11248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos deInt32 stencilSize = eglu::getConfigAttribInt(library, display, *cfgIter, EGL_STENCIL_SIZE); 11348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos deInt32 numSamples = eglu::getConfigAttribInt(library, display, *cfgIter, EGL_SAMPLES); 11448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 11548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool isRenderable = (renderableBits & renderableMask) == renderableMask; 11648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool isConformant = (conformantBits & conformantMask) == conformantMask; 11748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool isAOSPOk = isRenderable && isConformant; 1184777cb3a175dc29f1302ec3b98710d423abfcc0eWeiwan Liu bool isFloatType = supportFloatConfigs ? 1194777cb3a175dc29f1302ec3b98710d423abfcc0eWeiwan Liu (eglu::getConfigAttribInt(library, display, *cfgIter, EGL_COLOR_COMPONENT_TYPE_EXT) == 1204777cb3a175dc29f1302ec3b98710d423abfcc0eWeiwan Liu EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT) : 1214777cb3a175dc29f1302ec3b98710d423abfcc0eWeiwan Liu false; 122c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville bool isYUV = 123c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville supportYUVConfigs ? 124c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville (eglu::getConfigAttribInt(library, display, *cfgIter, EGL_COLOR_BUFFER_TYPE) == EGL_YUV_BUFFER_EXT) : 125c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville false; 126c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville bool isOk = isRenderable && isConformant && (numSamples == 0) && !isFloatType && !isYUV; 12748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 12848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos deUint32 surfaceBits = eglu::getConfigAttribInt(library, display, *cfgIter, EGL_SURFACE_TYPE); 12948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos deUint32 surfaceTypes = ((surfaceBits & EGL_WINDOW_BIT) ? SURFACETYPE_WINDOW : 0) | 13048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos ((surfaceBits & EGL_PIXMAP_BIT) ? SURFACETYPE_PIXMAP : 0) | 13148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos ((surfaceBits & EGL_PBUFFER_BIT) ? SURFACETYPE_PBUFFER : 0); 13248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 13348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (isAOSPOk) 13448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 13548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos configList.aospConfigs.push_back(AOSPConfig(CONFIGTYPE_EGL, id, surfaceTypes, redSize, greenSize, blueSize, 13648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos alphaSize, depthSize, stencilSize, numSamples)); 13748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 13848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 13948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (isOk) 14048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 14148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos configList.configs.push_back(Config(CONFIGTYPE_EGL, id, surfaceTypes)); 14248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 14348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 14448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 145c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville DE_ASSERT(!isRenderable || !isConformant || (numSamples != 0) || isFloatType || isYUV); 146c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville configList.excludedConfigs.push_back( 147c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville ExcludedConfig(CONFIGTYPE_EGL, id, 148c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville !isRenderable ? EXCLUDEREASON_NOT_COMPATIBLE : 149c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville !isConformant ? EXCLUDEREASON_NOT_CONFORMANT : 150c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville (numSamples != 0) ? 151c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville EXCLUDEREASON_MSAA : 152c9f5bf7c2a7a31811c9718e207abb5c878577fcejames.glanville isFloatType ? EXCLUDEREASON_FLOAT : EXCLUDEREASON_YUV)); 15348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 15448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 15548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 15648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 15748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid getConfigListEGL(tcu::Platform& platform, glu::ApiType type, ConfigList& configList) 15848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 15948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos try 16048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 16148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos getDefaultEglConfigList(platform, type, configList); 16248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 16348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos catch (const std::bad_cast&) 16448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 16548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos throw tcu::Exception("Platform is not tcu::EglPlatform"); 16648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 16748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 16848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 16948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} // glcts 170