Home | History | Annotate | Download | only in opengl
      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 
     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 
    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 
    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