287 lines
6.8 KiB
C++
287 lines
6.8 KiB
C++
/*-------------------------------------------------------------------------
|
|
* drawElements Quality Program OpenGL ES 3.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 "es3fPrerequisiteTests.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 gles3
|
|
{
|
|
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");
|
|
|
|
m_testCtx.getLog() << 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
|
|
} // gles3
|
|
} // deqp
|