xref: /aosp_15_r20/external/deqp/external/openglcts/modules/common/glcConfigListEGL.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
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 
getDefaultEglConfigList(tcu::Platform & eglPlatform,glu::ApiType type,ConfigList & configList)59 static void getDefaultEglConfigList(tcu::Platform &eglPlatform, glu::ApiType type, ConfigList &configList)
60 {
61     uint32_t renderableMask = 0;
62     uint32_t 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         uint32_t renderableBits = eglu::getConfigAttribInt(library, display, *cfgIter, EGL_RENDERABLE_TYPE);
106         uint32_t conformantBits = eglu::getConfigAttribInt(library, display, *cfgIter, EGL_CONFORMANT);
107         int32_t redSize         = eglu::getConfigAttribInt(library, display, *cfgIter, EGL_RED_SIZE);
108         int32_t greenSize       = eglu::getConfigAttribInt(library, display, *cfgIter, EGL_GREEN_SIZE);
109         int32_t blueSize        = eglu::getConfigAttribInt(library, display, *cfgIter, EGL_BLUE_SIZE);
110         int32_t alphaSize       = eglu::getConfigAttribInt(library, display, *cfgIter, EGL_ALPHA_SIZE);
111         int32_t depthSize       = eglu::getConfigAttribInt(library, display, *cfgIter, EGL_DEPTH_SIZE);
112         int32_t stencilSize     = eglu::getConfigAttribInt(library, display, *cfgIter, EGL_STENCIL_SIZE);
113         int32_t 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         uint32_t surfaceBits  = eglu::getConfigAttribInt(library, display, *cfgIter, EGL_SURFACE_TYPE);
129         uint32_t 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(ExcludedConfig(CONFIGTYPE_EGL, id,
147                                                                 !isRenderable     ? EXCLUDEREASON_NOT_COMPATIBLE :
148                                                                 !isConformant     ? EXCLUDEREASON_NOT_CONFORMANT :
149                                                                 (numSamples != 0) ? EXCLUDEREASON_MSAA :
150                                                                 isFloatType       ? EXCLUDEREASON_FLOAT :
151                                                                                     EXCLUDEREASON_YUV));
152         }
153     }
154     eglu::terminateDisplay(library, display);
155 }
156 
getConfigListEGL(tcu::Platform & platform,glu::ApiType type,ConfigList & configList)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 } // namespace glcts
170