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