| /*------------------------------------------------------------------------- |
| * 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 |