1 /*-------------------------------------------------------------------------
2 * drawElements Quality Program EGL Module
3 * ---------------------------------------
5 * Copyright 2017 The Android Open Source Project
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
21 * \brief Test KHR_wide_color
22 *//*--------------------------------------------------------------------*/
24 #include "teglWideColorTests.hpp"
26 #include "tcuImageCompare.hpp"
27 #include "tcuTestLog.hpp"
28 #include "tcuSurface.hpp"
29 #include "tcuTextureUtil.hpp"
31 #include "egluNativeWindow.hpp"
32 #include "egluStrUtil.hpp"
33 #include "egluUtil.hpp"
34 #include "egluConfigFilter.hpp"
36 #include "eglwLibrary.hpp"
37 #include "eglwEnums.hpp"
39 #include "gluDefs.hpp"
40 #include "gluRenderContext.hpp"
41 #include "gluShaderProgram.hpp"
43 #include "glwDefs.hpp"
44 #include "glwEnums.hpp"
45 #include "glwFunctions.hpp"
48 #include "deRandom.hpp"
50 #include "deStringUtil.hpp"
71 typedef tcu::Vec4 Color;
75 class ReferenceRenderer;
77 class WideColorTests : public TestCaseGroup
80 WideColorTests (EglTestContext& eglTestCtx);
84 WideColorTests (const WideColorTests&);
85 WideColorTests& operator= (const WideColorTests&);
88 class WideColorTest : public TestCase
97 WideColorTest (EglTestContext& eglTestCtx, const char* name, const char* description);
98 ~WideColorTest (void);
102 void checkPixelFloatSupport (void);
103 void checkColorSpaceSupport (void);
104 void checkDisplayP3Support (void);
105 void check1010102Support (void);
106 void checkFP16Support (void);
107 void checkSCRGBSupport (void);
108 void checkSCRGBLinearSupport (void);
111 void initEGLSurface (EGLConfig config);
112 void initEGLContext (EGLConfig config);
114 EGLDisplay m_eglDisplay;
121 ColoredRect (const IVec2& bottomLeft_, const IVec2& topRight_, const Color& color_);
127 ColoredRect::ColoredRect (const IVec2& bottomLeft_, const IVec2& topRight_, const Color& color_)
128 : bottomLeft (bottomLeft_)
129 , topRight (topRight_)
134 void clearColorScreen (const glw::Functions& gl, const Color& clearColor)
136 gl.clearColor(clearColor.x(), clearColor.y(), clearColor.z(), clearColor.w());
137 gl.clear(GL_COLOR_BUFFER_BIT);
140 float windowToDeviceCoordinates (int x, int length)
142 return (2.0f * float(x) / float(length)) - 1.0f;
148 GLES2Renderer (const glw::Functions& gl, int width, int height);
149 ~GLES2Renderer (void);
150 void render (const ColoredRect& coloredRect) const;
153 GLES2Renderer (const GLES2Renderer&);
154 GLES2Renderer& operator= (const GLES2Renderer&);
156 const glw::Functions& m_gl;
157 glu::ShaderProgram m_glProgram;
158 glw::GLuint m_coordLoc;
159 glw::GLuint m_colorLoc;
160 glw::GLuint m_bufWidth;
161 glw::GLuint m_bufHeight;
164 // generate sources for vertex and fragment buffer
165 glu::ProgramSources getSources (void)
167 const char* const vertexShaderSource =
168 "attribute mediump vec2 a_pos;\n"
169 "attribute mediump vec4 a_color;\n"
170 "varying mediump vec4 v_color;\n"
173 "\tv_color = a_color;\n"
174 "\tgl_Position = vec4(a_pos, 0.0, 1.0);\n"
177 const char* const fragmentShaderSource =
178 "varying mediump vec4 v_color;\n"
181 "\tgl_FragColor = v_color;\n"
184 return glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource);
187 GLES2Renderer::GLES2Renderer (const glw::Functions& gl, int width, int height)
189 , m_glProgram (gl, getSources())
190 , m_coordLoc ((glw::GLuint)-1)
191 , m_colorLoc ((glw::GLuint)-1)
193 , m_bufHeight (height)
195 m_colorLoc = m_gl.getAttribLocation(m_glProgram.getProgram(), "a_color");
196 m_coordLoc = m_gl.getAttribLocation(m_glProgram.getProgram(), "a_pos");
197 GLU_EXPECT_NO_ERROR(m_gl.getError(), "Failed to get attribute locations");
200 GLES2Renderer::~GLES2Renderer (void)
204 void GLES2Renderer::render (const struct ColoredRect &coloredRect) const
206 const float x1 = windowToDeviceCoordinates(coloredRect.bottomLeft.x(), m_bufWidth);
207 const float y1 = windowToDeviceCoordinates(coloredRect.bottomLeft.y(), m_bufHeight);
208 const float x2 = windowToDeviceCoordinates(coloredRect.topRight.x(), m_bufWidth);
209 const float y2 = windowToDeviceCoordinates(coloredRect.topRight.y(), m_bufHeight);
211 const glw::GLfloat coords[] =
222 const glw::GLfloat colors[] =
224 coloredRect.color.x(), coloredRect.color.y(), coloredRect.color.z(), coloredRect.color.w(),
225 coloredRect.color.x(), coloredRect.color.y(), coloredRect.color.z(), coloredRect.color.w(),
226 coloredRect.color.x(), coloredRect.color.y(), coloredRect.color.z(), coloredRect.color.w(),
228 coloredRect.color.x(), coloredRect.color.y(), coloredRect.color.z(), coloredRect.color.w(),
229 coloredRect.color.x(), coloredRect.color.y(), coloredRect.color.z(), coloredRect.color.w(),
230 coloredRect.color.x(), coloredRect.color.y(), coloredRect.color.z(), coloredRect.color.w(),
233 m_gl.useProgram(m_glProgram.getProgram());
234 GLU_EXPECT_NO_ERROR(m_gl.getError(), "glUseProgram() failed");
236 m_gl.enableVertexAttribArray(m_coordLoc);
237 m_gl.enableVertexAttribArray(m_colorLoc);
238 GLU_EXPECT_NO_ERROR(m_gl.getError(), "Failed to enable attributes");
240 m_gl.vertexAttribPointer(m_coordLoc, 4, GL_FLOAT, GL_FALSE, 0, coords);
241 m_gl.vertexAttribPointer(m_colorLoc, 4, GL_FLOAT, GL_TRUE, 0, colors);
242 GLU_EXPECT_NO_ERROR(m_gl.getError(), "Failed to set attribute pointers");
244 m_gl.drawArrays(GL_TRIANGLES, 0, DE_LENGTH_OF_ARRAY(coords)/4);
245 GLU_EXPECT_NO_ERROR(m_gl.getError(), "glDrawArrays(), failed");
247 m_gl.disableVertexAttribArray(m_coordLoc);
248 m_gl.disableVertexAttribArray(m_colorLoc);
249 GLU_EXPECT_NO_ERROR(m_gl.getError(), "Failed to disable attributes");
252 GLU_EXPECT_NO_ERROR(m_gl.getError(), "glUseProgram() failed");
255 class ReferenceRenderer
258 ReferenceRenderer (void);
260 ReferenceRenderer (const ReferenceRenderer&);
261 ReferenceRenderer& operator= (const ReferenceRenderer&);
264 WideColorTest::WideColorTest (EglTestContext& eglTestCtx, const char* name, const char* description)
265 : TestCase (eglTestCtx, name, description)
266 , m_eglDisplay (EGL_NO_DISPLAY)
270 WideColorTest::~WideColorTest (void)
275 void WideColorTest::init (void)
277 m_eglDisplay = eglu::getAndInitDisplay(m_eglTestCtx.getNativeDisplay());
279 m_eglTestCtx.initGLFunctions(&m_gl, glu::ApiType::es(2,0));
282 void WideColorTest::checkPixelFloatSupport (void)
284 const Library& egl = m_eglTestCtx.getLibrary();
286 if (!eglu::hasExtension(egl, m_eglDisplay, "EGL_EXT_pixel_format_float"))
287 TCU_THROW(NotSupportedError, "EGL_EXT_pixel_format_float is not supported");
290 void WideColorTest::checkColorSpaceSupport (void)
292 const Library& egl = m_eglTestCtx.getLibrary();
294 if (!eglu::hasExtension(egl, m_eglDisplay, "EGL_KHR_gl_colorspace"))
295 TCU_THROW(NotSupportedError, "EGL_KHR_gl_colorspace is not supported");
298 void WideColorTest::checkDisplayP3Support (void)
300 const Library& egl = m_eglTestCtx.getLibrary();
302 if (!eglu::hasExtension(egl, m_eglDisplay, "EGL_EXT_gl_colorspace_display_p3"))
303 TCU_THROW(NotSupportedError, "EGL_EXT_gl_colorspace_display_p3 is not supported");
306 void WideColorTest::checkSCRGBSupport (void)
308 const Library& egl = m_eglTestCtx.getLibrary();
310 if (!eglu::hasExtension(egl, m_eglDisplay, "EGL_EXT_gl_colorspace_scrgb"))
311 TCU_THROW(NotSupportedError, "EGL_EXT_gl_colorspace_scrgb is not supported");
314 void WideColorTest::checkSCRGBLinearSupport (void)
316 const Library& egl = m_eglTestCtx.getLibrary();
318 if (!eglu::hasExtension(egl, m_eglDisplay, "EGL_EXT_gl_colorspace_scrgb_linear"))
319 TCU_THROW(NotSupportedError, "EGL_EXT_gl_colorspace_scrgb_linear is not supported");
322 void WideColorTest::check1010102Support (void)
324 const Library& egl = m_eglTestCtx.getLibrary();
325 tcu::TestLog& log = m_testCtx.getLog();
327 const EGLint attribList[] =
329 EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
330 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
337 EGLint numConfigs = 0;
340 // Query from EGL implementation
341 EGLU_CHECK_CALL(egl, chooseConfig(m_eglDisplay, &attribList[0], DE_NULL, 0, &numConfigs));
345 log << tcu::TestLog::Message << "No configs returned." << tcu::TestLog::EndMessage;
346 TCU_THROW(NotSupportedError, "10:10:10:2 pixel format is not supported");
349 log << tcu::TestLog::Message << numConfigs << " configs returned" << tcu::TestLog::EndMessage;
351 EGLU_CHECK_CALL(egl, chooseConfig(m_eglDisplay, &attribList[0], &config, 1, &numConfigs));
354 log << tcu::TestLog::Message << "Fail, more configs returned than requested." << tcu::TestLog::EndMessage;
355 TCU_FAIL("Too many configs returned");
358 EGLint components[4];
360 EGLU_CHECK_CALL(egl, getConfigAttrib(m_eglDisplay, config, EGL_RED_SIZE, &components[0]));
361 EGLU_CHECK_CALL(egl, getConfigAttrib(m_eglDisplay, config, EGL_GREEN_SIZE, &components[1]));
362 EGLU_CHECK_CALL(egl, getConfigAttrib(m_eglDisplay, config, EGL_BLUE_SIZE, &components[2]));
363 EGLU_CHECK_CALL(egl, getConfigAttrib(m_eglDisplay, config, EGL_ALPHA_SIZE, &components[3]));
365 TCU_CHECK_MSG(components[0] == 10, "Missing 10bit deep red channel");
366 TCU_CHECK_MSG(components[1] == 10, "Missing 10bit deep green channel");
367 TCU_CHECK_MSG(components[2] == 10, "Missing 10bit deep blue channel");
368 TCU_CHECK_MSG(components[3] == 2, "Missing 2bit deep alpha channel");
371 void WideColorTest::checkFP16Support (void)
373 const Library& egl = m_eglTestCtx.getLibrary();
374 tcu::TestLog& log = m_testCtx.getLog();
375 EGLint numConfigs = 0;
378 const EGLint attribList[] =
380 EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
381 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
386 EGL_COLOR_COMPONENT_TYPE_EXT, EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT,
390 // Query from EGL implementation
391 EGLU_CHECK_CALL(egl, chooseConfig(m_eglDisplay, &attribList[0], DE_NULL, 0, &numConfigs));
395 log << tcu::TestLog::Message << "No configs returned." << tcu::TestLog::EndMessage;
396 TCU_THROW(NotSupportedError, "16:16:16:16 pixel format is not supported");
399 log << tcu::TestLog::Message << numConfigs << " configs returned" << tcu::TestLog::EndMessage;
401 EGLBoolean success = egl.chooseConfig(m_eglDisplay, &attribList[0], &config, 1, &numConfigs);
402 if (success != EGL_TRUE)
404 log << tcu::TestLog::Message << "Fail, eglChooseConfig returned an error." << tcu::TestLog::EndMessage;
405 TCU_FAIL("eglChooseConfig failed");
409 log << tcu::TestLog::Message << "Fail, more configs returned than requested." << tcu::TestLog::EndMessage;
410 TCU_FAIL("Too many configs returned");
413 EGLint components[4];
415 success = egl.getConfigAttrib(m_eglDisplay, config, EGL_RED_SIZE, &components[0]);
416 TCU_CHECK_MSG(success == EGL_TRUE, "eglGetConfigAttrib failed");
418 success = egl.getConfigAttrib(m_eglDisplay, config, EGL_GREEN_SIZE, &components[1]);
419 TCU_CHECK_MSG(success == EGL_TRUE, "eglGetConfigAttrib failed");
421 success = egl.getConfigAttrib(m_eglDisplay, config, EGL_BLUE_SIZE, &components[2]);
422 TCU_CHECK_MSG(success == EGL_TRUE, "eglGetConfigAttrib failed");
424 success = egl.getConfigAttrib(m_eglDisplay, config, EGL_ALPHA_SIZE, &components[3]);
425 TCU_CHECK_MSG(success == EGL_TRUE, "eglGetConfigAttrib failed");
428 TCU_CHECK_MSG(components[0] == 16, "Missing 16bit deep red channel");
429 TCU_CHECK_MSG(components[1] == 16, "Missing 16bit deep green channel");
430 TCU_CHECK_MSG(components[2] == 16, "Missing 16bit deep blue channel");
431 TCU_CHECK_MSG(components[3] == 16, "Missing 16bit deep alpha channel");
434 void WideColorTest::deinit (void)
436 const Library& egl = m_eglTestCtx.getLibrary();
438 if (m_eglDisplay != EGL_NO_DISPLAY)
440 egl.terminate(m_eglDisplay);
441 m_eglDisplay = EGL_NO_DISPLAY;
445 class WideColorFP16Test : public WideColorTest
448 WideColorFP16Test (EglTestContext& eglTestCtx, const char* name, const char* description);
451 void executeTest (void);
452 IterateResult iterate (void);
455 WideColorFP16Test::WideColorFP16Test (EglTestContext& eglTestCtx,
457 const char* description)
458 : WideColorTest(eglTestCtx, name, description)
463 void WideColorFP16Test::executeTest (void)
465 checkPixelFloatSupport();
469 TestCase::IterateResult WideColorFP16Test::iterate (void)
471 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
476 void WideColorFP16Test::init (void)
478 WideColorTest::init();
481 class WideColor1010102Test : public WideColorTest
484 WideColor1010102Test (EglTestContext& eglTestCtx,
486 const char* description);
488 void executeTest (void);
489 IterateResult iterate (void);
492 WideColor1010102Test::WideColor1010102Test (EglTestContext& eglTestCtx, const char* name, const char* description)
493 : WideColorTest(eglTestCtx, name, description)
497 void WideColor1010102Test::executeTest (void)
499 check1010102Support();
502 TestCase::IterateResult WideColor1010102Test::iterate (void)
504 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
514 Iteration(float s, float i, int c)
515 : start(s), increment(i), iterationCount(c) {}
518 class WideColorSurfaceTest : public WideColorTest
521 WideColorSurfaceTest (EglTestContext& eglTestCtx,
523 const char* description,
524 const EGLint* attribList,
526 const std::vector<Iteration>& iterations);
529 void executeTest (void);
530 IterateResult iterate (void);
533 void readPixels (const glw::Functions& gl, float* dataPtr);
534 void readPixels (const glw::Functions& gl, deUint32* dataPtr);
535 void readPixels (const glw::Functions& gl, deUint8* dataPtr);
536 deUint32 expectedUint10 (float reference);
537 deUint32 expectedUint2 (float reference);
538 deUint8 expectedUint8 (float reference);
539 deUint8 expectedAlpha8 (float reference);
540 bool checkWithThreshold8 (deUint8 value, deUint8 reference, deUint8 threshold = 1);
541 bool checkWithThreshold10 (deUint32 value, deUint32 reference, deUint32 threshold = 1);
542 bool checkWithThresholdFloat (float value, float reference, float threshold);
543 void doClearTest (EGLSurface surface);
544 void testPixels (float reference, float increment);
545 void writeEglConfig (EGLConfig config);
548 std::vector<EGLint> m_attribList;
549 EGLConfig m_eglConfig;
550 EGLint m_surfaceType;
551 EGLint m_componentType;
554 const std::vector<struct Iteration> m_iterations;
555 std::stringstream m_debugLog;
558 WideColorSurfaceTest::WideColorSurfaceTest (EglTestContext& eglTestCtx, const char* name, const char* description, const EGLint* attribList, EGLint colorSpace, const std::vector<struct Iteration>& iterations)
559 : WideColorTest (eglTestCtx, name, description)
560 , m_colorSpace (colorSpace)
561 , m_iterations (iterations)
564 while (attribList[idx] != EGL_NONE)
566 if (attribList[idx] == EGL_COLOR_COMPONENT_TYPE_EXT)
568 m_componentType = attribList[idx + 1];
570 else if (attribList[idx] == EGL_SURFACE_TYPE)
572 m_surfaceType = attribList[idx+1];
574 else if (attribList[idx] == EGL_RED_SIZE)
576 m_redSize = attribList[idx + 1];
578 m_attribList.push_back(attribList[idx++]);
579 m_attribList.push_back(attribList[idx++]);
581 m_attribList.push_back(EGL_NONE);
584 void WideColorSurfaceTest::init (void)
586 const Library& egl = m_eglTestCtx.getLibrary();
587 tcu::TestLog& log = m_testCtx.getLog();
589 WideColorTest::init();
591 // Only check for pixel format required for this specific run
592 // If not available, check will abort test with "NotSupported"
596 check1010102Support();
599 checkPixelFloatSupport();
604 if (m_colorSpace != EGL_NONE && !eglu::hasExtension(egl, m_eglDisplay, "EGL_KHR_gl_colorspace"))
605 TCU_THROW(NotSupportedError, "EGL_KHR_gl_colorspace is not supported");
607 switch (m_colorSpace) {
608 case EGL_GL_COLORSPACE_SRGB_KHR:
609 checkColorSpaceSupport();
611 case EGL_GL_COLORSPACE_DISPLAY_P3_EXT:
612 checkDisplayP3Support();
614 case EGL_GL_COLORSPACE_SCRGB_EXT:
617 case EGL_GL_COLORSPACE_SCRGB_LINEAR_EXT:
618 checkSCRGBLinearSupport();
624 EGLint numConfigs = 0;
626 // Query from EGL implementation
627 EGLU_CHECK_CALL(egl, chooseConfig(m_eglDisplay, &m_attribList[0], DE_NULL, 0, &numConfigs));
631 log << tcu::TestLog::Message << "No configs returned." << tcu::TestLog::EndMessage;
632 TCU_FAIL("No configs returned");
635 log << tcu::TestLog::Message << numConfigs << " configs returned" << tcu::TestLog::EndMessage;
637 EGLBoolean success = egl.chooseConfig(m_eglDisplay, &m_attribList[0], &m_eglConfig, 1, &numConfigs);
638 if (success != EGL_TRUE)
640 log << tcu::TestLog::Message << "Fail, eglChooseConfig returned an error." << tcu::TestLog::EndMessage;
641 TCU_FAIL("eglChooseConfig failed");
645 log << tcu::TestLog::Message << "Fail, more configs returned than requested." << tcu::TestLog::EndMessage;
646 TCU_FAIL("Too many configs returned");
649 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
651 writeEglConfig(m_eglConfig);
655 void WideColorSurfaceTest::readPixels (const glw::Functions& gl, float* dataPtr)
657 gl.readPixels(0, 0, 1, 1, GL_RGBA, GL_FLOAT, dataPtr);
658 GLU_EXPECT_NO_ERROR(m_gl.getError(), "glReadPixels with floats");
661 void WideColorSurfaceTest::readPixels (const glw::Functions& gl, deUint32 *dataPtr)
663 gl.readPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, dataPtr);
664 GLU_EXPECT_NO_ERROR(m_gl.getError(), "glReadPixels with RGBA_1010102 (32bits)");
667 void WideColorSurfaceTest::readPixels (const glw::Functions& gl, deUint8 *dataPtr)
669 gl.readPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, dataPtr);
670 GLU_EXPECT_NO_ERROR(m_gl.getError(), "glReadPixels with RGBA_8888 (8 bit components)");
673 void WideColorSurfaceTest::writeEglConfig (EGLConfig config)
675 const Library& egl = m_eglTestCtx.getLibrary();
676 tcu::TestLog& log = m_testCtx.getLog();
677 qpEglConfigInfo info;
680 info.bufferSize = eglu::getConfigAttribInt(egl, m_eglDisplay, config, EGL_BUFFER_SIZE);
682 info.redSize = eglu::getConfigAttribInt(egl, m_eglDisplay, config, EGL_RED_SIZE);
684 info.greenSize = eglu::getConfigAttribInt(egl, m_eglDisplay, config, EGL_GREEN_SIZE);
686 info.blueSize = eglu::getConfigAttribInt(egl, m_eglDisplay, config, EGL_BLUE_SIZE);
688 info.luminanceSize = eglu::getConfigAttribInt(egl, m_eglDisplay, config, EGL_LUMINANCE_SIZE);
690 info.alphaSize = eglu::getConfigAttribInt(egl, m_eglDisplay, config, EGL_ALPHA_SIZE);
692 info.alphaMaskSize = eglu::getConfigAttribInt(egl, m_eglDisplay, config, EGL_ALPHA_MASK_SIZE);
694 val = eglu::getConfigAttribInt(egl, m_eglDisplay, config, EGL_BIND_TO_TEXTURE_RGB);
695 info.bindToTextureRGB = val == EGL_TRUE ? true : false;
697 val = eglu::getConfigAttribInt(egl, m_eglDisplay, config, EGL_BIND_TO_TEXTURE_RGBA);
698 info.bindToTextureRGBA = val == EGL_TRUE ? true : false;
700 val = eglu::getConfigAttribInt(egl, m_eglDisplay, config, EGL_COLOR_BUFFER_TYPE);
701 std::string colorBufferType = de::toString(eglu::getColorBufferTypeStr(val));
702 info.colorBufferType = colorBufferType.c_str();
704 val = eglu::getConfigAttribInt(egl, m_eglDisplay, config, EGL_CONFIG_CAVEAT);
705 std::string caveat = de::toString(eglu::getConfigCaveatStr(val));
706 info.configCaveat = caveat.c_str();
708 info.configID = eglu::getConfigAttribInt(egl, m_eglDisplay, config, EGL_CONFIG_ID);
710 val = eglu::getConfigAttribInt(egl, m_eglDisplay, config, EGL_CONFORMANT);
711 std::string conformant = de::toString(eglu::getAPIBitsStr(val));
712 info.conformant = conformant.c_str();
714 info.depthSize = eglu::getConfigAttribInt(egl, m_eglDisplay, config, EGL_DEPTH_SIZE);
716 info.level = eglu::getConfigAttribInt(egl, m_eglDisplay, config, EGL_LEVEL);
718 info.maxPBufferWidth = eglu::getConfigAttribInt(egl, m_eglDisplay, config, EGL_MAX_PBUFFER_WIDTH);
720 info.maxPBufferHeight = eglu::getConfigAttribInt(egl, m_eglDisplay, config, EGL_MAX_PBUFFER_HEIGHT);
722 info.maxPBufferPixels = eglu::getConfigAttribInt(egl, m_eglDisplay, config, EGL_MAX_PBUFFER_PIXELS);
724 info.maxSwapInterval = eglu::getConfigAttribInt(egl, m_eglDisplay, config, EGL_MAX_SWAP_INTERVAL);
726 info.minSwapInterval = eglu::getConfigAttribInt(egl, m_eglDisplay, config, EGL_MIN_SWAP_INTERVAL);
728 val = eglu::getConfigAttribInt(egl, m_eglDisplay, config, EGL_NATIVE_RENDERABLE);
729 info.nativeRenderable = val == EGL_TRUE ? true : false;
731 val = eglu::getConfigAttribInt(egl, m_eglDisplay, config, EGL_RENDERABLE_TYPE);
732 std::string renderableTypes = de::toString(eglu::getAPIBitsStr(val));
733 info.renderableType = renderableTypes.c_str();
735 info.sampleBuffers = eglu::getConfigAttribInt(egl, m_eglDisplay, config, EGL_SAMPLE_BUFFERS);
737 info.samples = eglu::getConfigAttribInt(egl, m_eglDisplay, config, EGL_SAMPLES);
739 info.stencilSize = eglu::getConfigAttribInt(egl, m_eglDisplay, config, EGL_STENCIL_SIZE);
741 val = eglu::getConfigAttribInt(egl, m_eglDisplay, config, EGL_SURFACE_TYPE);
742 std::string surfaceTypes = de::toString(eglu::getSurfaceBitsStr(val));
743 info.surfaceTypes = surfaceTypes.c_str();
745 val = eglu::getConfigAttribInt(egl, m_eglDisplay, config, EGL_TRANSPARENT_TYPE);
746 std::string transparentType = de::toString(eglu::getTransparentTypeStr(val));
747 info.transparentType = transparentType.c_str();
749 info.transparentRedValue = eglu::getConfigAttribInt(egl, m_eglDisplay, config, EGL_TRANSPARENT_RED_VALUE);
751 info.transparentGreenValue = eglu::getConfigAttribInt(egl, m_eglDisplay, config, EGL_TRANSPARENT_GREEN_VALUE);
753 info.transparentBlueValue = eglu::getConfigAttribInt(egl, m_eglDisplay, config, EGL_TRANSPARENT_BLUE_VALUE);
755 log.writeEglConfig(&info);
758 deUint32 WideColorSurfaceTest::expectedUint10 (float reference)
766 else if (reference > 1.0)
772 expected = static_cast<deUint32>(deRound(reference * 1023.0));
778 deUint32 WideColorSurfaceTest::expectedUint2 (float reference)
786 else if (reference > 1.0)
792 expected = static_cast<deUint32>(deRound(reference * 3.0));
798 deUint8 WideColorSurfaceTest::expectedUint8 (float reference)
805 else if (reference >= 1.0)
811 // Apply sRGB transfer function when colorspace is sRGB and pixel component
812 // size is 8 bits (which is why we are here in expectedUint8).
813 if (m_colorSpace == EGL_GL_COLORSPACE_SRGB_KHR)
817 if (reference <= 0.0031308)
819 srgbReference = 12.92f * reference;
823 float powRef = deFloatPow(reference, (1.0f/2.4f));
824 srgbReference = (1.055f * powRef) - 0.055f;
826 expected = static_cast<deUint8>(deRound(srgbReference * 255.0));
830 expected = static_cast<deUint8>(deRound(reference * 255.0));
836 deUint8 WideColorSurfaceTest::expectedAlpha8 (float reference)
843 else if (reference >= 1.0)
849 // The sRGB transfer function is not applied to alpha
850 expected = static_cast<deUint8>(deRound(reference * 255.0));
855 // Return true for value out of range (fail)
856 bool WideColorSurfaceTest::checkWithThreshold8(deUint8 value, deUint8 reference, deUint8 threshold)
858 const deUint8 low = reference >= threshold ? static_cast<deUint8>(reference - threshold) : 0;
859 const deUint8 high = reference <= (255 - threshold) ? static_cast<deUint8>(reference + threshold) : 255;
860 return !((value >= low) && (value <= high));
863 bool WideColorSurfaceTest::checkWithThreshold10(deUint32 value, deUint32 reference, deUint32 threshold)
865 const deUint32 low = reference >= threshold ? reference - threshold : 0;
866 const deUint32 high = reference <= (1023 - threshold) ? reference + threshold : 1023;
867 return !((value >= low) && (value <= high));
870 bool WideColorSurfaceTest::checkWithThresholdFloat(float value, float reference, float threshold)
872 const float low = reference - threshold;
873 const float high = reference + threshold;
874 return !((value >= low) && (value <= high));
877 void WideColorSurfaceTest::testPixels (float reference, float increment)
879 tcu::TestLog& log = m_testCtx.getLog();
881 if (m_componentType == EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT)
884 const float expected[4] =
887 reference + increment,
888 reference - increment,
889 reference + 2 * increment
891 readPixels(m_gl, pixels);
893 if (checkWithThresholdFloat(pixels[0], expected[0], increment) ||
894 checkWithThresholdFloat(pixels[1], expected[1], increment) ||
895 checkWithThresholdFloat(pixels[2], expected[2], increment) ||
896 checkWithThresholdFloat(pixels[3], expected[3], increment))
898 if (m_debugLog.str().size() > 0)
900 log << tcu::TestLog::Message
901 << "Prior passing tests\n"
903 << tcu::TestLog::EndMessage;
906 log << tcu::TestLog::Message
907 << "Image comparison failed: "
908 << "reference = " << reference
909 << ", expected = " << expected[0]
910 << ":" << expected[1]
911 << ":" << expected[2]
912 << ":" << expected[3]
913 << ", result = " << pixels[0]
917 << tcu::TestLog::EndMessage;
918 m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Color test failed");
922 // Pixel matches expected value
923 m_debugLog << "Image comparison passed: "
924 << "reference = " << reference
925 << ", result = " << pixels[0]
932 else if (m_redSize > 8)
935 readPixels(m_gl, buffer);
937 deUint32 expected[4];
939 pixels[0] = buffer[0] & 0x3ff;
940 pixels[1] = (buffer[0] >> 10) & 0x3ff;
941 pixels[2] = (buffer[0] >> 20) & 0x3ff;
942 pixels[3] = (buffer[0] >> 30) & 0x3;
944 expected[0] = expectedUint10(reference);
945 expected[1] = expectedUint10(reference + increment);
946 expected[2] = expectedUint10(reference - increment);
947 expected[3] = expectedUint2(reference + 2 * increment);
948 if (checkWithThreshold10(pixels[0], expected[0]) || checkWithThreshold10(pixels[1], expected[1])
949 || checkWithThreshold10(pixels[2], expected[2]) || checkWithThreshold10(pixels[3], expected[3]))
951 if (m_debugLog.str().size() > 0) {
952 log << tcu::TestLog::Message
953 << "Prior passing tests\n"
955 << tcu::TestLog::EndMessage;
958 log << tcu::TestLog::Message
959 << "Image comparison failed: "
960 << "reference = " << reference
961 << ", expected = " << static_cast<deUint32>(expected[0])
962 << ":" << static_cast<deUint32>(expected[1])
963 << ":" << static_cast<deUint32>(expected[2])
964 << ":" << static_cast<deUint32>(expected[3])
965 << ", result = " << static_cast<deUint32>(pixels[0])
966 << ":" << static_cast<deUint32>(pixels[1])
967 << ":" << static_cast<deUint32>(pixels[2])
968 << ":" << static_cast<deUint32>(pixels[3])
969 << tcu::TestLog::EndMessage;
970 m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Color test failed");
974 // Pixel matches expected value
975 m_debugLog << "Image comparison passed: "
976 << "reference = " << reference
977 << ", result = " << static_cast<deUint32>(pixels[0])
978 << ":" << static_cast<deUint32>(pixels[1])
979 << ":" << static_cast<deUint32>(pixels[2])
980 << ":" << static_cast<deUint32>(pixels[3])
988 readPixels(m_gl, pixels);
990 expected[0] = expectedUint8(reference);
991 expected[1] = expectedUint8(reference + increment);
992 expected[2] = expectedUint8(reference - increment);
993 expected[3] = expectedAlpha8(reference + 2 * increment);
994 if (checkWithThreshold8(pixels[0], expected[0]) || checkWithThreshold8(pixels[1], expected[1])
995 || checkWithThreshold8(pixels[2], expected[2]) || checkWithThreshold8(pixels[3], expected[3]))
997 if (m_debugLog.str().size() > 0) {
998 log << tcu::TestLog::Message
999 << "(C)Prior passing tests\n"
1001 << tcu::TestLog::EndMessage;
1004 log << tcu::TestLog::Message
1005 << "Image comparison failed: "
1006 << "reference = " << reference
1007 << ", expected = " << static_cast<deUint32>(expected[0])
1008 << ":" << static_cast<deUint32>(expected[1])
1009 << ":" << static_cast<deUint32>(expected[2])
1010 << ":" << static_cast<deUint32>(expected[3])
1011 << ", result = " << static_cast<deUint32>(pixels[0])
1012 << ":" << static_cast<deUint32>(pixels[1])
1013 << ":" << static_cast<deUint32>(pixels[2])
1014 << ":" << static_cast<deUint32>(pixels[3])
1015 << tcu::TestLog::EndMessage;
1016 m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Color test failed");
1020 // Pixel matches expected value
1021 m_debugLog << "Image comparison passed: "
1022 << "reference = " << reference
1023 << ", result = " << static_cast<deUint32>(pixels[0])
1024 << ":" << static_cast<deUint32>(pixels[1])
1025 << ":" << static_cast<deUint32>(pixels[2])
1026 << ":" << static_cast<deUint32>(pixels[3])
1032 void WideColorSurfaceTest::doClearTest (EGLSurface surface)
1034 tcu::TestLog& log = m_testCtx.getLog();
1035 const Library& egl = m_eglTestCtx.getLibrary();
1036 const EGLint attribList[] =
1038 EGL_CONTEXT_CLIENT_VERSION, 2,
1041 EGLContext eglContext = egl.createContext(m_eglDisplay, m_eglConfig, EGL_NO_CONTEXT, attribList);
1042 EGLU_CHECK_MSG(egl, "eglCreateContext");
1044 egl.makeCurrent(m_eglDisplay, surface, surface, eglContext);
1045 EGLU_CHECK_MSG(egl, "eglMakeCurrent");
1048 // put gles2Renderer inside it's own scope so that it's cleaned
1049 // up before we hit the destroyContext
1050 const GLES2Renderer gles2Renderer(m_gl, 128, 128);
1052 std::vector<Iteration>::const_iterator it; // declare an Iterator to a vector of strings
1053 log << tcu::TestLog::Message << "m_iterations.count = " << m_iterations.size() << tcu::TestLog::EndMessage;
1054 for(it = m_iterations.begin() ; it < m_iterations.end(); it++)
1056 float reference = it->start;
1057 log << tcu::TestLog::Message << "start = " << it->start
1058 << tcu::TestLog::EndMessage;
1059 log << tcu::TestLog::Message
1060 << "increment = " << it->increment
1061 << tcu::TestLog::EndMessage;
1062 log << tcu::TestLog::Message
1063 << "count = " << it->iterationCount
1064 << tcu::TestLog::EndMessage;
1066 for (int iterationCount = 0; iterationCount < it->iterationCount; iterationCount++)
1068 const Color clearColor(reference, reference + it->increment, reference - it->increment, reference + 2 * it->increment);
1070 clearColorScreen(m_gl, clearColor);
1071 GLU_EXPECT_NO_ERROR(m_gl.getError(), "Clear to test value");
1073 testPixels(reference, it->increment);
1075 // reset buffer contents so that we know render below did something
1076 const Color clearColor2(1.0f - reference, 1.0f, 1.0f, 1.0f);
1077 clearColorScreen(m_gl, clearColor2);
1078 GLU_EXPECT_NO_ERROR(m_gl.getError(), "Clear to 1.0f - reference value");
1080 const ColoredRect coloredRect (IVec2(0.0f, 0.0f), IVec2(1.0f, 1.0f), clearColor);
1081 gles2Renderer.render(coloredRect);
1082 testPixels(reference, it->increment);
1084 reference += it->increment;
1087 EGLU_CHECK_CALL(egl, swapBuffers(m_eglDisplay, surface));
1091 // disconnect surface & context so they can be destroyed when
1092 // this function exits.
1093 EGLU_CHECK_CALL(egl, makeCurrent(m_eglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
1095 egl.destroyContext(m_eglDisplay, eglContext);
1098 void WideColorSurfaceTest::executeTest (void)
1100 tcu::TestLog& log = m_testCtx.getLog();
1101 const Library& egl = m_eglTestCtx.getLibrary();
1102 const eglu::NativeDisplayFactory& displayFactory = m_eglTestCtx.getNativeDisplayFactory();
1103 eglu::NativeDisplay& nativeDisplay = m_eglTestCtx.getNativeDisplay();
1104 egl.bindAPI(EGL_OPENGL_ES_API);
1106 if (m_surfaceType & EGL_PBUFFER_BIT)
1108 log << tcu::TestLog::Message << "Test Pbuffer" << tcu::TestLog::EndMessage;
1110 std::vector<EGLint> attribs;
1111 attribs.push_back(EGL_WIDTH);
1112 attribs.push_back(128);
1113 attribs.push_back(EGL_HEIGHT);
1114 attribs.push_back(128);
1115 if (m_colorSpace != EGL_NONE)
1117 attribs.push_back(EGL_GL_COLORSPACE_KHR);
1118 attribs.push_back(m_colorSpace);
1120 attribs.push_back(EGL_NONE);
1121 attribs.push_back(EGL_NONE);
1122 const EGLSurface surface = egl.createPbufferSurface(m_eglDisplay, m_eglConfig, attribs.data());
1123 if ((surface == EGL_NO_SURFACE) && (egl.getError() == EGL_BAD_MATCH))
1125 TCU_THROW(NotSupportedError, "Colorspace is not supported with this format");
1127 TCU_CHECK(surface != EGL_NO_SURFACE);
1128 EGLU_CHECK_MSG(egl, "eglCreatePbufferSurface()");
1130 doClearTest(surface);
1132 egl.destroySurface(m_eglDisplay, surface);
1133 EGLU_CHECK_MSG(egl, "eglDestroySurface()");
1135 else if (m_surfaceType & EGL_WINDOW_BIT)
1137 log << tcu::TestLog::Message << "Test Window" << tcu::TestLog::EndMessage;
1139 const eglu::NativeWindowFactory& windowFactory = eglu::selectNativeWindowFactory(displayFactory, m_testCtx.getCommandLine());
1141 de::UniquePtr<eglu::NativeWindow> window (windowFactory.createWindow(&nativeDisplay, m_eglDisplay, m_eglConfig, DE_NULL, eglu::WindowParams(128, 128, eglu::parseWindowVisibility(m_testCtx.getCommandLine()))));
1142 std::vector<EGLAttrib> attribs;
1143 if (m_colorSpace != EGL_NONE)
1145 attribs.push_back(EGL_GL_COLORSPACE_KHR);
1146 attribs.push_back(m_colorSpace);
1148 attribs.push_back(EGL_NONE);
1149 attribs.push_back(EGL_NONE);
1154 surface = eglu::createWindowSurface(nativeDisplay, *window, m_eglDisplay, m_eglConfig, attribs.data());
1156 catch (const eglu::Error& error)
1158 if (error.getError() == EGL_BAD_MATCH)
1159 TCU_THROW(NotSupportedError, "createWindowSurface is not supported for this config");
1163 TCU_CHECK(surface != EGL_NO_SURFACE);
1164 EGLU_CHECK_MSG(egl, "eglCreateWindowSurface()");
1166 doClearTest(surface);
1168 egl.destroySurface(m_eglDisplay, surface);
1169 EGLU_CHECK_MSG(egl, "eglDestroySurface()");
1171 else if (m_surfaceType & EGL_PIXMAP_BIT)
1173 log << tcu::TestLog::Message << "Test Pixmap" << tcu::TestLog::EndMessage;
1175 const eglu::NativePixmapFactory& pixmapFactory = eglu::selectNativePixmapFactory(displayFactory, m_testCtx.getCommandLine());
1177 de::UniquePtr<eglu::NativePixmap> pixmap (pixmapFactory.createPixmap(&nativeDisplay, m_eglDisplay, m_eglConfig, DE_NULL, 128, 128));
1178 const EGLSurface surface = eglu::createPixmapSurface(nativeDisplay, *pixmap, m_eglDisplay, m_eglConfig, DE_NULL);
1179 TCU_CHECK(surface != EGL_NO_SURFACE);
1180 EGLU_CHECK_MSG(egl, "eglCreatePixmapSurface()");
1182 doClearTest(surface);
1184 egl.destroySurface(m_eglDisplay, surface);
1185 EGLU_CHECK_MSG(egl, "eglDestroySurface()");
1188 TCU_FAIL("No valid surface types supported in config");
1191 TestCase::IterateResult WideColorSurfaceTest::iterate (void)
1193 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
1200 WideColorTests::WideColorTests (EglTestContext& eglTestCtx)
1201 : TestCaseGroup(eglTestCtx, "wide_color", "Wide Color tests")
1205 void WideColorTests::init (void)
1207 addChild(new WideColorFP16Test(m_eglTestCtx, "fp16", "Verify that FP16 pixel format is present"));
1208 addChild(new WideColor1010102Test(m_eglTestCtx, "1010102", "Check if 1010102 pixel format is present"));
1210 // This is an increment FP16 can do between -1.0 to 1.0
1211 const float fp16Increment1 = deFloatPow(2.0, -11.0);
1212 // This is an increment FP16 can do between 1.0 to 2.0
1213 const float fp16Increment2 = deFloatPow(2.0, -10.0);
1215 const EGLint windowAttribListFP16[] =
1217 EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
1218 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
1223 EGL_COLOR_COMPONENT_TYPE_EXT, EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT,
1227 std::vector<Iteration> fp16Iterations;
1228 // -0.333251953125f ~ -1/3 as seen in FP16
1229 fp16Iterations.push_back(Iteration(-0.333251953125f, fp16Increment1, 10));
1231 fp16Iterations.push_back( Iteration(-fp16Increment1 * 5.0f, fp16Increment1, 10));
1232 // test crossing 1.0
1233 fp16Iterations.push_back( Iteration(1.0f - fp16Increment2 * 5.0f, fp16Increment2, 10));
1234 addChild(new WideColorSurfaceTest(m_eglTestCtx, "window_fp16_default_colorspace", "FP16 window surface has FP16 pixels in it", windowAttribListFP16, EGL_NONE, fp16Iterations));
1235 addChild(new WideColorSurfaceTest(m_eglTestCtx, "window_fp16_colorspace_srgb", "FP16 window surface, explicit sRGB colorspace", windowAttribListFP16, EGL_GL_COLORSPACE_SRGB_KHR, fp16Iterations));
1236 addChild(new WideColorSurfaceTest(m_eglTestCtx, "window_fp16_colorspace_p3", "FP16 window surface, explicit Display-P3 colorspace", windowAttribListFP16, EGL_GL_COLORSPACE_DISPLAY_P3_EXT, fp16Iterations));
1237 addChild(new WideColorSurfaceTest(m_eglTestCtx, "window_fp16_colorspace_scrgb", "FP16 window surface, explicit scRGB colorspace", windowAttribListFP16, EGL_GL_COLORSPACE_SCRGB_EXT, fp16Iterations));
1238 addChild(new WideColorSurfaceTest(m_eglTestCtx, "window_fp16_colorspace_scrgb_linear", "FP16 window surface, explicit scRGB linear colorspace", windowAttribListFP16, EGL_GL_COLORSPACE_SCRGB_LINEAR_EXT, fp16Iterations));
1240 const EGLint pbufferAttribListFP16[] =
1242 EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
1243 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
1248 EGL_COLOR_COMPONENT_TYPE_EXT, EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT,
1251 addChild(new WideColorSurfaceTest(m_eglTestCtx, "pbuffer_fp16_default_colorspace", "FP16 pbuffer surface has FP16 pixels in it", pbufferAttribListFP16, EGL_NONE, fp16Iterations));
1252 addChild(new WideColorSurfaceTest(m_eglTestCtx, "pbuffer_fp16_colorspace_srgb", "FP16 pbuffer surface, explicit sRGB colorspace", pbufferAttribListFP16, EGL_GL_COLORSPACE_SRGB_KHR, fp16Iterations));
1253 addChild(new WideColorSurfaceTest(m_eglTestCtx, "pbuffer_fp16_colorspace_p3", "FP16 pbuffer surface, explicit Display-P3 colorspace", pbufferAttribListFP16, EGL_GL_COLORSPACE_DISPLAY_P3_EXT, fp16Iterations));
1254 addChild(new WideColorSurfaceTest(m_eglTestCtx, "pbuffer_fp16_colorspace_scrgb", "FP16 pbuffer surface, explicit scRGB colorspace", pbufferAttribListFP16, EGL_GL_COLORSPACE_SCRGB_EXT, fp16Iterations));
1255 addChild(new WideColorSurfaceTest(m_eglTestCtx, "pbuffer_fp16_colorspace_scrgb_linear", "FP16 pbuffer surface, explicit scRGB linear colorspace", pbufferAttribListFP16, EGL_GL_COLORSPACE_SCRGB_LINEAR_EXT, fp16Iterations));
1257 const EGLint windowAttribList1010102[] =
1259 EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
1260 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
1268 std::vector<Iteration> int1010102Iterations;
1269 // -0.333251953125f ~ -1/3 as seen in fp16
1270 // Negative values will be 0 on read with fixed point pixel formats
1271 int1010102Iterations.push_back(Iteration(-0.333251953125f, fp16Increment1, 10));
1273 int1010102Iterations.push_back(Iteration(-fp16Increment1 * 5.0f, fp16Increment1, 10));
1274 // test crossing 1.0
1275 // Values > 1.0 will be truncated to 1.0 with fixed point pixel formats
1276 int1010102Iterations.push_back(Iteration(1.0f - fp16Increment2 * 5.0f, fp16Increment2, 10));
1277 addChild(new WideColorSurfaceTest(m_eglTestCtx, "window_1010102_colorspace_default", "1010102 Window surface, default (sRGB) colorspace", windowAttribList1010102, EGL_NONE, int1010102Iterations));
1278 addChild(new WideColorSurfaceTest(m_eglTestCtx, "window_1010102_colorspace_srgb", "1010102 Window surface, explicit sRGB colorspace", windowAttribList1010102, EGL_GL_COLORSPACE_SRGB_KHR, int1010102Iterations));
1279 addChild(new WideColorSurfaceTest(m_eglTestCtx, "window_1010102_colorspace_p3", "1010102 Window surface, explicit Display-P3 colorspace", windowAttribList1010102, EGL_GL_COLORSPACE_DISPLAY_P3_EXT, int1010102Iterations));
1281 const EGLint pbufferAttribList1010102[] =
1283 EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
1284 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
1291 addChild(new WideColorSurfaceTest(m_eglTestCtx, "pbuffer_1010102_colorspace_default", "1010102 pbuffer surface, default (sRGB) colorspace", pbufferAttribList1010102, EGL_NONE, int1010102Iterations));
1292 addChild(new WideColorSurfaceTest(m_eglTestCtx, "pbuffer_1010102_colorspace_srgb", "1010102 pbuffer surface, explicit sRGB colorspace", pbufferAttribList1010102, EGL_GL_COLORSPACE_SRGB_KHR, int1010102Iterations));
1293 addChild(new WideColorSurfaceTest(m_eglTestCtx, "pbuffer_1010102_colorspace_p3", "1010102 pbuffer surface, explicit Display-P3 colorspace", pbufferAttribList1010102, EGL_GL_COLORSPACE_DISPLAY_P3_EXT, int1010102Iterations));
1295 const EGLint windowAttribList8888[] =
1297 EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
1298 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
1306 std::vector<Iteration> int8888Iterations;
1307 // -0.333251953125f ~ -1/3 as seen in fp16
1308 // Negative values will be 0 on read with fixed point pixel formats
1309 int8888Iterations.push_back(Iteration(-0.333251953125f, fp16Increment1, 10));
1311 int8888Iterations.push_back(Iteration(-fp16Increment1 * 5.0f, fp16Increment1, 10));
1312 // test crossing 1.0
1313 // Values > 1.0 will be truncated to 1.0 with fixed point pixel formats
1314 int8888Iterations.push_back(Iteration(1.0f - fp16Increment2 * 5.0f, fp16Increment2, 10));
1315 addChild(new WideColorSurfaceTest(m_eglTestCtx, "window_8888_colorspace_default", "8888 window surface, default (sRGB) colorspace", windowAttribList8888, EGL_NONE, int8888Iterations));
1316 addChild(new WideColorSurfaceTest(m_eglTestCtx, "window_8888_colorspace_srgb", "8888 window surface, explicit sRGB colorspace", windowAttribList8888, EGL_GL_COLORSPACE_SRGB_KHR, int8888Iterations));
1317 addChild(new WideColorSurfaceTest(m_eglTestCtx, "window_8888_colorspace_p3", "8888 window surface, explicit Display-P3 colorspace", windowAttribList8888, EGL_GL_COLORSPACE_DISPLAY_P3_EXT, int8888Iterations));
1319 const EGLint pbufferAttribList8888[] =
1321 EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
1322 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
1329 addChild(new WideColorSurfaceTest(m_eglTestCtx, "pbuffer_8888_colorspace_default", "8888 pbuffer surface, default (sRGB) colorspace", pbufferAttribList8888, EGL_NONE, int8888Iterations));
1330 addChild(new WideColorSurfaceTest(m_eglTestCtx, "pbuffer_8888_colorspace_srgb", "8888 pbuffer surface, explicit sRGB colorspace", pbufferAttribList8888, EGL_GL_COLORSPACE_SRGB_KHR, int8888Iterations));
1331 addChild(new WideColorSurfaceTest(m_eglTestCtx, "pbuffer_8888_colorspace_p3", "8888 pbuffer surface, explicit Display-P3 colorspace", pbufferAttribList8888, EGL_GL_COLORSPACE_DISPLAY_P3_EXT, int8888Iterations));
1334 TestCaseGroup* createWideColorTests (EglTestContext& eglTestCtx)
1336 return new WideColorTests(eglTestCtx);