1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program OpenGL ES 2.0 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 Depth & stencil tests.
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "es2fDepthStencilTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "glsFragmentOpUtil.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "gluPixelTransfer.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "gluStrUtil.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "tcuSurface.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "tcuRenderTarget.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "tcuImageCompare.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "tcuCommandLine.hpp"
33*35238bceSAndroid Build Coastguard Worker #include "tcuTextureUtil.hpp"
34*35238bceSAndroid Build Coastguard Worker #include "deRandom.hpp"
35*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
36*35238bceSAndroid Build Coastguard Worker #include "deMemory.h"
37*35238bceSAndroid Build Coastguard Worker #include "deString.h"
38*35238bceSAndroid Build Coastguard Worker #include "rrFragmentOperations.hpp"
39*35238bceSAndroid Build Coastguard Worker #include "sglrReferenceUtils.hpp"
40*35238bceSAndroid Build Coastguard Worker
41*35238bceSAndroid Build Coastguard Worker #include <algorithm>
42*35238bceSAndroid Build Coastguard Worker #include <sstream>
43*35238bceSAndroid Build Coastguard Worker
44*35238bceSAndroid Build Coastguard Worker #include "glw.h"
45*35238bceSAndroid Build Coastguard Worker
46*35238bceSAndroid Build Coastguard Worker namespace deqp
47*35238bceSAndroid Build Coastguard Worker {
48*35238bceSAndroid Build Coastguard Worker namespace gles2
49*35238bceSAndroid Build Coastguard Worker {
50*35238bceSAndroid Build Coastguard Worker namespace Functional
51*35238bceSAndroid Build Coastguard Worker {
52*35238bceSAndroid Build Coastguard Worker
53*35238bceSAndroid Build Coastguard Worker using std::ostringstream;
54*35238bceSAndroid Build Coastguard Worker using std::vector;
55*35238bceSAndroid Build Coastguard Worker using tcu::IVec2;
56*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
57*35238bceSAndroid Build Coastguard Worker using tcu::Vec2;
58*35238bceSAndroid Build Coastguard Worker using tcu::Vec4;
59*35238bceSAndroid Build Coastguard Worker
60*35238bceSAndroid Build Coastguard Worker enum
61*35238bceSAndroid Build Coastguard Worker {
62*35238bceSAndroid Build Coastguard Worker VIEWPORT_WIDTH = 4 * 3 * 4,
63*35238bceSAndroid Build Coastguard Worker VIEWPORT_HEIGHT = 4 * 12,
64*35238bceSAndroid Build Coastguard Worker
65*35238bceSAndroid Build Coastguard Worker NUM_RANDOM_CASES = 25,
66*35238bceSAndroid Build Coastguard Worker NUM_RANDOM_SUB_CASES = 10
67*35238bceSAndroid Build Coastguard Worker };
68*35238bceSAndroid Build Coastguard Worker
69*35238bceSAndroid Build Coastguard Worker namespace DepthStencilCaseUtil
70*35238bceSAndroid Build Coastguard Worker {
71*35238bceSAndroid Build Coastguard Worker
72*35238bceSAndroid Build Coastguard Worker struct StencilParams
73*35238bceSAndroid Build Coastguard Worker {
74*35238bceSAndroid Build Coastguard Worker uint32_t function;
75*35238bceSAndroid Build Coastguard Worker int reference;
76*35238bceSAndroid Build Coastguard Worker uint32_t compareMask;
77*35238bceSAndroid Build Coastguard Worker
78*35238bceSAndroid Build Coastguard Worker uint32_t stencilFailOp;
79*35238bceSAndroid Build Coastguard Worker uint32_t depthFailOp;
80*35238bceSAndroid Build Coastguard Worker uint32_t depthPassOp;
81*35238bceSAndroid Build Coastguard Worker
82*35238bceSAndroid Build Coastguard Worker uint32_t writeMask;
83*35238bceSAndroid Build Coastguard Worker
StencilParamsdeqp::gles2::Functional::DepthStencilCaseUtil::StencilParams84*35238bceSAndroid Build Coastguard Worker StencilParams(void)
85*35238bceSAndroid Build Coastguard Worker : function(0)
86*35238bceSAndroid Build Coastguard Worker , reference(0)
87*35238bceSAndroid Build Coastguard Worker , compareMask(0)
88*35238bceSAndroid Build Coastguard Worker , stencilFailOp(0)
89*35238bceSAndroid Build Coastguard Worker , depthFailOp(0)
90*35238bceSAndroid Build Coastguard Worker , depthPassOp(0)
91*35238bceSAndroid Build Coastguard Worker , writeMask(0)
92*35238bceSAndroid Build Coastguard Worker {
93*35238bceSAndroid Build Coastguard Worker }
94*35238bceSAndroid Build Coastguard Worker };
95*35238bceSAndroid Build Coastguard Worker
96*35238bceSAndroid Build Coastguard Worker struct DepthStencilParams
97*35238bceSAndroid Build Coastguard Worker {
98*35238bceSAndroid Build Coastguard Worker rr::FaceType visibleFace; //!< Quad visible face.
99*35238bceSAndroid Build Coastguard Worker
100*35238bceSAndroid Build Coastguard Worker bool stencilTestEnabled;
101*35238bceSAndroid Build Coastguard Worker StencilParams stencil[rr::FACETYPE_LAST];
102*35238bceSAndroid Build Coastguard Worker
103*35238bceSAndroid Build Coastguard Worker bool depthTestEnabled;
104*35238bceSAndroid Build Coastguard Worker uint32_t depthFunc;
105*35238bceSAndroid Build Coastguard Worker float depth;
106*35238bceSAndroid Build Coastguard Worker bool depthWriteMask;
107*35238bceSAndroid Build Coastguard Worker
DepthStencilParamsdeqp::gles2::Functional::DepthStencilCaseUtil::DepthStencilParams108*35238bceSAndroid Build Coastguard Worker DepthStencilParams(void)
109*35238bceSAndroid Build Coastguard Worker : visibleFace(rr::FACETYPE_LAST)
110*35238bceSAndroid Build Coastguard Worker , stencilTestEnabled(false)
111*35238bceSAndroid Build Coastguard Worker , depthTestEnabled(false)
112*35238bceSAndroid Build Coastguard Worker , depthFunc(0)
113*35238bceSAndroid Build Coastguard Worker , depth(0.0f)
114*35238bceSAndroid Build Coastguard Worker , depthWriteMask(false)
115*35238bceSAndroid Build Coastguard Worker {
116*35238bceSAndroid Build Coastguard Worker }
117*35238bceSAndroid Build Coastguard Worker };
118*35238bceSAndroid Build Coastguard Worker
operator <<(tcu::TestLog & log,const StencilParams & params)119*35238bceSAndroid Build Coastguard Worker tcu::TestLog &operator<<(tcu::TestLog &log, const StencilParams ¶ms)
120*35238bceSAndroid Build Coastguard Worker {
121*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << " func = " << glu::getCompareFuncStr(params.function) << "\n"
122*35238bceSAndroid Build Coastguard Worker << " ref = " << params.reference << "\n"
123*35238bceSAndroid Build Coastguard Worker << " compare mask = " << tcu::toHex(params.compareMask) << "\n"
124*35238bceSAndroid Build Coastguard Worker << " stencil fail = " << glu::getStencilOpStr(params.stencilFailOp) << "\n"
125*35238bceSAndroid Build Coastguard Worker << " depth fail = " << glu::getStencilOpStr(params.depthFailOp) << "\n"
126*35238bceSAndroid Build Coastguard Worker << " depth pass = " << glu::getStencilOpStr(params.depthPassOp) << "\n"
127*35238bceSAndroid Build Coastguard Worker << " write mask = " << tcu::toHex(params.writeMask) << "\n"
128*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
129*35238bceSAndroid Build Coastguard Worker return log;
130*35238bceSAndroid Build Coastguard Worker }
131*35238bceSAndroid Build Coastguard Worker
operator <<(tcu::TestLog & log,const DepthStencilParams & params)132*35238bceSAndroid Build Coastguard Worker tcu::TestLog &operator<<(tcu::TestLog &log, const DepthStencilParams ¶ms)
133*35238bceSAndroid Build Coastguard Worker {
134*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Stencil test: " << (params.stencilTestEnabled ? "enabled" : "disabled")
135*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
136*35238bceSAndroid Build Coastguard Worker if (params.stencilTestEnabled)
137*35238bceSAndroid Build Coastguard Worker {
138*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Front-face stencil state: " << TestLog::EndMessage;
139*35238bceSAndroid Build Coastguard Worker log << params.stencil[rr::FACETYPE_FRONT];
140*35238bceSAndroid Build Coastguard Worker
141*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Back-face stencil state: " << TestLog::EndMessage;
142*35238bceSAndroid Build Coastguard Worker log << params.stencil[rr::FACETYPE_BACK];
143*35238bceSAndroid Build Coastguard Worker }
144*35238bceSAndroid Build Coastguard Worker
145*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Depth test: " << (params.depthTestEnabled ? "enabled" : "disabled")
146*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
147*35238bceSAndroid Build Coastguard Worker if (params.depthTestEnabled)
148*35238bceSAndroid Build Coastguard Worker {
149*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << " func = " << glu::getCompareFuncStr(params.depthFunc)
150*35238bceSAndroid Build Coastguard Worker << "\n"
151*35238bceSAndroid Build Coastguard Worker " depth value = "
152*35238bceSAndroid Build Coastguard Worker << params.depth
153*35238bceSAndroid Build Coastguard Worker << "\n"
154*35238bceSAndroid Build Coastguard Worker " write mask = "
155*35238bceSAndroid Build Coastguard Worker << (params.depthWriteMask ? "true" : "false") << "\n"
156*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
157*35238bceSAndroid Build Coastguard Worker }
158*35238bceSAndroid Build Coastguard Worker
159*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Triangles are " << (params.visibleFace == rr::FACETYPE_FRONT ? "front" : "back")
160*35238bceSAndroid Build Coastguard Worker << "-facing" << TestLog::EndMessage;
161*35238bceSAndroid Build Coastguard Worker
162*35238bceSAndroid Build Coastguard Worker return log;
163*35238bceSAndroid Build Coastguard Worker }
164*35238bceSAndroid Build Coastguard Worker
165*35238bceSAndroid Build Coastguard Worker struct ClearCommand
166*35238bceSAndroid Build Coastguard Worker {
167*35238bceSAndroid Build Coastguard Worker rr::WindowRectangle rect;
168*35238bceSAndroid Build Coastguard Worker uint32_t buffers;
169*35238bceSAndroid Build Coastguard Worker tcu::Vec4 color;
170*35238bceSAndroid Build Coastguard Worker int stencil;
171*35238bceSAndroid Build Coastguard Worker // \note No depth here - don't use clears for setting depth values; use quad rendering instead. Cleared depths are in [0, 1] to begin with,
172*35238bceSAndroid Build Coastguard Worker // whereas rendered depths are given in [-1, 1] and then mapped to [0, 1]; this discrepancy could cause precision issues in depth tests.
173*35238bceSAndroid Build Coastguard Worker
ClearCommanddeqp::gles2::Functional::DepthStencilCaseUtil::ClearCommand174*35238bceSAndroid Build Coastguard Worker ClearCommand(void) : rect(0, 0, 0, 0), buffers(0), stencil(0)
175*35238bceSAndroid Build Coastguard Worker {
176*35238bceSAndroid Build Coastguard Worker }
177*35238bceSAndroid Build Coastguard Worker
ClearCommanddeqp::gles2::Functional::DepthStencilCaseUtil::ClearCommand178*35238bceSAndroid Build Coastguard Worker ClearCommand(const rr::WindowRectangle &rect_, uint32_t buffers_, const tcu::Vec4 &color_, int stencil_)
179*35238bceSAndroid Build Coastguard Worker : rect(rect_)
180*35238bceSAndroid Build Coastguard Worker , buffers(buffers_)
181*35238bceSAndroid Build Coastguard Worker , color(color_)
182*35238bceSAndroid Build Coastguard Worker , stencil(stencil_)
183*35238bceSAndroid Build Coastguard Worker {
184*35238bceSAndroid Build Coastguard Worker }
185*35238bceSAndroid Build Coastguard Worker };
186*35238bceSAndroid Build Coastguard Worker
187*35238bceSAndroid Build Coastguard Worker struct RenderCommand
188*35238bceSAndroid Build Coastguard Worker {
189*35238bceSAndroid Build Coastguard Worker DepthStencilParams params;
190*35238bceSAndroid Build Coastguard Worker rr::WindowRectangle rect;
191*35238bceSAndroid Build Coastguard Worker tcu::Vec4 color;
192*35238bceSAndroid Build Coastguard Worker tcu::BVec4 colorMask;
193*35238bceSAndroid Build Coastguard Worker
RenderCommanddeqp::gles2::Functional::DepthStencilCaseUtil::RenderCommand194*35238bceSAndroid Build Coastguard Worker RenderCommand(void) : rect(0, 0, 0, 0)
195*35238bceSAndroid Build Coastguard Worker {
196*35238bceSAndroid Build Coastguard Worker }
197*35238bceSAndroid Build Coastguard Worker };
198*35238bceSAndroid Build Coastguard Worker
199*35238bceSAndroid Build Coastguard Worker struct RefRenderCommand
200*35238bceSAndroid Build Coastguard Worker {
201*35238bceSAndroid Build Coastguard Worker gls::FragmentOpUtil::IntegerQuad quad;
202*35238bceSAndroid Build Coastguard Worker rr::FragmentOperationState state;
203*35238bceSAndroid Build Coastguard Worker };
204*35238bceSAndroid Build Coastguard Worker
205*35238bceSAndroid Build Coastguard Worker struct TestRenderTarget
206*35238bceSAndroid Build Coastguard Worker {
207*35238bceSAndroid Build Coastguard Worker int width;
208*35238bceSAndroid Build Coastguard Worker int height;
209*35238bceSAndroid Build Coastguard Worker int depthBits;
210*35238bceSAndroid Build Coastguard Worker int stencilBits;
211*35238bceSAndroid Build Coastguard Worker
TestRenderTargetdeqp::gles2::Functional::DepthStencilCaseUtil::TestRenderTarget212*35238bceSAndroid Build Coastguard Worker TestRenderTarget(int width_, int height_, int depthBits_, int stencilBits_)
213*35238bceSAndroid Build Coastguard Worker : width(width_)
214*35238bceSAndroid Build Coastguard Worker , height(height_)
215*35238bceSAndroid Build Coastguard Worker , depthBits(depthBits_)
216*35238bceSAndroid Build Coastguard Worker , stencilBits(stencilBits_)
217*35238bceSAndroid Build Coastguard Worker {
218*35238bceSAndroid Build Coastguard Worker }
219*35238bceSAndroid Build Coastguard Worker
TestRenderTargetdeqp::gles2::Functional::DepthStencilCaseUtil::TestRenderTarget220*35238bceSAndroid Build Coastguard Worker TestRenderTarget(void) : width(0), height(0), depthBits(0), stencilBits(0)
221*35238bceSAndroid Build Coastguard Worker {
222*35238bceSAndroid Build Coastguard Worker }
223*35238bceSAndroid Build Coastguard Worker };
224*35238bceSAndroid Build Coastguard Worker
getStencilTestValues(int stencilBits,int numValues,int * values)225*35238bceSAndroid Build Coastguard Worker void getStencilTestValues(int stencilBits, int numValues, int *values)
226*35238bceSAndroid Build Coastguard Worker {
227*35238bceSAndroid Build Coastguard Worker int numLowest = numValues / 2;
228*35238bceSAndroid Build Coastguard Worker int numHighest = numValues - numLowest;
229*35238bceSAndroid Build Coastguard Worker int maxVal = (1 << stencilBits) - 1;
230*35238bceSAndroid Build Coastguard Worker
231*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < numLowest; ndx++)
232*35238bceSAndroid Build Coastguard Worker values[ndx] = ndx;
233*35238bceSAndroid Build Coastguard Worker
234*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < numHighest; ndx++)
235*35238bceSAndroid Build Coastguard Worker values[numValues - ndx - 1] = maxVal - ndx;
236*35238bceSAndroid Build Coastguard Worker }
237*35238bceSAndroid Build Coastguard Worker
generateBaseClearAndDepthCommands(const TestRenderTarget & target,vector<ClearCommand> & clearCommands,vector<RenderCommand> & renderCommands)238*35238bceSAndroid Build Coastguard Worker void generateBaseClearAndDepthCommands(const TestRenderTarget &target, vector<ClearCommand> &clearCommands,
239*35238bceSAndroid Build Coastguard Worker vector<RenderCommand> &renderCommands)
240*35238bceSAndroid Build Coastguard Worker {
241*35238bceSAndroid Build Coastguard Worker DE_ASSERT(clearCommands.empty());
242*35238bceSAndroid Build Coastguard Worker DE_ASSERT(renderCommands.empty());
243*35238bceSAndroid Build Coastguard Worker
244*35238bceSAndroid Build Coastguard Worker const int numL0CellsX = 4;
245*35238bceSAndroid Build Coastguard Worker const int numL0CellsY = 4;
246*35238bceSAndroid Build Coastguard Worker const int numL1CellsX = 3;
247*35238bceSAndroid Build Coastguard Worker const int numL1CellsY = 1;
248*35238bceSAndroid Build Coastguard Worker int cellL0Width = target.width / numL0CellsX;
249*35238bceSAndroid Build Coastguard Worker int cellL0Height = target.height / numL0CellsY;
250*35238bceSAndroid Build Coastguard Worker int cellL1Width = cellL0Width / numL1CellsX;
251*35238bceSAndroid Build Coastguard Worker int cellL1Height = cellL0Height / numL1CellsY;
252*35238bceSAndroid Build Coastguard Worker
253*35238bceSAndroid Build Coastguard Worker int stencilValues[numL0CellsX * numL0CellsY];
254*35238bceSAndroid Build Coastguard Worker float depthValues[numL1CellsX * numL1CellsY];
255*35238bceSAndroid Build Coastguard Worker
256*35238bceSAndroid Build Coastguard Worker if (cellL0Width <= 0 || cellL1Width <= 0 || cellL0Height <= 0 || cellL1Height <= 0)
257*35238bceSAndroid Build Coastguard Worker throw tcu::NotSupportedError("Too small render target");
258*35238bceSAndroid Build Coastguard Worker
259*35238bceSAndroid Build Coastguard Worker // Fullscreen clear to black.
260*35238bceSAndroid Build Coastguard Worker clearCommands.push_back(ClearCommand(rr::WindowRectangle(0, 0, target.width, target.height), GL_COLOR_BUFFER_BIT,
261*35238bceSAndroid Build Coastguard Worker Vec4(0.0f, 0.0f, 0.0f, 1.0f), 0));
262*35238bceSAndroid Build Coastguard Worker
263*35238bceSAndroid Build Coastguard Worker // Compute stencil values: numL0CellsX*numL0CellsY combinations of lowest and highest bits.
264*35238bceSAndroid Build Coastguard Worker getStencilTestValues(target.stencilBits, numL0CellsX * numL0CellsY, &stencilValues[0]);
265*35238bceSAndroid Build Coastguard Worker
266*35238bceSAndroid Build Coastguard Worker // Compute depth values
267*35238bceSAndroid Build Coastguard Worker {
268*35238bceSAndroid Build Coastguard Worker int numValues = DE_LENGTH_OF_ARRAY(depthValues);
269*35238bceSAndroid Build Coastguard Worker float depthStep = 2.0f / (float)(numValues - 1);
270*35238bceSAndroid Build Coastguard Worker
271*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < numValues; ndx++)
272*35238bceSAndroid Build Coastguard Worker depthValues[ndx] = -1.0f + depthStep * (float)ndx;
273*35238bceSAndroid Build Coastguard Worker }
274*35238bceSAndroid Build Coastguard Worker
275*35238bceSAndroid Build Coastguard Worker for (int y0 = 0; y0 < numL0CellsY; y0++)
276*35238bceSAndroid Build Coastguard Worker {
277*35238bceSAndroid Build Coastguard Worker for (int x0 = 0; x0 < numL0CellsX; x0++)
278*35238bceSAndroid Build Coastguard Worker {
279*35238bceSAndroid Build Coastguard Worker int stencilValue = stencilValues[y0 * numL0CellsX + x0];
280*35238bceSAndroid Build Coastguard Worker
281*35238bceSAndroid Build Coastguard Worker for (int y1 = 0; y1 < numL1CellsY; y1++)
282*35238bceSAndroid Build Coastguard Worker {
283*35238bceSAndroid Build Coastguard Worker for (int x1 = 0; x1 < numL1CellsX; x1++)
284*35238bceSAndroid Build Coastguard Worker {
285*35238bceSAndroid Build Coastguard Worker int x = x0 * cellL0Width + x1 * cellL1Width;
286*35238bceSAndroid Build Coastguard Worker int y = y0 * cellL0Height + y1 * cellL1Height;
287*35238bceSAndroid Build Coastguard Worker rr::WindowRectangle cellL1Rect(x, y, cellL1Width, cellL1Height);
288*35238bceSAndroid Build Coastguard Worker
289*35238bceSAndroid Build Coastguard Worker clearCommands.push_back(ClearCommand(cellL1Rect, GL_STENCIL_BUFFER_BIT, Vec4(0), stencilValue));
290*35238bceSAndroid Build Coastguard Worker
291*35238bceSAndroid Build Coastguard Worker RenderCommand renderCmd;
292*35238bceSAndroid Build Coastguard Worker renderCmd.params.visibleFace = rr::FACETYPE_FRONT;
293*35238bceSAndroid Build Coastguard Worker renderCmd.params.depth = depthValues[y1 * numL1CellsX + x1];
294*35238bceSAndroid Build Coastguard Worker renderCmd.params.depthTestEnabled = true;
295*35238bceSAndroid Build Coastguard Worker renderCmd.params.depthFunc = GL_ALWAYS;
296*35238bceSAndroid Build Coastguard Worker renderCmd.params.depthWriteMask = true;
297*35238bceSAndroid Build Coastguard Worker renderCmd.colorMask = tcu::BVec4(false);
298*35238bceSAndroid Build Coastguard Worker renderCmd.rect = cellL1Rect;
299*35238bceSAndroid Build Coastguard Worker
300*35238bceSAndroid Build Coastguard Worker renderCommands.push_back(renderCmd);
301*35238bceSAndroid Build Coastguard Worker }
302*35238bceSAndroid Build Coastguard Worker }
303*35238bceSAndroid Build Coastguard Worker }
304*35238bceSAndroid Build Coastguard Worker }
305*35238bceSAndroid Build Coastguard Worker }
306*35238bceSAndroid Build Coastguard Worker
generateDepthVisualizeCommands(const TestRenderTarget & target,vector<RenderCommand> & commands)307*35238bceSAndroid Build Coastguard Worker void generateDepthVisualizeCommands(const TestRenderTarget &target, vector<RenderCommand> &commands)
308*35238bceSAndroid Build Coastguard Worker {
309*35238bceSAndroid Build Coastguard Worker const float epsilon = -0.05f;
310*35238bceSAndroid Build Coastguard Worker static const float depthSteps[] = {-1.0f, -0.5f, 0.0f, 0.5f, 1.0f};
311*35238bceSAndroid Build Coastguard Worker int numSteps = DE_LENGTH_OF_ARRAY(depthSteps);
312*35238bceSAndroid Build Coastguard Worker const float colorStep = 1.0f / (float)(numSteps - 1);
313*35238bceSAndroid Build Coastguard Worker
314*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < numSteps; ndx++)
315*35238bceSAndroid Build Coastguard Worker {
316*35238bceSAndroid Build Coastguard Worker RenderCommand cmd;
317*35238bceSAndroid Build Coastguard Worker
318*35238bceSAndroid Build Coastguard Worker cmd.params.visibleFace = rr::FACETYPE_FRONT;
319*35238bceSAndroid Build Coastguard Worker cmd.rect = rr::WindowRectangle(0, 0, target.width, target.height);
320*35238bceSAndroid Build Coastguard Worker cmd.color = Vec4(0.0f, 0.0f, colorStep * (float)ndx, 0.0f);
321*35238bceSAndroid Build Coastguard Worker cmd.colorMask = tcu::BVec4(false, false, true, false);
322*35238bceSAndroid Build Coastguard Worker cmd.params.depth = depthSteps[ndx] + epsilon;
323*35238bceSAndroid Build Coastguard Worker cmd.params.depthTestEnabled = true;
324*35238bceSAndroid Build Coastguard Worker cmd.params.depthFunc = GL_LESS;
325*35238bceSAndroid Build Coastguard Worker cmd.params.depthWriteMask = false;
326*35238bceSAndroid Build Coastguard Worker
327*35238bceSAndroid Build Coastguard Worker commands.push_back(cmd);
328*35238bceSAndroid Build Coastguard Worker }
329*35238bceSAndroid Build Coastguard Worker }
330*35238bceSAndroid Build Coastguard Worker
generateStencilVisualizeCommands(const TestRenderTarget & target,vector<RenderCommand> & commands)331*35238bceSAndroid Build Coastguard Worker void generateStencilVisualizeCommands(const TestRenderTarget &target, vector<RenderCommand> &commands)
332*35238bceSAndroid Build Coastguard Worker {
333*35238bceSAndroid Build Coastguard Worker const int numValues = 4 * 4;
334*35238bceSAndroid Build Coastguard Worker float colorStep = 1.0f / numValues; // 0 is reserved for non-matching.
335*35238bceSAndroid Build Coastguard Worker int stencilValues[numValues];
336*35238bceSAndroid Build Coastguard Worker
337*35238bceSAndroid Build Coastguard Worker getStencilTestValues(target.stencilBits, numValues, &stencilValues[0]);
338*35238bceSAndroid Build Coastguard Worker
339*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < numValues; ndx++)
340*35238bceSAndroid Build Coastguard Worker {
341*35238bceSAndroid Build Coastguard Worker RenderCommand cmd;
342*35238bceSAndroid Build Coastguard Worker
343*35238bceSAndroid Build Coastguard Worker cmd.params.visibleFace = rr::FACETYPE_FRONT;
344*35238bceSAndroid Build Coastguard Worker cmd.rect = rr::WindowRectangle(0, 0, target.width, target.height);
345*35238bceSAndroid Build Coastguard Worker cmd.color = Vec4(0.0f, colorStep * float(ndx + 1), 0.0f, 0.0f);
346*35238bceSAndroid Build Coastguard Worker cmd.colorMask = tcu::BVec4(false, true, false, false);
347*35238bceSAndroid Build Coastguard Worker cmd.params.stencilTestEnabled = true;
348*35238bceSAndroid Build Coastguard Worker
349*35238bceSAndroid Build Coastguard Worker cmd.params.stencil[rr::FACETYPE_FRONT].function = GL_EQUAL;
350*35238bceSAndroid Build Coastguard Worker cmd.params.stencil[rr::FACETYPE_FRONT].reference = stencilValues[ndx];
351*35238bceSAndroid Build Coastguard Worker cmd.params.stencil[rr::FACETYPE_FRONT].compareMask = ~0u;
352*35238bceSAndroid Build Coastguard Worker cmd.params.stencil[rr::FACETYPE_FRONT].stencilFailOp = GL_KEEP;
353*35238bceSAndroid Build Coastguard Worker cmd.params.stencil[rr::FACETYPE_FRONT].depthFailOp = GL_KEEP;
354*35238bceSAndroid Build Coastguard Worker cmd.params.stencil[rr::FACETYPE_FRONT].depthPassOp = GL_KEEP;
355*35238bceSAndroid Build Coastguard Worker cmd.params.stencil[rr::FACETYPE_FRONT].writeMask = 0u;
356*35238bceSAndroid Build Coastguard Worker
357*35238bceSAndroid Build Coastguard Worker cmd.params.stencil[rr::FACETYPE_BACK] = cmd.params.stencil[rr::FACETYPE_FRONT];
358*35238bceSAndroid Build Coastguard Worker
359*35238bceSAndroid Build Coastguard Worker commands.push_back(cmd);
360*35238bceSAndroid Build Coastguard Worker }
361*35238bceSAndroid Build Coastguard Worker }
362*35238bceSAndroid Build Coastguard Worker
translateStencilState(const StencilParams & src,rr::StencilState & dst)363*35238bceSAndroid Build Coastguard Worker void translateStencilState(const StencilParams &src, rr::StencilState &dst)
364*35238bceSAndroid Build Coastguard Worker {
365*35238bceSAndroid Build Coastguard Worker dst.func = sglr::rr_util::mapGLTestFunc(src.function);
366*35238bceSAndroid Build Coastguard Worker dst.ref = src.reference;
367*35238bceSAndroid Build Coastguard Worker dst.compMask = src.compareMask;
368*35238bceSAndroid Build Coastguard Worker dst.sFail = sglr::rr_util::mapGLStencilOp(src.stencilFailOp);
369*35238bceSAndroid Build Coastguard Worker dst.dpFail = sglr::rr_util::mapGLStencilOp(src.depthFailOp);
370*35238bceSAndroid Build Coastguard Worker dst.dpPass = sglr::rr_util::mapGLStencilOp(src.depthPassOp);
371*35238bceSAndroid Build Coastguard Worker dst.writeMask = src.writeMask;
372*35238bceSAndroid Build Coastguard Worker }
373*35238bceSAndroid Build Coastguard Worker
translateCommand(const RenderCommand & src,RefRenderCommand & dst,const TestRenderTarget & renderTarget)374*35238bceSAndroid Build Coastguard Worker void translateCommand(const RenderCommand &src, RefRenderCommand &dst, const TestRenderTarget &renderTarget)
375*35238bceSAndroid Build Coastguard Worker {
376*35238bceSAndroid Build Coastguard Worker const float far = 1.0f;
377*35238bceSAndroid Build Coastguard Worker const float near = 0.0f;
378*35238bceSAndroid Build Coastguard Worker bool hasDepth = renderTarget.depthBits > 0;
379*35238bceSAndroid Build Coastguard Worker bool hasStencil = renderTarget.stencilBits > 0;
380*35238bceSAndroid Build Coastguard Worker bool isFrontFacing = src.params.visibleFace == rr::FACETYPE_FRONT;
381*35238bceSAndroid Build Coastguard Worker
382*35238bceSAndroid Build Coastguard Worker dst.quad.posA = IVec2(isFrontFacing ? src.rect.left : (src.rect.left + src.rect.width - 1), src.rect.bottom);
383*35238bceSAndroid Build Coastguard Worker dst.quad.posB = IVec2(isFrontFacing ? (src.rect.left + src.rect.width - 1) : src.rect.left,
384*35238bceSAndroid Build Coastguard Worker src.rect.bottom + src.rect.height - 1);
385*35238bceSAndroid Build Coastguard Worker
386*35238bceSAndroid Build Coastguard Worker std::fill(DE_ARRAY_BEGIN(dst.quad.color), DE_ARRAY_END(dst.quad.color), src.color);
387*35238bceSAndroid Build Coastguard Worker std::fill(DE_ARRAY_BEGIN(dst.quad.depth), DE_ARRAY_END(dst.quad.depth),
388*35238bceSAndroid Build Coastguard Worker ((far - near) / 2.0f) * src.params.depth + (near + far) / 2.0f);
389*35238bceSAndroid Build Coastguard Worker
390*35238bceSAndroid Build Coastguard Worker dst.state.colorMask = src.colorMask;
391*35238bceSAndroid Build Coastguard Worker
392*35238bceSAndroid Build Coastguard Worker dst.state.scissorTestEnabled = false;
393*35238bceSAndroid Build Coastguard Worker dst.state.stencilTestEnabled = hasStencil && src.params.stencilTestEnabled;
394*35238bceSAndroid Build Coastguard Worker dst.state.depthTestEnabled = hasDepth && src.params.depthTestEnabled;
395*35238bceSAndroid Build Coastguard Worker dst.state.blendMode = rr::BLENDMODE_NONE;
396*35238bceSAndroid Build Coastguard Worker dst.state.numStencilBits = renderTarget.stencilBits;
397*35238bceSAndroid Build Coastguard Worker
398*35238bceSAndroid Build Coastguard Worker if (dst.state.depthTestEnabled)
399*35238bceSAndroid Build Coastguard Worker {
400*35238bceSAndroid Build Coastguard Worker dst.state.depthFunc = sglr::rr_util::mapGLTestFunc(src.params.depthFunc);
401*35238bceSAndroid Build Coastguard Worker dst.state.depthMask = src.params.depthWriteMask;
402*35238bceSAndroid Build Coastguard Worker }
403*35238bceSAndroid Build Coastguard Worker
404*35238bceSAndroid Build Coastguard Worker if (dst.state.stencilTestEnabled)
405*35238bceSAndroid Build Coastguard Worker {
406*35238bceSAndroid Build Coastguard Worker translateStencilState(src.params.stencil[rr::FACETYPE_BACK], dst.state.stencilStates[rr::FACETYPE_BACK]);
407*35238bceSAndroid Build Coastguard Worker translateStencilState(src.params.stencil[rr::FACETYPE_FRONT], dst.state.stencilStates[rr::FACETYPE_FRONT]);
408*35238bceSAndroid Build Coastguard Worker }
409*35238bceSAndroid Build Coastguard Worker }
410*35238bceSAndroid Build Coastguard Worker
render(const vector<ClearCommand> & clears,int viewportX,int viewportY)411*35238bceSAndroid Build Coastguard Worker void render(const vector<ClearCommand> &clears, int viewportX, int viewportY)
412*35238bceSAndroid Build Coastguard Worker {
413*35238bceSAndroid Build Coastguard Worker glEnable(GL_SCISSOR_TEST);
414*35238bceSAndroid Build Coastguard Worker
415*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < (int)clears.size(); ndx++)
416*35238bceSAndroid Build Coastguard Worker {
417*35238bceSAndroid Build Coastguard Worker const ClearCommand &clear = clears[ndx];
418*35238bceSAndroid Build Coastguard Worker
419*35238bceSAndroid Build Coastguard Worker if (clear.buffers & GL_COLOR_BUFFER_BIT)
420*35238bceSAndroid Build Coastguard Worker glClearColor(clear.color.x(), clear.color.y(), clear.color.z(), clear.color.w());
421*35238bceSAndroid Build Coastguard Worker if (clear.buffers & GL_STENCIL_BUFFER_BIT)
422*35238bceSAndroid Build Coastguard Worker glClearStencil(clear.stencil);
423*35238bceSAndroid Build Coastguard Worker
424*35238bceSAndroid Build Coastguard Worker DE_ASSERT(clear.buffers ==
425*35238bceSAndroid Build Coastguard Worker (clear.buffers & (GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT))); // \note Don't use clear for depths.
426*35238bceSAndroid Build Coastguard Worker
427*35238bceSAndroid Build Coastguard Worker glScissor(clear.rect.left + viewportX, clear.rect.bottom + viewportY, clear.rect.width, clear.rect.height);
428*35238bceSAndroid Build Coastguard Worker glClear(clear.buffers);
429*35238bceSAndroid Build Coastguard Worker }
430*35238bceSAndroid Build Coastguard Worker
431*35238bceSAndroid Build Coastguard Worker glDisable(GL_SCISSOR_TEST);
432*35238bceSAndroid Build Coastguard Worker }
433*35238bceSAndroid Build Coastguard Worker
render(gls::FragmentOpUtil::QuadRenderer & renderer,const RenderCommand & command,int viewportX,int viewportY)434*35238bceSAndroid Build Coastguard Worker void render(gls::FragmentOpUtil::QuadRenderer &renderer, const RenderCommand &command, int viewportX, int viewportY)
435*35238bceSAndroid Build Coastguard Worker {
436*35238bceSAndroid Build Coastguard Worker if (command.params.stencilTestEnabled)
437*35238bceSAndroid Build Coastguard Worker {
438*35238bceSAndroid Build Coastguard Worker glEnable(GL_STENCIL_TEST);
439*35238bceSAndroid Build Coastguard Worker
440*35238bceSAndroid Build Coastguard Worker for (int face = 0; face < rr::FACETYPE_LAST; face++)
441*35238bceSAndroid Build Coastguard Worker {
442*35238bceSAndroid Build Coastguard Worker uint32_t glFace = face == rr::FACETYPE_BACK ? GL_BACK : GL_FRONT;
443*35238bceSAndroid Build Coastguard Worker const StencilParams &sParams = command.params.stencil[face];
444*35238bceSAndroid Build Coastguard Worker
445*35238bceSAndroid Build Coastguard Worker glStencilFuncSeparate(glFace, sParams.function, sParams.reference, sParams.compareMask);
446*35238bceSAndroid Build Coastguard Worker glStencilOpSeparate(glFace, sParams.stencilFailOp, sParams.depthFailOp, sParams.depthPassOp);
447*35238bceSAndroid Build Coastguard Worker glStencilMaskSeparate(glFace, sParams.writeMask);
448*35238bceSAndroid Build Coastguard Worker }
449*35238bceSAndroid Build Coastguard Worker }
450*35238bceSAndroid Build Coastguard Worker else
451*35238bceSAndroid Build Coastguard Worker glDisable(GL_STENCIL_TEST);
452*35238bceSAndroid Build Coastguard Worker
453*35238bceSAndroid Build Coastguard Worker if (command.params.depthTestEnabled)
454*35238bceSAndroid Build Coastguard Worker {
455*35238bceSAndroid Build Coastguard Worker glEnable(GL_DEPTH_TEST);
456*35238bceSAndroid Build Coastguard Worker glDepthFunc(command.params.depthFunc);
457*35238bceSAndroid Build Coastguard Worker glDepthMask(command.params.depthWriteMask ? GL_TRUE : GL_FALSE);
458*35238bceSAndroid Build Coastguard Worker }
459*35238bceSAndroid Build Coastguard Worker else
460*35238bceSAndroid Build Coastguard Worker glDisable(GL_DEPTH_TEST);
461*35238bceSAndroid Build Coastguard Worker
462*35238bceSAndroid Build Coastguard Worker glColorMask(command.colorMask[0] ? GL_TRUE : GL_FALSE, command.colorMask[1] ? GL_TRUE : GL_FALSE,
463*35238bceSAndroid Build Coastguard Worker command.colorMask[2] ? GL_TRUE : GL_FALSE, command.colorMask[3] ? GL_TRUE : GL_FALSE);
464*35238bceSAndroid Build Coastguard Worker glViewport(command.rect.left + viewportX, command.rect.bottom + viewportY, command.rect.width, command.rect.height);
465*35238bceSAndroid Build Coastguard Worker
466*35238bceSAndroid Build Coastguard Worker gls::FragmentOpUtil::Quad quad;
467*35238bceSAndroid Build Coastguard Worker
468*35238bceSAndroid Build Coastguard Worker bool isFrontFacing = command.params.visibleFace == rr::FACETYPE_FRONT;
469*35238bceSAndroid Build Coastguard Worker quad.posA = Vec2(isFrontFacing ? -1.0f : 1.0f, -1.0f);
470*35238bceSAndroid Build Coastguard Worker quad.posB = Vec2(isFrontFacing ? 1.0f : -1.0f, 1.0f);
471*35238bceSAndroid Build Coastguard Worker
472*35238bceSAndroid Build Coastguard Worker std::fill(DE_ARRAY_BEGIN(quad.color), DE_ARRAY_END(quad.color), command.color);
473*35238bceSAndroid Build Coastguard Worker std::fill(DE_ARRAY_BEGIN(quad.depth), DE_ARRAY_END(quad.depth), command.params.depth);
474*35238bceSAndroid Build Coastguard Worker
475*35238bceSAndroid Build Coastguard Worker renderer.render(quad);
476*35238bceSAndroid Build Coastguard Worker GLU_CHECK();
477*35238bceSAndroid Build Coastguard Worker }
478*35238bceSAndroid Build Coastguard Worker
renderReference(const vector<ClearCommand> & clears,const tcu::PixelBufferAccess & dstColor,const tcu::PixelBufferAccess & dstStencil,int stencilBits)479*35238bceSAndroid Build Coastguard Worker void renderReference(const vector<ClearCommand> &clears, const tcu::PixelBufferAccess &dstColor,
480*35238bceSAndroid Build Coastguard Worker const tcu::PixelBufferAccess &dstStencil, int stencilBits)
481*35238bceSAndroid Build Coastguard Worker {
482*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < (int)clears.size(); ndx++)
483*35238bceSAndroid Build Coastguard Worker {
484*35238bceSAndroid Build Coastguard Worker const ClearCommand &clear = clears[ndx];
485*35238bceSAndroid Build Coastguard Worker
486*35238bceSAndroid Build Coastguard Worker if (clear.buffers & GL_COLOR_BUFFER_BIT)
487*35238bceSAndroid Build Coastguard Worker tcu::clear(
488*35238bceSAndroid Build Coastguard Worker tcu::getSubregion(dstColor, clear.rect.left, clear.rect.bottom, clear.rect.width, clear.rect.height),
489*35238bceSAndroid Build Coastguard Worker clear.color);
490*35238bceSAndroid Build Coastguard Worker
491*35238bceSAndroid Build Coastguard Worker if (clear.buffers & GL_STENCIL_BUFFER_BIT && stencilBits > 0)
492*35238bceSAndroid Build Coastguard Worker {
493*35238bceSAndroid Build Coastguard Worker int maskedVal = clear.stencil & ((1 << stencilBits) - 1);
494*35238bceSAndroid Build Coastguard Worker tcu::clearStencil(
495*35238bceSAndroid Build Coastguard Worker tcu::getSubregion(dstStencil, clear.rect.left, clear.rect.bottom, clear.rect.width, clear.rect.height),
496*35238bceSAndroid Build Coastguard Worker maskedVal);
497*35238bceSAndroid Build Coastguard Worker }
498*35238bceSAndroid Build Coastguard Worker
499*35238bceSAndroid Build Coastguard Worker DE_ASSERT(clear.buffers ==
500*35238bceSAndroid Build Coastguard Worker (clear.buffers & (GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT))); // \note Don't use clear for depths.
501*35238bceSAndroid Build Coastguard Worker }
502*35238bceSAndroid Build Coastguard Worker }
503*35238bceSAndroid Build Coastguard Worker
504*35238bceSAndroid Build Coastguard Worker } // namespace DepthStencilCaseUtil
505*35238bceSAndroid Build Coastguard Worker
506*35238bceSAndroid Build Coastguard Worker using namespace DepthStencilCaseUtil;
507*35238bceSAndroid Build Coastguard Worker
508*35238bceSAndroid Build Coastguard Worker class DepthStencilCase : public TestCase
509*35238bceSAndroid Build Coastguard Worker {
510*35238bceSAndroid Build Coastguard Worker public:
511*35238bceSAndroid Build Coastguard Worker DepthStencilCase(Context &context, const char *name, const char *desc,
512*35238bceSAndroid Build Coastguard Worker const std::vector<DepthStencilParams> &cases);
513*35238bceSAndroid Build Coastguard Worker ~DepthStencilCase(void);
514*35238bceSAndroid Build Coastguard Worker
515*35238bceSAndroid Build Coastguard Worker void init(void);
516*35238bceSAndroid Build Coastguard Worker void deinit(void);
517*35238bceSAndroid Build Coastguard Worker
518*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void);
519*35238bceSAndroid Build Coastguard Worker
520*35238bceSAndroid Build Coastguard Worker private:
521*35238bceSAndroid Build Coastguard Worker DepthStencilCase(const DepthStencilCase &other);
522*35238bceSAndroid Build Coastguard Worker DepthStencilCase &operator=(const DepthStencilCase &other);
523*35238bceSAndroid Build Coastguard Worker
524*35238bceSAndroid Build Coastguard Worker std::vector<DepthStencilParams> m_cases;
525*35238bceSAndroid Build Coastguard Worker
526*35238bceSAndroid Build Coastguard Worker TestRenderTarget m_renderTarget;
527*35238bceSAndroid Build Coastguard Worker std::vector<ClearCommand> m_baseClears;
528*35238bceSAndroid Build Coastguard Worker std::vector<RenderCommand> m_baseDepthRenders;
529*35238bceSAndroid Build Coastguard Worker std::vector<RenderCommand> m_visualizeCommands;
530*35238bceSAndroid Build Coastguard Worker std::vector<RefRenderCommand> m_refBaseDepthRenders;
531*35238bceSAndroid Build Coastguard Worker std::vector<RefRenderCommand> m_refVisualizeCommands;
532*35238bceSAndroid Build Coastguard Worker
533*35238bceSAndroid Build Coastguard Worker gls::FragmentOpUtil::QuadRenderer *m_renderer;
534*35238bceSAndroid Build Coastguard Worker tcu::Surface *m_refColorBuffer;
535*35238bceSAndroid Build Coastguard Worker tcu::TextureLevel *m_refDepthBuffer;
536*35238bceSAndroid Build Coastguard Worker tcu::TextureLevel *m_refStencilBuffer;
537*35238bceSAndroid Build Coastguard Worker gls::FragmentOpUtil::ReferenceQuadRenderer *m_refRenderer;
538*35238bceSAndroid Build Coastguard Worker
539*35238bceSAndroid Build Coastguard Worker int m_iterNdx;
540*35238bceSAndroid Build Coastguard Worker };
541*35238bceSAndroid Build Coastguard Worker
DepthStencilCase(Context & context,const char * name,const char * desc,const std::vector<DepthStencilParams> & cases)542*35238bceSAndroid Build Coastguard Worker DepthStencilCase::DepthStencilCase(Context &context, const char *name, const char *desc,
543*35238bceSAndroid Build Coastguard Worker const std::vector<DepthStencilParams> &cases)
544*35238bceSAndroid Build Coastguard Worker : TestCase(context, name, desc)
545*35238bceSAndroid Build Coastguard Worker , m_cases(cases)
546*35238bceSAndroid Build Coastguard Worker , m_renderer(DE_NULL)
547*35238bceSAndroid Build Coastguard Worker , m_refColorBuffer(DE_NULL)
548*35238bceSAndroid Build Coastguard Worker , m_refDepthBuffer(DE_NULL)
549*35238bceSAndroid Build Coastguard Worker , m_refStencilBuffer(DE_NULL)
550*35238bceSAndroid Build Coastguard Worker , m_refRenderer(DE_NULL)
551*35238bceSAndroid Build Coastguard Worker , m_iterNdx(0)
552*35238bceSAndroid Build Coastguard Worker {
553*35238bceSAndroid Build Coastguard Worker }
554*35238bceSAndroid Build Coastguard Worker
~DepthStencilCase(void)555*35238bceSAndroid Build Coastguard Worker DepthStencilCase::~DepthStencilCase(void)
556*35238bceSAndroid Build Coastguard Worker {
557*35238bceSAndroid Build Coastguard Worker delete m_renderer;
558*35238bceSAndroid Build Coastguard Worker delete m_refColorBuffer;
559*35238bceSAndroid Build Coastguard Worker delete m_refDepthBuffer;
560*35238bceSAndroid Build Coastguard Worker delete m_refStencilBuffer;
561*35238bceSAndroid Build Coastguard Worker delete m_refRenderer;
562*35238bceSAndroid Build Coastguard Worker }
563*35238bceSAndroid Build Coastguard Worker
init(void)564*35238bceSAndroid Build Coastguard Worker void DepthStencilCase::init(void)
565*35238bceSAndroid Build Coastguard Worker {
566*35238bceSAndroid Build Coastguard Worker DE_ASSERT(!m_renderer && !m_refColorBuffer && !m_refDepthBuffer && !m_refStencilBuffer && !m_refRenderer);
567*35238bceSAndroid Build Coastguard Worker
568*35238bceSAndroid Build Coastguard Worker // Compute render target.
569*35238bceSAndroid Build Coastguard Worker int viewportW = de::min<int>(m_context.getRenderTarget().getWidth(), VIEWPORT_WIDTH);
570*35238bceSAndroid Build Coastguard Worker int viewportH = de::min<int>(m_context.getRenderTarget().getHeight(), VIEWPORT_HEIGHT);
571*35238bceSAndroid Build Coastguard Worker m_renderTarget = TestRenderTarget(viewportW, viewportH, m_context.getRenderTarget().getDepthBits(),
572*35238bceSAndroid Build Coastguard Worker m_context.getRenderTarget().getStencilBits());
573*35238bceSAndroid Build Coastguard Worker
574*35238bceSAndroid Build Coastguard Worker // Compute base clears & visualization commands.
575*35238bceSAndroid Build Coastguard Worker generateBaseClearAndDepthCommands(m_renderTarget, m_baseClears, m_baseDepthRenders);
576*35238bceSAndroid Build Coastguard Worker generateDepthVisualizeCommands(m_renderTarget, m_visualizeCommands);
577*35238bceSAndroid Build Coastguard Worker generateStencilVisualizeCommands(m_renderTarget, m_visualizeCommands);
578*35238bceSAndroid Build Coastguard Worker
579*35238bceSAndroid Build Coastguard Worker // Translate to ref commands.
580*35238bceSAndroid Build Coastguard Worker m_refBaseDepthRenders.resize(m_baseDepthRenders.size());
581*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < (int)m_baseDepthRenders.size(); ndx++)
582*35238bceSAndroid Build Coastguard Worker translateCommand(m_baseDepthRenders[ndx], m_refBaseDepthRenders[ndx], m_renderTarget);
583*35238bceSAndroid Build Coastguard Worker
584*35238bceSAndroid Build Coastguard Worker m_refVisualizeCommands.resize(m_visualizeCommands.size());
585*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < (int)m_visualizeCommands.size(); ndx++)
586*35238bceSAndroid Build Coastguard Worker translateCommand(m_visualizeCommands[ndx], m_refVisualizeCommands[ndx], m_renderTarget);
587*35238bceSAndroid Build Coastguard Worker
588*35238bceSAndroid Build Coastguard Worker m_renderer = new gls::FragmentOpUtil::QuadRenderer(m_context.getRenderContext(), glu::GLSL_VERSION_100_ES);
589*35238bceSAndroid Build Coastguard Worker m_refColorBuffer = new tcu::Surface(viewportW, viewportH);
590*35238bceSAndroid Build Coastguard Worker m_refDepthBuffer = new tcu::TextureLevel(tcu::TextureFormat(tcu::TextureFormat::D, tcu::TextureFormat::FLOAT),
591*35238bceSAndroid Build Coastguard Worker viewportW, viewportH);
592*35238bceSAndroid Build Coastguard Worker m_refStencilBuffer = new tcu::TextureLevel(
593*35238bceSAndroid Build Coastguard Worker tcu::TextureFormat(tcu::TextureFormat::S, tcu::TextureFormat::UNSIGNED_INT32), viewportW, viewportH);
594*35238bceSAndroid Build Coastguard Worker m_refRenderer = new gls::FragmentOpUtil::ReferenceQuadRenderer();
595*35238bceSAndroid Build Coastguard Worker
596*35238bceSAndroid Build Coastguard Worker m_iterNdx = 0;
597*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
598*35238bceSAndroid Build Coastguard Worker }
599*35238bceSAndroid Build Coastguard Worker
deinit(void)600*35238bceSAndroid Build Coastguard Worker void DepthStencilCase::deinit(void)
601*35238bceSAndroid Build Coastguard Worker {
602*35238bceSAndroid Build Coastguard Worker delete m_renderer;
603*35238bceSAndroid Build Coastguard Worker delete m_refColorBuffer;
604*35238bceSAndroid Build Coastguard Worker delete m_refDepthBuffer;
605*35238bceSAndroid Build Coastguard Worker delete m_refStencilBuffer;
606*35238bceSAndroid Build Coastguard Worker delete m_refRenderer;
607*35238bceSAndroid Build Coastguard Worker
608*35238bceSAndroid Build Coastguard Worker m_renderer = DE_NULL;
609*35238bceSAndroid Build Coastguard Worker m_refColorBuffer = DE_NULL;
610*35238bceSAndroid Build Coastguard Worker m_refDepthBuffer = DE_NULL;
611*35238bceSAndroid Build Coastguard Worker m_refStencilBuffer = DE_NULL;
612*35238bceSAndroid Build Coastguard Worker m_refRenderer = DE_NULL;
613*35238bceSAndroid Build Coastguard Worker
614*35238bceSAndroid Build Coastguard Worker m_baseClears.clear();
615*35238bceSAndroid Build Coastguard Worker m_baseDepthRenders.clear();
616*35238bceSAndroid Build Coastguard Worker m_visualizeCommands.clear();
617*35238bceSAndroid Build Coastguard Worker m_refBaseDepthRenders.clear();
618*35238bceSAndroid Build Coastguard Worker m_refVisualizeCommands.clear();
619*35238bceSAndroid Build Coastguard Worker }
620*35238bceSAndroid Build Coastguard Worker
iterate(void)621*35238bceSAndroid Build Coastguard Worker DepthStencilCase::IterateResult DepthStencilCase::iterate(void)
622*35238bceSAndroid Build Coastguard Worker {
623*35238bceSAndroid Build Coastguard Worker de::Random rnd(deStringHash(getName()) ^ deInt32Hash(m_iterNdx));
624*35238bceSAndroid Build Coastguard Worker int viewportX = rnd.getInt(0, m_context.getRenderTarget().getWidth() - m_renderTarget.width);
625*35238bceSAndroid Build Coastguard Worker int viewportY = rnd.getInt(0, m_context.getRenderTarget().getHeight() - m_renderTarget.height);
626*35238bceSAndroid Build Coastguard Worker RenderCommand testCmd;
627*35238bceSAndroid Build Coastguard Worker
628*35238bceSAndroid Build Coastguard Worker tcu::Surface renderedImg(m_renderTarget.width, m_renderTarget.height);
629*35238bceSAndroid Build Coastguard Worker tcu::RGBA threshold = m_context.getRenderTarget().getPixelFormat().getColorThreshold();
630*35238bceSAndroid Build Coastguard Worker
631*35238bceSAndroid Build Coastguard Worker // Fill in test command for this iteration.
632*35238bceSAndroid Build Coastguard Worker testCmd.color = Vec4(1.0f, 0.0f, 0.0f, 1.0f);
633*35238bceSAndroid Build Coastguard Worker testCmd.colorMask = tcu::BVec4(true);
634*35238bceSAndroid Build Coastguard Worker testCmd.rect = rr::WindowRectangle(0, 0, m_renderTarget.width, m_renderTarget.height);
635*35238bceSAndroid Build Coastguard Worker testCmd.params = m_cases[m_iterNdx];
636*35238bceSAndroid Build Coastguard Worker
637*35238bceSAndroid Build Coastguard Worker if (m_iterNdx == 0)
638*35238bceSAndroid Build Coastguard Worker {
639*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << TestLog::Message
640*35238bceSAndroid Build Coastguard Worker << "Channels:\n"
641*35238bceSAndroid Build Coastguard Worker " RED: passing pixels\n"
642*35238bceSAndroid Build Coastguard Worker " GREEN: stencil values\n"
643*35238bceSAndroid Build Coastguard Worker " BLUE: depth values"
644*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
645*35238bceSAndroid Build Coastguard Worker }
646*35238bceSAndroid Build Coastguard Worker
647*35238bceSAndroid Build Coastguard Worker if (m_cases.size() > 1)
648*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << TestLog::Message << "Iteration " << m_iterNdx << "..." << TestLog::EndMessage;
649*35238bceSAndroid Build Coastguard Worker
650*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << m_cases[m_iterNdx];
651*35238bceSAndroid Build Coastguard Worker
652*35238bceSAndroid Build Coastguard Worker // Submit render commands to gl GL.
653*35238bceSAndroid Build Coastguard Worker
654*35238bceSAndroid Build Coastguard Worker // Base clears.
655*35238bceSAndroid Build Coastguard Worker render(m_baseClears, viewportX, viewportY);
656*35238bceSAndroid Build Coastguard Worker
657*35238bceSAndroid Build Coastguard Worker // Base depths.
658*35238bceSAndroid Build Coastguard Worker for (vector<RenderCommand>::const_iterator cmd = m_baseDepthRenders.begin(); cmd != m_baseDepthRenders.end(); ++cmd)
659*35238bceSAndroid Build Coastguard Worker render(*m_renderer, *cmd, viewportX, viewportY);
660*35238bceSAndroid Build Coastguard Worker
661*35238bceSAndroid Build Coastguard Worker // Test command.
662*35238bceSAndroid Build Coastguard Worker render(*m_renderer, testCmd, viewportX, viewportY);
663*35238bceSAndroid Build Coastguard Worker
664*35238bceSAndroid Build Coastguard Worker // Visualization commands.
665*35238bceSAndroid Build Coastguard Worker for (vector<RenderCommand>::const_iterator cmd = m_visualizeCommands.begin(); cmd != m_visualizeCommands.end();
666*35238bceSAndroid Build Coastguard Worker ++cmd)
667*35238bceSAndroid Build Coastguard Worker render(*m_renderer, *cmd, viewportX, viewportY);
668*35238bceSAndroid Build Coastguard Worker
669*35238bceSAndroid Build Coastguard Worker // Re-enable all write masks.
670*35238bceSAndroid Build Coastguard Worker glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
671*35238bceSAndroid Build Coastguard Worker glDepthMask(GL_TRUE);
672*35238bceSAndroid Build Coastguard Worker glStencilMask(~0u);
673*35238bceSAndroid Build Coastguard Worker
674*35238bceSAndroid Build Coastguard Worker // Ask GPU to start rendering.
675*35238bceSAndroid Build Coastguard Worker glFlush();
676*35238bceSAndroid Build Coastguard Worker
677*35238bceSAndroid Build Coastguard Worker // Render reference while GPU is doing work.
678*35238bceSAndroid Build Coastguard Worker {
679*35238bceSAndroid Build Coastguard Worker RefRenderCommand refTestCmd;
680*35238bceSAndroid Build Coastguard Worker translateCommand(testCmd, refTestCmd, m_renderTarget);
681*35238bceSAndroid Build Coastguard Worker
682*35238bceSAndroid Build Coastguard Worker // Base clears.
683*35238bceSAndroid Build Coastguard Worker renderReference(m_baseClears, m_refColorBuffer->getAccess(), m_refStencilBuffer->getAccess(),
684*35238bceSAndroid Build Coastguard Worker m_renderTarget.stencilBits);
685*35238bceSAndroid Build Coastguard Worker
686*35238bceSAndroid Build Coastguard Worker // Base depths.
687*35238bceSAndroid Build Coastguard Worker for (vector<RefRenderCommand>::const_iterator cmd = m_refBaseDepthRenders.begin();
688*35238bceSAndroid Build Coastguard Worker cmd != m_refBaseDepthRenders.end(); ++cmd)
689*35238bceSAndroid Build Coastguard Worker m_refRenderer->render(gls::FragmentOpUtil::getMultisampleAccess(m_refColorBuffer->getAccess()),
690*35238bceSAndroid Build Coastguard Worker gls::FragmentOpUtil::getMultisampleAccess(m_refDepthBuffer->getAccess()),
691*35238bceSAndroid Build Coastguard Worker gls::FragmentOpUtil::getMultisampleAccess(m_refStencilBuffer->getAccess()), cmd->quad,
692*35238bceSAndroid Build Coastguard Worker cmd->state);
693*35238bceSAndroid Build Coastguard Worker
694*35238bceSAndroid Build Coastguard Worker // Test command.
695*35238bceSAndroid Build Coastguard Worker m_refRenderer->render(gls::FragmentOpUtil::getMultisampleAccess(m_refColorBuffer->getAccess()),
696*35238bceSAndroid Build Coastguard Worker gls::FragmentOpUtil::getMultisampleAccess(m_refDepthBuffer->getAccess()),
697*35238bceSAndroid Build Coastguard Worker gls::FragmentOpUtil::getMultisampleAccess(m_refStencilBuffer->getAccess()),
698*35238bceSAndroid Build Coastguard Worker refTestCmd.quad, refTestCmd.state);
699*35238bceSAndroid Build Coastguard Worker
700*35238bceSAndroid Build Coastguard Worker // Visualization commands.
701*35238bceSAndroid Build Coastguard Worker for (vector<RefRenderCommand>::const_iterator cmd = m_refVisualizeCommands.begin();
702*35238bceSAndroid Build Coastguard Worker cmd != m_refVisualizeCommands.end(); ++cmd)
703*35238bceSAndroid Build Coastguard Worker m_refRenderer->render(gls::FragmentOpUtil::getMultisampleAccess(m_refColorBuffer->getAccess()),
704*35238bceSAndroid Build Coastguard Worker gls::FragmentOpUtil::getMultisampleAccess(m_refDepthBuffer->getAccess()),
705*35238bceSAndroid Build Coastguard Worker gls::FragmentOpUtil::getMultisampleAccess(m_refStencilBuffer->getAccess()), cmd->quad,
706*35238bceSAndroid Build Coastguard Worker cmd->state);
707*35238bceSAndroid Build Coastguard Worker }
708*35238bceSAndroid Build Coastguard Worker
709*35238bceSAndroid Build Coastguard Worker // Read rendered image.
710*35238bceSAndroid Build Coastguard Worker glu::readPixels(m_context.getRenderContext(), viewportX, viewportY, renderedImg.getAccess());
711*35238bceSAndroid Build Coastguard Worker
712*35238bceSAndroid Build Coastguard Worker m_iterNdx += 1;
713*35238bceSAndroid Build Coastguard Worker
714*35238bceSAndroid Build Coastguard Worker // Compare to reference.
715*35238bceSAndroid Build Coastguard Worker bool isLastIter = m_iterNdx >= (int)m_cases.size();
716*35238bceSAndroid Build Coastguard Worker bool compareOk = tcu::pixelThresholdCompare(m_testCtx.getLog(), "CompareResult", "Image Comparison Result",
717*35238bceSAndroid Build Coastguard Worker *m_refColorBuffer, renderedImg, threshold, tcu::COMPARE_LOG_RESULT);
718*35238bceSAndroid Build Coastguard Worker
719*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << TestLog::Message << (compareOk ? " Passed." : " FAILED!") << TestLog::EndMessage;
720*35238bceSAndroid Build Coastguard Worker if (!compareOk)
721*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Image comparison failed");
722*35238bceSAndroid Build Coastguard Worker
723*35238bceSAndroid Build Coastguard Worker if (compareOk && !isLastIter)
724*35238bceSAndroid Build Coastguard Worker return CONTINUE;
725*35238bceSAndroid Build Coastguard Worker else
726*35238bceSAndroid Build Coastguard Worker return STOP;
727*35238bceSAndroid Build Coastguard Worker }
728*35238bceSAndroid Build Coastguard Worker
DepthStencilTests(Context & context)729*35238bceSAndroid Build Coastguard Worker DepthStencilTests::DepthStencilTests(Context &context)
730*35238bceSAndroid Build Coastguard Worker : TestCaseGroup(context, "depth_stencil", "Depth and Stencil Op Tests")
731*35238bceSAndroid Build Coastguard Worker {
732*35238bceSAndroid Build Coastguard Worker }
733*35238bceSAndroid Build Coastguard Worker
~DepthStencilTests(void)734*35238bceSAndroid Build Coastguard Worker DepthStencilTests::~DepthStencilTests(void)
735*35238bceSAndroid Build Coastguard Worker {
736*35238bceSAndroid Build Coastguard Worker }
737*35238bceSAndroid Build Coastguard Worker
randomDepthStencilState(de::Random & rnd,DepthStencilParams & params)738*35238bceSAndroid Build Coastguard Worker static void randomDepthStencilState(de::Random &rnd, DepthStencilParams ¶ms)
739*35238bceSAndroid Build Coastguard Worker {
740*35238bceSAndroid Build Coastguard Worker const float stencilTestProbability = 0.8f;
741*35238bceSAndroid Build Coastguard Worker const float depthTestProbability = 0.7f;
742*35238bceSAndroid Build Coastguard Worker
743*35238bceSAndroid Build Coastguard Worker static const uint32_t compareFuncs[] = {GL_NEVER, GL_ALWAYS, GL_LESS, GL_LEQUAL,
744*35238bceSAndroid Build Coastguard Worker GL_EQUAL, GL_GEQUAL, GL_GREATER, GL_NOTEQUAL};
745*35238bceSAndroid Build Coastguard Worker
746*35238bceSAndroid Build Coastguard Worker static const uint32_t stencilOps[] = {GL_KEEP, GL_ZERO, GL_REPLACE, GL_INCR,
747*35238bceSAndroid Build Coastguard Worker GL_DECR, GL_INVERT, GL_INCR_WRAP, GL_DECR_WRAP};
748*35238bceSAndroid Build Coastguard Worker
749*35238bceSAndroid Build Coastguard Worker static const float depthValues[] = {-1.0f, -0.8f, -0.6f, -0.4f, -0.2f, 0.0f, 0.2f, 0.4f, 0.6f, 0.8f, 1.0f};
750*35238bceSAndroid Build Coastguard Worker
751*35238bceSAndroid Build Coastguard Worker params.visibleFace = rnd.getBool() ? rr::FACETYPE_FRONT : rr::FACETYPE_BACK;
752*35238bceSAndroid Build Coastguard Worker params.stencilTestEnabled = rnd.getFloat() < stencilTestProbability;
753*35238bceSAndroid Build Coastguard Worker params.depthTestEnabled = !params.stencilTestEnabled || (rnd.getFloat() < depthTestProbability);
754*35238bceSAndroid Build Coastguard Worker
755*35238bceSAndroid Build Coastguard Worker if (params.stencilTestEnabled)
756*35238bceSAndroid Build Coastguard Worker {
757*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < 2; ndx++)
758*35238bceSAndroid Build Coastguard Worker {
759*35238bceSAndroid Build Coastguard Worker params.stencil[ndx].function =
760*35238bceSAndroid Build Coastguard Worker rnd.choose<uint32_t>(DE_ARRAY_BEGIN(compareFuncs), DE_ARRAY_END(compareFuncs));
761*35238bceSAndroid Build Coastguard Worker params.stencil[ndx].reference = rnd.getInt(-2, 260);
762*35238bceSAndroid Build Coastguard Worker params.stencil[ndx].compareMask = rnd.getUint32();
763*35238bceSAndroid Build Coastguard Worker params.stencil[ndx].stencilFailOp =
764*35238bceSAndroid Build Coastguard Worker rnd.choose<uint32_t>(DE_ARRAY_BEGIN(stencilOps), DE_ARRAY_END(stencilOps));
765*35238bceSAndroid Build Coastguard Worker params.stencil[ndx].depthFailOp =
766*35238bceSAndroid Build Coastguard Worker rnd.choose<uint32_t>(DE_ARRAY_BEGIN(stencilOps), DE_ARRAY_END(stencilOps));
767*35238bceSAndroid Build Coastguard Worker params.stencil[ndx].depthPassOp =
768*35238bceSAndroid Build Coastguard Worker rnd.choose<uint32_t>(DE_ARRAY_BEGIN(stencilOps), DE_ARRAY_END(stencilOps));
769*35238bceSAndroid Build Coastguard Worker params.stencil[ndx].writeMask = rnd.getUint32();
770*35238bceSAndroid Build Coastguard Worker }
771*35238bceSAndroid Build Coastguard Worker }
772*35238bceSAndroid Build Coastguard Worker
773*35238bceSAndroid Build Coastguard Worker if (params.depthTestEnabled)
774*35238bceSAndroid Build Coastguard Worker {
775*35238bceSAndroid Build Coastguard Worker params.depthFunc = rnd.choose<uint32_t>(DE_ARRAY_BEGIN(compareFuncs), DE_ARRAY_END(compareFuncs));
776*35238bceSAndroid Build Coastguard Worker params.depth = rnd.choose<float>(DE_ARRAY_BEGIN(depthValues), DE_ARRAY_END(depthValues));
777*35238bceSAndroid Build Coastguard Worker params.depthWriteMask = rnd.getBool();
778*35238bceSAndroid Build Coastguard Worker }
779*35238bceSAndroid Build Coastguard Worker }
780*35238bceSAndroid Build Coastguard Worker
init(void)781*35238bceSAndroid Build Coastguard Worker void DepthStencilTests::init(void)
782*35238bceSAndroid Build Coastguard Worker {
783*35238bceSAndroid Build Coastguard Worker static const struct
784*35238bceSAndroid Build Coastguard Worker {
785*35238bceSAndroid Build Coastguard Worker const char *name;
786*35238bceSAndroid Build Coastguard Worker uint32_t func;
787*35238bceSAndroid Build Coastguard Worker } compareFuncs[] = {{"never", GL_NEVER}, {"always", GL_ALWAYS}, {"less", GL_LESS}, {"lequal", GL_LEQUAL},
788*35238bceSAndroid Build Coastguard Worker {"equal", GL_EQUAL}, {"gequal", GL_GEQUAL}, {"greater", GL_GREATER}, {"notequal", GL_NOTEQUAL}};
789*35238bceSAndroid Build Coastguard Worker
790*35238bceSAndroid Build Coastguard Worker static const struct
791*35238bceSAndroid Build Coastguard Worker {
792*35238bceSAndroid Build Coastguard Worker const char *name;
793*35238bceSAndroid Build Coastguard Worker uint32_t op;
794*35238bceSAndroid Build Coastguard Worker } stencilOps[] = {{"keep", GL_KEEP}, {"zero", GL_ZERO}, {"replace", GL_REPLACE},
795*35238bceSAndroid Build Coastguard Worker {"incr", GL_INCR}, {"decr", GL_DECR}, {"invert", GL_INVERT},
796*35238bceSAndroid Build Coastguard Worker {"incr_wrap", GL_INCR_WRAP}, {"decr_wrap", GL_DECR_WRAP}};
797*35238bceSAndroid Build Coastguard Worker
798*35238bceSAndroid Build Coastguard Worker static const struct
799*35238bceSAndroid Build Coastguard Worker {
800*35238bceSAndroid Build Coastguard Worker rr::FaceType visibleFace;
801*35238bceSAndroid Build Coastguard Worker uint32_t sFail;
802*35238bceSAndroid Build Coastguard Worker uint32_t dFail;
803*35238bceSAndroid Build Coastguard Worker uint32_t dPass;
804*35238bceSAndroid Build Coastguard Worker int stencilRef;
805*35238bceSAndroid Build Coastguard Worker uint32_t compareMask;
806*35238bceSAndroid Build Coastguard Worker uint32_t writeMask;
807*35238bceSAndroid Build Coastguard Worker float depth;
808*35238bceSAndroid Build Coastguard Worker } functionCases[] = {{rr::FACETYPE_BACK, GL_DECR, GL_INCR, GL_INVERT, 4, ~0u, ~0u, -0.7f},
809*35238bceSAndroid Build Coastguard Worker {rr::FACETYPE_FRONT, GL_DECR, GL_INCR, GL_INVERT, 2, ~0u, ~0u, 0.0f},
810*35238bceSAndroid Build Coastguard Worker {rr::FACETYPE_BACK, GL_DECR, GL_INCR, GL_INVERT, 1, ~0u, ~0u, 0.2f},
811*35238bceSAndroid Build Coastguard Worker {rr::FACETYPE_FRONT, GL_DECR_WRAP, GL_INVERT, GL_REPLACE, 4, ~0u, ~0u, 1.0f}};
812*35238bceSAndroid Build Coastguard Worker
813*35238bceSAndroid Build Coastguard Worker // All combinations of depth stencil functions.
814*35238bceSAndroid Build Coastguard Worker {
815*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *functionsGroup =
816*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, "stencil_depth_funcs", "Combinations of Depth and Stencil Functions");
817*35238bceSAndroid Build Coastguard Worker addChild(functionsGroup);
818*35238bceSAndroid Build Coastguard Worker
819*35238bceSAndroid Build Coastguard Worker for (int stencilFunc = 0; stencilFunc < DE_LENGTH_OF_ARRAY(compareFuncs) + 1; stencilFunc++)
820*35238bceSAndroid Build Coastguard Worker {
821*35238bceSAndroid Build Coastguard Worker // One extra: depth test disabled.
822*35238bceSAndroid Build Coastguard Worker for (int depthFunc = 0; depthFunc < DE_LENGTH_OF_ARRAY(compareFuncs) + 1; depthFunc++)
823*35238bceSAndroid Build Coastguard Worker {
824*35238bceSAndroid Build Coastguard Worker DepthStencilParams params;
825*35238bceSAndroid Build Coastguard Worker ostringstream name;
826*35238bceSAndroid Build Coastguard Worker bool hasStencilFunc = de::inBounds(stencilFunc, 0, DE_LENGTH_OF_ARRAY(compareFuncs));
827*35238bceSAndroid Build Coastguard Worker bool hasDepthFunc = de::inBounds(depthFunc, 0, DE_LENGTH_OF_ARRAY(compareFuncs));
828*35238bceSAndroid Build Coastguard Worker
829*35238bceSAndroid Build Coastguard Worker if (hasStencilFunc)
830*35238bceSAndroid Build Coastguard Worker name << "stencil_" << compareFuncs[stencilFunc].name << "_";
831*35238bceSAndroid Build Coastguard Worker else
832*35238bceSAndroid Build Coastguard Worker name << "no_stencil_";
833*35238bceSAndroid Build Coastguard Worker
834*35238bceSAndroid Build Coastguard Worker if (hasDepthFunc)
835*35238bceSAndroid Build Coastguard Worker name << "depth_" << compareFuncs[depthFunc].name;
836*35238bceSAndroid Build Coastguard Worker else
837*35238bceSAndroid Build Coastguard Worker name << "no_depth";
838*35238bceSAndroid Build Coastguard Worker
839*35238bceSAndroid Build Coastguard Worker params.depthFunc = hasDepthFunc ? compareFuncs[depthFunc].func : 0;
840*35238bceSAndroid Build Coastguard Worker params.depthTestEnabled = hasDepthFunc;
841*35238bceSAndroid Build Coastguard Worker params.depthWriteMask = true;
842*35238bceSAndroid Build Coastguard Worker
843*35238bceSAndroid Build Coastguard Worker params.stencilTestEnabled = hasStencilFunc;
844*35238bceSAndroid Build Coastguard Worker
845*35238bceSAndroid Build Coastguard Worker vector<DepthStencilParams> cases;
846*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(functionCases); ndx++)
847*35238bceSAndroid Build Coastguard Worker {
848*35238bceSAndroid Build Coastguard Worker rr::FaceType visible = functionCases[ndx].visibleFace;
849*35238bceSAndroid Build Coastguard Worker rr::FaceType notVisible = visible == rr::FACETYPE_FRONT ? rr::FACETYPE_BACK : rr::FACETYPE_FRONT;
850*35238bceSAndroid Build Coastguard Worker
851*35238bceSAndroid Build Coastguard Worker params.depth = functionCases[ndx].depth;
852*35238bceSAndroid Build Coastguard Worker params.visibleFace = visible;
853*35238bceSAndroid Build Coastguard Worker
854*35238bceSAndroid Build Coastguard Worker params.stencil[visible].function = hasStencilFunc ? compareFuncs[stencilFunc].func : 0;
855*35238bceSAndroid Build Coastguard Worker params.stencil[visible].reference = functionCases[ndx].stencilRef;
856*35238bceSAndroid Build Coastguard Worker params.stencil[visible].stencilFailOp = functionCases[ndx].sFail;
857*35238bceSAndroid Build Coastguard Worker params.stencil[visible].depthFailOp = functionCases[ndx].dFail;
858*35238bceSAndroid Build Coastguard Worker params.stencil[visible].depthPassOp = functionCases[ndx].dPass;
859*35238bceSAndroid Build Coastguard Worker params.stencil[visible].compareMask = functionCases[ndx].compareMask;
860*35238bceSAndroid Build Coastguard Worker params.stencil[visible].writeMask = functionCases[ndx].writeMask;
861*35238bceSAndroid Build Coastguard Worker
862*35238bceSAndroid Build Coastguard Worker params.stencil[notVisible].function = GL_ALWAYS;
863*35238bceSAndroid Build Coastguard Worker params.stencil[notVisible].reference = 0;
864*35238bceSAndroid Build Coastguard Worker params.stencil[notVisible].stencilFailOp = GL_REPLACE;
865*35238bceSAndroid Build Coastguard Worker params.stencil[notVisible].depthFailOp = GL_REPLACE;
866*35238bceSAndroid Build Coastguard Worker params.stencil[notVisible].depthPassOp = GL_REPLACE;
867*35238bceSAndroid Build Coastguard Worker params.stencil[notVisible].compareMask = 0u;
868*35238bceSAndroid Build Coastguard Worker params.stencil[notVisible].writeMask = ~0u;
869*35238bceSAndroid Build Coastguard Worker
870*35238bceSAndroid Build Coastguard Worker cases.push_back(params);
871*35238bceSAndroid Build Coastguard Worker }
872*35238bceSAndroid Build Coastguard Worker
873*35238bceSAndroid Build Coastguard Worker functionsGroup->addChild(new DepthStencilCase(m_context, name.str().c_str(), "", cases));
874*35238bceSAndroid Build Coastguard Worker }
875*35238bceSAndroid Build Coastguard Worker }
876*35238bceSAndroid Build Coastguard Worker }
877*35238bceSAndroid Build Coastguard Worker
878*35238bceSAndroid Build Coastguard Worker static const struct
879*35238bceSAndroid Build Coastguard Worker {
880*35238bceSAndroid Build Coastguard Worker rr::FaceType visibleFace;
881*35238bceSAndroid Build Coastguard Worker uint32_t func;
882*35238bceSAndroid Build Coastguard Worker int ref;
883*35238bceSAndroid Build Coastguard Worker uint32_t compareMask;
884*35238bceSAndroid Build Coastguard Worker uint32_t writeMask;
885*35238bceSAndroid Build Coastguard Worker } opCombinationCases[] = {{rr::FACETYPE_BACK, GL_LESS, 4, ~0u, ~0u},
886*35238bceSAndroid Build Coastguard Worker {rr::FACETYPE_FRONT, GL_GREATER, 2, ~0u, ~0u},
887*35238bceSAndroid Build Coastguard Worker {rr::FACETYPE_BACK, GL_EQUAL, 3, ~2u, ~0u},
888*35238bceSAndroid Build Coastguard Worker {rr::FACETYPE_FRONT, GL_NOTEQUAL, 1, ~0u, ~1u}};
889*35238bceSAndroid Build Coastguard Worker
890*35238bceSAndroid Build Coastguard Worker // All combinations of stencil ops.
891*35238bceSAndroid Build Coastguard Worker {
892*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *opCombinationGroup =
893*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, "stencil_ops", "Stencil Op Combinations");
894*35238bceSAndroid Build Coastguard Worker addChild(opCombinationGroup);
895*35238bceSAndroid Build Coastguard Worker
896*35238bceSAndroid Build Coastguard Worker for (int sFail = 0; sFail < DE_LENGTH_OF_ARRAY(stencilOps); sFail++)
897*35238bceSAndroid Build Coastguard Worker {
898*35238bceSAndroid Build Coastguard Worker for (int dFail = 0; dFail < DE_LENGTH_OF_ARRAY(stencilOps); dFail++)
899*35238bceSAndroid Build Coastguard Worker {
900*35238bceSAndroid Build Coastguard Worker for (int dPass = 0; dPass < DE_LENGTH_OF_ARRAY(stencilOps); dPass++)
901*35238bceSAndroid Build Coastguard Worker {
902*35238bceSAndroid Build Coastguard Worker DepthStencilParams params;
903*35238bceSAndroid Build Coastguard Worker ostringstream name;
904*35238bceSAndroid Build Coastguard Worker
905*35238bceSAndroid Build Coastguard Worker name << stencilOps[sFail].name << "_" << stencilOps[dFail].name << "_" << stencilOps[dPass].name;
906*35238bceSAndroid Build Coastguard Worker
907*35238bceSAndroid Build Coastguard Worker params.depthFunc = GL_LEQUAL;
908*35238bceSAndroid Build Coastguard Worker params.depth = 0.0f;
909*35238bceSAndroid Build Coastguard Worker params.depthTestEnabled = true;
910*35238bceSAndroid Build Coastguard Worker params.depthWriteMask = true;
911*35238bceSAndroid Build Coastguard Worker
912*35238bceSAndroid Build Coastguard Worker params.stencilTestEnabled = true;
913*35238bceSAndroid Build Coastguard Worker
914*35238bceSAndroid Build Coastguard Worker vector<DepthStencilParams> cases;
915*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(opCombinationCases); ndx++)
916*35238bceSAndroid Build Coastguard Worker {
917*35238bceSAndroid Build Coastguard Worker rr::FaceType visible = opCombinationCases[ndx].visibleFace;
918*35238bceSAndroid Build Coastguard Worker rr::FaceType notVisible =
919*35238bceSAndroid Build Coastguard Worker visible == rr::FACETYPE_FRONT ? rr::FACETYPE_BACK : rr::FACETYPE_FRONT;
920*35238bceSAndroid Build Coastguard Worker
921*35238bceSAndroid Build Coastguard Worker params.visibleFace = visible;
922*35238bceSAndroid Build Coastguard Worker
923*35238bceSAndroid Build Coastguard Worker params.stencil[visible].function = opCombinationCases[ndx].func;
924*35238bceSAndroid Build Coastguard Worker params.stencil[visible].reference = opCombinationCases[ndx].ref;
925*35238bceSAndroid Build Coastguard Worker params.stencil[visible].stencilFailOp = stencilOps[sFail].op;
926*35238bceSAndroid Build Coastguard Worker params.stencil[visible].depthFailOp = stencilOps[dFail].op;
927*35238bceSAndroid Build Coastguard Worker params.stencil[visible].depthPassOp = stencilOps[dPass].op;
928*35238bceSAndroid Build Coastguard Worker params.stencil[visible].compareMask = opCombinationCases[ndx].compareMask;
929*35238bceSAndroid Build Coastguard Worker params.stencil[visible].writeMask = opCombinationCases[ndx].writeMask;
930*35238bceSAndroid Build Coastguard Worker
931*35238bceSAndroid Build Coastguard Worker params.stencil[notVisible].function = GL_ALWAYS;
932*35238bceSAndroid Build Coastguard Worker params.stencil[notVisible].reference = 0;
933*35238bceSAndroid Build Coastguard Worker params.stencil[notVisible].stencilFailOp = GL_REPLACE;
934*35238bceSAndroid Build Coastguard Worker params.stencil[notVisible].depthFailOp = GL_REPLACE;
935*35238bceSAndroid Build Coastguard Worker params.stencil[notVisible].depthPassOp = GL_REPLACE;
936*35238bceSAndroid Build Coastguard Worker params.stencil[notVisible].compareMask = 0u;
937*35238bceSAndroid Build Coastguard Worker params.stencil[notVisible].writeMask = ~0u;
938*35238bceSAndroid Build Coastguard Worker
939*35238bceSAndroid Build Coastguard Worker cases.push_back(params);
940*35238bceSAndroid Build Coastguard Worker }
941*35238bceSAndroid Build Coastguard Worker
942*35238bceSAndroid Build Coastguard Worker opCombinationGroup->addChild(new DepthStencilCase(m_context, name.str().c_str(), "", cases));
943*35238bceSAndroid Build Coastguard Worker }
944*35238bceSAndroid Build Coastguard Worker }
945*35238bceSAndroid Build Coastguard Worker }
946*35238bceSAndroid Build Coastguard Worker }
947*35238bceSAndroid Build Coastguard Worker
948*35238bceSAndroid Build Coastguard Worker // Write masks
949*35238bceSAndroid Build Coastguard Worker {
950*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *writeMaskGroup =
951*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, "write_mask", "Depth and Stencil Write Masks");
952*35238bceSAndroid Build Coastguard Worker addChild(writeMaskGroup);
953*35238bceSAndroid Build Coastguard Worker
954*35238bceSAndroid Build Coastguard Worker // Depth mask
955*35238bceSAndroid Build Coastguard Worker {
956*35238bceSAndroid Build Coastguard Worker DepthStencilParams params;
957*35238bceSAndroid Build Coastguard Worker
958*35238bceSAndroid Build Coastguard Worker params.depthFunc = GL_LEQUAL;
959*35238bceSAndroid Build Coastguard Worker params.depth = 0.0f;
960*35238bceSAndroid Build Coastguard Worker params.depthTestEnabled = true;
961*35238bceSAndroid Build Coastguard Worker params.stencilTestEnabled = true;
962*35238bceSAndroid Build Coastguard Worker
963*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_FRONT].function = GL_NOTEQUAL;
964*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_FRONT].reference = 1;
965*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_FRONT].stencilFailOp = GL_INVERT;
966*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_FRONT].depthFailOp = GL_INCR;
967*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_FRONT].depthPassOp = GL_DECR;
968*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_FRONT].compareMask = ~0u;
969*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_FRONT].writeMask = ~0u;
970*35238bceSAndroid Build Coastguard Worker
971*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_BACK].function = GL_ALWAYS;
972*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_BACK].reference = 0;
973*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_BACK].stencilFailOp = GL_REPLACE;
974*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_BACK].depthFailOp = GL_INVERT;
975*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_BACK].depthPassOp = GL_INCR;
976*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_BACK].compareMask = ~0u;
977*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_BACK].writeMask = ~0u;
978*35238bceSAndroid Build Coastguard Worker
979*35238bceSAndroid Build Coastguard Worker vector<DepthStencilParams> cases;
980*35238bceSAndroid Build Coastguard Worker
981*35238bceSAndroid Build Coastguard Worker // Case 1: front, depth write enabled
982*35238bceSAndroid Build Coastguard Worker params.visibleFace = rr::FACETYPE_FRONT;
983*35238bceSAndroid Build Coastguard Worker params.depthWriteMask = true;
984*35238bceSAndroid Build Coastguard Worker cases.push_back(params);
985*35238bceSAndroid Build Coastguard Worker
986*35238bceSAndroid Build Coastguard Worker // Case 2: front, depth write disabled
987*35238bceSAndroid Build Coastguard Worker params.visibleFace = rr::FACETYPE_FRONT;
988*35238bceSAndroid Build Coastguard Worker params.depthWriteMask = false;
989*35238bceSAndroid Build Coastguard Worker cases.push_back(params);
990*35238bceSAndroid Build Coastguard Worker
991*35238bceSAndroid Build Coastguard Worker // Case 3: back, depth write enabled
992*35238bceSAndroid Build Coastguard Worker params.visibleFace = rr::FACETYPE_BACK;
993*35238bceSAndroid Build Coastguard Worker params.depthWriteMask = true;
994*35238bceSAndroid Build Coastguard Worker cases.push_back(params);
995*35238bceSAndroid Build Coastguard Worker
996*35238bceSAndroid Build Coastguard Worker // Case 4: back, depth write disabled
997*35238bceSAndroid Build Coastguard Worker params.visibleFace = rr::FACETYPE_BACK;
998*35238bceSAndroid Build Coastguard Worker params.depthWriteMask = false;
999*35238bceSAndroid Build Coastguard Worker cases.push_back(params);
1000*35238bceSAndroid Build Coastguard Worker
1001*35238bceSAndroid Build Coastguard Worker writeMaskGroup->addChild(new DepthStencilCase(m_context, "depth", "Depth Write Mask", cases));
1002*35238bceSAndroid Build Coastguard Worker }
1003*35238bceSAndroid Build Coastguard Worker
1004*35238bceSAndroid Build Coastguard Worker // Stencil write masks.
1005*35238bceSAndroid Build Coastguard Worker {
1006*35238bceSAndroid Build Coastguard Worker static const struct
1007*35238bceSAndroid Build Coastguard Worker {
1008*35238bceSAndroid Build Coastguard Worker rr::FaceType visibleFace;
1009*35238bceSAndroid Build Coastguard Worker uint32_t frontWriteMask;
1010*35238bceSAndroid Build Coastguard Worker uint32_t backWriteMask;
1011*35238bceSAndroid Build Coastguard Worker } stencilWmaskCases[] = {{rr::FACETYPE_FRONT, ~0u, 0u}, {rr::FACETYPE_FRONT, 0u, ~0u},
1012*35238bceSAndroid Build Coastguard Worker {rr::FACETYPE_FRONT, 0xfu, 0xf0u}, {rr::FACETYPE_FRONT, 0x2u, 0x4u},
1013*35238bceSAndroid Build Coastguard Worker {rr::FACETYPE_BACK, 0u, ~0u}, {rr::FACETYPE_BACK, ~0u, 0u},
1014*35238bceSAndroid Build Coastguard Worker {rr::FACETYPE_BACK, 0xf0u, 0xfu}, {rr::FACETYPE_BACK, 0x4u, 0x2u}};
1015*35238bceSAndroid Build Coastguard Worker
1016*35238bceSAndroid Build Coastguard Worker DepthStencilParams params;
1017*35238bceSAndroid Build Coastguard Worker
1018*35238bceSAndroid Build Coastguard Worker params.depthFunc = GL_LEQUAL;
1019*35238bceSAndroid Build Coastguard Worker params.depth = 0.0f;
1020*35238bceSAndroid Build Coastguard Worker params.depthTestEnabled = true;
1021*35238bceSAndroid Build Coastguard Worker params.depthWriteMask = true;
1022*35238bceSAndroid Build Coastguard Worker params.stencilTestEnabled = true;
1023*35238bceSAndroid Build Coastguard Worker
1024*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_FRONT].function = GL_NOTEQUAL;
1025*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_FRONT].reference = 1;
1026*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_FRONT].stencilFailOp = GL_INVERT;
1027*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_FRONT].depthFailOp = GL_INCR;
1028*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_FRONT].depthPassOp = GL_DECR;
1029*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_FRONT].compareMask = ~0u;
1030*35238bceSAndroid Build Coastguard Worker
1031*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_BACK].function = GL_ALWAYS;
1032*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_BACK].reference = 0;
1033*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_BACK].stencilFailOp = GL_REPLACE;
1034*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_BACK].depthFailOp = GL_INVERT;
1035*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_BACK].depthPassOp = GL_INCR;
1036*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_BACK].compareMask = ~0u;
1037*35238bceSAndroid Build Coastguard Worker
1038*35238bceSAndroid Build Coastguard Worker vector<DepthStencilParams> cases;
1039*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(stencilWmaskCases); ndx++)
1040*35238bceSAndroid Build Coastguard Worker {
1041*35238bceSAndroid Build Coastguard Worker params.visibleFace = stencilWmaskCases[ndx].visibleFace;
1042*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_FRONT].writeMask = stencilWmaskCases[ndx].frontWriteMask;
1043*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_BACK].writeMask = stencilWmaskCases[ndx].backWriteMask;
1044*35238bceSAndroid Build Coastguard Worker cases.push_back(params);
1045*35238bceSAndroid Build Coastguard Worker }
1046*35238bceSAndroid Build Coastguard Worker
1047*35238bceSAndroid Build Coastguard Worker writeMaskGroup->addChild(new DepthStencilCase(m_context, "stencil", "Stencil Write Mask", cases));
1048*35238bceSAndroid Build Coastguard Worker }
1049*35238bceSAndroid Build Coastguard Worker
1050*35238bceSAndroid Build Coastguard Worker // Depth & stencil write masks.
1051*35238bceSAndroid Build Coastguard Worker {
1052*35238bceSAndroid Build Coastguard Worker static const struct
1053*35238bceSAndroid Build Coastguard Worker {
1054*35238bceSAndroid Build Coastguard Worker bool depthWriteMask;
1055*35238bceSAndroid Build Coastguard Worker rr::FaceType visibleFace;
1056*35238bceSAndroid Build Coastguard Worker uint32_t frontWriteMask;
1057*35238bceSAndroid Build Coastguard Worker uint32_t backWriteMask;
1058*35238bceSAndroid Build Coastguard Worker } depthStencilWmaskCases[] = {
1059*35238bceSAndroid Build Coastguard Worker {false, rr::FACETYPE_FRONT, ~0u, 0u}, {false, rr::FACETYPE_FRONT, 0u, ~0u},
1060*35238bceSAndroid Build Coastguard Worker {false, rr::FACETYPE_FRONT, 0xfu, 0xf0u}, {true, rr::FACETYPE_FRONT, ~0u, 0u},
1061*35238bceSAndroid Build Coastguard Worker {true, rr::FACETYPE_FRONT, 0u, ~0u}, {true, rr::FACETYPE_FRONT, 0xfu, 0xf0u},
1062*35238bceSAndroid Build Coastguard Worker {false, rr::FACETYPE_BACK, 0u, ~0u}, {false, rr::FACETYPE_BACK, ~0u, 0u},
1063*35238bceSAndroid Build Coastguard Worker {false, rr::FACETYPE_BACK, 0xf0u, 0xfu}, {true, rr::FACETYPE_BACK, 0u, ~0u},
1064*35238bceSAndroid Build Coastguard Worker {true, rr::FACETYPE_BACK, ~0u, 0u}, {true, rr::FACETYPE_BACK, 0xf0u, 0xfu}};
1065*35238bceSAndroid Build Coastguard Worker
1066*35238bceSAndroid Build Coastguard Worker DepthStencilParams params;
1067*35238bceSAndroid Build Coastguard Worker
1068*35238bceSAndroid Build Coastguard Worker params.depthFunc = GL_LEQUAL;
1069*35238bceSAndroid Build Coastguard Worker params.depth = 0.0f;
1070*35238bceSAndroid Build Coastguard Worker params.depthTestEnabled = true;
1071*35238bceSAndroid Build Coastguard Worker params.depthWriteMask = true;
1072*35238bceSAndroid Build Coastguard Worker params.stencilTestEnabled = true;
1073*35238bceSAndroid Build Coastguard Worker
1074*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_FRONT].function = GL_NOTEQUAL;
1075*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_FRONT].reference = 1;
1076*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_FRONT].stencilFailOp = GL_INVERT;
1077*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_FRONT].depthFailOp = GL_INCR;
1078*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_FRONT].depthPassOp = GL_DECR;
1079*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_FRONT].compareMask = ~0u;
1080*35238bceSAndroid Build Coastguard Worker
1081*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_BACK].function = GL_ALWAYS;
1082*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_BACK].reference = 0;
1083*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_BACK].stencilFailOp = GL_REPLACE;
1084*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_BACK].depthFailOp = GL_INVERT;
1085*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_BACK].depthPassOp = GL_INCR;
1086*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_BACK].compareMask = ~0u;
1087*35238bceSAndroid Build Coastguard Worker
1088*35238bceSAndroid Build Coastguard Worker vector<DepthStencilParams> cases;
1089*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(depthStencilWmaskCases); ndx++)
1090*35238bceSAndroid Build Coastguard Worker {
1091*35238bceSAndroid Build Coastguard Worker params.depthWriteMask = depthStencilWmaskCases[ndx].depthWriteMask;
1092*35238bceSAndroid Build Coastguard Worker params.visibleFace = depthStencilWmaskCases[ndx].visibleFace;
1093*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_FRONT].writeMask = depthStencilWmaskCases[ndx].frontWriteMask;
1094*35238bceSAndroid Build Coastguard Worker params.stencil[rr::FACETYPE_BACK].writeMask = depthStencilWmaskCases[ndx].backWriteMask;
1095*35238bceSAndroid Build Coastguard Worker cases.push_back(params);
1096*35238bceSAndroid Build Coastguard Worker }
1097*35238bceSAndroid Build Coastguard Worker
1098*35238bceSAndroid Build Coastguard Worker writeMaskGroup->addChild(new DepthStencilCase(m_context, "both", "Depth and Stencil Write Masks", cases));
1099*35238bceSAndroid Build Coastguard Worker }
1100*35238bceSAndroid Build Coastguard Worker }
1101*35238bceSAndroid Build Coastguard Worker
1102*35238bceSAndroid Build Coastguard Worker // Randomized cases
1103*35238bceSAndroid Build Coastguard Worker {
1104*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *randomGroup =
1105*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, "random", "Randomized Depth and Stencil Test Cases");
1106*35238bceSAndroid Build Coastguard Worker addChild(randomGroup);
1107*35238bceSAndroid Build Coastguard Worker
1108*35238bceSAndroid Build Coastguard Worker for (int caseNdx = 0; caseNdx < NUM_RANDOM_CASES; caseNdx++)
1109*35238bceSAndroid Build Coastguard Worker {
1110*35238bceSAndroid Build Coastguard Worker vector<DepthStencilParams> subCases(NUM_RANDOM_SUB_CASES);
1111*35238bceSAndroid Build Coastguard Worker de::Random rnd(deInt32Hash(caseNdx) ^ deInt32Hash(m_testCtx.getCommandLine().getBaseSeed()));
1112*35238bceSAndroid Build Coastguard Worker
1113*35238bceSAndroid Build Coastguard Worker for (vector<DepthStencilParams>::iterator iter = subCases.begin(); iter != subCases.end(); ++iter)
1114*35238bceSAndroid Build Coastguard Worker randomDepthStencilState(rnd, *iter);
1115*35238bceSAndroid Build Coastguard Worker
1116*35238bceSAndroid Build Coastguard Worker randomGroup->addChild(new DepthStencilCase(m_context, de::toString(caseNdx).c_str(), "", subCases));
1117*35238bceSAndroid Build Coastguard Worker }
1118*35238bceSAndroid Build Coastguard Worker }
1119*35238bceSAndroid Build Coastguard Worker }
1120*35238bceSAndroid Build Coastguard Worker
1121*35238bceSAndroid Build Coastguard Worker } // namespace Functional
1122*35238bceSAndroid Build Coastguard Worker } // namespace gles2
1123*35238bceSAndroid Build Coastguard Worker } // namespace deqp
1124