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