/*-------------------------------------------------------------------------
* drawElements Quality Program OpenGL ES Utilities
* ------------------------------------------------
*
* Copyright 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*//*!
* \file
* \brief OpenGL rendering configuration.
*//*--------------------------------------------------------------------*/
#include "gluRenderConfig.hpp"
#include "tcuCommandLine.hpp"
#include "deString.h"
namespace glu
{
void parseConfigBitsFromName (RenderConfig* config, const char* renderCfgName)
{
const char* cfgName = renderCfgName;
DE_ASSERT(config->redBits == RenderConfig::DONT_CARE &&
config->greenBits == RenderConfig::DONT_CARE &&
config->blueBits == RenderConfig::DONT_CARE &&
config->alphaBits == RenderConfig::DONT_CARE &&
config->depthBits == RenderConfig::DONT_CARE &&
config->stencilBits == RenderConfig::DONT_CARE &&
config->numSamples == RenderConfig::DONT_CARE);
static const struct
{
const char* name;
int redBits;
int greenBits;
int blueBits;
int alphaBits;
} colorCfgs[] =
{
{ "rgb888", 8, 8, 8, 0 },
{ "rgba8888", 8, 8, 8, 8 },
{ "rgb565", 5, 6, 5, 0 },
{ "rgba4444", 4, 4, 4, 4 },
{ "rgba5551", 5, 5, 5, 1 }
};
for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(colorCfgs); ndx++)
{
if (deStringBeginsWith(cfgName, colorCfgs[ndx].name))
{
config->redBits = colorCfgs[ndx].redBits;
config->greenBits = colorCfgs[ndx].greenBits;
config->blueBits = colorCfgs[ndx].blueBits;
config->alphaBits = colorCfgs[ndx].alphaBits;
cfgName += strlen(colorCfgs[ndx].name);
break;
}
}
static const struct
{
const char* name;
int depthSize;
} depthCfgs[] =
{
{ "d0", 0 },
{ "d16", 16 },
{ "d24", 24 },
{ "d32", 32 }
};
for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(depthCfgs); ndx++)
{
if (deStringBeginsWith(cfgName, depthCfgs[ndx].name))
{
config->depthBits = depthCfgs[ndx].depthSize;
cfgName += strlen(depthCfgs[ndx].name);
break;
}
}
static const struct
{
const char* name;
int stencilSize;
} stencilCfgs[] =
{
{ "s0", 0 },
{ "s8", 8 },
{ "s16", 16 },
};
for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(stencilCfgs); ndx++)
{
if (deStringBeginsWith(cfgName, stencilCfgs[ndx].name))
{
config->stencilBits = stencilCfgs[ndx].stencilSize;
cfgName += strlen(stencilCfgs[ndx].name);
break;
}
}
static const struct
{
const char* name;
int numSamples;
} multiSampleCfgs[] =
{
{ "ms0", 0 },
{ "ms16", 16 },
{ "ms1", 1 },
{ "ms2", 2 },
{ "ms4", 4 },
{ "ms8", 8 }
};
for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(multiSampleCfgs); ndx++)
{
if (deStringBeginsWith(cfgName, multiSampleCfgs[ndx].name))
{
config->numSamples = multiSampleCfgs[ndx].numSamples;
cfgName += strlen(multiSampleCfgs[ndx].name);
break;
}
}
if (cfgName[0] != 0)
throw tcu::InternalError(std::string("Invalid GL configuration: '") + renderCfgName + "'");
}
void parseRenderConfig (RenderConfig* config, const tcu::CommandLine& cmdLine)
{
switch (cmdLine.getSurfaceType())
{
case tcu::SURFACETYPE_WINDOW: config->surfaceType = RenderConfig::SURFACETYPE_WINDOW; break;
case tcu::SURFACETYPE_OFFSCREEN_NATIVE: config->surfaceType = RenderConfig::SURFACETYPE_OFFSCREEN_NATIVE; break;
case tcu::SURFACETYPE_OFFSCREEN_GENERIC: config->surfaceType = RenderConfig::SURFACETYPE_OFFSCREEN_GENERIC; break;
case tcu::SURFACETYPE_FBO: config->surfaceType = RenderConfig::SURFACETYPE_DONT_CARE; break;
case tcu::SURFACETYPE_LAST: config->surfaceType = RenderConfig::SURFACETYPE_DONT_CARE; break;
default:
throw tcu::InternalError("Unsupported surface type");
}
config->windowVisibility = parseWindowVisibility(cmdLine);
if (cmdLine.getSurfaceWidth() > 0)
config->width = cmdLine.getSurfaceWidth();
if (cmdLine.getSurfaceHeight() > 0)
config->height = cmdLine.getSurfaceHeight();
if (cmdLine.getGLConfigName() != DE_NULL)
parseConfigBitsFromName(config, cmdLine.getGLConfigName());
if (cmdLine.getGLConfigId() >= 0)
config->id = cmdLine.getGLConfigId();
}
RenderConfig::Visibility parseWindowVisibility (const tcu::CommandLine& cmdLine)
{
switch (cmdLine.getVisibility())
{
case tcu::WINDOWVISIBILITY_HIDDEN: return RenderConfig::VISIBILITY_HIDDEN;
case tcu::WINDOWVISIBILITY_WINDOWED: return RenderConfig::VISIBILITY_VISIBLE;
case tcu::WINDOWVISIBILITY_FULLSCREEN: return RenderConfig::VISIBILITY_FULLSCREEN;
default:
throw tcu::InternalError("Unsupported window visibility");
}
}
} // glu