xref: /aosp_15_r20/external/deqp/framework/opengl/gluRenderConfig.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program OpenGL ES Utilities
3*35238bceSAndroid Build Coastguard Worker  * ------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker  *
5*35238bceSAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker  *
7*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker  *
11*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker  *
13*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker  *
19*35238bceSAndroid Build Coastguard Worker  *//*!
20*35238bceSAndroid Build Coastguard Worker  * \file
21*35238bceSAndroid Build Coastguard Worker  * \brief OpenGL rendering configuration.
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "gluRenderConfig.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "tcuCommandLine.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "deString.h"
27*35238bceSAndroid Build Coastguard Worker #include "eglwEnums.hpp"
28*35238bceSAndroid Build Coastguard Worker 
29*35238bceSAndroid Build Coastguard Worker namespace glu
30*35238bceSAndroid Build Coastguard Worker {
31*35238bceSAndroid Build Coastguard Worker 
parseConfigBitsFromName(RenderConfig * config,const char * renderCfgName)32*35238bceSAndroid Build Coastguard Worker void parseConfigBitsFromName(RenderConfig *config, const char *renderCfgName)
33*35238bceSAndroid Build Coastguard Worker {
34*35238bceSAndroid Build Coastguard Worker     const char *cfgName = renderCfgName;
35*35238bceSAndroid Build Coastguard Worker 
36*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(config->redBits == RenderConfig::DONT_CARE && config->greenBits == RenderConfig::DONT_CARE &&
37*35238bceSAndroid Build Coastguard Worker               config->blueBits == RenderConfig::DONT_CARE && config->alphaBits == RenderConfig::DONT_CARE &&
38*35238bceSAndroid Build Coastguard Worker               config->depthBits == RenderConfig::DONT_CARE && config->stencilBits == RenderConfig::DONT_CARE &&
39*35238bceSAndroid Build Coastguard Worker               config->numSamples == RenderConfig::DONT_CARE);
40*35238bceSAndroid Build Coastguard Worker 
41*35238bceSAndroid Build Coastguard Worker     static const struct
42*35238bceSAndroid Build Coastguard Worker     {
43*35238bceSAndroid Build Coastguard Worker         const char *name;
44*35238bceSAndroid Build Coastguard Worker         int redBits;
45*35238bceSAndroid Build Coastguard Worker         int greenBits;
46*35238bceSAndroid Build Coastguard Worker         int blueBits;
47*35238bceSAndroid Build Coastguard Worker         int alphaBits;
48*35238bceSAndroid Build Coastguard Worker     } colorCfgs[] = {{"rgb888", 8, 8, 8, 0},
49*35238bceSAndroid Build Coastguard Worker                      {"rgba8888", 8, 8, 8, 8},
50*35238bceSAndroid Build Coastguard Worker                      {"rgb565", 5, 6, 5, 0},
51*35238bceSAndroid Build Coastguard Worker                      {"rgba4444", 4, 4, 4, 4},
52*35238bceSAndroid Build Coastguard Worker                      {"rgba5551", 5, 5, 5, 1}};
53*35238bceSAndroid Build Coastguard Worker     for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(colorCfgs); ndx++)
54*35238bceSAndroid Build Coastguard Worker     {
55*35238bceSAndroid Build Coastguard Worker         if (deStringBeginsWith(cfgName, colorCfgs[ndx].name))
56*35238bceSAndroid Build Coastguard Worker         {
57*35238bceSAndroid Build Coastguard Worker             config->redBits   = colorCfgs[ndx].redBits;
58*35238bceSAndroid Build Coastguard Worker             config->greenBits = colorCfgs[ndx].greenBits;
59*35238bceSAndroid Build Coastguard Worker             config->blueBits  = colorCfgs[ndx].blueBits;
60*35238bceSAndroid Build Coastguard Worker             config->alphaBits = colorCfgs[ndx].alphaBits;
61*35238bceSAndroid Build Coastguard Worker 
62*35238bceSAndroid Build Coastguard Worker             cfgName += strlen(colorCfgs[ndx].name);
63*35238bceSAndroid Build Coastguard Worker             break;
64*35238bceSAndroid Build Coastguard Worker         }
65*35238bceSAndroid Build Coastguard Worker     }
66*35238bceSAndroid Build Coastguard Worker 
67*35238bceSAndroid Build Coastguard Worker     static const struct
68*35238bceSAndroid Build Coastguard Worker     {
69*35238bceSAndroid Build Coastguard Worker         const char *name;
70*35238bceSAndroid Build Coastguard Worker         int depthSize;
71*35238bceSAndroid Build Coastguard Worker     } depthCfgs[] = {{"d0", 0}, {"d16", 16}, {"d24", 24}, {"d32", 32}};
72*35238bceSAndroid Build Coastguard Worker     for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(depthCfgs); ndx++)
73*35238bceSAndroid Build Coastguard Worker     {
74*35238bceSAndroid Build Coastguard Worker         if (deStringBeginsWith(cfgName, depthCfgs[ndx].name))
75*35238bceSAndroid Build Coastguard Worker         {
76*35238bceSAndroid Build Coastguard Worker             config->depthBits = depthCfgs[ndx].depthSize;
77*35238bceSAndroid Build Coastguard Worker 
78*35238bceSAndroid Build Coastguard Worker             cfgName += strlen(depthCfgs[ndx].name);
79*35238bceSAndroid Build Coastguard Worker             break;
80*35238bceSAndroid Build Coastguard Worker         }
81*35238bceSAndroid Build Coastguard Worker     }
82*35238bceSAndroid Build Coastguard Worker 
83*35238bceSAndroid Build Coastguard Worker     static const struct
84*35238bceSAndroid Build Coastguard Worker     {
85*35238bceSAndroid Build Coastguard Worker         const char *name;
86*35238bceSAndroid Build Coastguard Worker         int stencilSize;
87*35238bceSAndroid Build Coastguard Worker     } stencilCfgs[] = {
88*35238bceSAndroid Build Coastguard Worker         {"s0", 0},
89*35238bceSAndroid Build Coastguard Worker         {"s8", 8},
90*35238bceSAndroid Build Coastguard Worker         {"s16", 16},
91*35238bceSAndroid Build Coastguard Worker     };
92*35238bceSAndroid Build Coastguard Worker     for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(stencilCfgs); ndx++)
93*35238bceSAndroid Build Coastguard Worker     {
94*35238bceSAndroid Build Coastguard Worker         if (deStringBeginsWith(cfgName, stencilCfgs[ndx].name))
95*35238bceSAndroid Build Coastguard Worker         {
96*35238bceSAndroid Build Coastguard Worker             config->stencilBits = stencilCfgs[ndx].stencilSize;
97*35238bceSAndroid Build Coastguard Worker 
98*35238bceSAndroid Build Coastguard Worker             cfgName += strlen(stencilCfgs[ndx].name);
99*35238bceSAndroid Build Coastguard Worker             break;
100*35238bceSAndroid Build Coastguard Worker         }
101*35238bceSAndroid Build Coastguard Worker     }
102*35238bceSAndroid Build Coastguard Worker 
103*35238bceSAndroid Build Coastguard Worker     static const struct
104*35238bceSAndroid Build Coastguard Worker     {
105*35238bceSAndroid Build Coastguard Worker         const char *name;
106*35238bceSAndroid Build Coastguard Worker         int numSamples;
107*35238bceSAndroid Build Coastguard Worker     } multiSampleCfgs[] = {{"ms0", 0}, {"ms16", 16}, {"ms1", 1}, {"ms2", 2}, {"ms4", 4}, {"ms8", 8}};
108*35238bceSAndroid Build Coastguard Worker     for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(multiSampleCfgs); ndx++)
109*35238bceSAndroid Build Coastguard Worker     {
110*35238bceSAndroid Build Coastguard Worker         if (deStringBeginsWith(cfgName, multiSampleCfgs[ndx].name))
111*35238bceSAndroid Build Coastguard Worker         {
112*35238bceSAndroid Build Coastguard Worker             config->numSamples = multiSampleCfgs[ndx].numSamples;
113*35238bceSAndroid Build Coastguard Worker 
114*35238bceSAndroid Build Coastguard Worker             cfgName += strlen(multiSampleCfgs[ndx].name);
115*35238bceSAndroid Build Coastguard Worker             break;
116*35238bceSAndroid Build Coastguard Worker         }
117*35238bceSAndroid Build Coastguard Worker     }
118*35238bceSAndroid Build Coastguard Worker 
119*35238bceSAndroid Build Coastguard Worker     if (cfgName[0] != 0)
120*35238bceSAndroid Build Coastguard Worker         throw tcu::InternalError(std::string("Invalid GL configuration: '") + renderCfgName + "'");
121*35238bceSAndroid Build Coastguard Worker }
122*35238bceSAndroid Build Coastguard Worker 
parseRenderConfig(RenderConfig * config,const tcu::CommandLine & cmdLine)123*35238bceSAndroid Build Coastguard Worker void parseRenderConfig(RenderConfig *config, const tcu::CommandLine &cmdLine)
124*35238bceSAndroid Build Coastguard Worker {
125*35238bceSAndroid Build Coastguard Worker     switch (cmdLine.getSurfaceType())
126*35238bceSAndroid Build Coastguard Worker     {
127*35238bceSAndroid Build Coastguard Worker     case tcu::SURFACETYPE_WINDOW:
128*35238bceSAndroid Build Coastguard Worker         config->surfaceType = RenderConfig::SURFACETYPE_WINDOW;
129*35238bceSAndroid Build Coastguard Worker         break;
130*35238bceSAndroid Build Coastguard Worker     case tcu::SURFACETYPE_OFFSCREEN_NATIVE:
131*35238bceSAndroid Build Coastguard Worker         config->surfaceType = RenderConfig::SURFACETYPE_OFFSCREEN_NATIVE;
132*35238bceSAndroid Build Coastguard Worker         break;
133*35238bceSAndroid Build Coastguard Worker     case tcu::SURFACETYPE_OFFSCREEN_GENERIC:
134*35238bceSAndroid Build Coastguard Worker         config->surfaceType = RenderConfig::SURFACETYPE_OFFSCREEN_GENERIC;
135*35238bceSAndroid Build Coastguard Worker         break;
136*35238bceSAndroid Build Coastguard Worker     case tcu::SURFACETYPE_FBO:
137*35238bceSAndroid Build Coastguard Worker         config->surfaceType = RenderConfig::SURFACETYPE_DONT_CARE;
138*35238bceSAndroid Build Coastguard Worker         break;
139*35238bceSAndroid Build Coastguard Worker     case tcu::SURFACETYPE_LAST:
140*35238bceSAndroid Build Coastguard Worker         config->surfaceType = RenderConfig::SURFACETYPE_DONT_CARE;
141*35238bceSAndroid Build Coastguard Worker         break;
142*35238bceSAndroid Build Coastguard Worker     default:
143*35238bceSAndroid Build Coastguard Worker         throw tcu::InternalError("Unsupported surface type");
144*35238bceSAndroid Build Coastguard Worker     }
145*35238bceSAndroid Build Coastguard Worker 
146*35238bceSAndroid Build Coastguard Worker     config->windowVisibility = parseWindowVisibility(cmdLine);
147*35238bceSAndroid Build Coastguard Worker 
148*35238bceSAndroid Build Coastguard Worker     if (cmdLine.getSurfaceWidth() > 0)
149*35238bceSAndroid Build Coastguard Worker         config->width = cmdLine.getSurfaceWidth();
150*35238bceSAndroid Build Coastguard Worker 
151*35238bceSAndroid Build Coastguard Worker     if (cmdLine.getSurfaceHeight() > 0)
152*35238bceSAndroid Build Coastguard Worker         config->height = cmdLine.getSurfaceHeight();
153*35238bceSAndroid Build Coastguard Worker 
154*35238bceSAndroid Build Coastguard Worker     if (cmdLine.getGLConfigName() != DE_NULL)
155*35238bceSAndroid Build Coastguard Worker         parseConfigBitsFromName(config, cmdLine.getGLConfigName());
156*35238bceSAndroid Build Coastguard Worker 
157*35238bceSAndroid Build Coastguard Worker     if (cmdLine.getGLConfigId() >= 0)
158*35238bceSAndroid Build Coastguard Worker         config->id = cmdLine.getGLConfigId();
159*35238bceSAndroid Build Coastguard Worker }
160*35238bceSAndroid Build Coastguard Worker 
parseWindowVisibility(const tcu::CommandLine & cmdLine)161*35238bceSAndroid Build Coastguard Worker RenderConfig::Visibility parseWindowVisibility(const tcu::CommandLine &cmdLine)
162*35238bceSAndroid Build Coastguard Worker {
163*35238bceSAndroid Build Coastguard Worker     switch (cmdLine.getVisibility())
164*35238bceSAndroid Build Coastguard Worker     {
165*35238bceSAndroid Build Coastguard Worker     case tcu::WINDOWVISIBILITY_HIDDEN:
166*35238bceSAndroid Build Coastguard Worker         return RenderConfig::VISIBILITY_HIDDEN;
167*35238bceSAndroid Build Coastguard Worker     case tcu::WINDOWVISIBILITY_WINDOWED:
168*35238bceSAndroid Build Coastguard Worker         return RenderConfig::VISIBILITY_VISIBLE;
169*35238bceSAndroid Build Coastguard Worker     case tcu::WINDOWVISIBILITY_FULLSCREEN:
170*35238bceSAndroid Build Coastguard Worker         return RenderConfig::VISIBILITY_FULLSCREEN;
171*35238bceSAndroid Build Coastguard Worker     default:
172*35238bceSAndroid Build Coastguard Worker         throw tcu::InternalError("Unsupported window visibility");
173*35238bceSAndroid Build Coastguard Worker     }
174*35238bceSAndroid Build Coastguard Worker }
175*35238bceSAndroid Build Coastguard Worker 
fromEGLComponentType(int eglComponentType)176*35238bceSAndroid Build Coastguard Worker RenderConfig::ComponentType fromEGLComponentType(int eglComponentType)
177*35238bceSAndroid Build Coastguard Worker {
178*35238bceSAndroid Build Coastguard Worker     switch (eglComponentType)
179*35238bceSAndroid Build Coastguard Worker     {
180*35238bceSAndroid Build Coastguard Worker     case EGL_NONE:
181*35238bceSAndroid Build Coastguard Worker         return glu::RenderConfig::COMPONENT_TYPE_DONT_CARE;
182*35238bceSAndroid Build Coastguard Worker     case EGL_DONT_CARE:
183*35238bceSAndroid Build Coastguard Worker         return glu::RenderConfig::COMPONENT_TYPE_DONT_CARE;
184*35238bceSAndroid Build Coastguard Worker     case EGL_COLOR_COMPONENT_TYPE_FIXED_EXT:
185*35238bceSAndroid Build Coastguard Worker         return glu::RenderConfig::COMPONENT_TYPE_FIXED;
186*35238bceSAndroid Build Coastguard Worker     case EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT:
187*35238bceSAndroid Build Coastguard Worker         return glu::RenderConfig::COMPONENT_TYPE_FLOAT;
188*35238bceSAndroid Build Coastguard Worker     default:
189*35238bceSAndroid Build Coastguard Worker         throw tcu::InternalError("Unsupported color component type");
190*35238bceSAndroid Build Coastguard Worker     }
191*35238bceSAndroid Build Coastguard Worker }
192*35238bceSAndroid Build Coastguard Worker 
toEGLComponentType(RenderConfig::ComponentType gluComponentType)193*35238bceSAndroid Build Coastguard Worker int toEGLComponentType(RenderConfig::ComponentType gluComponentType)
194*35238bceSAndroid Build Coastguard Worker {
195*35238bceSAndroid Build Coastguard Worker     switch (gluComponentType)
196*35238bceSAndroid Build Coastguard Worker     {
197*35238bceSAndroid Build Coastguard Worker     case glu::RenderConfig::COMPONENT_TYPE_DONT_CARE:
198*35238bceSAndroid Build Coastguard Worker         return EGL_DONT_CARE;
199*35238bceSAndroid Build Coastguard Worker     case glu::RenderConfig::COMPONENT_TYPE_FIXED:
200*35238bceSAndroid Build Coastguard Worker         return EGL_COLOR_COMPONENT_TYPE_FIXED_EXT;
201*35238bceSAndroid Build Coastguard Worker     case glu::RenderConfig::COMPONENT_TYPE_FLOAT:
202*35238bceSAndroid Build Coastguard Worker         return EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT;
203*35238bceSAndroid Build Coastguard Worker     default:
204*35238bceSAndroid Build Coastguard Worker         throw tcu::InternalError("Unsupported color component type");
205*35238bceSAndroid Build Coastguard Worker     }
206*35238bceSAndroid Build Coastguard Worker }
207*35238bceSAndroid Build Coastguard Worker 
208*35238bceSAndroid Build Coastguard Worker } // namespace glu
209