/*------------------------------------------------------------------------- * drawElements Quality Program OpenGL ES 2.0 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 Prerequisite tests. *//*--------------------------------------------------------------------*/ #include "es2fPrerequisiteTests.hpp" #include "deRandom.h" #include "tcuRGBA.hpp" #include "tcuSurface.hpp" #include "tcuTextureUtil.hpp" #include "tcuTestLog.hpp" #include "tcuRenderTarget.hpp" #include "gluPixelTransfer.hpp" #include "gluStateReset.hpp" #include "glw.h" using tcu::RGBA; using tcu::Surface; using tcu::TestLog; namespace deqp { namespace gles2 { namespace Functional { class StateResetCase : public TestCase { public: StateResetCase (Context& context); virtual ~StateResetCase (void); virtual TestCase::IterateResult iterate (void); }; StateResetCase::StateResetCase (Context& context) : TestCase(context, "state_reset", "State Reset Test") { } StateResetCase::~StateResetCase (void) { } TestCase::IterateResult StateResetCase::iterate (void) { try { glu::resetState(m_context.getRenderContext(), m_context.getContextInfo()); m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); } catch (const tcu::TestError& e) { m_testCtx.getLog() << e; m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail"); } return TestCase::STOP; } class ClearColorCase : public TestCase { public: ClearColorCase (Context& context); virtual ~ClearColorCase (void); virtual TestCase::IterateResult iterate (void); private: RGBA m_clearColor; int m_numIters; int m_curIter; }; ClearColorCase::ClearColorCase (Context& context) : TestCase (context, "clear_color", "glClearColor test") , m_numIters (10) , m_curIter (0) { } ClearColorCase::~ClearColorCase (void) { } TestCase::IterateResult ClearColorCase::iterate (void) { int r = 0; int g = 0; int b = 0; int a = 255; switch (m_curIter) { case 0: // Black, skip break; case 1: r = 255; g = 255; b = 255; break; case 2: r = 255; break; case 3: g = 255; break; case 4: b = 255; break; default: deRandom rnd; deRandom_init(&rnd, deInt32Hash(m_curIter)); r = (int)(deRandom_getUint32(&rnd) & 0xFF); g = (int)(deRandom_getUint32(&rnd) & 0xFF); b = (int)(deRandom_getUint32(&rnd) & 0xFF); a = (int)(deRandom_getUint32(&rnd) & 0xFF); break; }; glClearColor(float(r)/255.0f, float(g)/255.0f, float(b)/255.0f, float(a)/255.0f); glClear(GL_COLOR_BUFFER_BIT); GLU_CHECK_MSG("CLES2 ClearColor failed."); m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); return (++m_curIter < m_numIters) ? CONTINUE : STOP; } class ReadPixelsCase : public TestCase { public: ReadPixelsCase (Context& context); virtual ~ReadPixelsCase (void); virtual TestCase::IterateResult iterate (void); private: int m_numIters; int m_curIter; }; ReadPixelsCase::ReadPixelsCase (Context& context) : TestCase(context, "read_pixels", "Read pixels test") , m_numIters(20) , m_curIter(0) { } ReadPixelsCase::~ReadPixelsCase (void) { } TestCase::IterateResult ReadPixelsCase::iterate (void) { const tcu::RenderTarget& renderTarget = m_context.getRenderTarget(); tcu::PixelFormat pixelFormat = renderTarget.getPixelFormat(); int targetWidth = renderTarget.getWidth(); int targetHeight = renderTarget.getHeight(); int x = 0; int y = 0; int imageWidth = 0; int imageHeight = 0; deRandom rnd; deRandom_init(&rnd, deInt32Hash(m_curIter)); switch (m_curIter) { case 0: // Fullscreen x = 0; y = 0; imageWidth = targetWidth; imageHeight = targetHeight; break; case 1: // Upper left corner x = 0; y = 0; imageWidth = targetWidth / 2; imageHeight = targetHeight / 2; break; case 2: // Lower right corner x = targetWidth / 2; y = targetHeight / 2; imageWidth = targetWidth - x; imageHeight = targetHeight - y; break; default: x = deRandom_getUint32(&rnd) % (targetWidth - 1); y = deRandom_getUint32(&rnd) % (targetHeight - 1); imageWidth = 1 + (deRandom_getUint32(&rnd) % (targetWidth - x - 1)); imageHeight = 1 + (deRandom_getUint32(&rnd) % (targetHeight - y - 1)); break; } Surface resImage(imageWidth, imageHeight); Surface refImage(imageWidth, imageHeight); Surface diffImage(imageWidth, imageHeight); int r = (int)(deRandom_getUint32(&rnd) & 0xFF); int g = (int)(deRandom_getUint32(&rnd) & 0xFF); int b = (int)(deRandom_getUint32(&rnd) & 0xFF); tcu::clear(refImage.getAccess(), tcu::IVec4(r, g, b, 255)); glClearColor(float(r)/255.0f, float(g)/255.0f, float(b)/255.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glu::readPixels(m_context.getRenderContext(), x, y, resImage.getAccess()); GLU_CHECK_MSG("glReadPixels() failed."); RGBA colorThreshold = pixelFormat.getColorThreshold(); RGBA matchColor(0, 255, 0, 255); RGBA diffColor(255, 0, 0, 255); bool isImageOk = true; for (int j = 0; j < imageHeight; j++) { for (int i = 0; i < imageWidth; i++) { RGBA resRGBA = resImage.getPixel(i, j); RGBA refRGBA = refImage.getPixel(i, j); bool isPixelOk = compareThreshold(refRGBA, resRGBA, colorThreshold); diffImage.setPixel(i, j, isPixelOk ? matchColor : diffColor); isImageOk = isImageOk && isPixelOk; } } if (isImageOk) m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); else { m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail"); TestLog& log = m_testCtx.getLog(); log << TestLog::ImageSet("Result", "Resulting framebuffer") << TestLog::Image("Result", "Resulting framebuffer", resImage) << TestLog::Image("Reference", "Reference image", refImage) << TestLog::Image("DiffMask", "Failing pixels", diffImage) << TestLog::EndImageSet; } return (++m_curIter < m_numIters) ? CONTINUE : STOP; } PrerequisiteTests::PrerequisiteTests (Context& context) : TestCaseGroup(context, "prerequisite", "Prerequisite Test Cases") { } PrerequisiteTests::~PrerequisiteTests (void) { } void PrerequisiteTests::init (void) { addChild(new StateResetCase(m_context)); addChild(new ClearColorCase(m_context)); addChild(new ReadPixelsCase(m_context)); } } // Functional } // gles } // deqp