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