1 /*------------------------------------------------------------------------- 2 * drawElements Quality Program EGL Module 3 * --------------------------------------- 4 * 5 * Copyright 2014 The Android Open Source Project 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 * 19 *//*! 20 * \file 21 * \brief Simple Context construction test. 22 *//*--------------------------------------------------------------------*/ 23 24 #include "teglSimpleConfigCase.hpp" 25 #include "tcuTestLog.hpp" 26 #include "tcuFormatUtil.hpp" 27 #include "egluUtil.hpp" 28 #include "eglwLibrary.hpp" 29 #include "eglwEnums.hpp" 30 #include "deStringUtil.hpp" 31 32 namespace deqp 33 { 34 namespace egl 35 { 36 37 using std::vector; 38 using std::string; 39 using tcu::TestLog; 40 using eglu::ConfigInfo; 41 using namespace eglw; 42 using namespace eglu; 43 44 SimpleConfigCase::SimpleConfigCase (EglTestContext& eglTestCtx, const char* name, const char* description, const FilterList& filters) 45 : TestCase (eglTestCtx, name, description) 46 , m_filters (filters) 47 , m_display (EGL_NO_DISPLAY) 48 { 49 } 50 51 SimpleConfigCase::~SimpleConfigCase (void) 52 { 53 } 54 55 void SimpleConfigCase::init (void) 56 { 57 const Library& egl = m_eglTestCtx.getLibrary(); 58 59 DE_ASSERT(m_display == EGL_NO_DISPLAY && m_configs.empty()); 60 61 m_display = getAndInitDisplay(m_eglTestCtx.getNativeDisplay()); 62 m_configs = chooseConfigs(egl, m_display, m_filters); 63 64 // Log matching configs. 65 { 66 vector<EGLint> configIds(m_configs.size()); 67 68 for (size_t ndx = 0; ndx < m_configs.size(); ndx++) 69 configIds[ndx] = getConfigID(egl, m_display, m_configs[ndx]); 70 71 m_testCtx.getLog() << TestLog::Message << "Compatible configs: " << tcu::formatArray(configIds.begin(), configIds.end()) << TestLog::EndMessage; 72 } 73 74 if (m_configs.empty()) 75 { 76 egl.terminate(m_display); 77 m_display = EGL_NO_DISPLAY; 78 TCU_THROW(NotSupportedError, "No compatible configs found"); 79 } 80 81 // Init config iter 82 m_configIter = m_configs.begin(); 83 84 // Init test case result to Pass 85 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); 86 } 87 88 void SimpleConfigCase::deinit (void) 89 { 90 if (m_display != EGL_NO_DISPLAY) 91 { 92 m_eglTestCtx.getLibrary().terminate(m_display); 93 m_display = EGL_NO_DISPLAY; 94 } 95 m_configs.clear(); 96 } 97 98 SimpleConfigCase::IterateResult SimpleConfigCase::iterate (void) 99 { 100 DE_ASSERT(m_configIter != m_configs.end()); 101 102 EGLConfig config = *m_configIter++; 103 104 try 105 { 106 executeForConfig(m_display, config); 107 } 108 catch (const tcu::TestError& e) 109 { 110 m_testCtx.getLog() << e; 111 m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail"); 112 } 113 // \note Other errors are handled by framework (resource / internal errors). 114 115 return (m_configIter != m_configs.end()) ? CONTINUE : STOP; 116 } 117 118 template <int Red, int Green, int Blue, int Alpha> 119 static bool colorBits (const eglu::CandidateConfig& c) 120 { 121 return c.redSize() == Red && 122 c.greenSize() == Green && 123 c.blueSize() == Blue && 124 c.alphaSize() == Alpha; 125 } 126 127 template <int Red, int Green, int Blue, int Alpha> 128 static bool notColorBits (const eglu::CandidateConfig& c) 129 { 130 return c.redSize() != Red || 131 c.greenSize() != Green || 132 c.blueSize() != Blue || 133 c.alphaSize() != Alpha; 134 } 135 136 static bool hasDepth (const eglu::CandidateConfig& c) { return c.depthSize() > 0; } 137 static bool noDepth (const eglu::CandidateConfig& c) { return c.depthSize() == 0; } 138 static bool hasStencil (const eglu::CandidateConfig& c) { return c.stencilSize() > 0; } 139 static bool noStencil (const eglu::CandidateConfig& c) { return c.stencilSize() == 0; } 140 141 static bool isConformant (const eglu::CandidateConfig& c) 142 { 143 return c.get(EGL_CONFIG_CAVEAT) != EGL_NON_CONFORMANT_CONFIG; 144 } 145 146 static bool notFloat (const eglu::CandidateConfig& c) 147 { 148 return c.colorComponentType() != EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT; 149 } 150 151 void getDefaultFilterLists (vector<NamedFilterList>& lists, const FilterList& baseFilters) 152 { 153 static const struct 154 { 155 const char* name; 156 eglu::ConfigFilter filter; 157 } s_colorRules[] = 158 { 159 { "rgb565", colorBits<5, 6, 5, 0> }, 160 { "rgb888", colorBits<8, 8, 8, 0> }, 161 { "rgba4444", colorBits<4, 4, 4, 4> }, 162 { "rgba5551", colorBits<5, 5, 5, 1> }, 163 { "rgba8888", colorBits<8, 8, 8, 8> } 164 }; 165 166 static const struct 167 { 168 const char* name; 169 eglu::ConfigFilter filter; 170 } s_depthRules[] = 171 { 172 { "no_depth", noDepth }, 173 { "depth", hasDepth }, 174 }; 175 176 static const struct 177 { 178 const char* name; 179 eglu::ConfigFilter filter; 180 } s_stencilRules[] = 181 { 182 { "no_stencil", noStencil }, 183 { "stencil", hasStencil }, 184 }; 185 186 for (int colorRuleNdx = 0; colorRuleNdx < DE_LENGTH_OF_ARRAY(s_colorRules); colorRuleNdx++) 187 { 188 for (int depthRuleNdx = 0; depthRuleNdx < DE_LENGTH_OF_ARRAY(s_depthRules); depthRuleNdx++) 189 { 190 for (int stencilRuleNdx = 0; stencilRuleNdx < DE_LENGTH_OF_ARRAY(s_stencilRules); stencilRuleNdx++) 191 { 192 const string name = string(s_colorRules[colorRuleNdx].name) + "_" + s_depthRules[depthRuleNdx].name + "_" + s_stencilRules[stencilRuleNdx].name; 193 NamedFilterList filters (name.c_str(), ""); 194 195 filters << baseFilters 196 << s_colorRules[colorRuleNdx].filter 197 << s_depthRules[depthRuleNdx].filter 198 << s_stencilRules[stencilRuleNdx].filter 199 << isConformant; 200 201 lists.push_back(filters); 202 } 203 } 204 } 205 206 // Build "other" set - not configs that don't match any of known color rules 207 { 208 NamedFilterList filters ("other", "All other configs"); 209 210 // \todo [2014-12-18 pyry] Optimize rules 211 filters << baseFilters 212 << notColorBits<5, 6, 5, 0> 213 << notColorBits<8, 8, 8, 0> 214 << notColorBits<4, 4, 4, 4> 215 << notColorBits<5, 5, 5, 1> 216 << notColorBits<8, 8, 8, 8> 217 << isConformant 218 << notFloat; 219 220 lists.push_back(filters); 221 } 222 } 223 224 } // egl 225 } // deqp 226