/*------------------------------------------------------------------------- * OpenGL Conformance Test Suite * ----------------------------- * * Copyright (c) 2016 Google Inc. * Copyright (c) 2016 The Khronos Group Inc. * * 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 Test config list case. */ /*-------------------------------------------------------------------*/ #include "glcConfigListCase.hpp" #include "glcConfigList.hpp" #include "tcuTestLog.hpp" namespace glcts { using tcu::TestLog; using std::vector; static const char* getConfigTypeName(ConfigType type) { switch (type) { case CONFIGTYPE_DEFAULT: return "default"; case CONFIGTYPE_EGL: return "EGL"; case CONFIGTYPE_WGL: return "WGL"; default: throw tcu::Exception("Unknown config type"); } } static const char* getExcludeReasonName(ExcludeReason reason) { switch (reason) { case EXCLUDEREASON_NOT_COMPATIBLE: return "Not compatible"; case EXCLUDEREASON_NOT_CONFORMANT: return "Not conformant"; case EXCLUDEREASON_MSAA: return "Multisampled: Not testable"; case EXCLUDEREASON_FLOAT: return "Float configs: Not testable"; case EXCLUDEREASON_YUV: return "YUV: Not testable"; default: throw tcu::Exception("Unknown exclude reason"); } } static const char* getSurfaceTypeName(tcu::SurfaceType type) { switch (type) { case tcu::SURFACETYPE_WINDOW: return "window"; case tcu::SURFACETYPE_OFFSCREEN_NATIVE: return "pixmap"; case tcu::SURFACETYPE_OFFSCREEN_GENERIC: return "pbuffer"; default: throw tcu::Exception("Unknown surface type"); } } struct SurfaceBitsFmt { deUint32 bits; SurfaceBitsFmt(deUint32 bits_) : bits(bits_) { } }; std::ostream& operator<<(std::ostream& str, const SurfaceBitsFmt& bits) { static const tcu::SurfaceType s_types[] = { tcu::SURFACETYPE_WINDOW, tcu::SURFACETYPE_OFFSCREEN_NATIVE, tcu::SURFACETYPE_OFFSCREEN_GENERIC }; bool isFirst = true; for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_types); ndx++) { if (bits.bits & (1 << s_types[ndx])) { if (!isFirst) str << ", "; str << getSurfaceTypeName(s_types[ndx]); isFirst = false; } } return str; } ConfigListCase::ConfigListCase(tcu::TestContext& testCtx, const char* name, const char* description, glu::ApiType type) : TestCase(testCtx, name, description), m_ctxType(type) { } ConfigListCase::~ConfigListCase(void) { } ConfigListCase::IterateResult ConfigListCase::iterate(void) { TestLog& log = m_testCtx.getLog(); ConfigList configs; getDefaultConfigList(m_testCtx.getPlatform(), m_ctxType, configs); // Valid configs. { tcu::ScopedLogSection configSection(log, "Configs", "Configs"); for (vector::const_iterator cfgIter = configs.configs.begin(); cfgIter != configs.configs.end(); cfgIter++) log << TestLog::Message << getConfigTypeName(cfgIter->type) << "(" << cfgIter->id << "): " << SurfaceBitsFmt(cfgIter->surfaceTypes) << TestLog::EndMessage; } // Excluded configs. { tcu::ScopedLogSection excludedSection(log, "ExcludedConfigs", "Excluded configs"); for (vector::const_iterator cfgIter = configs.excludedConfigs.begin(); cfgIter != configs.excludedConfigs.end(); cfgIter++) log << TestLog::Message << getConfigTypeName(cfgIter->type) << "(" << cfgIter->id << "): " << getExcludeReasonName(cfgIter->reason) << TestLog::EndMessage; } // Totals. int numValid = (int)configs.configs.size(); int numNotCompatible = 0; int numNotConformant = 0; for (vector::const_iterator cfgIter = configs.excludedConfigs.begin(); cfgIter != configs.excludedConfigs.end(); cfgIter++) (cfgIter->reason == EXCLUDEREASON_NOT_CONFORMANT ? numNotConformant : numNotCompatible) += 1; log << TestLog::Message << numValid << " valid, " << numNotConformant << " non-conformant and " << numNotCompatible << " non-compatible configs" << TestLog::EndMessage; bool configCountOk = numValid >= numNotConformant; m_testCtx.setTestResult(configCountOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL, configCountOk ? "Pass" : "Too many non-conformant configs"); return STOP; } } // glcts