You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
225 lines
6.0 KiB
225 lines
6.0 KiB
/*------------------------------------------------------------------------- |
|
* drawElements Quality Program EGL Module |
|
* --------------------------------------- |
|
* |
|
* 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 Simple Context construction test. |
|
*//*--------------------------------------------------------------------*/ |
|
|
|
#include "teglSimpleConfigCase.hpp" |
|
#include "tcuTestLog.hpp" |
|
#include "tcuFormatUtil.hpp" |
|
#include "egluUtil.hpp" |
|
#include "eglwLibrary.hpp" |
|
#include "eglwEnums.hpp" |
|
#include "deStringUtil.hpp" |
|
|
|
namespace deqp |
|
{ |
|
namespace egl |
|
{ |
|
|
|
using std::vector; |
|
using std::string; |
|
using tcu::TestLog; |
|
using eglu::ConfigInfo; |
|
using namespace eglw; |
|
using namespace eglu; |
|
|
|
SimpleConfigCase::SimpleConfigCase (EglTestContext& eglTestCtx, const char* name, const char* description, const FilterList& filters) |
|
: TestCase (eglTestCtx, name, description) |
|
, m_filters (filters) |
|
, m_display (EGL_NO_DISPLAY) |
|
{ |
|
} |
|
|
|
SimpleConfigCase::~SimpleConfigCase (void) |
|
{ |
|
} |
|
|
|
void SimpleConfigCase::init (void) |
|
{ |
|
const Library& egl = m_eglTestCtx.getLibrary(); |
|
|
|
DE_ASSERT(m_display == EGL_NO_DISPLAY && m_configs.empty()); |
|
|
|
m_display = getAndInitDisplay(m_eglTestCtx.getNativeDisplay()); |
|
m_configs = chooseConfigs(egl, m_display, m_filters); |
|
|
|
// Log matching configs. |
|
{ |
|
vector<EGLint> configIds(m_configs.size()); |
|
|
|
for (size_t ndx = 0; ndx < m_configs.size(); ndx++) |
|
configIds[ndx] = getConfigID(egl, m_display, m_configs[ndx]); |
|
|
|
m_testCtx.getLog() << TestLog::Message << "Compatible configs: " << tcu::formatArray(configIds.begin(), configIds.end()) << TestLog::EndMessage; |
|
} |
|
|
|
if (m_configs.empty()) |
|
{ |
|
egl.terminate(m_display); |
|
m_display = EGL_NO_DISPLAY; |
|
TCU_THROW(NotSupportedError, "No compatible configs found"); |
|
} |
|
|
|
// Init config iter |
|
m_configIter = m_configs.begin(); |
|
|
|
// Init test case result to Pass |
|
m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); |
|
} |
|
|
|
void SimpleConfigCase::deinit (void) |
|
{ |
|
if (m_display != EGL_NO_DISPLAY) |
|
{ |
|
m_eglTestCtx.getLibrary().terminate(m_display); |
|
m_display = EGL_NO_DISPLAY; |
|
} |
|
m_configs.clear(); |
|
} |
|
|
|
SimpleConfigCase::IterateResult SimpleConfigCase::iterate (void) |
|
{ |
|
DE_ASSERT(m_configIter != m_configs.end()); |
|
|
|
EGLConfig config = *m_configIter++; |
|
|
|
try |
|
{ |
|
executeForConfig(m_display, config); |
|
} |
|
catch (const tcu::TestError& e) |
|
{ |
|
m_testCtx.getLog() << e; |
|
m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail"); |
|
} |
|
// \note Other errors are handled by framework (resource / internal errors). |
|
|
|
return (m_configIter != m_configs.end()) ? CONTINUE : STOP; |
|
} |
|
|
|
template <int Red, int Green, int Blue, int Alpha> |
|
static bool colorBits (const eglu::CandidateConfig& c) |
|
{ |
|
return c.redSize() == Red && |
|
c.greenSize() == Green && |
|
c.blueSize() == Blue && |
|
c.alphaSize() == Alpha; |
|
} |
|
|
|
template <int Red, int Green, int Blue, int Alpha> |
|
static bool notColorBits (const eglu::CandidateConfig& c) |
|
{ |
|
return c.redSize() != Red || |
|
c.greenSize() != Green || |
|
c.blueSize() != Blue || |
|
c.alphaSize() != Alpha; |
|
} |
|
|
|
static bool hasDepth (const eglu::CandidateConfig& c) { return c.depthSize() > 0; } |
|
static bool noDepth (const eglu::CandidateConfig& c) { return c.depthSize() == 0; } |
|
static bool hasStencil (const eglu::CandidateConfig& c) { return c.stencilSize() > 0; } |
|
static bool noStencil (const eglu::CandidateConfig& c) { return c.stencilSize() == 0; } |
|
|
|
static bool isConformant (const eglu::CandidateConfig& c) |
|
{ |
|
return c.get(EGL_CONFIG_CAVEAT) != EGL_NON_CONFORMANT_CONFIG; |
|
} |
|
|
|
static bool notFloat (const eglu::CandidateConfig& c) |
|
{ |
|
return c.colorComponentType() != EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT; |
|
} |
|
|
|
void getDefaultFilterLists (vector<NamedFilterList>& lists, const FilterList& baseFilters) |
|
{ |
|
static const struct |
|
{ |
|
const char* name; |
|
eglu::ConfigFilter filter; |
|
} s_colorRules[] = |
|
{ |
|
{ "rgb565", colorBits<5, 6, 5, 0> }, |
|
{ "rgb888", colorBits<8, 8, 8, 0> }, |
|
{ "rgba4444", colorBits<4, 4, 4, 4> }, |
|
{ "rgba5551", colorBits<5, 5, 5, 1> }, |
|
{ "rgba8888", colorBits<8, 8, 8, 8> } |
|
}; |
|
|
|
static const struct |
|
{ |
|
const char* name; |
|
eglu::ConfigFilter filter; |
|
} s_depthRules[] = |
|
{ |
|
{ "no_depth", noDepth }, |
|
{ "depth", hasDepth }, |
|
}; |
|
|
|
static const struct |
|
{ |
|
const char* name; |
|
eglu::ConfigFilter filter; |
|
} s_stencilRules[] = |
|
{ |
|
{ "no_stencil", noStencil }, |
|
{ "stencil", hasStencil }, |
|
}; |
|
|
|
for (int colorRuleNdx = 0; colorRuleNdx < DE_LENGTH_OF_ARRAY(s_colorRules); colorRuleNdx++) |
|
{ |
|
for (int depthRuleNdx = 0; depthRuleNdx < DE_LENGTH_OF_ARRAY(s_depthRules); depthRuleNdx++) |
|
{ |
|
for (int stencilRuleNdx = 0; stencilRuleNdx < DE_LENGTH_OF_ARRAY(s_stencilRules); stencilRuleNdx++) |
|
{ |
|
const string name = string(s_colorRules[colorRuleNdx].name) + "_" + s_depthRules[depthRuleNdx].name + "_" + s_stencilRules[stencilRuleNdx].name; |
|
NamedFilterList filters (name.c_str(), ""); |
|
|
|
filters << baseFilters |
|
<< s_colorRules[colorRuleNdx].filter |
|
<< s_depthRules[depthRuleNdx].filter |
|
<< s_stencilRules[stencilRuleNdx].filter |
|
<< isConformant; |
|
|
|
lists.push_back(filters); |
|
} |
|
} |
|
} |
|
|
|
// Build "other" set - not configs that don't match any of known color rules |
|
{ |
|
NamedFilterList filters ("other", "All other configs"); |
|
|
|
// \todo [2014-12-18 pyry] Optimize rules |
|
filters << baseFilters |
|
<< notColorBits<5, 6, 5, 0> |
|
<< notColorBits<8, 8, 8, 0> |
|
<< notColorBits<4, 4, 4, 4> |
|
<< notColorBits<5, 5, 5, 1> |
|
<< notColorBits<8, 8, 8, 8> |
|
<< isConformant |
|
<< notFloat; |
|
|
|
lists.push_back(filters); |
|
} |
|
} |
|
|
|
} // egl |
|
} // deqp
|
|
|