184 lines
5.0 KiB
C++
184 lines
5.0 KiB
C++
/*-------------------------------------------------------------------------
|
|
* 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
|