1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program OpenGL ES 3.1 Module
3*35238bceSAndroid Build Coastguard Worker * -------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker *
5*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker *
7*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker *
11*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker *
13*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker *
19*35238bceSAndroid Build Coastguard Worker *//*!
20*35238bceSAndroid Build Coastguard Worker * \file
21*35238bceSAndroid Build Coastguard Worker * \brief Multisample tests
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "es31fMultisampleTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "tcuRenderTarget.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "tcuVector.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "tcuSurface.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "tcuImageCompare.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "tcuStringTemplate.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "gluPixelTransfer.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "gluRenderContext.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "gluCallLogWrapper.hpp"
33*35238bceSAndroid Build Coastguard Worker #include "gluObjectWrapper.hpp"
34*35238bceSAndroid Build Coastguard Worker #include "gluShaderProgram.hpp"
35*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
36*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
37*35238bceSAndroid Build Coastguard Worker #include "deRandom.hpp"
38*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
39*35238bceSAndroid Build Coastguard Worker #include "deString.h"
40*35238bceSAndroid Build Coastguard Worker #include "deMath.h"
41*35238bceSAndroid Build Coastguard Worker
42*35238bceSAndroid Build Coastguard Worker using namespace glw;
43*35238bceSAndroid Build Coastguard Worker
44*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
45*35238bceSAndroid Build Coastguard Worker using tcu::Vec2;
46*35238bceSAndroid Build Coastguard Worker using tcu::Vec3;
47*35238bceSAndroid Build Coastguard Worker using tcu::Vec4;
48*35238bceSAndroid Build Coastguard Worker
49*35238bceSAndroid Build Coastguard Worker namespace deqp
50*35238bceSAndroid Build Coastguard Worker {
51*35238bceSAndroid Build Coastguard Worker namespace gles31
52*35238bceSAndroid Build Coastguard Worker {
53*35238bceSAndroid Build Coastguard Worker namespace Functional
54*35238bceSAndroid Build Coastguard Worker {
55*35238bceSAndroid Build Coastguard Worker namespace
56*35238bceSAndroid Build Coastguard Worker {
57*35238bceSAndroid Build Coastguard Worker
58*35238bceSAndroid Build Coastguard Worker using std::map;
59*35238bceSAndroid Build Coastguard Worker using std::string;
60*35238bceSAndroid Build Coastguard Worker
sampleMaskToString(const std::vector<uint32_t> & bitfield,int numBits)61*35238bceSAndroid Build Coastguard Worker static std::string sampleMaskToString(const std::vector<uint32_t> &bitfield, int numBits)
62*35238bceSAndroid Build Coastguard Worker {
63*35238bceSAndroid Build Coastguard Worker std::string result(numBits, '0');
64*35238bceSAndroid Build Coastguard Worker
65*35238bceSAndroid Build Coastguard Worker // move from back to front and set chars to 1
66*35238bceSAndroid Build Coastguard Worker for (int wordNdx = 0; wordNdx < (int)bitfield.size(); ++wordNdx)
67*35238bceSAndroid Build Coastguard Worker {
68*35238bceSAndroid Build Coastguard Worker for (int bit = 0; bit < 32; ++bit)
69*35238bceSAndroid Build Coastguard Worker {
70*35238bceSAndroid Build Coastguard Worker const int targetCharNdx = numBits - (wordNdx * 32 + bit) - 1;
71*35238bceSAndroid Build Coastguard Worker
72*35238bceSAndroid Build Coastguard Worker // beginning of the string reached
73*35238bceSAndroid Build Coastguard Worker if (targetCharNdx < 0)
74*35238bceSAndroid Build Coastguard Worker return result;
75*35238bceSAndroid Build Coastguard Worker
76*35238bceSAndroid Build Coastguard Worker if ((bitfield[wordNdx] >> bit) & 0x01)
77*35238bceSAndroid Build Coastguard Worker result[targetCharNdx] = '1';
78*35238bceSAndroid Build Coastguard Worker }
79*35238bceSAndroid Build Coastguard Worker }
80*35238bceSAndroid Build Coastguard Worker
81*35238bceSAndroid Build Coastguard Worker return result;
82*35238bceSAndroid Build Coastguard Worker }
83*35238bceSAndroid Build Coastguard Worker
84*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
85*35238bceSAndroid Build Coastguard Worker * \brief Returns the number of words needed to represent mask of given length
86*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
getEffectiveSampleMaskWordCount(int highestBitNdx)87*35238bceSAndroid Build Coastguard Worker static int getEffectiveSampleMaskWordCount(int highestBitNdx)
88*35238bceSAndroid Build Coastguard Worker {
89*35238bceSAndroid Build Coastguard Worker const int wordSize = 32;
90*35238bceSAndroid Build Coastguard Worker const int maskLen = highestBitNdx + 1;
91*35238bceSAndroid Build Coastguard Worker
92*35238bceSAndroid Build Coastguard Worker return ((maskLen - 1) / wordSize) + 1; // round_up(mask_len / wordSize)
93*35238bceSAndroid Build Coastguard Worker }
94*35238bceSAndroid Build Coastguard Worker
95*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
96*35238bceSAndroid Build Coastguard Worker * \brief Creates sample mask with all less significant bits than nthBit set
97*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
genAllSetToNthBitSampleMask(int nthBit)98*35238bceSAndroid Build Coastguard Worker static std::vector<uint32_t> genAllSetToNthBitSampleMask(int nthBit)
99*35238bceSAndroid Build Coastguard Worker {
100*35238bceSAndroid Build Coastguard Worker const int wordSize = 32;
101*35238bceSAndroid Build Coastguard Worker const int numWords = getEffectiveSampleMaskWordCount(nthBit - 1);
102*35238bceSAndroid Build Coastguard Worker const uint32_t topWordBits = (uint32_t)(nthBit - (numWords - 1) * wordSize);
103*35238bceSAndroid Build Coastguard Worker std::vector<uint32_t> mask(numWords);
104*35238bceSAndroid Build Coastguard Worker
105*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < numWords - 1; ++ndx)
106*35238bceSAndroid Build Coastguard Worker mask[ndx] = 0xFFFFFFFF;
107*35238bceSAndroid Build Coastguard Worker
108*35238bceSAndroid Build Coastguard Worker mask[numWords - 1] = deBitMask32(0, (int)topWordBits);
109*35238bceSAndroid Build Coastguard Worker return mask;
110*35238bceSAndroid Build Coastguard Worker }
111*35238bceSAndroid Build Coastguard Worker
112*35238bceSAndroid Build Coastguard Worker class SamplePosQueryCase : public TestCase
113*35238bceSAndroid Build Coastguard Worker {
114*35238bceSAndroid Build Coastguard Worker public:
115*35238bceSAndroid Build Coastguard Worker SamplePosQueryCase(Context &context, const char *name, const char *desc);
116*35238bceSAndroid Build Coastguard Worker
117*35238bceSAndroid Build Coastguard Worker private:
118*35238bceSAndroid Build Coastguard Worker void init(void);
119*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void);
120*35238bceSAndroid Build Coastguard Worker };
121*35238bceSAndroid Build Coastguard Worker
SamplePosQueryCase(Context & context,const char * name,const char * desc)122*35238bceSAndroid Build Coastguard Worker SamplePosQueryCase::SamplePosQueryCase(Context &context, const char *name, const char *desc)
123*35238bceSAndroid Build Coastguard Worker : TestCase(context, name, desc)
124*35238bceSAndroid Build Coastguard Worker {
125*35238bceSAndroid Build Coastguard Worker }
126*35238bceSAndroid Build Coastguard Worker
init(void)127*35238bceSAndroid Build Coastguard Worker void SamplePosQueryCase::init(void)
128*35238bceSAndroid Build Coastguard Worker {
129*35238bceSAndroid Build Coastguard Worker if (m_context.getRenderTarget().getNumSamples() == 0)
130*35238bceSAndroid Build Coastguard Worker throw tcu::NotSupportedError("No multisample buffers");
131*35238bceSAndroid Build Coastguard Worker }
132*35238bceSAndroid Build Coastguard Worker
iterate(void)133*35238bceSAndroid Build Coastguard Worker SamplePosQueryCase::IterateResult SamplePosQueryCase::iterate(void)
134*35238bceSAndroid Build Coastguard Worker {
135*35238bceSAndroid Build Coastguard Worker glu::CallLogWrapper gl(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
136*35238bceSAndroid Build Coastguard Worker bool error = false;
137*35238bceSAndroid Build Coastguard Worker
138*35238bceSAndroid Build Coastguard Worker gl.enableLogging(true);
139*35238bceSAndroid Build Coastguard Worker
140*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < m_context.getRenderTarget().getNumSamples(); ++ndx)
141*35238bceSAndroid Build Coastguard Worker {
142*35238bceSAndroid Build Coastguard Worker tcu::Vec2 samplePos = tcu::Vec2(-1, -1);
143*35238bceSAndroid Build Coastguard Worker
144*35238bceSAndroid Build Coastguard Worker gl.glGetMultisamplefv(GL_SAMPLE_POSITION, ndx, samplePos.getPtr());
145*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.glGetError(), "getMultisamplefv");
146*35238bceSAndroid Build Coastguard Worker
147*35238bceSAndroid Build Coastguard Worker // check value range
148*35238bceSAndroid Build Coastguard Worker if (samplePos.x() < 0.0f || samplePos.x() > 1.0f || samplePos.y() < 0.0f || samplePos.y() > 1.0f)
149*35238bceSAndroid Build Coastguard Worker {
150*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message << "Sample " << ndx << " is not in valid range [0,1], got "
151*35238bceSAndroid Build Coastguard Worker << samplePos << tcu::TestLog::EndMessage;
152*35238bceSAndroid Build Coastguard Worker error = true;
153*35238bceSAndroid Build Coastguard Worker }
154*35238bceSAndroid Build Coastguard Worker }
155*35238bceSAndroid Build Coastguard Worker
156*35238bceSAndroid Build Coastguard Worker if (!error)
157*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
158*35238bceSAndroid Build Coastguard Worker else
159*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid sample pos");
160*35238bceSAndroid Build Coastguard Worker
161*35238bceSAndroid Build Coastguard Worker return STOP;
162*35238bceSAndroid Build Coastguard Worker }
163*35238bceSAndroid Build Coastguard Worker
164*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
165*35238bceSAndroid Build Coastguard Worker * \brief Abstract base class handling common stuff for default fbo multisample cases.
166*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
167*35238bceSAndroid Build Coastguard Worker class DefaultFBOMultisampleCase : public TestCase
168*35238bceSAndroid Build Coastguard Worker {
169*35238bceSAndroid Build Coastguard Worker public:
170*35238bceSAndroid Build Coastguard Worker DefaultFBOMultisampleCase(Context &context, const char *name, const char *desc, int desiredViewportSize);
171*35238bceSAndroid Build Coastguard Worker virtual ~DefaultFBOMultisampleCase(void);
172*35238bceSAndroid Build Coastguard Worker
173*35238bceSAndroid Build Coastguard Worker virtual void init(void);
174*35238bceSAndroid Build Coastguard Worker virtual void deinit(void);
175*35238bceSAndroid Build Coastguard Worker
176*35238bceSAndroid Build Coastguard Worker protected:
177*35238bceSAndroid Build Coastguard Worker void renderTriangle(const Vec3 &p0, const Vec3 &p1, const Vec3 &p2, const Vec4 &c0, const Vec4 &c1,
178*35238bceSAndroid Build Coastguard Worker const Vec4 &c2) const;
179*35238bceSAndroid Build Coastguard Worker void renderTriangle(const Vec2 &p0, const Vec2 &p1, const Vec2 &p2, const Vec4 &c0, const Vec4 &c1,
180*35238bceSAndroid Build Coastguard Worker const Vec4 &c2) const;
181*35238bceSAndroid Build Coastguard Worker void renderTriangle(const Vec2 &p0, const Vec2 &p1, const Vec2 &p2, const Vec4 &color) const;
182*35238bceSAndroid Build Coastguard Worker void renderQuad(const Vec2 &p0, const Vec2 &p1, const Vec2 &p2, const Vec2 &p3, const Vec4 &c0, const Vec4 &c1,
183*35238bceSAndroid Build Coastguard Worker const Vec4 &c2, const Vec4 &c3) const;
184*35238bceSAndroid Build Coastguard Worker void renderQuad(const Vec2 &p0, const Vec2 &p1, const Vec2 &p2, const Vec2 &p3, const Vec4 &color) const;
185*35238bceSAndroid Build Coastguard Worker
186*35238bceSAndroid Build Coastguard Worker void randomizeViewport(void);
187*35238bceSAndroid Build Coastguard Worker void readImage(tcu::Surface &dst) const;
188*35238bceSAndroid Build Coastguard Worker
189*35238bceSAndroid Build Coastguard Worker int m_numSamples;
190*35238bceSAndroid Build Coastguard Worker
191*35238bceSAndroid Build Coastguard Worker int m_viewportSize;
192*35238bceSAndroid Build Coastguard Worker
193*35238bceSAndroid Build Coastguard Worker private:
194*35238bceSAndroid Build Coastguard Worker DefaultFBOMultisampleCase(const DefaultFBOMultisampleCase &other);
195*35238bceSAndroid Build Coastguard Worker DefaultFBOMultisampleCase &operator=(const DefaultFBOMultisampleCase &other);
196*35238bceSAndroid Build Coastguard Worker
197*35238bceSAndroid Build Coastguard Worker const int m_desiredViewportSize;
198*35238bceSAndroid Build Coastguard Worker
199*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram *m_program;
200*35238bceSAndroid Build Coastguard Worker int m_attrPositionLoc;
201*35238bceSAndroid Build Coastguard Worker int m_attrColorLoc;
202*35238bceSAndroid Build Coastguard Worker
203*35238bceSAndroid Build Coastguard Worker int m_viewportX;
204*35238bceSAndroid Build Coastguard Worker int m_viewportY;
205*35238bceSAndroid Build Coastguard Worker de::Random m_rnd;
206*35238bceSAndroid Build Coastguard Worker
207*35238bceSAndroid Build Coastguard Worker bool m_initCalled;
208*35238bceSAndroid Build Coastguard Worker };
209*35238bceSAndroid Build Coastguard Worker
DefaultFBOMultisampleCase(Context & context,const char * name,const char * desc,int desiredViewportSize)210*35238bceSAndroid Build Coastguard Worker DefaultFBOMultisampleCase::DefaultFBOMultisampleCase(Context &context, const char *name, const char *desc,
211*35238bceSAndroid Build Coastguard Worker int desiredViewportSize)
212*35238bceSAndroid Build Coastguard Worker : TestCase(context, name, desc)
213*35238bceSAndroid Build Coastguard Worker , m_numSamples(0)
214*35238bceSAndroid Build Coastguard Worker , m_viewportSize(0)
215*35238bceSAndroid Build Coastguard Worker , m_desiredViewportSize(desiredViewportSize)
216*35238bceSAndroid Build Coastguard Worker , m_program(DE_NULL)
217*35238bceSAndroid Build Coastguard Worker , m_attrPositionLoc(-1)
218*35238bceSAndroid Build Coastguard Worker , m_attrColorLoc(-1)
219*35238bceSAndroid Build Coastguard Worker , m_viewportX(0)
220*35238bceSAndroid Build Coastguard Worker , m_viewportY(0)
221*35238bceSAndroid Build Coastguard Worker , m_rnd(deStringHash(name))
222*35238bceSAndroid Build Coastguard Worker , m_initCalled(false)
223*35238bceSAndroid Build Coastguard Worker {
224*35238bceSAndroid Build Coastguard Worker }
225*35238bceSAndroid Build Coastguard Worker
~DefaultFBOMultisampleCase(void)226*35238bceSAndroid Build Coastguard Worker DefaultFBOMultisampleCase::~DefaultFBOMultisampleCase(void)
227*35238bceSAndroid Build Coastguard Worker {
228*35238bceSAndroid Build Coastguard Worker DefaultFBOMultisampleCase::deinit();
229*35238bceSAndroid Build Coastguard Worker }
230*35238bceSAndroid Build Coastguard Worker
init(void)231*35238bceSAndroid Build Coastguard Worker void DefaultFBOMultisampleCase::init(void)
232*35238bceSAndroid Build Coastguard Worker {
233*35238bceSAndroid Build Coastguard Worker const bool supportsES32 = glu::contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2));
234*35238bceSAndroid Build Coastguard Worker map<string, string> args;
235*35238bceSAndroid Build Coastguard Worker args["GLSL_VERSION_DECL"] = supportsES32 ? getGLSLVersionDeclaration(glu::GLSL_VERSION_320_ES) :
236*35238bceSAndroid Build Coastguard Worker getGLSLVersionDeclaration(glu::GLSL_VERSION_310_ES);
237*35238bceSAndroid Build Coastguard Worker
238*35238bceSAndroid Build Coastguard Worker static const char *vertShaderSource = "${GLSL_VERSION_DECL}\n"
239*35238bceSAndroid Build Coastguard Worker "in highp vec4 a_position;\n"
240*35238bceSAndroid Build Coastguard Worker "in mediump vec4 a_color;\n"
241*35238bceSAndroid Build Coastguard Worker "out mediump vec4 v_color;\n"
242*35238bceSAndroid Build Coastguard Worker "void main()\n"
243*35238bceSAndroid Build Coastguard Worker "{\n"
244*35238bceSAndroid Build Coastguard Worker " gl_Position = a_position;\n"
245*35238bceSAndroid Build Coastguard Worker " v_color = a_color;\n"
246*35238bceSAndroid Build Coastguard Worker "}\n";
247*35238bceSAndroid Build Coastguard Worker
248*35238bceSAndroid Build Coastguard Worker static const char *fragShaderSource = "${GLSL_VERSION_DECL}\n"
249*35238bceSAndroid Build Coastguard Worker "in mediump vec4 v_color;\n"
250*35238bceSAndroid Build Coastguard Worker "layout(location = 0) out mediump vec4 o_color;\n"
251*35238bceSAndroid Build Coastguard Worker "void main()\n"
252*35238bceSAndroid Build Coastguard Worker "{\n"
253*35238bceSAndroid Build Coastguard Worker " o_color = v_color;\n"
254*35238bceSAndroid Build Coastguard Worker "}\n";
255*35238bceSAndroid Build Coastguard Worker
256*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
257*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
258*35238bceSAndroid Build Coastguard Worker
259*35238bceSAndroid Build Coastguard Worker if (m_context.getRenderTarget().getNumSamples() <= 1)
260*35238bceSAndroid Build Coastguard Worker throw tcu::NotSupportedError("No multisample buffers");
261*35238bceSAndroid Build Coastguard Worker
262*35238bceSAndroid Build Coastguard Worker m_initCalled = true;
263*35238bceSAndroid Build Coastguard Worker
264*35238bceSAndroid Build Coastguard Worker // Query and log number of samples per pixel.
265*35238bceSAndroid Build Coastguard Worker
266*35238bceSAndroid Build Coastguard Worker gl.getIntegerv(GL_SAMPLES, &m_numSamples);
267*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "getIntegerv(GL_SAMPLES)");
268*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "GL_SAMPLES = " << m_numSamples << TestLog::EndMessage;
269*35238bceSAndroid Build Coastguard Worker
270*35238bceSAndroid Build Coastguard Worker // Prepare program.
271*35238bceSAndroid Build Coastguard Worker
272*35238bceSAndroid Build Coastguard Worker DE_ASSERT(!m_program);
273*35238bceSAndroid Build Coastguard Worker
274*35238bceSAndroid Build Coastguard Worker m_program = new glu::ShaderProgram(
275*35238bceSAndroid Build Coastguard Worker m_context.getRenderContext(),
276*35238bceSAndroid Build Coastguard Worker glu::ProgramSources() << glu::VertexSource(tcu::StringTemplate(vertShaderSource).specialize(args))
277*35238bceSAndroid Build Coastguard Worker << glu::FragmentSource(tcu::StringTemplate(fragShaderSource).specialize(args)));
278*35238bceSAndroid Build Coastguard Worker if (!m_program->isOk())
279*35238bceSAndroid Build Coastguard Worker throw tcu::TestError("Failed to compile program", DE_NULL, __FILE__, __LINE__);
280*35238bceSAndroid Build Coastguard Worker
281*35238bceSAndroid Build Coastguard Worker m_attrPositionLoc = gl.getAttribLocation(m_program->getProgram(), "a_position");
282*35238bceSAndroid Build Coastguard Worker m_attrColorLoc = gl.getAttribLocation(m_program->getProgram(), "a_color");
283*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "getAttribLocation");
284*35238bceSAndroid Build Coastguard Worker
285*35238bceSAndroid Build Coastguard Worker if (m_attrPositionLoc < 0 || m_attrColorLoc < 0)
286*35238bceSAndroid Build Coastguard Worker {
287*35238bceSAndroid Build Coastguard Worker delete m_program;
288*35238bceSAndroid Build Coastguard Worker throw tcu::TestError("Invalid attribute locations", DE_NULL, __FILE__, __LINE__);
289*35238bceSAndroid Build Coastguard Worker }
290*35238bceSAndroid Build Coastguard Worker
291*35238bceSAndroid Build Coastguard Worker // Get suitable viewport size.
292*35238bceSAndroid Build Coastguard Worker
293*35238bceSAndroid Build Coastguard Worker m_viewportSize = de::min<int>(m_desiredViewportSize, de::min(m_context.getRenderTarget().getWidth(),
294*35238bceSAndroid Build Coastguard Worker m_context.getRenderTarget().getHeight()));
295*35238bceSAndroid Build Coastguard Worker randomizeViewport();
296*35238bceSAndroid Build Coastguard Worker }
297*35238bceSAndroid Build Coastguard Worker
deinit(void)298*35238bceSAndroid Build Coastguard Worker void DefaultFBOMultisampleCase::deinit(void)
299*35238bceSAndroid Build Coastguard Worker {
300*35238bceSAndroid Build Coastguard Worker // Do not try to call GL functions during case list creation
301*35238bceSAndroid Build Coastguard Worker if (!m_initCalled)
302*35238bceSAndroid Build Coastguard Worker return;
303*35238bceSAndroid Build Coastguard Worker
304*35238bceSAndroid Build Coastguard Worker delete m_program;
305*35238bceSAndroid Build Coastguard Worker m_program = DE_NULL;
306*35238bceSAndroid Build Coastguard Worker }
307*35238bceSAndroid Build Coastguard Worker
renderTriangle(const Vec3 & p0,const Vec3 & p1,const Vec3 & p2,const Vec4 & c0,const Vec4 & c1,const Vec4 & c2) const308*35238bceSAndroid Build Coastguard Worker void DefaultFBOMultisampleCase::renderTriangle(const Vec3 &p0, const Vec3 &p1, const Vec3 &p2, const Vec4 &c0,
309*35238bceSAndroid Build Coastguard Worker const Vec4 &c1, const Vec4 &c2) const
310*35238bceSAndroid Build Coastguard Worker {
311*35238bceSAndroid Build Coastguard Worker const float vertexPositions[] = {p0.x(), p0.y(), p0.z(), 1.0f, p1.x(), p1.y(),
312*35238bceSAndroid Build Coastguard Worker p1.z(), 1.0f, p2.x(), p2.y(), p2.z(), 1.0f};
313*35238bceSAndroid Build Coastguard Worker const float vertexColors[] = {
314*35238bceSAndroid Build Coastguard Worker c0.x(), c0.y(), c0.z(), c0.w(), c1.x(), c1.y(), c1.z(), c1.w(), c2.x(), c2.y(), c2.z(), c2.w(),
315*35238bceSAndroid Build Coastguard Worker };
316*35238bceSAndroid Build Coastguard Worker
317*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
318*35238bceSAndroid Build Coastguard Worker glu::Buffer vtxBuf(m_context.getRenderContext());
319*35238bceSAndroid Build Coastguard Worker glu::Buffer colBuf(m_context.getRenderContext());
320*35238bceSAndroid Build Coastguard Worker glu::VertexArray vao(m_context.getRenderContext());
321*35238bceSAndroid Build Coastguard Worker
322*35238bceSAndroid Build Coastguard Worker gl.bindVertexArray(*vao);
323*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "bindVertexArray");
324*35238bceSAndroid Build Coastguard Worker
325*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, *vtxBuf);
326*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions), &vertexPositions[0], GL_STATIC_DRAW);
327*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "vtx buf");
328*35238bceSAndroid Build Coastguard Worker
329*35238bceSAndroid Build Coastguard Worker gl.enableVertexAttribArray(m_attrPositionLoc);
330*35238bceSAndroid Build Coastguard Worker gl.vertexAttribPointer(m_attrPositionLoc, 4, GL_FLOAT, false, 0, DE_NULL);
331*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "vtx vertexAttribPointer");
332*35238bceSAndroid Build Coastguard Worker
333*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_ARRAY_BUFFER, *colBuf);
334*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_ARRAY_BUFFER, sizeof(vertexColors), &vertexColors[0], GL_STATIC_DRAW);
335*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "col buf");
336*35238bceSAndroid Build Coastguard Worker
337*35238bceSAndroid Build Coastguard Worker gl.enableVertexAttribArray(m_attrColorLoc);
338*35238bceSAndroid Build Coastguard Worker gl.vertexAttribPointer(m_attrColorLoc, 4, GL_FLOAT, false, 0, DE_NULL);
339*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "col vertexAttribPointer");
340*35238bceSAndroid Build Coastguard Worker
341*35238bceSAndroid Build Coastguard Worker gl.useProgram(m_program->getProgram());
342*35238bceSAndroid Build Coastguard Worker gl.drawArrays(GL_TRIANGLES, 0, 3);
343*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "drawArrays");
344*35238bceSAndroid Build Coastguard Worker }
345*35238bceSAndroid Build Coastguard Worker
renderTriangle(const Vec2 & p0,const Vec2 & p1,const Vec2 & p2,const Vec4 & c0,const Vec4 & c1,const Vec4 & c2) const346*35238bceSAndroid Build Coastguard Worker void DefaultFBOMultisampleCase::renderTriangle(const Vec2 &p0, const Vec2 &p1, const Vec2 &p2, const Vec4 &c0,
347*35238bceSAndroid Build Coastguard Worker const Vec4 &c1, const Vec4 &c2) const
348*35238bceSAndroid Build Coastguard Worker {
349*35238bceSAndroid Build Coastguard Worker renderTriangle(Vec3(p0.x(), p0.y(), 0.0f), Vec3(p1.x(), p1.y(), 0.0f), Vec3(p2.x(), p2.y(), 0.0f), c0, c1, c2);
350*35238bceSAndroid Build Coastguard Worker }
351*35238bceSAndroid Build Coastguard Worker
renderTriangle(const Vec2 & p0,const Vec2 & p1,const Vec2 & p2,const Vec4 & color) const352*35238bceSAndroid Build Coastguard Worker void DefaultFBOMultisampleCase::renderTriangle(const Vec2 &p0, const Vec2 &p1, const Vec2 &p2, const Vec4 &color) const
353*35238bceSAndroid Build Coastguard Worker {
354*35238bceSAndroid Build Coastguard Worker renderTriangle(p0, p1, p2, color, color, color);
355*35238bceSAndroid Build Coastguard Worker }
356*35238bceSAndroid Build Coastguard Worker
renderQuad(const Vec2 & p0,const Vec2 & p1,const Vec2 & p2,const Vec2 & p3,const Vec4 & c0,const Vec4 & c1,const Vec4 & c2,const Vec4 & c3) const357*35238bceSAndroid Build Coastguard Worker void DefaultFBOMultisampleCase::renderQuad(const Vec2 &p0, const Vec2 &p1, const Vec2 &p2, const Vec2 &p3,
358*35238bceSAndroid Build Coastguard Worker const Vec4 &c0, const Vec4 &c1, const Vec4 &c2, const Vec4 &c3) const
359*35238bceSAndroid Build Coastguard Worker {
360*35238bceSAndroid Build Coastguard Worker renderTriangle(p0, p1, p2, c0, c1, c2);
361*35238bceSAndroid Build Coastguard Worker renderTriangle(p2, p1, p3, c2, c1, c3);
362*35238bceSAndroid Build Coastguard Worker }
363*35238bceSAndroid Build Coastguard Worker
renderQuad(const Vec2 & p0,const Vec2 & p1,const Vec2 & p2,const Vec2 & p3,const Vec4 & color) const364*35238bceSAndroid Build Coastguard Worker void DefaultFBOMultisampleCase::renderQuad(const Vec2 &p0, const Vec2 &p1, const Vec2 &p2, const Vec2 &p3,
365*35238bceSAndroid Build Coastguard Worker const Vec4 &color) const
366*35238bceSAndroid Build Coastguard Worker {
367*35238bceSAndroid Build Coastguard Worker renderQuad(p0, p1, p2, p3, color, color, color, color);
368*35238bceSAndroid Build Coastguard Worker }
369*35238bceSAndroid Build Coastguard Worker
randomizeViewport(void)370*35238bceSAndroid Build Coastguard Worker void DefaultFBOMultisampleCase::randomizeViewport(void)
371*35238bceSAndroid Build Coastguard Worker {
372*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
373*35238bceSAndroid Build Coastguard Worker
374*35238bceSAndroid Build Coastguard Worker m_viewportX = m_rnd.getInt(0, m_context.getRenderTarget().getWidth() - m_viewportSize);
375*35238bceSAndroid Build Coastguard Worker m_viewportY = m_rnd.getInt(0, m_context.getRenderTarget().getHeight() - m_viewportSize);
376*35238bceSAndroid Build Coastguard Worker
377*35238bceSAndroid Build Coastguard Worker gl.viewport(m_viewportX, m_viewportY, m_viewportSize, m_viewportSize);
378*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "viewport");
379*35238bceSAndroid Build Coastguard Worker }
380*35238bceSAndroid Build Coastguard Worker
readImage(tcu::Surface & dst) const381*35238bceSAndroid Build Coastguard Worker void DefaultFBOMultisampleCase::readImage(tcu::Surface &dst) const
382*35238bceSAndroid Build Coastguard Worker {
383*35238bceSAndroid Build Coastguard Worker glu::readPixels(m_context.getRenderContext(), m_viewportX, m_viewportY, dst.getAccess());
384*35238bceSAndroid Build Coastguard Worker }
385*35238bceSAndroid Build Coastguard Worker
386*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
387*35238bceSAndroid Build Coastguard Worker * \brief Tests coverage mask inversion validity.
388*35238bceSAndroid Build Coastguard Worker *
389*35238bceSAndroid Build Coastguard Worker * Tests that the coverage masks obtained by masks set with glSampleMaski(mask)
390*35238bceSAndroid Build Coastguard Worker * and glSampleMaski(~mask) are indeed each others' inverses.
391*35238bceSAndroid Build Coastguard Worker *
392*35238bceSAndroid Build Coastguard Worker * This is done by drawing a pattern, with varying coverage values,
393*35238bceSAndroid Build Coastguard Worker * overlapped by a pattern that has inverted masks and is otherwise
394*35238bceSAndroid Build Coastguard Worker * identical. The resulting image is compared to one obtained by drawing
395*35238bceSAndroid Build Coastguard Worker * the same pattern but with all-ones coverage masks.
396*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
397*35238bceSAndroid Build Coastguard Worker class MaskInvertCase : public DefaultFBOMultisampleCase
398*35238bceSAndroid Build Coastguard Worker {
399*35238bceSAndroid Build Coastguard Worker public:
400*35238bceSAndroid Build Coastguard Worker MaskInvertCase(Context &context, const char *name, const char *description);
~MaskInvertCase(void)401*35238bceSAndroid Build Coastguard Worker ~MaskInvertCase(void)
402*35238bceSAndroid Build Coastguard Worker {
403*35238bceSAndroid Build Coastguard Worker }
404*35238bceSAndroid Build Coastguard Worker
405*35238bceSAndroid Build Coastguard Worker void init(void);
406*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void);
407*35238bceSAndroid Build Coastguard Worker
408*35238bceSAndroid Build Coastguard Worker private:
409*35238bceSAndroid Build Coastguard Worker void drawPattern(bool invert) const;
410*35238bceSAndroid Build Coastguard Worker };
411*35238bceSAndroid Build Coastguard Worker
MaskInvertCase(Context & context,const char * name,const char * description)412*35238bceSAndroid Build Coastguard Worker MaskInvertCase::MaskInvertCase(Context &context, const char *name, const char *description)
413*35238bceSAndroid Build Coastguard Worker : DefaultFBOMultisampleCase(context, name, description, 256)
414*35238bceSAndroid Build Coastguard Worker {
415*35238bceSAndroid Build Coastguard Worker }
416*35238bceSAndroid Build Coastguard Worker
init(void)417*35238bceSAndroid Build Coastguard Worker void MaskInvertCase::init(void)
418*35238bceSAndroid Build Coastguard Worker {
419*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
420*35238bceSAndroid Build Coastguard Worker
421*35238bceSAndroid Build Coastguard Worker // check the test is even possible
422*35238bceSAndroid Build Coastguard Worker
423*35238bceSAndroid Build Coastguard Worker GLint maxSampleMaskWords = 0;
424*35238bceSAndroid Build Coastguard Worker gl.getIntegerv(GL_MAX_SAMPLE_MASK_WORDS, &maxSampleMaskWords);
425*35238bceSAndroid Build Coastguard Worker if (getEffectiveSampleMaskWordCount(m_numSamples - 1) > maxSampleMaskWords)
426*35238bceSAndroid Build Coastguard Worker throw tcu::NotSupportedError("Test requires larger GL_MAX_SAMPLE_MASK_WORDS");
427*35238bceSAndroid Build Coastguard Worker
428*35238bceSAndroid Build Coastguard Worker // normal init
429*35238bceSAndroid Build Coastguard Worker DefaultFBOMultisampleCase::init();
430*35238bceSAndroid Build Coastguard Worker }
431*35238bceSAndroid Build Coastguard Worker
iterate(void)432*35238bceSAndroid Build Coastguard Worker MaskInvertCase::IterateResult MaskInvertCase::iterate(void)
433*35238bceSAndroid Build Coastguard Worker {
434*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
435*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
436*35238bceSAndroid Build Coastguard Worker tcu::Surface renderedImgNoSampleCoverage(m_viewportSize, m_viewportSize);
437*35238bceSAndroid Build Coastguard Worker tcu::Surface renderedImgSampleCoverage(m_viewportSize, m_viewportSize);
438*35238bceSAndroid Build Coastguard Worker
439*35238bceSAndroid Build Coastguard Worker randomizeViewport();
440*35238bceSAndroid Build Coastguard Worker
441*35238bceSAndroid Build Coastguard Worker gl.enable(GL_BLEND);
442*35238bceSAndroid Build Coastguard Worker gl.blendEquation(GL_FUNC_ADD);
443*35238bceSAndroid Build Coastguard Worker gl.blendFunc(GL_ONE, GL_ONE);
444*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "set blend");
445*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Additive blending enabled in order to detect (erroneously) overlapping samples"
446*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
447*35238bceSAndroid Build Coastguard Worker
448*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Clearing color to all-zeros" << TestLog::EndMessage;
449*35238bceSAndroid Build Coastguard Worker gl.clearColor(0.0f, 0.0f, 0.0f, 0.0f);
450*35238bceSAndroid Build Coastguard Worker gl.clear(GL_COLOR_BUFFER_BIT);
451*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "clear");
452*35238bceSAndroid Build Coastguard Worker
453*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Drawing the pattern with GL_SAMPLE_MASK disabled" << TestLog::EndMessage;
454*35238bceSAndroid Build Coastguard Worker drawPattern(false);
455*35238bceSAndroid Build Coastguard Worker readImage(renderedImgNoSampleCoverage);
456*35238bceSAndroid Build Coastguard Worker
457*35238bceSAndroid Build Coastguard Worker log << TestLog::Image("RenderedImageNoSampleMask", "Rendered image with GL_SAMPLE_MASK disabled",
458*35238bceSAndroid Build Coastguard Worker renderedImgNoSampleCoverage, QP_IMAGE_COMPRESSION_MODE_PNG);
459*35238bceSAndroid Build Coastguard Worker
460*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Clearing color to all-zeros" << TestLog::EndMessage;
461*35238bceSAndroid Build Coastguard Worker gl.clear(GL_COLOR_BUFFER_BIT);
462*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "clear");
463*35238bceSAndroid Build Coastguard Worker
464*35238bceSAndroid Build Coastguard Worker gl.enable(GL_SAMPLE_MASK);
465*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable(GL_SAMPLE_MASK)");
466*35238bceSAndroid Build Coastguard Worker
467*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Drawing the pattern with GL_SAMPLE_MASK enabled, using non-inverted sample masks"
468*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
469*35238bceSAndroid Build Coastguard Worker drawPattern(false);
470*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Drawing the pattern with GL_SAMPLE_MASK enabled, using inverted sample masks"
471*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
472*35238bceSAndroid Build Coastguard Worker drawPattern(true);
473*35238bceSAndroid Build Coastguard Worker
474*35238bceSAndroid Build Coastguard Worker readImage(renderedImgSampleCoverage);
475*35238bceSAndroid Build Coastguard Worker
476*35238bceSAndroid Build Coastguard Worker log << TestLog::Image("RenderedImageSampleMask", "Rendered image with GL_SAMPLE_MASK enabled",
477*35238bceSAndroid Build Coastguard Worker renderedImgSampleCoverage, QP_IMAGE_COMPRESSION_MODE_PNG);
478*35238bceSAndroid Build Coastguard Worker
479*35238bceSAndroid Build Coastguard Worker bool passed = tcu::pixelThresholdCompare(
480*35238bceSAndroid Build Coastguard Worker log, "CoverageVsNoCoverage", "Comparison of same pattern with GL_SAMPLE_MASK disabled and enabled",
481*35238bceSAndroid Build Coastguard Worker renderedImgNoSampleCoverage, renderedImgSampleCoverage, tcu::RGBA(0), tcu::COMPARE_LOG_ON_ERROR);
482*35238bceSAndroid Build Coastguard Worker
483*35238bceSAndroid Build Coastguard Worker if (passed)
484*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Success: The two images rendered are identical" << TestLog::EndMessage;
485*35238bceSAndroid Build Coastguard Worker
486*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().setTestResult(passed ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
487*35238bceSAndroid Build Coastguard Worker passed ? "Passed" : "Failed");
488*35238bceSAndroid Build Coastguard Worker
489*35238bceSAndroid Build Coastguard Worker return STOP;
490*35238bceSAndroid Build Coastguard Worker }
491*35238bceSAndroid Build Coastguard Worker
drawPattern(bool invert) const492*35238bceSAndroid Build Coastguard Worker void MaskInvertCase::drawPattern(bool invert) const
493*35238bceSAndroid Build Coastguard Worker {
494*35238bceSAndroid Build Coastguard Worker const int numTriangles = 25;
495*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
496*35238bceSAndroid Build Coastguard Worker
497*35238bceSAndroid Build Coastguard Worker for (int triNdx = 0; triNdx < numTriangles; triNdx++)
498*35238bceSAndroid Build Coastguard Worker {
499*35238bceSAndroid Build Coastguard Worker const float angle0 = 2.0f * DE_PI * (float)triNdx / (float)numTriangles;
500*35238bceSAndroid Build Coastguard Worker const float angle1 = 2.0f * DE_PI * ((float)triNdx + 0.5f) / (float)numTriangles;
501*35238bceSAndroid Build Coastguard Worker const Vec4 color =
502*35238bceSAndroid Build Coastguard Worker Vec4(0.4f + (float)triNdx / (float)numTriangles * 0.6f, 0.5f + (float)triNdx / (float)numTriangles * 0.3f,
503*35238bceSAndroid Build Coastguard Worker 0.6f - (float)triNdx / (float)numTriangles * 0.5f, 0.7f - (float)triNdx / (float)numTriangles * 0.7f);
504*35238bceSAndroid Build Coastguard Worker
505*35238bceSAndroid Build Coastguard Worker const int wordCount = getEffectiveSampleMaskWordCount(m_numSamples - 1);
506*35238bceSAndroid Build Coastguard Worker const GLbitfield finalWordBits = m_numSamples - 32 * ((m_numSamples - 1) / 32);
507*35238bceSAndroid Build Coastguard Worker const GLbitfield finalWordMask = (GLbitfield)deBitMask32(0, (int)finalWordBits);
508*35238bceSAndroid Build Coastguard Worker
509*35238bceSAndroid Build Coastguard Worker for (int wordNdx = 0; wordNdx < wordCount; ++wordNdx)
510*35238bceSAndroid Build Coastguard Worker {
511*35238bceSAndroid Build Coastguard Worker const GLbitfield rawMask = (GLbitfield)deUint32Hash(wordNdx * 32 + triNdx);
512*35238bceSAndroid Build Coastguard Worker const GLbitfield mask = (invert) ? (~rawMask) : (rawMask);
513*35238bceSAndroid Build Coastguard Worker const bool isFinalWord = (wordNdx + 1) == wordCount;
514*35238bceSAndroid Build Coastguard Worker const GLbitfield maskMask =
515*35238bceSAndroid Build Coastguard Worker (isFinalWord) ? (finalWordMask) :
516*35238bceSAndroid Build Coastguard Worker (0xFFFFFFFFUL); // maskMask prevents setting coverage bits higher than sample count
517*35238bceSAndroid Build Coastguard Worker
518*35238bceSAndroid Build Coastguard Worker gl.sampleMaski(wordNdx, mask & maskMask);
519*35238bceSAndroid Build Coastguard Worker }
520*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "glSampleMaski");
521*35238bceSAndroid Build Coastguard Worker
522*35238bceSAndroid Build Coastguard Worker renderTriangle(Vec2(0.0f, 0.0f), Vec2(deFloatCos(angle0) * 0.95f, deFloatSin(angle0) * 0.95f),
523*35238bceSAndroid Build Coastguard Worker Vec2(deFloatCos(angle1) * 0.95f, deFloatSin(angle1) * 0.95f), color);
524*35238bceSAndroid Build Coastguard Worker }
525*35238bceSAndroid Build Coastguard Worker }
526*35238bceSAndroid Build Coastguard Worker
527*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
528*35238bceSAndroid Build Coastguard Worker * \brief Tests coverage mask generation proportionality property.
529*35238bceSAndroid Build Coastguard Worker *
530*35238bceSAndroid Build Coastguard Worker * Tests that the number of coverage bits in a coverage mask set with
531*35238bceSAndroid Build Coastguard Worker * glSampleMaski is, on average, proportional to the number of set bits.
532*35238bceSAndroid Build Coastguard Worker * Draws multiple frames, each time increasing the number of mask bits set
533*35238bceSAndroid Build Coastguard Worker * and checks that the average color is changing appropriately.
534*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
535*35238bceSAndroid Build Coastguard Worker class MaskProportionalityCase : public DefaultFBOMultisampleCase
536*35238bceSAndroid Build Coastguard Worker {
537*35238bceSAndroid Build Coastguard Worker public:
538*35238bceSAndroid Build Coastguard Worker MaskProportionalityCase(Context &context, const char *name, const char *description);
~MaskProportionalityCase(void)539*35238bceSAndroid Build Coastguard Worker ~MaskProportionalityCase(void)
540*35238bceSAndroid Build Coastguard Worker {
541*35238bceSAndroid Build Coastguard Worker }
542*35238bceSAndroid Build Coastguard Worker
543*35238bceSAndroid Build Coastguard Worker void init(void);
544*35238bceSAndroid Build Coastguard Worker
545*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void);
546*35238bceSAndroid Build Coastguard Worker
547*35238bceSAndroid Build Coastguard Worker private:
548*35238bceSAndroid Build Coastguard Worker int m_numIterations;
549*35238bceSAndroid Build Coastguard Worker int m_currentIteration;
550*35238bceSAndroid Build Coastguard Worker
551*35238bceSAndroid Build Coastguard Worker int32_t m_previousIterationColorSum;
552*35238bceSAndroid Build Coastguard Worker };
553*35238bceSAndroid Build Coastguard Worker
MaskProportionalityCase(Context & context,const char * name,const char * description)554*35238bceSAndroid Build Coastguard Worker MaskProportionalityCase::MaskProportionalityCase(Context &context, const char *name, const char *description)
555*35238bceSAndroid Build Coastguard Worker : DefaultFBOMultisampleCase(context, name, description, 32)
556*35238bceSAndroid Build Coastguard Worker , m_numIterations(-1)
557*35238bceSAndroid Build Coastguard Worker , m_currentIteration(0)
558*35238bceSAndroid Build Coastguard Worker , m_previousIterationColorSum(-1)
559*35238bceSAndroid Build Coastguard Worker {
560*35238bceSAndroid Build Coastguard Worker }
561*35238bceSAndroid Build Coastguard Worker
init(void)562*35238bceSAndroid Build Coastguard Worker void MaskProportionalityCase::init(void)
563*35238bceSAndroid Build Coastguard Worker {
564*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
565*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
566*35238bceSAndroid Build Coastguard Worker
567*35238bceSAndroid Build Coastguard Worker // check the test is even possible
568*35238bceSAndroid Build Coastguard Worker GLint maxSampleMaskWords = 0;
569*35238bceSAndroid Build Coastguard Worker gl.getIntegerv(GL_MAX_SAMPLE_MASK_WORDS, &maxSampleMaskWords);
570*35238bceSAndroid Build Coastguard Worker if (getEffectiveSampleMaskWordCount(m_numSamples - 1) > maxSampleMaskWords)
571*35238bceSAndroid Build Coastguard Worker throw tcu::NotSupportedError("Test requires larger GL_MAX_SAMPLE_MASK_WORDS");
572*35238bceSAndroid Build Coastguard Worker
573*35238bceSAndroid Build Coastguard Worker DefaultFBOMultisampleCase::init();
574*35238bceSAndroid Build Coastguard Worker
575*35238bceSAndroid Build Coastguard Worker // set state
576*35238bceSAndroid Build Coastguard Worker gl.enable(GL_SAMPLE_MASK);
577*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "glEnable(GL_SAMPLE_MASK)");
578*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "GL_SAMPLE_MASK is enabled" << TestLog::EndMessage;
579*35238bceSAndroid Build Coastguard Worker
580*35238bceSAndroid Build Coastguard Worker m_numIterations = m_numSamples + 1;
581*35238bceSAndroid Build Coastguard Worker
582*35238bceSAndroid Build Coastguard Worker randomizeViewport(); // \note Using the same viewport for every iteration since coverage mask may depend on window-relative pixel coordinate.
583*35238bceSAndroid Build Coastguard Worker }
584*35238bceSAndroid Build Coastguard Worker
iterate(void)585*35238bceSAndroid Build Coastguard Worker MaskProportionalityCase::IterateResult MaskProportionalityCase::iterate(void)
586*35238bceSAndroid Build Coastguard Worker {
587*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
588*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
589*35238bceSAndroid Build Coastguard Worker tcu::Surface renderedImg(m_viewportSize, m_viewportSize);
590*35238bceSAndroid Build Coastguard Worker int32_t numPixels = (int32_t)renderedImg.getWidth() * (int32_t)renderedImg.getHeight();
591*35238bceSAndroid Build Coastguard Worker
592*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_numIterations >= 0);
593*35238bceSAndroid Build Coastguard Worker
594*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Clearing color to black" << TestLog::EndMessage;
595*35238bceSAndroid Build Coastguard Worker gl.colorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
596*35238bceSAndroid Build Coastguard Worker gl.clearColor(0.0f, 0.0f, 0.0f, 1.0f);
597*35238bceSAndroid Build Coastguard Worker gl.clear(GL_COLOR_BUFFER_BIT);
598*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "clear");
599*35238bceSAndroid Build Coastguard Worker
600*35238bceSAndroid Build Coastguard Worker // Draw quad.
601*35238bceSAndroid Build Coastguard Worker
602*35238bceSAndroid Build Coastguard Worker {
603*35238bceSAndroid Build Coastguard Worker const Vec2 pt0(-1.0f, -1.0f);
604*35238bceSAndroid Build Coastguard Worker const Vec2 pt1(1.0f, -1.0f);
605*35238bceSAndroid Build Coastguard Worker const Vec2 pt2(-1.0f, 1.0f);
606*35238bceSAndroid Build Coastguard Worker const Vec2 pt3(1.0f, 1.0f);
607*35238bceSAndroid Build Coastguard Worker Vec4 quadColor(1.0f, 0.0f, 0.0f, 1.0f);
608*35238bceSAndroid Build Coastguard Worker const std::vector<uint32_t> sampleMask = genAllSetToNthBitSampleMask(m_currentIteration);
609*35238bceSAndroid Build Coastguard Worker
610*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_currentIteration <= m_numSamples + 1);
611*35238bceSAndroid Build Coastguard Worker
612*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Drawing a red quad using sample mask 0b"
613*35238bceSAndroid Build Coastguard Worker << sampleMaskToString(sampleMask, m_numSamples) << TestLog::EndMessage;
614*35238bceSAndroid Build Coastguard Worker
615*35238bceSAndroid Build Coastguard Worker for (int wordNdx = 0; wordNdx < getEffectiveSampleMaskWordCount(m_numSamples - 1); ++wordNdx)
616*35238bceSAndroid Build Coastguard Worker {
617*35238bceSAndroid Build Coastguard Worker const GLbitfield mask = (wordNdx < (int)sampleMask.size()) ? ((GLbitfield)(sampleMask[wordNdx])) : (0);
618*35238bceSAndroid Build Coastguard Worker
619*35238bceSAndroid Build Coastguard Worker gl.sampleMaski(wordNdx, mask);
620*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "glSampleMaski");
621*35238bceSAndroid Build Coastguard Worker }
622*35238bceSAndroid Build Coastguard Worker
623*35238bceSAndroid Build Coastguard Worker renderQuad(pt0, pt1, pt2, pt3, quadColor);
624*35238bceSAndroid Build Coastguard Worker }
625*35238bceSAndroid Build Coastguard Worker
626*35238bceSAndroid Build Coastguard Worker // Read ang log image.
627*35238bceSAndroid Build Coastguard Worker
628*35238bceSAndroid Build Coastguard Worker readImage(renderedImg);
629*35238bceSAndroid Build Coastguard Worker
630*35238bceSAndroid Build Coastguard Worker log << TestLog::Image("RenderedImage", "Rendered image", renderedImg, QP_IMAGE_COMPRESSION_MODE_PNG);
631*35238bceSAndroid Build Coastguard Worker
632*35238bceSAndroid Build Coastguard Worker // Compute average red component in rendered image.
633*35238bceSAndroid Build Coastguard Worker
634*35238bceSAndroid Build Coastguard Worker int32_t sumRed = 0;
635*35238bceSAndroid Build Coastguard Worker
636*35238bceSAndroid Build Coastguard Worker for (int y = 0; y < renderedImg.getHeight(); y++)
637*35238bceSAndroid Build Coastguard Worker for (int x = 0; x < renderedImg.getWidth(); x++)
638*35238bceSAndroid Build Coastguard Worker sumRed += renderedImg.getPixel(x, y).getRed();
639*35238bceSAndroid Build Coastguard Worker
640*35238bceSAndroid Build Coastguard Worker log << TestLog::Message
641*35238bceSAndroid Build Coastguard Worker << "Average red color component: " << de::floatToString((float)sumRed / 255.0f / (float)numPixels, 2)
642*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
643*35238bceSAndroid Build Coastguard Worker
644*35238bceSAndroid Build Coastguard Worker // Check if average color has decreased from previous frame's color.
645*35238bceSAndroid Build Coastguard Worker
646*35238bceSAndroid Build Coastguard Worker if (sumRed < m_previousIterationColorSum)
647*35238bceSAndroid Build Coastguard Worker {
648*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Failure: Current average red color component is lower than previous"
649*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
650*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Failed");
651*35238bceSAndroid Build Coastguard Worker return STOP;
652*35238bceSAndroid Build Coastguard Worker }
653*35238bceSAndroid Build Coastguard Worker
654*35238bceSAndroid Build Coastguard Worker // Check if coverage mask is not all-zeros if alpha or coverage value is 0 (or 1, if inverted).
655*35238bceSAndroid Build Coastguard Worker
656*35238bceSAndroid Build Coastguard Worker if (m_currentIteration == 0 && sumRed != 0)
657*35238bceSAndroid Build Coastguard Worker {
658*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Failure: Image should be completely black" << TestLog::EndMessage;
659*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Failed");
660*35238bceSAndroid Build Coastguard Worker return STOP;
661*35238bceSAndroid Build Coastguard Worker }
662*35238bceSAndroid Build Coastguard Worker
663*35238bceSAndroid Build Coastguard Worker if (m_currentIteration == m_numIterations - 1 && sumRed != 0xff * numPixels)
664*35238bceSAndroid Build Coastguard Worker {
665*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Failure: Image should be completely red" << TestLog::EndMessage;
666*35238bceSAndroid Build Coastguard Worker
667*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Failed");
668*35238bceSAndroid Build Coastguard Worker return STOP;
669*35238bceSAndroid Build Coastguard Worker }
670*35238bceSAndroid Build Coastguard Worker
671*35238bceSAndroid Build Coastguard Worker m_previousIterationColorSum = sumRed;
672*35238bceSAndroid Build Coastguard Worker
673*35238bceSAndroid Build Coastguard Worker m_currentIteration++;
674*35238bceSAndroid Build Coastguard Worker
675*35238bceSAndroid Build Coastguard Worker if (m_currentIteration >= m_numIterations)
676*35238bceSAndroid Build Coastguard Worker {
677*35238bceSAndroid Build Coastguard Worker log << TestLog::Message
678*35238bceSAndroid Build Coastguard Worker << "Success: Number of coverage mask bits set appears to be, on average, proportional to the number of set "
679*35238bceSAndroid Build Coastguard Worker "sample mask bits"
680*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
681*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Passed");
682*35238bceSAndroid Build Coastguard Worker return STOP;
683*35238bceSAndroid Build Coastguard Worker }
684*35238bceSAndroid Build Coastguard Worker else
685*35238bceSAndroid Build Coastguard Worker return CONTINUE;
686*35238bceSAndroid Build Coastguard Worker }
687*35238bceSAndroid Build Coastguard Worker
688*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
689*35238bceSAndroid Build Coastguard Worker * \brief Tests coverage mask generation constancy property.
690*35238bceSAndroid Build Coastguard Worker *
691*35238bceSAndroid Build Coastguard Worker * Tests that the coverage mask created by GL_SAMPLE_MASK is constant at
692*35238bceSAndroid Build Coastguard Worker * given pixel coordinates. Draws two quads, with the second one fully
693*35238bceSAndroid Build Coastguard Worker * overlapping the first one such that at any given pixel, both quads have
694*35238bceSAndroid Build Coastguard Worker * the same coverage mask value. This way, if the constancy property is
695*35238bceSAndroid Build Coastguard Worker * fulfilled, only the second quad should be visible.
696*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
697*35238bceSAndroid Build Coastguard Worker class MaskConstancyCase : public DefaultFBOMultisampleCase
698*35238bceSAndroid Build Coastguard Worker {
699*35238bceSAndroid Build Coastguard Worker public:
700*35238bceSAndroid Build Coastguard Worker enum CaseBits
701*35238bceSAndroid Build Coastguard Worker {
702*35238bceSAndroid Build Coastguard Worker CASEBIT_ALPHA_TO_COVERAGE = 1, //!< Use alpha-to-coverage.
703*35238bceSAndroid Build Coastguard Worker CASEBIT_SAMPLE_COVERAGE = 2, //!< Use sample coverage.
704*35238bceSAndroid Build Coastguard Worker CASEBIT_SAMPLE_COVERAGE_INVERTED = 4, //!< Inverted sample coverage.
705*35238bceSAndroid Build Coastguard Worker CASEBIT_SAMPLE_MASK = 8, //!< Use sample mask.
706*35238bceSAndroid Build Coastguard Worker };
707*35238bceSAndroid Build Coastguard Worker
708*35238bceSAndroid Build Coastguard Worker MaskConstancyCase(Context &context, const char *name, const char *description, uint32_t typeBits);
~MaskConstancyCase(void)709*35238bceSAndroid Build Coastguard Worker ~MaskConstancyCase(void)
710*35238bceSAndroid Build Coastguard Worker {
711*35238bceSAndroid Build Coastguard Worker }
712*35238bceSAndroid Build Coastguard Worker
713*35238bceSAndroid Build Coastguard Worker void init(void);
714*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void);
715*35238bceSAndroid Build Coastguard Worker
716*35238bceSAndroid Build Coastguard Worker private:
717*35238bceSAndroid Build Coastguard Worker const bool m_isAlphaToCoverageCase;
718*35238bceSAndroid Build Coastguard Worker const bool m_isSampleCoverageCase;
719*35238bceSAndroid Build Coastguard Worker const bool m_isInvertedSampleCoverageCase;
720*35238bceSAndroid Build Coastguard Worker const bool m_isSampleMaskCase;
721*35238bceSAndroid Build Coastguard Worker };
722*35238bceSAndroid Build Coastguard Worker
MaskConstancyCase(Context & context,const char * name,const char * description,uint32_t typeBits)723*35238bceSAndroid Build Coastguard Worker MaskConstancyCase::MaskConstancyCase(Context &context, const char *name, const char *description, uint32_t typeBits)
724*35238bceSAndroid Build Coastguard Worker : DefaultFBOMultisampleCase(context, name, description, 256)
725*35238bceSAndroid Build Coastguard Worker , m_isAlphaToCoverageCase(0 != (typeBits & CASEBIT_ALPHA_TO_COVERAGE))
726*35238bceSAndroid Build Coastguard Worker , m_isSampleCoverageCase(0 != (typeBits & CASEBIT_SAMPLE_COVERAGE))
727*35238bceSAndroid Build Coastguard Worker , m_isInvertedSampleCoverageCase(0 != (typeBits & CASEBIT_SAMPLE_COVERAGE_INVERTED))
728*35238bceSAndroid Build Coastguard Worker , m_isSampleMaskCase(0 != (typeBits & CASEBIT_SAMPLE_MASK))
729*35238bceSAndroid Build Coastguard Worker {
730*35238bceSAndroid Build Coastguard Worker // CASEBIT_SAMPLE_COVERAGE_INVERT => CASEBIT_SAMPLE_COVERAGE
731*35238bceSAndroid Build Coastguard Worker DE_ASSERT((typeBits & CASEBIT_SAMPLE_COVERAGE) || ~(typeBits & CASEBIT_SAMPLE_COVERAGE_INVERTED));
732*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_isSampleMaskCase); // no point testing non-sample-mask cases, they are checked already in gles3
733*35238bceSAndroid Build Coastguard Worker }
734*35238bceSAndroid Build Coastguard Worker
init(void)735*35238bceSAndroid Build Coastguard Worker void MaskConstancyCase::init(void)
736*35238bceSAndroid Build Coastguard Worker {
737*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
738*35238bceSAndroid Build Coastguard Worker
739*35238bceSAndroid Build Coastguard Worker // check the test is even possible
740*35238bceSAndroid Build Coastguard Worker if (m_isSampleMaskCase)
741*35238bceSAndroid Build Coastguard Worker {
742*35238bceSAndroid Build Coastguard Worker GLint maxSampleMaskWords = 0;
743*35238bceSAndroid Build Coastguard Worker gl.getIntegerv(GL_MAX_SAMPLE_MASK_WORDS, &maxSampleMaskWords);
744*35238bceSAndroid Build Coastguard Worker if (getEffectiveSampleMaskWordCount(m_numSamples - 1) > maxSampleMaskWords)
745*35238bceSAndroid Build Coastguard Worker throw tcu::NotSupportedError("Test requires larger GL_MAX_SAMPLE_MASK_WORDS");
746*35238bceSAndroid Build Coastguard Worker }
747*35238bceSAndroid Build Coastguard Worker
748*35238bceSAndroid Build Coastguard Worker // normal init
749*35238bceSAndroid Build Coastguard Worker DefaultFBOMultisampleCase::init();
750*35238bceSAndroid Build Coastguard Worker }
751*35238bceSAndroid Build Coastguard Worker
iterate(void)752*35238bceSAndroid Build Coastguard Worker MaskConstancyCase::IterateResult MaskConstancyCase::iterate(void)
753*35238bceSAndroid Build Coastguard Worker {
754*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
755*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
756*35238bceSAndroid Build Coastguard Worker tcu::Surface renderedImg(m_viewportSize, m_viewportSize);
757*35238bceSAndroid Build Coastguard Worker
758*35238bceSAndroid Build Coastguard Worker randomizeViewport();
759*35238bceSAndroid Build Coastguard Worker
760*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Clearing color to black" << TestLog::EndMessage;
761*35238bceSAndroid Build Coastguard Worker gl.clearColor(0.0f, 0.0f, 0.0f, 1.0f);
762*35238bceSAndroid Build Coastguard Worker gl.clear(GL_COLOR_BUFFER_BIT);
763*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "clear");
764*35238bceSAndroid Build Coastguard Worker
765*35238bceSAndroid Build Coastguard Worker if (m_isAlphaToCoverageCase)
766*35238bceSAndroid Build Coastguard Worker {
767*35238bceSAndroid Build Coastguard Worker gl.enable(GL_SAMPLE_ALPHA_TO_COVERAGE);
768*35238bceSAndroid Build Coastguard Worker gl.colorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE);
769*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "enable GL_SAMPLE_ALPHA_TO_COVERAGE");
770*35238bceSAndroid Build Coastguard Worker
771*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "GL_SAMPLE_ALPHA_TO_COVERAGE is enabled" << TestLog::EndMessage;
772*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Color mask is TRUE, TRUE, TRUE, FALSE" << TestLog::EndMessage;
773*35238bceSAndroid Build Coastguard Worker }
774*35238bceSAndroid Build Coastguard Worker
775*35238bceSAndroid Build Coastguard Worker if (m_isSampleCoverageCase)
776*35238bceSAndroid Build Coastguard Worker {
777*35238bceSAndroid Build Coastguard Worker gl.enable(GL_SAMPLE_COVERAGE);
778*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "enable GL_SAMPLE_COVERAGE");
779*35238bceSAndroid Build Coastguard Worker
780*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "GL_SAMPLE_COVERAGE is enabled" << TestLog::EndMessage;
781*35238bceSAndroid Build Coastguard Worker }
782*35238bceSAndroid Build Coastguard Worker
783*35238bceSAndroid Build Coastguard Worker if (m_isSampleMaskCase)
784*35238bceSAndroid Build Coastguard Worker {
785*35238bceSAndroid Build Coastguard Worker gl.enable(GL_SAMPLE_MASK);
786*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "enable GL_SAMPLE_MASK");
787*35238bceSAndroid Build Coastguard Worker
788*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "GL_SAMPLE_MASK is enabled" << TestLog::EndMessage;
789*35238bceSAndroid Build Coastguard Worker }
790*35238bceSAndroid Build Coastguard Worker
791*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Drawing several green quads, each fully overlapped by a red quad with the same "
792*35238bceSAndroid Build Coastguard Worker << (m_isAlphaToCoverageCase ? "alpha" : "")
793*35238bceSAndroid Build Coastguard Worker << (m_isAlphaToCoverageCase && (m_isSampleCoverageCase || m_isSampleMaskCase) ? " and " : "")
794*35238bceSAndroid Build Coastguard Worker << (m_isInvertedSampleCoverageCase ? "inverted " : "") << (m_isSampleCoverageCase ? "sample coverage" : "")
795*35238bceSAndroid Build Coastguard Worker << (m_isSampleCoverageCase && m_isSampleMaskCase ? " and " : "") << (m_isSampleMaskCase ? "sample mask" : "")
796*35238bceSAndroid Build Coastguard Worker << " values" << TestLog::EndMessage;
797*35238bceSAndroid Build Coastguard Worker
798*35238bceSAndroid Build Coastguard Worker const int numQuadRowsCols = m_numSamples * 4;
799*35238bceSAndroid Build Coastguard Worker
800*35238bceSAndroid Build Coastguard Worker for (int row = 0; row < numQuadRowsCols; row++)
801*35238bceSAndroid Build Coastguard Worker {
802*35238bceSAndroid Build Coastguard Worker for (int col = 0; col < numQuadRowsCols; col++)
803*35238bceSAndroid Build Coastguard Worker {
804*35238bceSAndroid Build Coastguard Worker float x0 = (float)(col + 0) / (float)numQuadRowsCols * 2.0f - 1.0f;
805*35238bceSAndroid Build Coastguard Worker float x1 = (float)(col + 1) / (float)numQuadRowsCols * 2.0f - 1.0f;
806*35238bceSAndroid Build Coastguard Worker float y0 = (float)(row + 0) / (float)numQuadRowsCols * 2.0f - 1.0f;
807*35238bceSAndroid Build Coastguard Worker float y1 = (float)(row + 1) / (float)numQuadRowsCols * 2.0f - 1.0f;
808*35238bceSAndroid Build Coastguard Worker const Vec4 baseGreen(0.0f, 1.0f, 0.0f, 0.0f);
809*35238bceSAndroid Build Coastguard Worker const Vec4 baseRed(1.0f, 0.0f, 0.0f, 0.0f);
810*35238bceSAndroid Build Coastguard Worker Vec4 alpha0(0.0f, 0.0f, 0.0f, m_isAlphaToCoverageCase ? (float)col / (float)(numQuadRowsCols - 1) : 1.0f);
811*35238bceSAndroid Build Coastguard Worker Vec4 alpha1(0.0f, 0.0f, 0.0f, m_isAlphaToCoverageCase ? (float)row / (float)(numQuadRowsCols - 1) : 1.0f);
812*35238bceSAndroid Build Coastguard Worker
813*35238bceSAndroid Build Coastguard Worker if (m_isSampleCoverageCase)
814*35238bceSAndroid Build Coastguard Worker {
815*35238bceSAndroid Build Coastguard Worker float value = (float)(row * numQuadRowsCols + col) / (float)(numQuadRowsCols * numQuadRowsCols - 1);
816*35238bceSAndroid Build Coastguard Worker gl.sampleCoverage(m_isInvertedSampleCoverageCase ? 1.0f - value : value,
817*35238bceSAndroid Build Coastguard Worker m_isInvertedSampleCoverageCase ? GL_TRUE : GL_FALSE);
818*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "glSampleCoverage");
819*35238bceSAndroid Build Coastguard Worker }
820*35238bceSAndroid Build Coastguard Worker
821*35238bceSAndroid Build Coastguard Worker if (m_isSampleMaskCase)
822*35238bceSAndroid Build Coastguard Worker {
823*35238bceSAndroid Build Coastguard Worker const int wordCount = getEffectiveSampleMaskWordCount(m_numSamples - 1);
824*35238bceSAndroid Build Coastguard Worker const GLbitfield finalWordBits = m_numSamples - 32 * ((m_numSamples - 1) / 32);
825*35238bceSAndroid Build Coastguard Worker const GLbitfield finalWordMask = (GLbitfield)deBitMask32(0, (int)finalWordBits);
826*35238bceSAndroid Build Coastguard Worker
827*35238bceSAndroid Build Coastguard Worker for (int wordNdx = 0; wordNdx < wordCount; ++wordNdx)
828*35238bceSAndroid Build Coastguard Worker {
829*35238bceSAndroid Build Coastguard Worker const GLbitfield mask = (GLbitfield)deUint32Hash((col << (m_numSamples / 2)) ^ row);
830*35238bceSAndroid Build Coastguard Worker const bool isFinalWord = (wordNdx + 1) == wordCount;
831*35238bceSAndroid Build Coastguard Worker const GLbitfield maskMask =
832*35238bceSAndroid Build Coastguard Worker (isFinalWord) ?
833*35238bceSAndroid Build Coastguard Worker (finalWordMask) :
834*35238bceSAndroid Build Coastguard Worker (0xFFFFFFFFUL); // maskMask prevents setting coverage bits higher than sample count
835*35238bceSAndroid Build Coastguard Worker
836*35238bceSAndroid Build Coastguard Worker gl.sampleMaski(wordNdx, mask & maskMask);
837*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "glSampleMaski");
838*35238bceSAndroid Build Coastguard Worker }
839*35238bceSAndroid Build Coastguard Worker }
840*35238bceSAndroid Build Coastguard Worker
841*35238bceSAndroid Build Coastguard Worker renderQuad(Vec2(x0, y0), Vec2(x1, y0), Vec2(x0, y1), Vec2(x1, y1), baseGreen + alpha0, baseGreen + alpha1,
842*35238bceSAndroid Build Coastguard Worker baseGreen + alpha0, baseGreen + alpha1);
843*35238bceSAndroid Build Coastguard Worker renderQuad(Vec2(x0, y0), Vec2(x1, y0), Vec2(x0, y1), Vec2(x1, y1), baseRed + alpha0, baseRed + alpha1,
844*35238bceSAndroid Build Coastguard Worker baseRed + alpha0, baseRed + alpha1);
845*35238bceSAndroid Build Coastguard Worker }
846*35238bceSAndroid Build Coastguard Worker }
847*35238bceSAndroid Build Coastguard Worker
848*35238bceSAndroid Build Coastguard Worker readImage(renderedImg);
849*35238bceSAndroid Build Coastguard Worker
850*35238bceSAndroid Build Coastguard Worker log << TestLog::Image("RenderedImage", "Rendered image", renderedImg, QP_IMAGE_COMPRESSION_MODE_PNG);
851*35238bceSAndroid Build Coastguard Worker
852*35238bceSAndroid Build Coastguard Worker for (int y = 0; y < renderedImg.getHeight(); y++)
853*35238bceSAndroid Build Coastguard Worker for (int x = 0; x < renderedImg.getWidth(); x++)
854*35238bceSAndroid Build Coastguard Worker {
855*35238bceSAndroid Build Coastguard Worker if (renderedImg.getPixel(x, y).getGreen() > 0)
856*35238bceSAndroid Build Coastguard Worker {
857*35238bceSAndroid Build Coastguard Worker log << TestLog::Message
858*35238bceSAndroid Build Coastguard Worker << "Failure: Non-zero green color component detected - should have been completely overwritten by "
859*35238bceSAndroid Build Coastguard Worker "red quad"
860*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
861*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Failed");
862*35238bceSAndroid Build Coastguard Worker return STOP;
863*35238bceSAndroid Build Coastguard Worker }
864*35238bceSAndroid Build Coastguard Worker }
865*35238bceSAndroid Build Coastguard Worker
866*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Success: Coverage mask appears to be constant at a given pixel coordinate with a given "
867*35238bceSAndroid Build Coastguard Worker << (m_isAlphaToCoverageCase ? "alpha" : "")
868*35238bceSAndroid Build Coastguard Worker << (m_isAlphaToCoverageCase && m_isSampleCoverageCase ? " and " : "")
869*35238bceSAndroid Build Coastguard Worker << (m_isSampleCoverageCase ? "coverage value" : "") << TestLog::EndMessage;
870*35238bceSAndroid Build Coastguard Worker
871*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Passed");
872*35238bceSAndroid Build Coastguard Worker
873*35238bceSAndroid Build Coastguard Worker return STOP;
874*35238bceSAndroid Build Coastguard Worker }
875*35238bceSAndroid Build Coastguard Worker
876*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
877*35238bceSAndroid Build Coastguard Worker * \brief Tests that unused bits of a sample mask have no effect
878*35238bceSAndroid Build Coastguard Worker *
879*35238bceSAndroid Build Coastguard Worker * Tests that the bits in the sample mask with positions higher than
880*35238bceSAndroid Build Coastguard Worker * the number of samples do not have effect. In multisample fragment
881*35238bceSAndroid Build Coastguard Worker * operations the sample mask is ANDed with the fragment coverage value.
882*35238bceSAndroid Build Coastguard Worker * The coverage value cannot have the corresponding bits set.
883*35238bceSAndroid Build Coastguard Worker *
884*35238bceSAndroid Build Coastguard Worker * This is done by drawing a quads with varying sample masks and then
885*35238bceSAndroid Build Coastguard Worker * redrawing the quads with identical masks but with the mask's high bits
886*35238bceSAndroid Build Coastguard Worker * having different values. Only the latter quad pattern should be visible.
887*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
888*35238bceSAndroid Build Coastguard Worker class SampleMaskHighBitsCase : public DefaultFBOMultisampleCase
889*35238bceSAndroid Build Coastguard Worker {
890*35238bceSAndroid Build Coastguard Worker public:
891*35238bceSAndroid Build Coastguard Worker SampleMaskHighBitsCase(Context &context, const char *name, const char *description);
~SampleMaskHighBitsCase(void)892*35238bceSAndroid Build Coastguard Worker ~SampleMaskHighBitsCase(void)
893*35238bceSAndroid Build Coastguard Worker {
894*35238bceSAndroid Build Coastguard Worker }
895*35238bceSAndroid Build Coastguard Worker
896*35238bceSAndroid Build Coastguard Worker void init(void);
897*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void);
898*35238bceSAndroid Build Coastguard Worker };
899*35238bceSAndroid Build Coastguard Worker
SampleMaskHighBitsCase(Context & context,const char * name,const char * description)900*35238bceSAndroid Build Coastguard Worker SampleMaskHighBitsCase::SampleMaskHighBitsCase(Context &context, const char *name, const char *description)
901*35238bceSAndroid Build Coastguard Worker : DefaultFBOMultisampleCase(context, name, description, 256)
902*35238bceSAndroid Build Coastguard Worker {
903*35238bceSAndroid Build Coastguard Worker }
904*35238bceSAndroid Build Coastguard Worker
init(void)905*35238bceSAndroid Build Coastguard Worker void SampleMaskHighBitsCase::init(void)
906*35238bceSAndroid Build Coastguard Worker {
907*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
908*35238bceSAndroid Build Coastguard Worker GLint maxSampleMaskWords = 0;
909*35238bceSAndroid Build Coastguard Worker
910*35238bceSAndroid Build Coastguard Worker // check the test is even possible
911*35238bceSAndroid Build Coastguard Worker gl.getIntegerv(GL_MAX_SAMPLE_MASK_WORDS, &maxSampleMaskWords);
912*35238bceSAndroid Build Coastguard Worker if (getEffectiveSampleMaskWordCount(m_numSamples - 1) > maxSampleMaskWords)
913*35238bceSAndroid Build Coastguard Worker throw tcu::NotSupportedError("Test requires larger GL_MAX_SAMPLE_MASK_WORDS");
914*35238bceSAndroid Build Coastguard Worker
915*35238bceSAndroid Build Coastguard Worker // normal init
916*35238bceSAndroid Build Coastguard Worker DefaultFBOMultisampleCase::init();
917*35238bceSAndroid Build Coastguard Worker }
918*35238bceSAndroid Build Coastguard Worker
iterate(void)919*35238bceSAndroid Build Coastguard Worker SampleMaskHighBitsCase::IterateResult SampleMaskHighBitsCase::iterate(void)
920*35238bceSAndroid Build Coastguard Worker {
921*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
922*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
923*35238bceSAndroid Build Coastguard Worker tcu::Surface renderedImg(m_viewportSize, m_viewportSize);
924*35238bceSAndroid Build Coastguard Worker de::Random rnd(12345);
925*35238bceSAndroid Build Coastguard Worker
926*35238bceSAndroid Build Coastguard Worker if (m_numSamples % 32 == 0)
927*35238bceSAndroid Build Coastguard Worker {
928*35238bceSAndroid Build Coastguard Worker log << TestLog::Message
929*35238bceSAndroid Build Coastguard Worker << "Sample count is multiple of word size. No unused high bits in sample mask.\nSkipping."
930*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
931*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Skipped");
932*35238bceSAndroid Build Coastguard Worker return STOP;
933*35238bceSAndroid Build Coastguard Worker }
934*35238bceSAndroid Build Coastguard Worker
935*35238bceSAndroid Build Coastguard Worker randomizeViewport();
936*35238bceSAndroid Build Coastguard Worker
937*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Clearing color to black" << TestLog::EndMessage;
938*35238bceSAndroid Build Coastguard Worker gl.clearColor(0.0f, 0.0f, 0.0f, 1.0f);
939*35238bceSAndroid Build Coastguard Worker gl.clear(GL_COLOR_BUFFER_BIT);
940*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "clear");
941*35238bceSAndroid Build Coastguard Worker
942*35238bceSAndroid Build Coastguard Worker gl.enable(GL_SAMPLE_MASK);
943*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "enable GL_SAMPLE_MASK");
944*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "GL_SAMPLE_MASK is enabled" << TestLog::EndMessage;
945*35238bceSAndroid Build Coastguard Worker log << TestLog::Message
946*35238bceSAndroid Build Coastguard Worker << "Drawing several green quads, each fully overlapped by a red quad with the same effective sample mask values"
947*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
948*35238bceSAndroid Build Coastguard Worker
949*35238bceSAndroid Build Coastguard Worker const int numQuadRowsCols = m_numSamples * 4;
950*35238bceSAndroid Build Coastguard Worker
951*35238bceSAndroid Build Coastguard Worker for (int row = 0; row < numQuadRowsCols; row++)
952*35238bceSAndroid Build Coastguard Worker {
953*35238bceSAndroid Build Coastguard Worker for (int col = 0; col < numQuadRowsCols; col++)
954*35238bceSAndroid Build Coastguard Worker {
955*35238bceSAndroid Build Coastguard Worker float x0 = (float)(col + 0) / (float)numQuadRowsCols * 2.0f - 1.0f;
956*35238bceSAndroid Build Coastguard Worker float x1 = (float)(col + 1) / (float)numQuadRowsCols * 2.0f - 1.0f;
957*35238bceSAndroid Build Coastguard Worker float y0 = (float)(row + 0) / (float)numQuadRowsCols * 2.0f - 1.0f;
958*35238bceSAndroid Build Coastguard Worker float y1 = (float)(row + 1) / (float)numQuadRowsCols * 2.0f - 1.0f;
959*35238bceSAndroid Build Coastguard Worker const Vec4 baseGreen(0.0f, 1.0f, 0.0f, 1.0f);
960*35238bceSAndroid Build Coastguard Worker const Vec4 baseRed(1.0f, 0.0f, 0.0f, 1.0f);
961*35238bceSAndroid Build Coastguard Worker
962*35238bceSAndroid Build Coastguard Worker const int wordCount = getEffectiveSampleMaskWordCount(m_numSamples - 1);
963*35238bceSAndroid Build Coastguard Worker const GLbitfield finalWordBits = m_numSamples - 32 * ((m_numSamples - 1) / 32);
964*35238bceSAndroid Build Coastguard Worker const GLbitfield finalWordMask = (GLbitfield)deBitMask32(0, (int)finalWordBits);
965*35238bceSAndroid Build Coastguard Worker
966*35238bceSAndroid Build Coastguard Worker for (int wordNdx = 0; wordNdx < wordCount; ++wordNdx)
967*35238bceSAndroid Build Coastguard Worker {
968*35238bceSAndroid Build Coastguard Worker const GLbitfield mask = (GLbitfield)deUint32Hash((col << (m_numSamples / 2)) ^ row);
969*35238bceSAndroid Build Coastguard Worker const bool isFinalWord = (wordNdx + 1) == wordCount;
970*35238bceSAndroid Build Coastguard Worker const GLbitfield maskMask =
971*35238bceSAndroid Build Coastguard Worker (isFinalWord) ? (finalWordMask) :
972*35238bceSAndroid Build Coastguard Worker (0xFFFFFFFFUL); // maskMask is 1 on bits in lower positions than sample count
973*35238bceSAndroid Build Coastguard Worker const GLbitfield highBits = rnd.getUint32();
974*35238bceSAndroid Build Coastguard Worker
975*35238bceSAndroid Build Coastguard Worker gl.sampleMaski(wordNdx, (mask & maskMask) | (highBits & ~maskMask));
976*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "glSampleMaski");
977*35238bceSAndroid Build Coastguard Worker }
978*35238bceSAndroid Build Coastguard Worker renderQuad(Vec2(x0, y0), Vec2(x1, y0), Vec2(x0, y1), Vec2(x1, y1), baseGreen, baseGreen, baseGreen,
979*35238bceSAndroid Build Coastguard Worker baseGreen);
980*35238bceSAndroid Build Coastguard Worker
981*35238bceSAndroid Build Coastguard Worker for (int wordNdx = 0; wordNdx < wordCount; ++wordNdx)
982*35238bceSAndroid Build Coastguard Worker {
983*35238bceSAndroid Build Coastguard Worker const GLbitfield mask = (GLbitfield)deUint32Hash((col << (m_numSamples / 2)) ^ row);
984*35238bceSAndroid Build Coastguard Worker const bool isFinalWord = (wordNdx + 1) == wordCount;
985*35238bceSAndroid Build Coastguard Worker const GLbitfield maskMask =
986*35238bceSAndroid Build Coastguard Worker (isFinalWord) ? (finalWordMask) :
987*35238bceSAndroid Build Coastguard Worker (0xFFFFFFFFUL); // maskMask is 1 on bits in lower positions than sample count
988*35238bceSAndroid Build Coastguard Worker const GLbitfield highBits = rnd.getUint32();
989*35238bceSAndroid Build Coastguard Worker
990*35238bceSAndroid Build Coastguard Worker gl.sampleMaski(wordNdx, (mask & maskMask) | (highBits & ~maskMask));
991*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "glSampleMaski");
992*35238bceSAndroid Build Coastguard Worker }
993*35238bceSAndroid Build Coastguard Worker renderQuad(Vec2(x0, y0), Vec2(x1, y0), Vec2(x0, y1), Vec2(x1, y1), baseRed, baseRed, baseRed, baseRed);
994*35238bceSAndroid Build Coastguard Worker }
995*35238bceSAndroid Build Coastguard Worker }
996*35238bceSAndroid Build Coastguard Worker
997*35238bceSAndroid Build Coastguard Worker readImage(renderedImg);
998*35238bceSAndroid Build Coastguard Worker
999*35238bceSAndroid Build Coastguard Worker log << TestLog::Image("RenderedImage", "Rendered image", renderedImg, QP_IMAGE_COMPRESSION_MODE_PNG);
1000*35238bceSAndroid Build Coastguard Worker
1001*35238bceSAndroid Build Coastguard Worker for (int y = 0; y < renderedImg.getHeight(); y++)
1002*35238bceSAndroid Build Coastguard Worker for (int x = 0; x < renderedImg.getWidth(); x++)
1003*35238bceSAndroid Build Coastguard Worker {
1004*35238bceSAndroid Build Coastguard Worker if (renderedImg.getPixel(x, y).getGreen() > 0)
1005*35238bceSAndroid Build Coastguard Worker {
1006*35238bceSAndroid Build Coastguard Worker log << TestLog::Message
1007*35238bceSAndroid Build Coastguard Worker << "Failure: Non-zero green color component detected - should have been completely overwritten by "
1008*35238bceSAndroid Build Coastguard Worker "red quad. Mask unused bits have effect."
1009*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
1010*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().setTestResult(QP_TEST_RESULT_FAIL, "Unused mask bits modified mask");
1011*35238bceSAndroid Build Coastguard Worker return STOP;
1012*35238bceSAndroid Build Coastguard Worker }
1013*35238bceSAndroid Build Coastguard Worker }
1014*35238bceSAndroid Build Coastguard Worker
1015*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Success: Coverage mask high bits appear to have no effect." << TestLog::EndMessage;
1016*35238bceSAndroid Build Coastguard Worker m_context.getTestContext().setTestResult(QP_TEST_RESULT_PASS, "Passed");
1017*35238bceSAndroid Build Coastguard Worker
1018*35238bceSAndroid Build Coastguard Worker return STOP;
1019*35238bceSAndroid Build Coastguard Worker }
1020*35238bceSAndroid Build Coastguard Worker
1021*35238bceSAndroid Build Coastguard Worker } // namespace
1022*35238bceSAndroid Build Coastguard Worker
MultisampleTests(Context & context)1023*35238bceSAndroid Build Coastguard Worker MultisampleTests::MultisampleTests(Context &context) : TestCaseGroup(context, "multisample", "Multisample tests")
1024*35238bceSAndroid Build Coastguard Worker {
1025*35238bceSAndroid Build Coastguard Worker }
1026*35238bceSAndroid Build Coastguard Worker
~MultisampleTests(void)1027*35238bceSAndroid Build Coastguard Worker MultisampleTests::~MultisampleTests(void)
1028*35238bceSAndroid Build Coastguard Worker {
1029*35238bceSAndroid Build Coastguard Worker }
1030*35238bceSAndroid Build Coastguard Worker
init(void)1031*35238bceSAndroid Build Coastguard Worker void MultisampleTests::init(void)
1032*35238bceSAndroid Build Coastguard Worker {
1033*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *const group =
1034*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, "default_framebuffer", "Test with default framebuffer");
1035*35238bceSAndroid Build Coastguard Worker
1036*35238bceSAndroid Build Coastguard Worker addChild(group);
1037*35238bceSAndroid Build Coastguard Worker
1038*35238bceSAndroid Build Coastguard Worker // .default_framebuffer
1039*35238bceSAndroid Build Coastguard Worker {
1040*35238bceSAndroid Build Coastguard Worker // sample positions
1041*35238bceSAndroid Build Coastguard Worker group->addChild(new SamplePosQueryCase(m_context, "sample_position", "test SAMPLE_POSITION"));
1042*35238bceSAndroid Build Coastguard Worker
1043*35238bceSAndroid Build Coastguard Worker // sample mask
1044*35238bceSAndroid Build Coastguard Worker group->addChild(new MaskInvertCase(m_context, "sample_mask_sum_of_inverses",
1045*35238bceSAndroid Build Coastguard Worker "Test that mask and its negation's sum equal the fully set mask"));
1046*35238bceSAndroid Build Coastguard Worker group->addChild(new MaskProportionalityCase(m_context, "proportionality_sample_mask",
1047*35238bceSAndroid Build Coastguard Worker "Test the proportionality property of GL_SAMPLE_MASK"));
1048*35238bceSAndroid Build Coastguard Worker
1049*35238bceSAndroid Build Coastguard Worker group->addChild(new MaskConstancyCase(m_context, "constancy_sample_mask",
1050*35238bceSAndroid Build Coastguard Worker "Test that coverage mask is constant at given coordinates with a given "
1051*35238bceSAndroid Build Coastguard Worker "alpha or coverage value, using GL_SAMPLE_MASK",
1052*35238bceSAndroid Build Coastguard Worker MaskConstancyCase::CASEBIT_SAMPLE_MASK));
1053*35238bceSAndroid Build Coastguard Worker group->addChild(new MaskConstancyCase(
1054*35238bceSAndroid Build Coastguard Worker m_context, "constancy_alpha_to_coverage_sample_mask",
1055*35238bceSAndroid Build Coastguard Worker "Test that coverage mask is constant at given coordinates with a given alpha or coverage value, using "
1056*35238bceSAndroid Build Coastguard Worker "GL_SAMPLE_ALPHA_TO_COVERAGE and GL_SAMPLE_MASK",
1057*35238bceSAndroid Build Coastguard Worker MaskConstancyCase::CASEBIT_ALPHA_TO_COVERAGE | MaskConstancyCase::CASEBIT_SAMPLE_MASK));
1058*35238bceSAndroid Build Coastguard Worker group->addChild(
1059*35238bceSAndroid Build Coastguard Worker new MaskConstancyCase(m_context, "constancy_sample_coverage_sample_mask",
1060*35238bceSAndroid Build Coastguard Worker "Test that coverage mask is constant at given coordinates with a given alpha or "
1061*35238bceSAndroid Build Coastguard Worker "coverage value, using GL_SAMPLE_COVERAGE and GL_SAMPLE_MASK",
1062*35238bceSAndroid Build Coastguard Worker MaskConstancyCase::CASEBIT_SAMPLE_COVERAGE | MaskConstancyCase::CASEBIT_SAMPLE_MASK));
1063*35238bceSAndroid Build Coastguard Worker group->addChild(new MaskConstancyCase(
1064*35238bceSAndroid Build Coastguard Worker m_context, "constancy_alpha_to_coverage_sample_coverage_sample_mask",
1065*35238bceSAndroid Build Coastguard Worker "Test that coverage mask is constant at given coordinates with a given alpha or coverage value, using "
1066*35238bceSAndroid Build Coastguard Worker "GL_SAMPLE_ALPHA_TO_COVERAGE, GL_SAMPLE_COVERAGE and GL_SAMPLE_MASK",
1067*35238bceSAndroid Build Coastguard Worker MaskConstancyCase::CASEBIT_ALPHA_TO_COVERAGE | MaskConstancyCase::CASEBIT_SAMPLE_COVERAGE |
1068*35238bceSAndroid Build Coastguard Worker MaskConstancyCase::CASEBIT_SAMPLE_MASK));
1069*35238bceSAndroid Build Coastguard Worker group->addChild(new SampleMaskHighBitsCase(
1070*35238bceSAndroid Build Coastguard Worker m_context, "sample_mask_non_effective_bits",
1071*35238bceSAndroid Build Coastguard Worker "Test that values of unused bits of a sample mask (bit index > sample count) have no effect"));
1072*35238bceSAndroid Build Coastguard Worker }
1073*35238bceSAndroid Build Coastguard Worker }
1074*35238bceSAndroid Build Coastguard Worker
1075*35238bceSAndroid Build Coastguard Worker } // namespace Functional
1076*35238bceSAndroid Build Coastguard Worker } // namespace gles31
1077*35238bceSAndroid Build Coastguard Worker } // namespace deqp
1078