// RenderCase
-RenderCase::RenderCase (EglTestContext& eglTestCtx, const char* name, const char* description, EGLint apiMask, EGLint surfaceTypeMask, const eglu::FilterList& filters)
+RenderCase::RenderCase (EglTestContext& eglTestCtx, const char* name, const char* description, EGLint surfaceTypeMask, const eglu::FilterList& filters)
: SimpleConfigCase (eglTestCtx, name, description, filters)
- , m_apiMask (apiMask)
, m_surfaceTypeMask (surfaceTypeMask)
{
}
// SingleContextRenderCase
SingleContextRenderCase::SingleContextRenderCase (EglTestContext& eglTestCtx, const char* name, const char* description, EGLint apiMask, EGLint surfaceTypeMask, const eglu::FilterList& filters)
- : RenderCase(eglTestCtx, name, description, apiMask, surfaceTypeMask, filters)
+ : RenderCase (eglTestCtx, name, description, surfaceTypeMask, filters)
+ , m_apiMask (apiMask)
{
}
void SingleContextRenderCase::executeForSurface (EGLDisplay display, EGLSurface surface, const Config& config)
{
- const Library& egl = m_eglTestCtx.getLibrary();
- const EGLint apis[] = { EGL_OPENGL_ES2_BIT, EGL_OPENGL_ES3_BIT_KHR, EGL_OPENGL_ES_BIT, EGL_OPENVG_BIT };
- tcu::TestLog& log = m_testCtx.getLog();
+ const Library& egl = m_eglTestCtx.getLibrary();
+ const EGLint apis[] = { EGL_OPENGL_ES2_BIT, EGL_OPENGL_ES3_BIT_KHR, EGL_OPENGL_ES_BIT, EGL_OPENVG_BIT };
+ tcu::TestLog& log = m_testCtx.getLog();
+ const EGLint configApiMask = eglu::getConfigAttribInt(egl, display, config.config, EGL_RENDERABLE_TYPE);
checkBuildClientAPISupport(m_apiMask);
{
EGLint apiBit = apis[apiNdx];
- if ((apiBit & m_apiMask) == 0)
- continue; // Skip this api.
+ // Skip API if build or current config doesn't support it.
+ if ((apiBit & m_apiMask) == 0 || (apiBit & configApiMask) == 0)
+ continue;
EGLint api = EGL_NONE;
const char* apiName = DE_NULL;
// MultiContextRenderCase
MultiContextRenderCase::MultiContextRenderCase (EglTestContext& eglTestCtx, const char* name, const char* description, EGLint api, EGLint surfaceType, const eglu::FilterList& filters, int numContextsPerApi)
- : RenderCase (eglTestCtx, name, description, api, surfaceType, filters)
+ : RenderCase (eglTestCtx, name, description, surfaceType, filters)
, m_numContextsPerApi (numContextsPerApi)
+ , m_apiMask (api)
{
}
void MultiContextRenderCase::executeForSurface (EGLDisplay display, EGLSurface surface, const Config& config)
{
- const Library& egl = m_eglTestCtx.getLibrary();
+ const Library& egl = m_eglTestCtx.getLibrary();
+ const EGLint configApiMask = eglu::getConfigAttribInt(egl, display, config.config, EGL_RENDERABLE_TYPE);
vector<std::pair<EGLint, EGLContext> > contexts;
contexts.reserve(3*m_numContextsPerApi); // 3 types of contexts at maximum.
checkBuildClientAPISupport(m_apiMask);
+ // ConfigFilter should make sure that config always supports all of the APIs.
+ TCU_CHECK_INTERNAL((configApiMask & m_apiMask) == m_apiMask);
+
try
{
// Create contexts that will participate in rendering.
return (c.surfaceType() & Type) == Type;
}
+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 getDefaultRenderFilterLists (vector<RenderFilterList>& filterLists, const eglu::FilterList& baseFilters)
{
static const struct
filters << baseFilters
<< s_colorRules[colorNdx].filter
- << s_surfaceRules[surfaceNdx].filter;
+ << s_surfaceRules[surfaceNdx].filter
+ << isConformant;
filterLists.push_back(filters);
}
<< notColorBits<8, 8, 8, 0>
<< notColorBits<4, 4, 4, 4>
<< notColorBits<5, 5, 5, 1>
- << notColorBits<8, 8, 8, 8>;
+ << notColorBits<8, 8, 8, 8>
+ << isConformant
+ << notFloat;
filterLists.push_back(filters);
}