| /*------------------------------------------------------------------------- |
| * 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" |
| #include "eglwEnums.hpp" |
| |
| 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"); |
| } |
| } |
| |
| RenderConfig::ComponentType fromEGLComponentType(int eglComponentType) |
| { |
| switch (eglComponentType) |
| { |
| case EGL_NONE: |
| return glu::RenderConfig::COMPONENT_TYPE_DONT_CARE; |
| case EGL_DONT_CARE: |
| return glu::RenderConfig::COMPONENT_TYPE_DONT_CARE; |
| case EGL_COLOR_COMPONENT_TYPE_FIXED_EXT: |
| return glu::RenderConfig::COMPONENT_TYPE_FIXED; |
| case EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT: |
| return glu::RenderConfig::COMPONENT_TYPE_FLOAT; |
| default: |
| throw tcu::InternalError("Unsupported color component type"); |
| } |
| } |
| |
| int toEGLComponentType(RenderConfig::ComponentType gluComponentType) |
| { |
| switch (gluComponentType) |
| { |
| case glu::RenderConfig::COMPONENT_TYPE_DONT_CARE: |
| return EGL_DONT_CARE; |
| case glu::RenderConfig::COMPONENT_TYPE_FIXED: |
| return EGL_COLOR_COMPONENT_TYPE_FIXED_EXT; |
| case glu::RenderConfig::COMPONENT_TYPE_FLOAT: |
| return EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT; |
| default: |
| throw tcu::InternalError("Unsupported color component type"); |
| } |
| } |
| |
| } // namespace glu |