xref: /aosp_15_r20/external/deqp/modules/gles2/functional/es2fRasterizationTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
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 Functional rasterization tests.
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "es2fRasterizationTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "tcuRasterizationVerifier.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "tcuSurface.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "tcuRenderTarget.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "tcuVectorUtil.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "tcuStringTemplate.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "tcuResultCollector.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "gluShaderProgram.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "gluRenderContext.hpp"
33*35238bceSAndroid Build Coastguard Worker #include "gluPixelTransfer.hpp"
34*35238bceSAndroid Build Coastguard Worker #include "gluStrUtil.hpp"
35*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
36*35238bceSAndroid Build Coastguard Worker #include "deRandom.hpp"
37*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
38*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
39*35238bceSAndroid Build Coastguard Worker 
40*35238bceSAndroid Build Coastguard Worker #include <vector>
41*35238bceSAndroid Build Coastguard Worker 
42*35238bceSAndroid Build Coastguard Worker namespace deqp
43*35238bceSAndroid Build Coastguard Worker {
44*35238bceSAndroid Build Coastguard Worker namespace gles2
45*35238bceSAndroid Build Coastguard Worker {
46*35238bceSAndroid Build Coastguard Worker namespace Functional
47*35238bceSAndroid Build Coastguard Worker {
48*35238bceSAndroid Build Coastguard Worker namespace
49*35238bceSAndroid Build Coastguard Worker {
50*35238bceSAndroid Build Coastguard Worker 
51*35238bceSAndroid Build Coastguard Worker using tcu::LineInterpolationMethod;
52*35238bceSAndroid Build Coastguard Worker using tcu::LineSceneSpec;
53*35238bceSAndroid Build Coastguard Worker using tcu::PointSceneSpec;
54*35238bceSAndroid Build Coastguard Worker using tcu::RasterizationArguments;
55*35238bceSAndroid Build Coastguard Worker using tcu::TriangleSceneSpec;
56*35238bceSAndroid Build Coastguard Worker 
57*35238bceSAndroid Build Coastguard Worker static const char *const s_shaderVertexTemplate   = "attribute highp vec4 a_position;\n"
58*35238bceSAndroid Build Coastguard Worker                                                     "attribute highp vec4 a_color;\n"
59*35238bceSAndroid Build Coastguard Worker                                                     "varying highp vec4 v_color;\n"
60*35238bceSAndroid Build Coastguard Worker                                                     "uniform highp float u_pointSize;\n"
61*35238bceSAndroid Build Coastguard Worker                                                     "void main ()\n"
62*35238bceSAndroid Build Coastguard Worker                                                     "{\n"
63*35238bceSAndroid Build Coastguard Worker                                                     "    gl_Position = a_position;\n"
64*35238bceSAndroid Build Coastguard Worker                                                     "    gl_PointSize = u_pointSize;\n"
65*35238bceSAndroid Build Coastguard Worker                                                     "    v_color = a_color;\n"
66*35238bceSAndroid Build Coastguard Worker                                                     "}\n";
67*35238bceSAndroid Build Coastguard Worker static const char *const s_shaderFragmentTemplate = "varying mediump vec4 v_color;\n"
68*35238bceSAndroid Build Coastguard Worker                                                     "void main ()\n"
69*35238bceSAndroid Build Coastguard Worker                                                     "{\n"
70*35238bceSAndroid Build Coastguard Worker                                                     "    gl_FragColor = v_color;\n"
71*35238bceSAndroid Build Coastguard Worker                                                     "}\n";
72*35238bceSAndroid Build Coastguard Worker enum InterpolationCaseFlags
73*35238bceSAndroid Build Coastguard Worker {
74*35238bceSAndroid Build Coastguard Worker     INTERPOLATIONFLAGS_NONE      = 0,
75*35238bceSAndroid Build Coastguard Worker     INTERPOLATIONFLAGS_PROJECTED = (1 << 1),
76*35238bceSAndroid Build Coastguard Worker };
77*35238bceSAndroid Build Coastguard Worker 
78*35238bceSAndroid Build Coastguard Worker enum PrimitiveWideness
79*35238bceSAndroid Build Coastguard Worker {
80*35238bceSAndroid Build Coastguard Worker     PRIMITIVEWIDENESS_NARROW = 0,
81*35238bceSAndroid Build Coastguard Worker     PRIMITIVEWIDENESS_WIDE,
82*35238bceSAndroid Build Coastguard Worker 
83*35238bceSAndroid Build Coastguard Worker     PRIMITIVEWIDENESS_LAST
84*35238bceSAndroid Build Coastguard Worker };
85*35238bceSAndroid Build Coastguard Worker 
86*35238bceSAndroid Build Coastguard Worker class BaseRenderingCase : public TestCase
87*35238bceSAndroid Build Coastguard Worker {
88*35238bceSAndroid Build Coastguard Worker public:
89*35238bceSAndroid Build Coastguard Worker     BaseRenderingCase(Context &context, const char *name, const char *desc, int renderSize = 256);
90*35238bceSAndroid Build Coastguard Worker     ~BaseRenderingCase(void);
91*35238bceSAndroid Build Coastguard Worker     virtual void init(void);
92*35238bceSAndroid Build Coastguard Worker     void deinit(void);
93*35238bceSAndroid Build Coastguard Worker 
94*35238bceSAndroid Build Coastguard Worker protected:
95*35238bceSAndroid Build Coastguard Worker     void drawPrimitives(tcu::Surface &result, const std::vector<tcu::Vec4> &vertexData, glw::GLenum primitiveType);
96*35238bceSAndroid Build Coastguard Worker     void drawPrimitives(tcu::Surface &result, const std::vector<tcu::Vec4> &vertexData,
97*35238bceSAndroid Build Coastguard Worker                         const std::vector<tcu::Vec4> &coloDrata, glw::GLenum primitiveType);
98*35238bceSAndroid Build Coastguard Worker 
99*35238bceSAndroid Build Coastguard Worker     const int m_renderSize;
100*35238bceSAndroid Build Coastguard Worker     int m_numSamples;
101*35238bceSAndroid Build Coastguard Worker     int m_subpixelBits;
102*35238bceSAndroid Build Coastguard Worker     float m_pointSize;
103*35238bceSAndroid Build Coastguard Worker     float m_lineWidth;
104*35238bceSAndroid Build Coastguard Worker 
105*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram *m_shader;
106*35238bceSAndroid Build Coastguard Worker };
107*35238bceSAndroid Build Coastguard Worker 
BaseRenderingCase(Context & context,const char * name,const char * desc,int renderSize)108*35238bceSAndroid Build Coastguard Worker BaseRenderingCase::BaseRenderingCase(Context &context, const char *name, const char *desc, int renderSize)
109*35238bceSAndroid Build Coastguard Worker     : TestCase(context, name, desc)
110*35238bceSAndroid Build Coastguard Worker     , m_renderSize(renderSize)
111*35238bceSAndroid Build Coastguard Worker     , m_numSamples(-1)
112*35238bceSAndroid Build Coastguard Worker     , m_subpixelBits(-1)
113*35238bceSAndroid Build Coastguard Worker     , m_pointSize(1.0f)
114*35238bceSAndroid Build Coastguard Worker     , m_lineWidth(1.0f)
115*35238bceSAndroid Build Coastguard Worker     , m_shader(DE_NULL)
116*35238bceSAndroid Build Coastguard Worker {
117*35238bceSAndroid Build Coastguard Worker }
118*35238bceSAndroid Build Coastguard Worker 
~BaseRenderingCase(void)119*35238bceSAndroid Build Coastguard Worker BaseRenderingCase::~BaseRenderingCase(void)
120*35238bceSAndroid Build Coastguard Worker {
121*35238bceSAndroid Build Coastguard Worker     deinit();
122*35238bceSAndroid Build Coastguard Worker }
123*35238bceSAndroid Build Coastguard Worker 
init(void)124*35238bceSAndroid Build Coastguard Worker void BaseRenderingCase::init(void)
125*35238bceSAndroid Build Coastguard Worker {
126*35238bceSAndroid Build Coastguard Worker     const int width  = m_context.getRenderTarget().getWidth();
127*35238bceSAndroid Build Coastguard Worker     const int height = m_context.getRenderTarget().getHeight();
128*35238bceSAndroid Build Coastguard Worker 
129*35238bceSAndroid Build Coastguard Worker     // Requirements
130*35238bceSAndroid Build Coastguard Worker 
131*35238bceSAndroid Build Coastguard Worker     if (width < m_renderSize || height < m_renderSize)
132*35238bceSAndroid Build Coastguard Worker         throw tcu::NotSupportedError(std::string("Render target size must be at least ") + de::toString(m_renderSize) +
133*35238bceSAndroid Build Coastguard Worker                                      "x" + de::toString(m_renderSize));
134*35238bceSAndroid Build Coastguard Worker 
135*35238bceSAndroid Build Coastguard Worker     if (m_lineWidth != 1.0f)
136*35238bceSAndroid Build Coastguard Worker     {
137*35238bceSAndroid Build Coastguard Worker         float range[2] = {0.0f, 0.0f};
138*35238bceSAndroid Build Coastguard Worker         m_context.getRenderContext().getFunctions().getFloatv(GL_ALIASED_LINE_WIDTH_RANGE, range);
139*35238bceSAndroid Build Coastguard Worker 
140*35238bceSAndroid Build Coastguard Worker         if (m_lineWidth < range[0] || m_lineWidth > range[1])
141*35238bceSAndroid Build Coastguard Worker             throw tcu::NotSupportedError(std::string("Support for line width ") + de::toString(m_lineWidth) +
142*35238bceSAndroid Build Coastguard Worker                                          " is required.");
143*35238bceSAndroid Build Coastguard Worker 
144*35238bceSAndroid Build Coastguard Worker         m_testCtx.getLog() << tcu::TestLog::Message << "ALIASED_LINE_WIDTH_RANGE = [" << range[0] << ", " << range[1]
145*35238bceSAndroid Build Coastguard Worker                            << "]" << tcu::TestLog::EndMessage;
146*35238bceSAndroid Build Coastguard Worker     }
147*35238bceSAndroid Build Coastguard Worker 
148*35238bceSAndroid Build Coastguard Worker     if (m_pointSize != 1.0f)
149*35238bceSAndroid Build Coastguard Worker     {
150*35238bceSAndroid Build Coastguard Worker         float range[2] = {0.0f, 0.0f};
151*35238bceSAndroid Build Coastguard Worker         m_context.getRenderContext().getFunctions().getFloatv(GL_ALIASED_POINT_SIZE_RANGE, range);
152*35238bceSAndroid Build Coastguard Worker 
153*35238bceSAndroid Build Coastguard Worker         if (m_pointSize < range[0] || m_pointSize > range[1])
154*35238bceSAndroid Build Coastguard Worker             throw tcu::NotSupportedError(std::string("Support for point size ") + de::toString(m_pointSize) +
155*35238bceSAndroid Build Coastguard Worker                                          " is required.");
156*35238bceSAndroid Build Coastguard Worker 
157*35238bceSAndroid Build Coastguard Worker         m_testCtx.getLog() << tcu::TestLog::Message << "ALIASED_POINT_SIZE_RANGE = [" << range[0] << ", " << range[1]
158*35238bceSAndroid Build Coastguard Worker                            << "]" << tcu::TestLog::EndMessage;
159*35238bceSAndroid Build Coastguard Worker     }
160*35238bceSAndroid Build Coastguard Worker 
161*35238bceSAndroid Build Coastguard Worker     // Query info
162*35238bceSAndroid Build Coastguard Worker 
163*35238bceSAndroid Build Coastguard Worker     m_numSamples = m_context.getRenderTarget().getNumSamples();
164*35238bceSAndroid Build Coastguard Worker     m_context.getRenderContext().getFunctions().getIntegerv(GL_SUBPIXEL_BITS, &m_subpixelBits);
165*35238bceSAndroid Build Coastguard Worker 
166*35238bceSAndroid Build Coastguard Worker     m_testCtx.getLog() << tcu::TestLog::Message << "Sample count = " << m_numSamples << tcu::TestLog::EndMessage;
167*35238bceSAndroid Build Coastguard Worker     m_testCtx.getLog() << tcu::TestLog::Message << "SUBPIXEL_BITS = " << m_subpixelBits << tcu::TestLog::EndMessage;
168*35238bceSAndroid Build Coastguard Worker 
169*35238bceSAndroid Build Coastguard Worker     // Gen shader
170*35238bceSAndroid Build Coastguard Worker 
171*35238bceSAndroid Build Coastguard Worker     {
172*35238bceSAndroid Build Coastguard Worker         tcu::StringTemplate vertexSource(s_shaderVertexTemplate);
173*35238bceSAndroid Build Coastguard Worker         tcu::StringTemplate fragmentSource(s_shaderFragmentTemplate);
174*35238bceSAndroid Build Coastguard Worker         std::map<std::string, std::string> params;
175*35238bceSAndroid Build Coastguard Worker 
176*35238bceSAndroid Build Coastguard Worker         m_shader =
177*35238bceSAndroid Build Coastguard Worker             new glu::ShaderProgram(m_context.getRenderContext(),
178*35238bceSAndroid Build Coastguard Worker                                    glu::ProgramSources() << glu::VertexSource(vertexSource.specialize(params))
179*35238bceSAndroid Build Coastguard Worker                                                          << glu::FragmentSource(fragmentSource.specialize(params)));
180*35238bceSAndroid Build Coastguard Worker         if (!m_shader->isOk())
181*35238bceSAndroid Build Coastguard Worker             throw tcu::TestError("could not create shader");
182*35238bceSAndroid Build Coastguard Worker     }
183*35238bceSAndroid Build Coastguard Worker }
184*35238bceSAndroid Build Coastguard Worker 
deinit(void)185*35238bceSAndroid Build Coastguard Worker void BaseRenderingCase::deinit(void)
186*35238bceSAndroid Build Coastguard Worker {
187*35238bceSAndroid Build Coastguard Worker     if (m_shader)
188*35238bceSAndroid Build Coastguard Worker     {
189*35238bceSAndroid Build Coastguard Worker         delete m_shader;
190*35238bceSAndroid Build Coastguard Worker         m_shader = DE_NULL;
191*35238bceSAndroid Build Coastguard Worker     }
192*35238bceSAndroid Build Coastguard Worker }
193*35238bceSAndroid Build Coastguard Worker 
drawPrimitives(tcu::Surface & result,const std::vector<tcu::Vec4> & vertexData,glw::GLenum primitiveType)194*35238bceSAndroid Build Coastguard Worker void BaseRenderingCase::drawPrimitives(tcu::Surface &result, const std::vector<tcu::Vec4> &vertexData,
195*35238bceSAndroid Build Coastguard Worker                                        glw::GLenum primitiveType)
196*35238bceSAndroid Build Coastguard Worker {
197*35238bceSAndroid Build Coastguard Worker     // default to color white
198*35238bceSAndroid Build Coastguard Worker     const std::vector<tcu::Vec4> colorData(vertexData.size(), tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
199*35238bceSAndroid Build Coastguard Worker 
200*35238bceSAndroid Build Coastguard Worker     drawPrimitives(result, vertexData, colorData, primitiveType);
201*35238bceSAndroid Build Coastguard Worker }
202*35238bceSAndroid Build Coastguard Worker 
drawPrimitives(tcu::Surface & result,const std::vector<tcu::Vec4> & vertexData,const std::vector<tcu::Vec4> & colorData,glw::GLenum primitiveType)203*35238bceSAndroid Build Coastguard Worker void BaseRenderingCase::drawPrimitives(tcu::Surface &result, const std::vector<tcu::Vec4> &vertexData,
204*35238bceSAndroid Build Coastguard Worker                                        const std::vector<tcu::Vec4> &colorData, glw::GLenum primitiveType)
205*35238bceSAndroid Build Coastguard Worker {
206*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl      = m_context.getRenderContext().getFunctions();
207*35238bceSAndroid Build Coastguard Worker     const glw::GLint positionLoc  = gl.getAttribLocation(m_shader->getProgram(), "a_position");
208*35238bceSAndroid Build Coastguard Worker     const glw::GLint colorLoc     = gl.getAttribLocation(m_shader->getProgram(), "a_color");
209*35238bceSAndroid Build Coastguard Worker     const glw::GLint pointSizeLoc = gl.getUniformLocation(m_shader->getProgram(), "u_pointSize");
210*35238bceSAndroid Build Coastguard Worker 
211*35238bceSAndroid Build Coastguard Worker     gl.clearColor(0, 0, 0, 1);
212*35238bceSAndroid Build Coastguard Worker     gl.clear(GL_COLOR_BUFFER_BIT);
213*35238bceSAndroid Build Coastguard Worker     gl.viewport(0, 0, m_renderSize, m_renderSize);
214*35238bceSAndroid Build Coastguard Worker     gl.useProgram(m_shader->getProgram());
215*35238bceSAndroid Build Coastguard Worker     gl.enableVertexAttribArray(positionLoc);
216*35238bceSAndroid Build Coastguard Worker     gl.vertexAttribPointer(positionLoc, 4, GL_FLOAT, GL_FALSE, 0, &vertexData[0]);
217*35238bceSAndroid Build Coastguard Worker     gl.enableVertexAttribArray(colorLoc);
218*35238bceSAndroid Build Coastguard Worker     gl.vertexAttribPointer(colorLoc, 4, GL_FLOAT, GL_FALSE, 0, &colorData[0]);
219*35238bceSAndroid Build Coastguard Worker     gl.uniform1f(pointSizeLoc, m_pointSize);
220*35238bceSAndroid Build Coastguard Worker     gl.lineWidth(m_lineWidth);
221*35238bceSAndroid Build Coastguard Worker     gl.drawArrays(primitiveType, 0, (glw::GLsizei)vertexData.size());
222*35238bceSAndroid Build Coastguard Worker     gl.disableVertexAttribArray(colorLoc);
223*35238bceSAndroid Build Coastguard Worker     gl.disableVertexAttribArray(positionLoc);
224*35238bceSAndroid Build Coastguard Worker     gl.useProgram(0);
225*35238bceSAndroid Build Coastguard Worker     gl.finish();
226*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "draw primitives");
227*35238bceSAndroid Build Coastguard Worker 
228*35238bceSAndroid Build Coastguard Worker     glu::readPixels(m_context.getRenderContext(), 0, 0, result.getAccess());
229*35238bceSAndroid Build Coastguard Worker }
230*35238bceSAndroid Build Coastguard Worker 
231*35238bceSAndroid Build Coastguard Worker class BaseTriangleCase : public BaseRenderingCase
232*35238bceSAndroid Build Coastguard Worker {
233*35238bceSAndroid Build Coastguard Worker public:
234*35238bceSAndroid Build Coastguard Worker     BaseTriangleCase(Context &context, const char *name, const char *desc, glw::GLenum primitiveDrawType);
235*35238bceSAndroid Build Coastguard Worker     ~BaseTriangleCase(void);
236*35238bceSAndroid Build Coastguard Worker     IterateResult iterate(void);
237*35238bceSAndroid Build Coastguard Worker 
238*35238bceSAndroid Build Coastguard Worker private:
239*35238bceSAndroid Build Coastguard Worker     virtual void generateTriangles(int iteration, std::vector<tcu::Vec4> &outData,
240*35238bceSAndroid Build Coastguard Worker                                    std::vector<TriangleSceneSpec::SceneTriangle> &outTriangles) = DE_NULL;
241*35238bceSAndroid Build Coastguard Worker 
242*35238bceSAndroid Build Coastguard Worker     int m_iteration;
243*35238bceSAndroid Build Coastguard Worker     const int m_iterationCount;
244*35238bceSAndroid Build Coastguard Worker     const glw::GLenum m_primitiveDrawType;
245*35238bceSAndroid Build Coastguard Worker     bool m_allIterationsPassed;
246*35238bceSAndroid Build Coastguard Worker };
247*35238bceSAndroid Build Coastguard Worker 
BaseTriangleCase(Context & context,const char * name,const char * desc,glw::GLenum primitiveDrawType)248*35238bceSAndroid Build Coastguard Worker BaseTriangleCase::BaseTriangleCase(Context &context, const char *name, const char *desc, glw::GLenum primitiveDrawType)
249*35238bceSAndroid Build Coastguard Worker     : BaseRenderingCase(context, name, desc)
250*35238bceSAndroid Build Coastguard Worker     , m_iteration(0)
251*35238bceSAndroid Build Coastguard Worker     , m_iterationCount(3)
252*35238bceSAndroid Build Coastguard Worker     , m_primitiveDrawType(primitiveDrawType)
253*35238bceSAndroid Build Coastguard Worker     , m_allIterationsPassed(true)
254*35238bceSAndroid Build Coastguard Worker {
255*35238bceSAndroid Build Coastguard Worker }
256*35238bceSAndroid Build Coastguard Worker 
~BaseTriangleCase(void)257*35238bceSAndroid Build Coastguard Worker BaseTriangleCase::~BaseTriangleCase(void)
258*35238bceSAndroid Build Coastguard Worker {
259*35238bceSAndroid Build Coastguard Worker }
260*35238bceSAndroid Build Coastguard Worker 
iterate(void)261*35238bceSAndroid Build Coastguard Worker BaseTriangleCase::IterateResult BaseTriangleCase::iterate(void)
262*35238bceSAndroid Build Coastguard Worker {
263*35238bceSAndroid Build Coastguard Worker     const std::string iterationDescription =
264*35238bceSAndroid Build Coastguard Worker         "Test iteration " + de::toString(m_iteration + 1) + " / " + de::toString(m_iterationCount);
265*35238bceSAndroid Build Coastguard Worker     const tcu::ScopedLogSection section(m_testCtx.getLog(), iterationDescription, iterationDescription);
266*35238bceSAndroid Build Coastguard Worker     tcu::Surface resultImage(m_renderSize, m_renderSize);
267*35238bceSAndroid Build Coastguard Worker     std::vector<tcu::Vec4> drawBuffer;
268*35238bceSAndroid Build Coastguard Worker     std::vector<TriangleSceneSpec::SceneTriangle> triangles;
269*35238bceSAndroid Build Coastguard Worker 
270*35238bceSAndroid Build Coastguard Worker     generateTriangles(m_iteration, drawBuffer, triangles);
271*35238bceSAndroid Build Coastguard Worker 
272*35238bceSAndroid Build Coastguard Worker     // draw image
273*35238bceSAndroid Build Coastguard Worker     drawPrimitives(resultImage, drawBuffer, m_primitiveDrawType);
274*35238bceSAndroid Build Coastguard Worker 
275*35238bceSAndroid Build Coastguard Worker     // compare
276*35238bceSAndroid Build Coastguard Worker     {
277*35238bceSAndroid Build Coastguard Worker         bool compareOk;
278*35238bceSAndroid Build Coastguard Worker         RasterizationArguments args;
279*35238bceSAndroid Build Coastguard Worker         TriangleSceneSpec scene;
280*35238bceSAndroid Build Coastguard Worker 
281*35238bceSAndroid Build Coastguard Worker         args.numSamples   = m_numSamples;
282*35238bceSAndroid Build Coastguard Worker         args.subpixelBits = m_subpixelBits;
283*35238bceSAndroid Build Coastguard Worker         args.redBits      = m_context.getRenderTarget().getPixelFormat().redBits;
284*35238bceSAndroid Build Coastguard Worker         args.greenBits    = m_context.getRenderTarget().getPixelFormat().greenBits;
285*35238bceSAndroid Build Coastguard Worker         args.blueBits     = m_context.getRenderTarget().getPixelFormat().blueBits;
286*35238bceSAndroid Build Coastguard Worker 
287*35238bceSAndroid Build Coastguard Worker         scene.triangles.swap(triangles);
288*35238bceSAndroid Build Coastguard Worker 
289*35238bceSAndroid Build Coastguard Worker         compareOk = verifyTriangleGroupRasterization(resultImage, scene, args, m_testCtx.getLog());
290*35238bceSAndroid Build Coastguard Worker 
291*35238bceSAndroid Build Coastguard Worker         if (!compareOk)
292*35238bceSAndroid Build Coastguard Worker             m_allIterationsPassed = false;
293*35238bceSAndroid Build Coastguard Worker     }
294*35238bceSAndroid Build Coastguard Worker 
295*35238bceSAndroid Build Coastguard Worker     // result
296*35238bceSAndroid Build Coastguard Worker     if (++m_iteration == m_iterationCount)
297*35238bceSAndroid Build Coastguard Worker     {
298*35238bceSAndroid Build Coastguard Worker         if (m_allIterationsPassed)
299*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
300*35238bceSAndroid Build Coastguard Worker         else
301*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Incorrect rasterization");
302*35238bceSAndroid Build Coastguard Worker 
303*35238bceSAndroid Build Coastguard Worker         return STOP;
304*35238bceSAndroid Build Coastguard Worker     }
305*35238bceSAndroid Build Coastguard Worker     else
306*35238bceSAndroid Build Coastguard Worker         return CONTINUE;
307*35238bceSAndroid Build Coastguard Worker }
308*35238bceSAndroid Build Coastguard Worker 
309*35238bceSAndroid Build Coastguard Worker class BaseLineCase : public BaseRenderingCase
310*35238bceSAndroid Build Coastguard Worker {
311*35238bceSAndroid Build Coastguard Worker public:
312*35238bceSAndroid Build Coastguard Worker     BaseLineCase(Context &context, const char *name, const char *desc, glw::GLenum primitiveDrawType,
313*35238bceSAndroid Build Coastguard Worker                  PrimitiveWideness wideness);
314*35238bceSAndroid Build Coastguard Worker     ~BaseLineCase(void);
315*35238bceSAndroid Build Coastguard Worker     IterateResult iterate(void);
316*35238bceSAndroid Build Coastguard Worker 
317*35238bceSAndroid Build Coastguard Worker private:
318*35238bceSAndroid Build Coastguard Worker     virtual void generateLines(int iteration, std::vector<tcu::Vec4> &outData,
319*35238bceSAndroid Build Coastguard Worker                                std::vector<LineSceneSpec::SceneLine> &outLines) = DE_NULL;
320*35238bceSAndroid Build Coastguard Worker 
321*35238bceSAndroid Build Coastguard Worker     int m_iteration;
322*35238bceSAndroid Build Coastguard Worker     const int m_iterationCount;
323*35238bceSAndroid Build Coastguard Worker     const glw::GLenum m_primitiveDrawType;
324*35238bceSAndroid Build Coastguard Worker     const PrimitiveWideness m_primitiveWideness;
325*35238bceSAndroid Build Coastguard Worker     bool m_allIterationsPassed;
326*35238bceSAndroid Build Coastguard Worker     bool m_multisampleRelaxationRequired;
327*35238bceSAndroid Build Coastguard Worker 
328*35238bceSAndroid Build Coastguard Worker     static const float s_wideSize;
329*35238bceSAndroid Build Coastguard Worker };
330*35238bceSAndroid Build Coastguard Worker 
331*35238bceSAndroid Build Coastguard Worker const float BaseLineCase::s_wideSize = 5.0f;
332*35238bceSAndroid Build Coastguard Worker 
BaseLineCase(Context & context,const char * name,const char * desc,glw::GLenum primitiveDrawType,PrimitiveWideness wideness)333*35238bceSAndroid Build Coastguard Worker BaseLineCase::BaseLineCase(Context &context, const char *name, const char *desc, glw::GLenum primitiveDrawType,
334*35238bceSAndroid Build Coastguard Worker                            PrimitiveWideness wideness)
335*35238bceSAndroid Build Coastguard Worker     : BaseRenderingCase(context, name, desc)
336*35238bceSAndroid Build Coastguard Worker     , m_iteration(0)
337*35238bceSAndroid Build Coastguard Worker     , m_iterationCount(3)
338*35238bceSAndroid Build Coastguard Worker     , m_primitiveDrawType(primitiveDrawType)
339*35238bceSAndroid Build Coastguard Worker     , m_primitiveWideness(wideness)
340*35238bceSAndroid Build Coastguard Worker     , m_allIterationsPassed(true)
341*35238bceSAndroid Build Coastguard Worker     , m_multisampleRelaxationRequired(false)
342*35238bceSAndroid Build Coastguard Worker {
343*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(m_primitiveWideness < PRIMITIVEWIDENESS_LAST);
344*35238bceSAndroid Build Coastguard Worker     m_lineWidth = (m_primitiveWideness == PRIMITIVEWIDENESS_WIDE) ? (s_wideSize) : (1.0f);
345*35238bceSAndroid Build Coastguard Worker }
346*35238bceSAndroid Build Coastguard Worker 
~BaseLineCase(void)347*35238bceSAndroid Build Coastguard Worker BaseLineCase::~BaseLineCase(void)
348*35238bceSAndroid Build Coastguard Worker {
349*35238bceSAndroid Build Coastguard Worker }
350*35238bceSAndroid Build Coastguard Worker 
iterate(void)351*35238bceSAndroid Build Coastguard Worker BaseLineCase::IterateResult BaseLineCase::iterate(void)
352*35238bceSAndroid Build Coastguard Worker {
353*35238bceSAndroid Build Coastguard Worker     const std::string iterationDescription =
354*35238bceSAndroid Build Coastguard Worker         "Test iteration " + de::toString(m_iteration + 1) + " / " + de::toString(m_iterationCount);
355*35238bceSAndroid Build Coastguard Worker     const tcu::ScopedLogSection section(m_testCtx.getLog(), iterationDescription, iterationDescription);
356*35238bceSAndroid Build Coastguard Worker     tcu::Surface resultImage(m_renderSize, m_renderSize);
357*35238bceSAndroid Build Coastguard Worker     std::vector<tcu::Vec4> drawBuffer;
358*35238bceSAndroid Build Coastguard Worker     std::vector<LineSceneSpec::SceneLine> lines;
359*35238bceSAndroid Build Coastguard Worker 
360*35238bceSAndroid Build Coastguard Worker     // last iteration, max out size
361*35238bceSAndroid Build Coastguard Worker     if (m_primitiveWideness == PRIMITIVEWIDENESS_WIDE && m_iteration + 1 == m_iterationCount)
362*35238bceSAndroid Build Coastguard Worker     {
363*35238bceSAndroid Build Coastguard Worker         float range[2] = {0.0f, 0.0f};
364*35238bceSAndroid Build Coastguard Worker         m_context.getRenderContext().getFunctions().getFloatv(GL_ALIASED_LINE_WIDTH_RANGE, range);
365*35238bceSAndroid Build Coastguard Worker 
366*35238bceSAndroid Build Coastguard Worker         m_lineWidth = range[1];
367*35238bceSAndroid Build Coastguard Worker     }
368*35238bceSAndroid Build Coastguard Worker 
369*35238bceSAndroid Build Coastguard Worker     // gen data
370*35238bceSAndroid Build Coastguard Worker     generateLines(m_iteration, drawBuffer, lines);
371*35238bceSAndroid Build Coastguard Worker 
372*35238bceSAndroid Build Coastguard Worker     // draw image
373*35238bceSAndroid Build Coastguard Worker     drawPrimitives(resultImage, drawBuffer, m_primitiveDrawType);
374*35238bceSAndroid Build Coastguard Worker 
375*35238bceSAndroid Build Coastguard Worker     // compare
376*35238bceSAndroid Build Coastguard Worker     {
377*35238bceSAndroid Build Coastguard Worker         bool compareOk;
378*35238bceSAndroid Build Coastguard Worker         RasterizationArguments args;
379*35238bceSAndroid Build Coastguard Worker         LineSceneSpec scene;
380*35238bceSAndroid Build Coastguard Worker 
381*35238bceSAndroid Build Coastguard Worker         args.numSamples   = m_numSamples;
382*35238bceSAndroid Build Coastguard Worker         args.subpixelBits = m_subpixelBits;
383*35238bceSAndroid Build Coastguard Worker         args.redBits      = m_context.getRenderTarget().getPixelFormat().redBits;
384*35238bceSAndroid Build Coastguard Worker         args.greenBits    = m_context.getRenderTarget().getPixelFormat().greenBits;
385*35238bceSAndroid Build Coastguard Worker         args.blueBits     = m_context.getRenderTarget().getPixelFormat().blueBits;
386*35238bceSAndroid Build Coastguard Worker 
387*35238bceSAndroid Build Coastguard Worker         scene.lines.swap(lines);
388*35238bceSAndroid Build Coastguard Worker         scene.lineWidth                      = m_lineWidth;
389*35238bceSAndroid Build Coastguard Worker         scene.stippleFactor                  = 1;
390*35238bceSAndroid Build Coastguard Worker         scene.stipplePattern                 = 0xFFFF;
391*35238bceSAndroid Build Coastguard Worker         scene.allowNonProjectedInterpolation = true;
392*35238bceSAndroid Build Coastguard Worker 
393*35238bceSAndroid Build Coastguard Worker         compareOk = verifyLineGroupRasterization(resultImage, scene, args, m_testCtx.getLog());
394*35238bceSAndroid Build Coastguard Worker 
395*35238bceSAndroid Build Coastguard Worker         // multisampled wide lines might not be supported
396*35238bceSAndroid Build Coastguard Worker         if (scene.lineWidth != 1.0f && m_numSamples > 1 && !compareOk)
397*35238bceSAndroid Build Coastguard Worker         {
398*35238bceSAndroid Build Coastguard Worker             m_multisampleRelaxationRequired = true;
399*35238bceSAndroid Build Coastguard Worker             compareOk                       = true;
400*35238bceSAndroid Build Coastguard Worker         }
401*35238bceSAndroid Build Coastguard Worker 
402*35238bceSAndroid Build Coastguard Worker         if (!compareOk)
403*35238bceSAndroid Build Coastguard Worker             m_allIterationsPassed = false;
404*35238bceSAndroid Build Coastguard Worker     }
405*35238bceSAndroid Build Coastguard Worker 
406*35238bceSAndroid Build Coastguard Worker     // result
407*35238bceSAndroid Build Coastguard Worker     if (++m_iteration == m_iterationCount)
408*35238bceSAndroid Build Coastguard Worker     {
409*35238bceSAndroid Build Coastguard Worker         if (m_allIterationsPassed && m_multisampleRelaxationRequired)
410*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_COMPATIBILITY_WARNING,
411*35238bceSAndroid Build Coastguard Worker                                     "Rasterization of multisampled wide lines failed");
412*35238bceSAndroid Build Coastguard Worker         else if (m_allIterationsPassed)
413*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
414*35238bceSAndroid Build Coastguard Worker         else
415*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Incorrect rasterization");
416*35238bceSAndroid Build Coastguard Worker 
417*35238bceSAndroid Build Coastguard Worker         return STOP;
418*35238bceSAndroid Build Coastguard Worker     }
419*35238bceSAndroid Build Coastguard Worker     else
420*35238bceSAndroid Build Coastguard Worker         return CONTINUE;
421*35238bceSAndroid Build Coastguard Worker }
422*35238bceSAndroid Build Coastguard Worker 
423*35238bceSAndroid Build Coastguard Worker class PointCase : public BaseRenderingCase
424*35238bceSAndroid Build Coastguard Worker {
425*35238bceSAndroid Build Coastguard Worker public:
426*35238bceSAndroid Build Coastguard Worker     PointCase(Context &context, const char *name, const char *desc, PrimitiveWideness wideness);
427*35238bceSAndroid Build Coastguard Worker     ~PointCase(void);
428*35238bceSAndroid Build Coastguard Worker     IterateResult iterate(void);
429*35238bceSAndroid Build Coastguard Worker 
430*35238bceSAndroid Build Coastguard Worker private:
431*35238bceSAndroid Build Coastguard Worker     void generatePoints(int iteration, std::vector<tcu::Vec4> &outData,
432*35238bceSAndroid Build Coastguard Worker                         std::vector<PointSceneSpec::ScenePoint> &outPoints);
433*35238bceSAndroid Build Coastguard Worker 
434*35238bceSAndroid Build Coastguard Worker     int m_iteration;
435*35238bceSAndroid Build Coastguard Worker     const int m_iterationCount;
436*35238bceSAndroid Build Coastguard Worker     const PrimitiveWideness m_primitiveWideness;
437*35238bceSAndroid Build Coastguard Worker     bool m_allIterationsPassed;
438*35238bceSAndroid Build Coastguard Worker 
439*35238bceSAndroid Build Coastguard Worker     static const float s_wideSize;
440*35238bceSAndroid Build Coastguard Worker };
441*35238bceSAndroid Build Coastguard Worker 
442*35238bceSAndroid Build Coastguard Worker const float PointCase::s_wideSize = 10.0f;
443*35238bceSAndroid Build Coastguard Worker 
PointCase(Context & context,const char * name,const char * desc,PrimitiveWideness wideness)444*35238bceSAndroid Build Coastguard Worker PointCase::PointCase(Context &context, const char *name, const char *desc, PrimitiveWideness wideness)
445*35238bceSAndroid Build Coastguard Worker     : BaseRenderingCase(context, name, desc)
446*35238bceSAndroid Build Coastguard Worker     , m_iteration(0)
447*35238bceSAndroid Build Coastguard Worker     , m_iterationCount(3)
448*35238bceSAndroid Build Coastguard Worker     , m_primitiveWideness(wideness)
449*35238bceSAndroid Build Coastguard Worker     , m_allIterationsPassed(true)
450*35238bceSAndroid Build Coastguard Worker {
451*35238bceSAndroid Build Coastguard Worker     m_pointSize = (m_primitiveWideness == PRIMITIVEWIDENESS_WIDE) ? (s_wideSize) : (1.0f);
452*35238bceSAndroid Build Coastguard Worker }
453*35238bceSAndroid Build Coastguard Worker 
~PointCase(void)454*35238bceSAndroid Build Coastguard Worker PointCase::~PointCase(void)
455*35238bceSAndroid Build Coastguard Worker {
456*35238bceSAndroid Build Coastguard Worker }
457*35238bceSAndroid Build Coastguard Worker 
iterate(void)458*35238bceSAndroid Build Coastguard Worker PointCase::IterateResult PointCase::iterate(void)
459*35238bceSAndroid Build Coastguard Worker {
460*35238bceSAndroid Build Coastguard Worker     const std::string iterationDescription =
461*35238bceSAndroid Build Coastguard Worker         "Test iteration " + de::toString(m_iteration + 1) + " / " + de::toString(m_iterationCount);
462*35238bceSAndroid Build Coastguard Worker     const tcu::ScopedLogSection section(m_testCtx.getLog(), iterationDescription, iterationDescription);
463*35238bceSAndroid Build Coastguard Worker     tcu::Surface resultImage(m_renderSize, m_renderSize);
464*35238bceSAndroid Build Coastguard Worker     std::vector<tcu::Vec4> drawBuffer;
465*35238bceSAndroid Build Coastguard Worker     std::vector<PointSceneSpec::ScenePoint> points;
466*35238bceSAndroid Build Coastguard Worker 
467*35238bceSAndroid Build Coastguard Worker     // last iteration, max out size
468*35238bceSAndroid Build Coastguard Worker     if (m_primitiveWideness == PRIMITIVEWIDENESS_WIDE && m_iteration + 1 == m_iterationCount)
469*35238bceSAndroid Build Coastguard Worker     {
470*35238bceSAndroid Build Coastguard Worker         float range[2] = {0.0f, 0.0f};
471*35238bceSAndroid Build Coastguard Worker         m_context.getRenderContext().getFunctions().getFloatv(GL_ALIASED_POINT_SIZE_RANGE, range);
472*35238bceSAndroid Build Coastguard Worker 
473*35238bceSAndroid Build Coastguard Worker         m_pointSize = range[1];
474*35238bceSAndroid Build Coastguard Worker     }
475*35238bceSAndroid Build Coastguard Worker 
476*35238bceSAndroid Build Coastguard Worker     // gen data
477*35238bceSAndroid Build Coastguard Worker     generatePoints(m_iteration, drawBuffer, points);
478*35238bceSAndroid Build Coastguard Worker 
479*35238bceSAndroid Build Coastguard Worker     // draw image
480*35238bceSAndroid Build Coastguard Worker     drawPrimitives(resultImage, drawBuffer, GL_POINTS);
481*35238bceSAndroid Build Coastguard Worker 
482*35238bceSAndroid Build Coastguard Worker     // compare
483*35238bceSAndroid Build Coastguard Worker     {
484*35238bceSAndroid Build Coastguard Worker         bool compareOk;
485*35238bceSAndroid Build Coastguard Worker         RasterizationArguments args;
486*35238bceSAndroid Build Coastguard Worker         PointSceneSpec scene;
487*35238bceSAndroid Build Coastguard Worker 
488*35238bceSAndroid Build Coastguard Worker         args.numSamples   = m_numSamples;
489*35238bceSAndroid Build Coastguard Worker         args.subpixelBits = m_subpixelBits;
490*35238bceSAndroid Build Coastguard Worker         args.redBits      = m_context.getRenderTarget().getPixelFormat().redBits;
491*35238bceSAndroid Build Coastguard Worker         args.greenBits    = m_context.getRenderTarget().getPixelFormat().greenBits;
492*35238bceSAndroid Build Coastguard Worker         args.blueBits     = m_context.getRenderTarget().getPixelFormat().blueBits;
493*35238bceSAndroid Build Coastguard Worker 
494*35238bceSAndroid Build Coastguard Worker         scene.points.swap(points);
495*35238bceSAndroid Build Coastguard Worker 
496*35238bceSAndroid Build Coastguard Worker         compareOk = verifyPointGroupRasterization(resultImage, scene, args, m_testCtx.getLog());
497*35238bceSAndroid Build Coastguard Worker 
498*35238bceSAndroid Build Coastguard Worker         if (!compareOk)
499*35238bceSAndroid Build Coastguard Worker             m_allIterationsPassed = false;
500*35238bceSAndroid Build Coastguard Worker     }
501*35238bceSAndroid Build Coastguard Worker 
502*35238bceSAndroid Build Coastguard Worker     // result
503*35238bceSAndroid Build Coastguard Worker     if (++m_iteration == m_iterationCount)
504*35238bceSAndroid Build Coastguard Worker     {
505*35238bceSAndroid Build Coastguard Worker         if (m_allIterationsPassed)
506*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
507*35238bceSAndroid Build Coastguard Worker         else
508*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Incorrect rasterization");
509*35238bceSAndroid Build Coastguard Worker 
510*35238bceSAndroid Build Coastguard Worker         return STOP;
511*35238bceSAndroid Build Coastguard Worker     }
512*35238bceSAndroid Build Coastguard Worker     else
513*35238bceSAndroid Build Coastguard Worker         return CONTINUE;
514*35238bceSAndroid Build Coastguard Worker }
515*35238bceSAndroid Build Coastguard Worker 
generatePoints(int iteration,std::vector<tcu::Vec4> & outData,std::vector<PointSceneSpec::ScenePoint> & outPoints)516*35238bceSAndroid Build Coastguard Worker void PointCase::generatePoints(int iteration, std::vector<tcu::Vec4> &outData,
517*35238bceSAndroid Build Coastguard Worker                                std::vector<PointSceneSpec::ScenePoint> &outPoints)
518*35238bceSAndroid Build Coastguard Worker {
519*35238bceSAndroid Build Coastguard Worker     outData.resize(6);
520*35238bceSAndroid Build Coastguard Worker 
521*35238bceSAndroid Build Coastguard Worker     switch (iteration)
522*35238bceSAndroid Build Coastguard Worker     {
523*35238bceSAndroid Build Coastguard Worker     case 0:
524*35238bceSAndroid Build Coastguard Worker         // \note: these values are chosen arbitrarily
525*35238bceSAndroid Build Coastguard Worker         outData[0] = tcu::Vec4(0.2f, 0.8f, 0.0f, 1.0f);
526*35238bceSAndroid Build Coastguard Worker         outData[1] = tcu::Vec4(0.5f, 0.2f, 0.0f, 1.0f);
527*35238bceSAndroid Build Coastguard Worker         outData[2] = tcu::Vec4(0.5f, 0.3f, 0.0f, 1.0f);
528*35238bceSAndroid Build Coastguard Worker         outData[3] = tcu::Vec4(-0.5f, 0.2f, 0.0f, 1.0f);
529*35238bceSAndroid Build Coastguard Worker         outData[4] = tcu::Vec4(-0.2f, -0.4f, 0.0f, 1.0f);
530*35238bceSAndroid Build Coastguard Worker         outData[5] = tcu::Vec4(-0.4f, 0.2f, 0.0f, 1.0f);
531*35238bceSAndroid Build Coastguard Worker         break;
532*35238bceSAndroid Build Coastguard Worker 
533*35238bceSAndroid Build Coastguard Worker     case 1:
534*35238bceSAndroid Build Coastguard Worker         outData[0] = tcu::Vec4(-0.499f, 0.128f, 0.0f, 1.0f);
535*35238bceSAndroid Build Coastguard Worker         outData[1] = tcu::Vec4(-0.501f, -0.3f, 0.0f, 1.0f);
536*35238bceSAndroid Build Coastguard Worker         outData[2] = tcu::Vec4(0.11f, -0.2f, 0.0f, 1.0f);
537*35238bceSAndroid Build Coastguard Worker         outData[3] = tcu::Vec4(0.11f, 0.2f, 0.0f, 1.0f);
538*35238bceSAndroid Build Coastguard Worker         outData[4] = tcu::Vec4(0.88f, 0.9f, 0.0f, 1.0f);
539*35238bceSAndroid Build Coastguard Worker         outData[5] = tcu::Vec4(0.4f, 1.2f, 0.0f, 1.0f);
540*35238bceSAndroid Build Coastguard Worker         break;
541*35238bceSAndroid Build Coastguard Worker 
542*35238bceSAndroid Build Coastguard Worker     case 2:
543*35238bceSAndroid Build Coastguard Worker         outData[0] = tcu::Vec4(-0.9f, -0.3f, 0.0f, 1.0f);
544*35238bceSAndroid Build Coastguard Worker         outData[1] = tcu::Vec4(0.3f, -0.9f, 0.0f, 1.0f);
545*35238bceSAndroid Build Coastguard Worker         outData[2] = tcu::Vec4(-0.4f, -0.1f, 0.0f, 1.0f);
546*35238bceSAndroid Build Coastguard Worker         outData[3] = tcu::Vec4(-0.11f, 0.2f, 0.0f, 1.0f);
547*35238bceSAndroid Build Coastguard Worker         outData[4] = tcu::Vec4(0.88f, 0.7f, 0.0f, 1.0f);
548*35238bceSAndroid Build Coastguard Worker         outData[5] = tcu::Vec4(-0.4f, 0.4f, 0.0f, 1.0f);
549*35238bceSAndroid Build Coastguard Worker         break;
550*35238bceSAndroid Build Coastguard Worker     }
551*35238bceSAndroid Build Coastguard Worker 
552*35238bceSAndroid Build Coastguard Worker     outPoints.resize(outData.size());
553*35238bceSAndroid Build Coastguard Worker     for (int pointNdx = 0; pointNdx < (int)outPoints.size(); ++pointNdx)
554*35238bceSAndroid Build Coastguard Worker     {
555*35238bceSAndroid Build Coastguard Worker         outPoints[pointNdx].position  = outData[pointNdx];
556*35238bceSAndroid Build Coastguard Worker         outPoints[pointNdx].pointSize = m_pointSize;
557*35238bceSAndroid Build Coastguard Worker     }
558*35238bceSAndroid Build Coastguard Worker 
559*35238bceSAndroid Build Coastguard Worker     // log
560*35238bceSAndroid Build Coastguard Worker     m_testCtx.getLog() << tcu::TestLog::Message << "Rendering " << outPoints.size()
561*35238bceSAndroid Build Coastguard Worker                        << " point(s): (point size = " << m_pointSize << ")" << tcu::TestLog::EndMessage;
562*35238bceSAndroid Build Coastguard Worker     for (int pointNdx = 0; pointNdx < (int)outPoints.size(); ++pointNdx)
563*35238bceSAndroid Build Coastguard Worker         m_testCtx.getLog() << tcu::TestLog::Message << "Point " << (pointNdx + 1) << ":\t"
564*35238bceSAndroid Build Coastguard Worker                            << outPoints[pointNdx].position << tcu::TestLog::EndMessage;
565*35238bceSAndroid Build Coastguard Worker }
566*35238bceSAndroid Build Coastguard Worker 
567*35238bceSAndroid Build Coastguard Worker class PointSizeClampedTest : public BaseRenderingCase
568*35238bceSAndroid Build Coastguard Worker {
569*35238bceSAndroid Build Coastguard Worker public:
PointSizeClampedTest(Context & context,const char * name,const char * desc)570*35238bceSAndroid Build Coastguard Worker     PointSizeClampedTest(Context &context, const char *name, const char *desc) : BaseRenderingCase(context, name, desc)
571*35238bceSAndroid Build Coastguard Worker     {
572*35238bceSAndroid Build Coastguard Worker     }
573*35238bceSAndroid Build Coastguard Worker 
iterate()574*35238bceSAndroid Build Coastguard Worker     IterateResult iterate()
575*35238bceSAndroid Build Coastguard Worker     {
576*35238bceSAndroid Build Coastguard Worker         m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
577*35238bceSAndroid Build Coastguard Worker         const glw::Functions &gl = m_context.getRenderContext().getFunctions();
578*35238bceSAndroid Build Coastguard Worker 
579*35238bceSAndroid Build Coastguard Worker         // Tests that point sizes (written to gl_PointSize) are clamped,
580*35238bceSAndroid Build Coastguard Worker         // before rasterization, to the ALIASED_POINT_SIZE_RANGE
581*35238bceSAndroid Build Coastguard Worker         // given by the implementation.
582*35238bceSAndroid Build Coastguard Worker         static const int fboHeight               = 4;
583*35238bceSAndroid Build Coastguard Worker         static const int testAreaWidth           = 4;
584*35238bceSAndroid Build Coastguard Worker         static const int testAreaWidthWithMargin = testAreaWidth + 4;
585*35238bceSAndroid Build Coastguard Worker         static const float pointRadiusOverage    = 8;
586*35238bceSAndroid Build Coastguard Worker         int fboWidth                             = 0;
587*35238bceSAndroid Build Coastguard Worker         int maxPointDiameter                     = 0;
588*35238bceSAndroid Build Coastguard Worker         {
589*35238bceSAndroid Build Coastguard Worker             int maxRenderbufferSize = 0;
590*35238bceSAndroid Build Coastguard Worker             int maxViewportDims[2]  = {};
591*35238bceSAndroid Build Coastguard Worker             gl.getIntegerv(GL_MAX_RENDERBUFFER_SIZE, &maxRenderbufferSize);
592*35238bceSAndroid Build Coastguard Worker             gl.getIntegerv(GL_MAX_VIEWPORT_DIMS, maxViewportDims);
593*35238bceSAndroid Build Coastguard Worker             int maxFboWidth = std::min(maxRenderbufferSize, maxViewportDims[0]);
594*35238bceSAndroid Build Coastguard Worker 
595*35238bceSAndroid Build Coastguard Worker             float pointSizeRange[2] = {};
596*35238bceSAndroid Build Coastguard Worker             gl.getFloatv(GL_ALIASED_POINT_SIZE_RANGE, pointSizeRange);
597*35238bceSAndroid Build Coastguard Worker             m_testCtx.getLog() << tcu::TestLog::Message << "GL_ALIASED_POINT_SIZE_RANGE is [" << pointSizeRange[0]
598*35238bceSAndroid Build Coastguard Worker                                << ", " << pointSizeRange[1] << "]" << tcu::TestLog::EndMessage;
599*35238bceSAndroid Build Coastguard Worker             // Typically (in the correct case), maxPointDiameter is an odd integer.
600*35238bceSAndroid Build Coastguard Worker             maxPointDiameter = (int)pointSizeRange[1];
601*35238bceSAndroid Build Coastguard Worker             // maxPointRadius is inclusive of the center point.
602*35238bceSAndroid Build Coastguard Worker             int maxPointRadius = (maxPointDiameter + 1) / 2;
603*35238bceSAndroid Build Coastguard Worker             if (maxPointRadius > maxFboWidth - testAreaWidthWithMargin)
604*35238bceSAndroid Build Coastguard Worker             {
605*35238bceSAndroid Build Coastguard Worker                 m_testCtx.setTestResult(QP_TEST_RESULT_COMPATIBILITY_WARNING,
606*35238bceSAndroid Build Coastguard Worker                                         "max framebuffer size isn't large enough to test max point size");
607*35238bceSAndroid Build Coastguard Worker                 return STOP;
608*35238bceSAndroid Build Coastguard Worker             }
609*35238bceSAndroid Build Coastguard Worker             fboWidth = maxPointRadius + testAreaWidthWithMargin;
610*35238bceSAndroid Build Coastguard Worker             // Round up to the nearest multiple of 2:
611*35238bceSAndroid Build Coastguard Worker             fboWidth = ((fboWidth + 1) / 2) * 2;
612*35238bceSAndroid Build Coastguard Worker         }
613*35238bceSAndroid Build Coastguard Worker         float pointSize = ((float)maxPointDiameter) + pointRadiusOverage * 2;
614*35238bceSAndroid Build Coastguard Worker         TCU_CHECK(gl.getError() == GL_NO_ERROR);
615*35238bceSAndroid Build Coastguard Worker 
616*35238bceSAndroid Build Coastguard Worker         m_testCtx.getLog() << tcu::TestLog::Message << "Testing with pointSize = " << pointSize
617*35238bceSAndroid Build Coastguard Worker                            << ", fboWidth = " << fboWidth << tcu::TestLog::EndMessage;
618*35238bceSAndroid Build Coastguard Worker 
619*35238bceSAndroid Build Coastguard Worker         // Create a framebuffer that is (fboWidth)x(fboHeight), cleared to green:
620*35238bceSAndroid Build Coastguard Worker         // +---------------------------+
621*35238bceSAndroid Build Coastguard Worker         // |ggggggggggggggggggggggggggg|
622*35238bceSAndroid Build Coastguard Worker         // +---------------------------+
623*35238bceSAndroid Build Coastguard Worker         gl.viewport(0, 0, fboWidth, fboHeight);
624*35238bceSAndroid Build Coastguard Worker         uint32_t fbo = 0;
625*35238bceSAndroid Build Coastguard Worker         gl.genFramebuffers(1, &fbo);
626*35238bceSAndroid Build Coastguard Worker         gl.bindFramebuffer(GL_FRAMEBUFFER, fbo);
627*35238bceSAndroid Build Coastguard Worker         uint32_t rbo = 0;
628*35238bceSAndroid Build Coastguard Worker         gl.genRenderbuffers(1, &rbo);
629*35238bceSAndroid Build Coastguard Worker         gl.bindRenderbuffer(GL_RENDERBUFFER, rbo);
630*35238bceSAndroid Build Coastguard Worker         gl.renderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, fboWidth, fboHeight);
631*35238bceSAndroid Build Coastguard Worker         gl.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
632*35238bceSAndroid Build Coastguard Worker         if (gl.checkFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
633*35238bceSAndroid Build Coastguard Worker         {
634*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_COMPATIBILITY_WARNING,
635*35238bceSAndroid Build Coastguard Worker                                     "couldn't complete a framebuffer suitable to test max point size");
636*35238bceSAndroid Build Coastguard Worker             return STOP;
637*35238bceSAndroid Build Coastguard Worker         }
638*35238bceSAndroid Build Coastguard Worker         gl.clearColor(0.0f, 1.0f, 0.0f, 1.0f);
639*35238bceSAndroid Build Coastguard Worker         gl.clear(GL_COLOR_BUFFER_BIT);
640*35238bceSAndroid Build Coastguard Worker         TCU_CHECK(gl.getError() == GL_NO_ERROR);
641*35238bceSAndroid Build Coastguard Worker 
642*35238bceSAndroid Build Coastguard Worker         // (Framebuffer is still bound.)
643*35238bceSAndroid Build Coastguard Worker 
644*35238bceSAndroid Build Coastguard Worker         // Draw a red point, with size pointSize, at the far right:
645*35238bceSAndroid Build Coastguard Worker         // +---------------------------+
646*35238bceSAndroid Build Coastguard Worker         // |ggggggggRRRRRRRRRRRRRRRRRRR|
647*35238bceSAndroid Build Coastguard Worker         // +---------------------------+
648*35238bceSAndroid Build Coastguard Worker         //                            x                           point center
649*35238bceSAndroid Build Coastguard Worker         //  ^^^^^^^^^^^^^^^^^^^^^^^^^^^                           fboWidth
650*35238bceSAndroid Build Coastguard Worker         //  ^^^^                                                  testAreaWidth = 4 (this is the area that's tested)
651*35238bceSAndroid Build Coastguard Worker         //  ^^^^^^^^                                              testAreaWidthWithMargin = 8 (extra 4 pixels for tolerance)
652*35238bceSAndroid Build Coastguard Worker         //          ^^^^^^^^^^^^^^^^^^x^^^^^^^^^^^^^^^^^^         maxPointDiameter = 37
653*35238bceSAndroid Build Coastguard Worker         //  ^^^^^^^^                                     ^^^^^^^^ pointRadiusOverage = 8 * 2
654*35238bceSAndroid Build Coastguard Worker         //  ^^^^^^^^^^^^^^^^^^^^^^^^^^x^^^^^^^^^^^^^^^^^^^^^^^^^^ pointSize = 53
655*35238bceSAndroid Build Coastguard Worker         //          ^^^^^^^^^^^^^^^^^^^ area of resulting draw, if the size is clamped properly = 19
656*35238bceSAndroid Build Coastguard Worker         {
657*35238bceSAndroid Build Coastguard Worker             const glw::GLint positionLoc  = gl.getAttribLocation(m_shader->getProgram(), "a_position");
658*35238bceSAndroid Build Coastguard Worker             const glw::GLint colorLoc     = gl.getAttribLocation(m_shader->getProgram(), "a_color");
659*35238bceSAndroid Build Coastguard Worker             const glw::GLint pointSizeLoc = gl.getUniformLocation(m_shader->getProgram(), "u_pointSize");
660*35238bceSAndroid Build Coastguard Worker             static const float position[] = {1.0f, 0.0f, 0.0f, 1.0f};
661*35238bceSAndroid Build Coastguard Worker             static const float color[]    = {1.0f, 0.0f, 0.0f, 1.0f};
662*35238bceSAndroid Build Coastguard Worker             gl.useProgram(m_shader->getProgram());
663*35238bceSAndroid Build Coastguard Worker             gl.enableVertexAttribArray(positionLoc);
664*35238bceSAndroid Build Coastguard Worker             gl.vertexAttribPointer(positionLoc, 4, GL_FLOAT, GL_FALSE, 0, position);
665*35238bceSAndroid Build Coastguard Worker             gl.enableVertexAttribArray(colorLoc);
666*35238bceSAndroid Build Coastguard Worker             gl.vertexAttribPointer(colorLoc, 4, GL_FLOAT, GL_FALSE, 0, color);
667*35238bceSAndroid Build Coastguard Worker             gl.uniform1f(pointSizeLoc, pointSize);
668*35238bceSAndroid Build Coastguard Worker             gl.drawArrays(GL_POINTS, 0, 1);
669*35238bceSAndroid Build Coastguard Worker             gl.disableVertexAttribArray(colorLoc);
670*35238bceSAndroid Build Coastguard Worker             gl.disableVertexAttribArray(positionLoc);
671*35238bceSAndroid Build Coastguard Worker             gl.useProgram(0);
672*35238bceSAndroid Build Coastguard Worker             TCU_CHECK(gl.getError() == GL_NO_ERROR);
673*35238bceSAndroid Build Coastguard Worker         }
674*35238bceSAndroid Build Coastguard Worker 
675*35238bceSAndroid Build Coastguard Worker         // And test the resulting draw (the test area should still be green).
676*35238bceSAndroid Build Coastguard Worker         uint32_t pixels[testAreaWidth * fboHeight] = {};
677*35238bceSAndroid Build Coastguard Worker         gl.readPixels(0, 0, testAreaWidth, fboHeight, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
678*35238bceSAndroid Build Coastguard Worker         TCU_CHECK(gl.getError() == GL_NO_ERROR);
679*35238bceSAndroid Build Coastguard Worker 
680*35238bceSAndroid Build Coastguard Worker         const tcu::RGBA threshold(12, 12, 12, 12);
681*35238bceSAndroid Build Coastguard Worker         for (uint32_t y = 0; y < fboHeight; ++y)
682*35238bceSAndroid Build Coastguard Worker         {
683*35238bceSAndroid Build Coastguard Worker             for (uint32_t x = 0; x < testAreaWidth; ++x)
684*35238bceSAndroid Build Coastguard Worker             {
685*35238bceSAndroid Build Coastguard Worker                 tcu::RGBA color(pixels[y * testAreaWidth + x]);
686*35238bceSAndroid Build Coastguard Worker                 TCU_CHECK(compareThreshold(color, tcu::RGBA::green(), threshold));
687*35238bceSAndroid Build Coastguard Worker             }
688*35238bceSAndroid Build Coastguard Worker         }
689*35238bceSAndroid Build Coastguard Worker 
690*35238bceSAndroid Build Coastguard Worker         return STOP;
691*35238bceSAndroid Build Coastguard Worker     }
692*35238bceSAndroid Build Coastguard Worker };
693*35238bceSAndroid Build Coastguard Worker 
694*35238bceSAndroid Build Coastguard Worker class TrianglesCase : public BaseTriangleCase
695*35238bceSAndroid Build Coastguard Worker {
696*35238bceSAndroid Build Coastguard Worker public:
697*35238bceSAndroid Build Coastguard Worker     TrianglesCase(Context &context, const char *name, const char *desc);
698*35238bceSAndroid Build Coastguard Worker     ~TrianglesCase(void);
699*35238bceSAndroid Build Coastguard Worker 
700*35238bceSAndroid Build Coastguard Worker     void generateTriangles(int iteration, std::vector<tcu::Vec4> &outData,
701*35238bceSAndroid Build Coastguard Worker                            std::vector<TriangleSceneSpec::SceneTriangle> &outTriangles);
702*35238bceSAndroid Build Coastguard Worker };
703*35238bceSAndroid Build Coastguard Worker 
TrianglesCase(Context & context,const char * name,const char * desc)704*35238bceSAndroid Build Coastguard Worker TrianglesCase::TrianglesCase(Context &context, const char *name, const char *desc)
705*35238bceSAndroid Build Coastguard Worker     : BaseTriangleCase(context, name, desc, GL_TRIANGLES)
706*35238bceSAndroid Build Coastguard Worker {
707*35238bceSAndroid Build Coastguard Worker }
708*35238bceSAndroid Build Coastguard Worker 
~TrianglesCase(void)709*35238bceSAndroid Build Coastguard Worker TrianglesCase::~TrianglesCase(void)
710*35238bceSAndroid Build Coastguard Worker {
711*35238bceSAndroid Build Coastguard Worker }
712*35238bceSAndroid Build Coastguard Worker 
generateTriangles(int iteration,std::vector<tcu::Vec4> & outData,std::vector<TriangleSceneSpec::SceneTriangle> & outTriangles)713*35238bceSAndroid Build Coastguard Worker void TrianglesCase::generateTriangles(int iteration, std::vector<tcu::Vec4> &outData,
714*35238bceSAndroid Build Coastguard Worker                                       std::vector<TriangleSceneSpec::SceneTriangle> &outTriangles)
715*35238bceSAndroid Build Coastguard Worker {
716*35238bceSAndroid Build Coastguard Worker     outData.resize(6);
717*35238bceSAndroid Build Coastguard Worker 
718*35238bceSAndroid Build Coastguard Worker     switch (iteration)
719*35238bceSAndroid Build Coastguard Worker     {
720*35238bceSAndroid Build Coastguard Worker     case 0:
721*35238bceSAndroid Build Coastguard Worker         // \note: these values are chosen arbitrarily
722*35238bceSAndroid Build Coastguard Worker         outData[0] = tcu::Vec4(0.2f, 0.8f, 0.0f, 1.0f);
723*35238bceSAndroid Build Coastguard Worker         outData[1] = tcu::Vec4(0.5f, 0.2f, 0.0f, 1.0f);
724*35238bceSAndroid Build Coastguard Worker         outData[2] = tcu::Vec4(0.5f, 0.3f, 0.0f, 1.0f);
725*35238bceSAndroid Build Coastguard Worker         outData[3] = tcu::Vec4(-0.5f, 0.2f, 0.0f, 1.0f);
726*35238bceSAndroid Build Coastguard Worker         outData[4] = tcu::Vec4(-1.5f, -0.4f, 0.0f, 1.0f);
727*35238bceSAndroid Build Coastguard Worker         outData[5] = tcu::Vec4(-0.4f, 0.2f, 0.0f, 1.0f);
728*35238bceSAndroid Build Coastguard Worker         break;
729*35238bceSAndroid Build Coastguard Worker 
730*35238bceSAndroid Build Coastguard Worker     case 1:
731*35238bceSAndroid Build Coastguard Worker         outData[0] = tcu::Vec4(-0.499f, 0.128f, 0.0f, 1.0f);
732*35238bceSAndroid Build Coastguard Worker         outData[1] = tcu::Vec4(-0.501f, -0.3f, 0.0f, 1.0f);
733*35238bceSAndroid Build Coastguard Worker         outData[2] = tcu::Vec4(0.11f, -0.2f, 0.0f, 1.0f);
734*35238bceSAndroid Build Coastguard Worker         outData[3] = tcu::Vec4(0.11f, 0.2f, 0.0f, 1.0f);
735*35238bceSAndroid Build Coastguard Worker         outData[4] = tcu::Vec4(0.88f, 0.9f, 0.0f, 1.0f);
736*35238bceSAndroid Build Coastguard Worker         outData[5] = tcu::Vec4(0.4f, 1.2f, 0.0f, 1.0f);
737*35238bceSAndroid Build Coastguard Worker         break;
738*35238bceSAndroid Build Coastguard Worker 
739*35238bceSAndroid Build Coastguard Worker     case 2:
740*35238bceSAndroid Build Coastguard Worker         outData[0] = tcu::Vec4(-0.9f, -0.3f, 0.0f, 1.0f);
741*35238bceSAndroid Build Coastguard Worker         outData[1] = tcu::Vec4(1.1f, -0.9f, 0.0f, 1.0f);
742*35238bceSAndroid Build Coastguard Worker         outData[2] = tcu::Vec4(-1.1f, -0.1f, 0.0f, 1.0f);
743*35238bceSAndroid Build Coastguard Worker         outData[3] = tcu::Vec4(-0.11f, 0.2f, 0.0f, 1.0f);
744*35238bceSAndroid Build Coastguard Worker         outData[4] = tcu::Vec4(0.88f, 0.7f, 0.0f, 1.0f);
745*35238bceSAndroid Build Coastguard Worker         outData[5] = tcu::Vec4(-0.4f, 0.4f, 0.0f, 1.0f);
746*35238bceSAndroid Build Coastguard Worker         break;
747*35238bceSAndroid Build Coastguard Worker     }
748*35238bceSAndroid Build Coastguard Worker 
749*35238bceSAndroid Build Coastguard Worker     outTriangles.resize(2);
750*35238bceSAndroid Build Coastguard Worker     outTriangles[0].positions[0]  = outData[0];
751*35238bceSAndroid Build Coastguard Worker     outTriangles[0].sharedEdge[0] = false;
752*35238bceSAndroid Build Coastguard Worker     outTriangles[0].positions[1]  = outData[1];
753*35238bceSAndroid Build Coastguard Worker     outTriangles[0].sharedEdge[1] = false;
754*35238bceSAndroid Build Coastguard Worker     outTriangles[0].positions[2]  = outData[2];
755*35238bceSAndroid Build Coastguard Worker     outTriangles[0].sharedEdge[2] = false;
756*35238bceSAndroid Build Coastguard Worker 
757*35238bceSAndroid Build Coastguard Worker     outTriangles[1].positions[0]  = outData[3];
758*35238bceSAndroid Build Coastguard Worker     outTriangles[1].sharedEdge[0] = false;
759*35238bceSAndroid Build Coastguard Worker     outTriangles[1].positions[1]  = outData[4];
760*35238bceSAndroid Build Coastguard Worker     outTriangles[1].sharedEdge[1] = false;
761*35238bceSAndroid Build Coastguard Worker     outTriangles[1].positions[2]  = outData[5];
762*35238bceSAndroid Build Coastguard Worker     outTriangles[1].sharedEdge[2] = false;
763*35238bceSAndroid Build Coastguard Worker 
764*35238bceSAndroid Build Coastguard Worker     // log
765*35238bceSAndroid Build Coastguard Worker     m_testCtx.getLog() << tcu::TestLog::Message << "Rendering " << outTriangles.size()
766*35238bceSAndroid Build Coastguard Worker                        << " triangle(s):" << tcu::TestLog::EndMessage;
767*35238bceSAndroid Build Coastguard Worker     for (int triangleNdx = 0; triangleNdx < (int)outTriangles.size(); ++triangleNdx)
768*35238bceSAndroid Build Coastguard Worker     {
769*35238bceSAndroid Build Coastguard Worker         m_testCtx.getLog() << tcu::TestLog::Message << "Triangle " << (triangleNdx + 1) << ":"
770*35238bceSAndroid Build Coastguard Worker                            << "\n\t" << outTriangles[triangleNdx].positions[0] << "\n\t"
771*35238bceSAndroid Build Coastguard Worker                            << outTriangles[triangleNdx].positions[1] << "\n\t" << outTriangles[triangleNdx].positions[2]
772*35238bceSAndroid Build Coastguard Worker                            << tcu::TestLog::EndMessage;
773*35238bceSAndroid Build Coastguard Worker     }
774*35238bceSAndroid Build Coastguard Worker }
775*35238bceSAndroid Build Coastguard Worker 
776*35238bceSAndroid Build Coastguard Worker class TriangleStripCase : public BaseTriangleCase
777*35238bceSAndroid Build Coastguard Worker {
778*35238bceSAndroid Build Coastguard Worker public:
779*35238bceSAndroid Build Coastguard Worker     TriangleStripCase(Context &context, const char *name, const char *desc);
780*35238bceSAndroid Build Coastguard Worker 
781*35238bceSAndroid Build Coastguard Worker     void generateTriangles(int iteration, std::vector<tcu::Vec4> &outData,
782*35238bceSAndroid Build Coastguard Worker                            std::vector<TriangleSceneSpec::SceneTriangle> &outTriangles);
783*35238bceSAndroid Build Coastguard Worker };
784*35238bceSAndroid Build Coastguard Worker 
TriangleStripCase(Context & context,const char * name,const char * desc)785*35238bceSAndroid Build Coastguard Worker TriangleStripCase::TriangleStripCase(Context &context, const char *name, const char *desc)
786*35238bceSAndroid Build Coastguard Worker     : BaseTriangleCase(context, name, desc, GL_TRIANGLE_STRIP)
787*35238bceSAndroid Build Coastguard Worker {
788*35238bceSAndroid Build Coastguard Worker }
789*35238bceSAndroid Build Coastguard Worker 
generateTriangles(int iteration,std::vector<tcu::Vec4> & outData,std::vector<TriangleSceneSpec::SceneTriangle> & outTriangles)790*35238bceSAndroid Build Coastguard Worker void TriangleStripCase::generateTriangles(int iteration, std::vector<tcu::Vec4> &outData,
791*35238bceSAndroid Build Coastguard Worker                                           std::vector<TriangleSceneSpec::SceneTriangle> &outTriangles)
792*35238bceSAndroid Build Coastguard Worker {
793*35238bceSAndroid Build Coastguard Worker     outData.resize(5);
794*35238bceSAndroid Build Coastguard Worker 
795*35238bceSAndroid Build Coastguard Worker     switch (iteration)
796*35238bceSAndroid Build Coastguard Worker     {
797*35238bceSAndroid Build Coastguard Worker     case 0:
798*35238bceSAndroid Build Coastguard Worker         // \note: these values are chosen arbitrarily
799*35238bceSAndroid Build Coastguard Worker         outData[0] = tcu::Vec4(-0.504f, 0.8f, 0.0f, 1.0f);
800*35238bceSAndroid Build Coastguard Worker         outData[1] = tcu::Vec4(-0.2f, -0.2f, 0.0f, 1.0f);
801*35238bceSAndroid Build Coastguard Worker         outData[2] = tcu::Vec4(-0.2f, 0.199f, 0.0f, 1.0f);
802*35238bceSAndroid Build Coastguard Worker         outData[3] = tcu::Vec4(0.5f, 0.201f, 0.0f, 1.0f);
803*35238bceSAndroid Build Coastguard Worker         outData[4] = tcu::Vec4(1.5f, 0.4f, 0.0f, 1.0f);
804*35238bceSAndroid Build Coastguard Worker         break;
805*35238bceSAndroid Build Coastguard Worker 
806*35238bceSAndroid Build Coastguard Worker     case 1:
807*35238bceSAndroid Build Coastguard Worker         outData[0] = tcu::Vec4(-0.499f, 0.129f, 0.0f, 1.0f);
808*35238bceSAndroid Build Coastguard Worker         outData[1] = tcu::Vec4(-0.501f, -0.3f, 0.0f, 1.0f);
809*35238bceSAndroid Build Coastguard Worker         outData[2] = tcu::Vec4(0.11f, -0.2f, 0.0f, 1.0f);
810*35238bceSAndroid Build Coastguard Worker         outData[3] = tcu::Vec4(0.11f, -0.31f, 0.0f, 1.0f);
811*35238bceSAndroid Build Coastguard Worker         outData[4] = tcu::Vec4(0.88f, 0.9f, 0.0f, 1.0f);
812*35238bceSAndroid Build Coastguard Worker         break;
813*35238bceSAndroid Build Coastguard Worker 
814*35238bceSAndroid Build Coastguard Worker     case 2:
815*35238bceSAndroid Build Coastguard Worker         outData[0] = tcu::Vec4(-0.9f, -0.3f, 0.0f, 1.0f);
816*35238bceSAndroid Build Coastguard Worker         outData[1] = tcu::Vec4(1.1f, -0.9f, 0.0f, 1.0f);
817*35238bceSAndroid Build Coastguard Worker         outData[2] = tcu::Vec4(-0.87f, -0.1f, 0.0f, 1.0f);
818*35238bceSAndroid Build Coastguard Worker         outData[3] = tcu::Vec4(-0.11f, 0.19f, 0.0f, 1.0f);
819*35238bceSAndroid Build Coastguard Worker         outData[4] = tcu::Vec4(0.88f, 0.7f, 0.0f, 1.0f);
820*35238bceSAndroid Build Coastguard Worker         break;
821*35238bceSAndroid Build Coastguard Worker     }
822*35238bceSAndroid Build Coastguard Worker 
823*35238bceSAndroid Build Coastguard Worker     outTriangles.resize(3);
824*35238bceSAndroid Build Coastguard Worker     outTriangles[0].positions[0]  = outData[0];
825*35238bceSAndroid Build Coastguard Worker     outTriangles[0].sharedEdge[0] = false;
826*35238bceSAndroid Build Coastguard Worker     outTriangles[0].positions[1]  = outData[1];
827*35238bceSAndroid Build Coastguard Worker     outTriangles[0].sharedEdge[1] = true;
828*35238bceSAndroid Build Coastguard Worker     outTriangles[0].positions[2]  = outData[2];
829*35238bceSAndroid Build Coastguard Worker     outTriangles[0].sharedEdge[2] = false;
830*35238bceSAndroid Build Coastguard Worker 
831*35238bceSAndroid Build Coastguard Worker     outTriangles[1].positions[0]  = outData[2];
832*35238bceSAndroid Build Coastguard Worker     outTriangles[1].sharedEdge[0] = true;
833*35238bceSAndroid Build Coastguard Worker     outTriangles[1].positions[1]  = outData[1];
834*35238bceSAndroid Build Coastguard Worker     outTriangles[1].sharedEdge[1] = false;
835*35238bceSAndroid Build Coastguard Worker     outTriangles[1].positions[2]  = outData[3];
836*35238bceSAndroid Build Coastguard Worker     outTriangles[1].sharedEdge[2] = true;
837*35238bceSAndroid Build Coastguard Worker 
838*35238bceSAndroid Build Coastguard Worker     outTriangles[2].positions[0]  = outData[2];
839*35238bceSAndroid Build Coastguard Worker     outTriangles[2].sharedEdge[0] = true;
840*35238bceSAndroid Build Coastguard Worker     outTriangles[2].positions[1]  = outData[3];
841*35238bceSAndroid Build Coastguard Worker     outTriangles[2].sharedEdge[1] = false;
842*35238bceSAndroid Build Coastguard Worker     outTriangles[2].positions[2]  = outData[4];
843*35238bceSAndroid Build Coastguard Worker     outTriangles[2].sharedEdge[2] = false;
844*35238bceSAndroid Build Coastguard Worker 
845*35238bceSAndroid Build Coastguard Worker     // log
846*35238bceSAndroid Build Coastguard Worker     m_testCtx.getLog() << tcu::TestLog::Message << "Rendering triangle strip, " << outData.size() << " vertices."
847*35238bceSAndroid Build Coastguard Worker                        << tcu::TestLog::EndMessage;
848*35238bceSAndroid Build Coastguard Worker     for (int vtxNdx = 0; vtxNdx < (int)outData.size(); ++vtxNdx)
849*35238bceSAndroid Build Coastguard Worker     {
850*35238bceSAndroid Build Coastguard Worker         m_testCtx.getLog() << tcu::TestLog::Message << "\t" << outData[vtxNdx] << tcu::TestLog::EndMessage;
851*35238bceSAndroid Build Coastguard Worker     }
852*35238bceSAndroid Build Coastguard Worker }
853*35238bceSAndroid Build Coastguard Worker 
854*35238bceSAndroid Build Coastguard Worker class TriangleFanCase : public BaseTriangleCase
855*35238bceSAndroid Build Coastguard Worker {
856*35238bceSAndroid Build Coastguard Worker public:
857*35238bceSAndroid Build Coastguard Worker     TriangleFanCase(Context &context, const char *name, const char *desc);
858*35238bceSAndroid Build Coastguard Worker 
859*35238bceSAndroid Build Coastguard Worker     void generateTriangles(int iteration, std::vector<tcu::Vec4> &outData,
860*35238bceSAndroid Build Coastguard Worker                            std::vector<TriangleSceneSpec::SceneTriangle> &outTriangles);
861*35238bceSAndroid Build Coastguard Worker };
862*35238bceSAndroid Build Coastguard Worker 
TriangleFanCase(Context & context,const char * name,const char * desc)863*35238bceSAndroid Build Coastguard Worker TriangleFanCase::TriangleFanCase(Context &context, const char *name, const char *desc)
864*35238bceSAndroid Build Coastguard Worker     : BaseTriangleCase(context, name, desc, GL_TRIANGLE_FAN)
865*35238bceSAndroid Build Coastguard Worker {
866*35238bceSAndroid Build Coastguard Worker }
867*35238bceSAndroid Build Coastguard Worker 
generateTriangles(int iteration,std::vector<tcu::Vec4> & outData,std::vector<TriangleSceneSpec::SceneTriangle> & outTriangles)868*35238bceSAndroid Build Coastguard Worker void TriangleFanCase::generateTriangles(int iteration, std::vector<tcu::Vec4> &outData,
869*35238bceSAndroid Build Coastguard Worker                                         std::vector<TriangleSceneSpec::SceneTriangle> &outTriangles)
870*35238bceSAndroid Build Coastguard Worker {
871*35238bceSAndroid Build Coastguard Worker     outData.resize(5);
872*35238bceSAndroid Build Coastguard Worker 
873*35238bceSAndroid Build Coastguard Worker     switch (iteration)
874*35238bceSAndroid Build Coastguard Worker     {
875*35238bceSAndroid Build Coastguard Worker     case 0:
876*35238bceSAndroid Build Coastguard Worker         // \note: these values are chosen arbitrarily
877*35238bceSAndroid Build Coastguard Worker         outData[0] = tcu::Vec4(0.01f, 0.0f, 0.0f, 1.0f);
878*35238bceSAndroid Build Coastguard Worker         outData[1] = tcu::Vec4(0.5f, 0.2f, 0.0f, 1.0f);
879*35238bceSAndroid Build Coastguard Worker         outData[2] = tcu::Vec4(0.46f, 0.3f, 0.0f, 1.0f);
880*35238bceSAndroid Build Coastguard Worker         outData[3] = tcu::Vec4(-0.5f, 0.2f, 0.0f, 1.0f);
881*35238bceSAndroid Build Coastguard Worker         outData[4] = tcu::Vec4(-1.5f, -0.4f, 0.0f, 1.0f);
882*35238bceSAndroid Build Coastguard Worker         break;
883*35238bceSAndroid Build Coastguard Worker 
884*35238bceSAndroid Build Coastguard Worker     case 1:
885*35238bceSAndroid Build Coastguard Worker         outData[0] = tcu::Vec4(-0.499f, 0.128f, 0.0f, 1.0f);
886*35238bceSAndroid Build Coastguard Worker         outData[1] = tcu::Vec4(-0.501f, -0.3f, 0.0f, 1.0f);
887*35238bceSAndroid Build Coastguard Worker         outData[2] = tcu::Vec4(0.11f, -0.2f, 0.0f, 1.0f);
888*35238bceSAndroid Build Coastguard Worker         outData[3] = tcu::Vec4(0.11f, 0.2f, 0.0f, 1.0f);
889*35238bceSAndroid Build Coastguard Worker         outData[4] = tcu::Vec4(0.88f, 0.9f, 0.0f, 1.0f);
890*35238bceSAndroid Build Coastguard Worker         break;
891*35238bceSAndroid Build Coastguard Worker 
892*35238bceSAndroid Build Coastguard Worker     case 2:
893*35238bceSAndroid Build Coastguard Worker         outData[0] = tcu::Vec4(-0.9f, -0.3f, 0.0f, 1.0f);
894*35238bceSAndroid Build Coastguard Worker         outData[1] = tcu::Vec4(1.1f, -0.9f, 0.0f, 1.0f);
895*35238bceSAndroid Build Coastguard Worker         outData[2] = tcu::Vec4(0.7f, -0.1f, 0.0f, 1.0f);
896*35238bceSAndroid Build Coastguard Worker         outData[3] = tcu::Vec4(0.11f, 0.2f, 0.0f, 1.0f);
897*35238bceSAndroid Build Coastguard Worker         outData[4] = tcu::Vec4(0.88f, 0.7f, 0.0f, 1.0f);
898*35238bceSAndroid Build Coastguard Worker         break;
899*35238bceSAndroid Build Coastguard Worker     }
900*35238bceSAndroid Build Coastguard Worker 
901*35238bceSAndroid Build Coastguard Worker     outTriangles.resize(3);
902*35238bceSAndroid Build Coastguard Worker     outTriangles[0].positions[0]  = outData[0];
903*35238bceSAndroid Build Coastguard Worker     outTriangles[0].sharedEdge[0] = false;
904*35238bceSAndroid Build Coastguard Worker     outTriangles[0].positions[1]  = outData[1];
905*35238bceSAndroid Build Coastguard Worker     outTriangles[0].sharedEdge[1] = false;
906*35238bceSAndroid Build Coastguard Worker     outTriangles[0].positions[2]  = outData[2];
907*35238bceSAndroid Build Coastguard Worker     outTriangles[0].sharedEdge[2] = true;
908*35238bceSAndroid Build Coastguard Worker 
909*35238bceSAndroid Build Coastguard Worker     outTriangles[1].positions[0]  = outData[0];
910*35238bceSAndroid Build Coastguard Worker     outTriangles[1].sharedEdge[0] = true;
911*35238bceSAndroid Build Coastguard Worker     outTriangles[1].positions[1]  = outData[2];
912*35238bceSAndroid Build Coastguard Worker     outTriangles[1].sharedEdge[1] = false;
913*35238bceSAndroid Build Coastguard Worker     outTriangles[1].positions[2]  = outData[3];
914*35238bceSAndroid Build Coastguard Worker     outTriangles[1].sharedEdge[2] = true;
915*35238bceSAndroid Build Coastguard Worker 
916*35238bceSAndroid Build Coastguard Worker     outTriangles[2].positions[0]  = outData[0];
917*35238bceSAndroid Build Coastguard Worker     outTriangles[2].sharedEdge[0] = true;
918*35238bceSAndroid Build Coastguard Worker     outTriangles[2].positions[1]  = outData[3];
919*35238bceSAndroid Build Coastguard Worker     outTriangles[2].sharedEdge[1] = false;
920*35238bceSAndroid Build Coastguard Worker     outTriangles[2].positions[2]  = outData[4];
921*35238bceSAndroid Build Coastguard Worker     outTriangles[2].sharedEdge[2] = false;
922*35238bceSAndroid Build Coastguard Worker 
923*35238bceSAndroid Build Coastguard Worker     // log
924*35238bceSAndroid Build Coastguard Worker     m_testCtx.getLog() << tcu::TestLog::Message << "Rendering triangle fan, " << outData.size() << " vertices."
925*35238bceSAndroid Build Coastguard Worker                        << tcu::TestLog::EndMessage;
926*35238bceSAndroid Build Coastguard Worker     for (int vtxNdx = 0; vtxNdx < (int)outData.size(); ++vtxNdx)
927*35238bceSAndroid Build Coastguard Worker     {
928*35238bceSAndroid Build Coastguard Worker         m_testCtx.getLog() << tcu::TestLog::Message << "\t" << outData[vtxNdx] << tcu::TestLog::EndMessage;
929*35238bceSAndroid Build Coastguard Worker     }
930*35238bceSAndroid Build Coastguard Worker }
931*35238bceSAndroid Build Coastguard Worker 
932*35238bceSAndroid Build Coastguard Worker class LinesCase : public BaseLineCase
933*35238bceSAndroid Build Coastguard Worker {
934*35238bceSAndroid Build Coastguard Worker public:
935*35238bceSAndroid Build Coastguard Worker     LinesCase(Context &context, const char *name, const char *desc, PrimitiveWideness wideness);
936*35238bceSAndroid Build Coastguard Worker 
937*35238bceSAndroid Build Coastguard Worker     void generateLines(int iteration, std::vector<tcu::Vec4> &outData, std::vector<LineSceneSpec::SceneLine> &outLines);
938*35238bceSAndroid Build Coastguard Worker };
939*35238bceSAndroid Build Coastguard Worker 
LinesCase(Context & context,const char * name,const char * desc,PrimitiveWideness wideness)940*35238bceSAndroid Build Coastguard Worker LinesCase::LinesCase(Context &context, const char *name, const char *desc, PrimitiveWideness wideness)
941*35238bceSAndroid Build Coastguard Worker     : BaseLineCase(context, name, desc, GL_LINES, wideness)
942*35238bceSAndroid Build Coastguard Worker {
943*35238bceSAndroid Build Coastguard Worker }
944*35238bceSAndroid Build Coastguard Worker 
generateLines(int iteration,std::vector<tcu::Vec4> & outData,std::vector<LineSceneSpec::SceneLine> & outLines)945*35238bceSAndroid Build Coastguard Worker void LinesCase::generateLines(int iteration, std::vector<tcu::Vec4> &outData,
946*35238bceSAndroid Build Coastguard Worker                               std::vector<LineSceneSpec::SceneLine> &outLines)
947*35238bceSAndroid Build Coastguard Worker {
948*35238bceSAndroid Build Coastguard Worker     outData.resize(6);
949*35238bceSAndroid Build Coastguard Worker 
950*35238bceSAndroid Build Coastguard Worker     switch (iteration)
951*35238bceSAndroid Build Coastguard Worker     {
952*35238bceSAndroid Build Coastguard Worker     case 0:
953*35238bceSAndroid Build Coastguard Worker         // \note: these values are chosen arbitrarily
954*35238bceSAndroid Build Coastguard Worker         outData[0] = tcu::Vec4(0.01f, 0.0f, 0.0f, 1.0f);
955*35238bceSAndroid Build Coastguard Worker         outData[1] = tcu::Vec4(0.5f, 0.2f, 0.0f, 1.0f);
956*35238bceSAndroid Build Coastguard Worker         outData[2] = tcu::Vec4(0.46f, 0.3f, 0.0f, 1.0f);
957*35238bceSAndroid Build Coastguard Worker         outData[3] = tcu::Vec4(-0.3f, 0.2f, 0.0f, 1.0f);
958*35238bceSAndroid Build Coastguard Worker         outData[4] = tcu::Vec4(-1.5f, -0.4f, 0.0f, 1.0f);
959*35238bceSAndroid Build Coastguard Worker         outData[5] = tcu::Vec4(0.1f, 0.5f, 0.0f, 1.0f);
960*35238bceSAndroid Build Coastguard Worker         break;
961*35238bceSAndroid Build Coastguard Worker 
962*35238bceSAndroid Build Coastguard Worker     case 1:
963*35238bceSAndroid Build Coastguard Worker         outData[0] = tcu::Vec4(-0.499f, 0.128f, 0.0f, 1.0f);
964*35238bceSAndroid Build Coastguard Worker         outData[1] = tcu::Vec4(-0.501f, -0.3f, 0.0f, 1.0f);
965*35238bceSAndroid Build Coastguard Worker         outData[2] = tcu::Vec4(0.11f, -0.2f, 0.0f, 1.0f);
966*35238bceSAndroid Build Coastguard Worker         outData[3] = tcu::Vec4(0.11f, 0.2f, 0.0f, 1.0f);
967*35238bceSAndroid Build Coastguard Worker         outData[4] = tcu::Vec4(0.88f, 0.9f, 0.0f, 1.0f);
968*35238bceSAndroid Build Coastguard Worker         outData[5] = tcu::Vec4(0.18f, -0.2f, 0.0f, 1.0f);
969*35238bceSAndroid Build Coastguard Worker         break;
970*35238bceSAndroid Build Coastguard Worker 
971*35238bceSAndroid Build Coastguard Worker     case 2:
972*35238bceSAndroid Build Coastguard Worker         outData[0] = tcu::Vec4(-0.9f, -0.3f, 0.0f, 1.0f);
973*35238bceSAndroid Build Coastguard Worker         outData[1] = tcu::Vec4(1.1f, -0.9f, 0.0f, 1.0f);
974*35238bceSAndroid Build Coastguard Worker         outData[2] = tcu::Vec4(0.7f, -0.1f, 0.0f, 1.0f);
975*35238bceSAndroid Build Coastguard Worker         outData[3] = tcu::Vec4(0.11f, 0.2f, 0.0f, 1.0f);
976*35238bceSAndroid Build Coastguard Worker         outData[4] = tcu::Vec4(0.88f, 0.7f, 0.0f, 1.0f);
977*35238bceSAndroid Build Coastguard Worker         outData[5] = tcu::Vec4(0.8f, -0.7f, 0.0f, 1.0f);
978*35238bceSAndroid Build Coastguard Worker         break;
979*35238bceSAndroid Build Coastguard Worker     }
980*35238bceSAndroid Build Coastguard Worker 
981*35238bceSAndroid Build Coastguard Worker     outLines.resize(3);
982*35238bceSAndroid Build Coastguard Worker     outLines[0].positions[0] = outData[0];
983*35238bceSAndroid Build Coastguard Worker     outLines[0].positions[1] = outData[1];
984*35238bceSAndroid Build Coastguard Worker     outLines[1].positions[0] = outData[2];
985*35238bceSAndroid Build Coastguard Worker     outLines[1].positions[1] = outData[3];
986*35238bceSAndroid Build Coastguard Worker     outLines[2].positions[0] = outData[4];
987*35238bceSAndroid Build Coastguard Worker     outLines[2].positions[1] = outData[5];
988*35238bceSAndroid Build Coastguard Worker 
989*35238bceSAndroid Build Coastguard Worker     // log
990*35238bceSAndroid Build Coastguard Worker     m_testCtx.getLog() << tcu::TestLog::Message << "Rendering " << outLines.size()
991*35238bceSAndroid Build Coastguard Worker                        << " lines(s): (width = " << m_lineWidth << ")" << tcu::TestLog::EndMessage;
992*35238bceSAndroid Build Coastguard Worker     for (int lineNdx = 0; lineNdx < (int)outLines.size(); ++lineNdx)
993*35238bceSAndroid Build Coastguard Worker     {
994*35238bceSAndroid Build Coastguard Worker         m_testCtx.getLog() << tcu::TestLog::Message << "Line " << (lineNdx + 1) << ":"
995*35238bceSAndroid Build Coastguard Worker                            << "\n\t" << outLines[lineNdx].positions[0] << "\n\t" << outLines[lineNdx].positions[1]
996*35238bceSAndroid Build Coastguard Worker                            << tcu::TestLog::EndMessage;
997*35238bceSAndroid Build Coastguard Worker     }
998*35238bceSAndroid Build Coastguard Worker }
999*35238bceSAndroid Build Coastguard Worker 
1000*35238bceSAndroid Build Coastguard Worker class LineStripCase : public BaseLineCase
1001*35238bceSAndroid Build Coastguard Worker {
1002*35238bceSAndroid Build Coastguard Worker public:
1003*35238bceSAndroid Build Coastguard Worker     LineStripCase(Context &context, const char *name, const char *desc, PrimitiveWideness wideness);
1004*35238bceSAndroid Build Coastguard Worker 
1005*35238bceSAndroid Build Coastguard Worker     void generateLines(int iteration, std::vector<tcu::Vec4> &outData, std::vector<LineSceneSpec::SceneLine> &outLines);
1006*35238bceSAndroid Build Coastguard Worker };
1007*35238bceSAndroid Build Coastguard Worker 
LineStripCase(Context & context,const char * name,const char * desc,PrimitiveWideness wideness)1008*35238bceSAndroid Build Coastguard Worker LineStripCase::LineStripCase(Context &context, const char *name, const char *desc, PrimitiveWideness wideness)
1009*35238bceSAndroid Build Coastguard Worker     : BaseLineCase(context, name, desc, GL_LINE_STRIP, wideness)
1010*35238bceSAndroid Build Coastguard Worker {
1011*35238bceSAndroid Build Coastguard Worker }
1012*35238bceSAndroid Build Coastguard Worker 
generateLines(int iteration,std::vector<tcu::Vec4> & outData,std::vector<LineSceneSpec::SceneLine> & outLines)1013*35238bceSAndroid Build Coastguard Worker void LineStripCase::generateLines(int iteration, std::vector<tcu::Vec4> &outData,
1014*35238bceSAndroid Build Coastguard Worker                                   std::vector<LineSceneSpec::SceneLine> &outLines)
1015*35238bceSAndroid Build Coastguard Worker {
1016*35238bceSAndroid Build Coastguard Worker     outData.resize(4);
1017*35238bceSAndroid Build Coastguard Worker 
1018*35238bceSAndroid Build Coastguard Worker     switch (iteration)
1019*35238bceSAndroid Build Coastguard Worker     {
1020*35238bceSAndroid Build Coastguard Worker     case 0:
1021*35238bceSAndroid Build Coastguard Worker         // \note: these values are chosen arbitrarily
1022*35238bceSAndroid Build Coastguard Worker         outData[0] = tcu::Vec4(0.01f, 0.0f, 0.0f, 1.0f);
1023*35238bceSAndroid Build Coastguard Worker         outData[1] = tcu::Vec4(0.5f, 0.2f, 0.0f, 1.0f);
1024*35238bceSAndroid Build Coastguard Worker         outData[2] = tcu::Vec4(0.46f, 0.3f, 0.0f, 1.0f);
1025*35238bceSAndroid Build Coastguard Worker         outData[3] = tcu::Vec4(-0.5f, 0.2f, 0.0f, 1.0f);
1026*35238bceSAndroid Build Coastguard Worker         break;
1027*35238bceSAndroid Build Coastguard Worker 
1028*35238bceSAndroid Build Coastguard Worker     case 1:
1029*35238bceSAndroid Build Coastguard Worker         outData[0] = tcu::Vec4(-0.499f, 0.128f, 0.0f, 1.0f);
1030*35238bceSAndroid Build Coastguard Worker         outData[1] = tcu::Vec4(-0.501f, -0.3f, 0.0f, 1.0f);
1031*35238bceSAndroid Build Coastguard Worker         outData[2] = tcu::Vec4(0.11f, -0.2f, 0.0f, 1.0f);
1032*35238bceSAndroid Build Coastguard Worker         outData[3] = tcu::Vec4(0.11f, 0.2f, 0.0f, 1.0f);
1033*35238bceSAndroid Build Coastguard Worker         break;
1034*35238bceSAndroid Build Coastguard Worker 
1035*35238bceSAndroid Build Coastguard Worker     case 2:
1036*35238bceSAndroid Build Coastguard Worker         outData[0] = tcu::Vec4(-0.9f, -0.3f, 0.0f, 1.0f);
1037*35238bceSAndroid Build Coastguard Worker         outData[1] = tcu::Vec4(1.1f, -0.9f, 0.0f, 1.0f);
1038*35238bceSAndroid Build Coastguard Worker         outData[2] = tcu::Vec4(0.7f, -0.1f, 0.0f, 1.0f);
1039*35238bceSAndroid Build Coastguard Worker         outData[3] = tcu::Vec4(0.11f, 0.2f, 0.0f, 1.0f);
1040*35238bceSAndroid Build Coastguard Worker         break;
1041*35238bceSAndroid Build Coastguard Worker     }
1042*35238bceSAndroid Build Coastguard Worker 
1043*35238bceSAndroid Build Coastguard Worker     outLines.resize(3);
1044*35238bceSAndroid Build Coastguard Worker     outLines[0].positions[0] = outData[0];
1045*35238bceSAndroid Build Coastguard Worker     outLines[0].positions[1] = outData[1];
1046*35238bceSAndroid Build Coastguard Worker     outLines[1].positions[0] = outData[1];
1047*35238bceSAndroid Build Coastguard Worker     outLines[1].positions[1] = outData[2];
1048*35238bceSAndroid Build Coastguard Worker     outLines[2].positions[0] = outData[2];
1049*35238bceSAndroid Build Coastguard Worker     outLines[2].positions[1] = outData[3];
1050*35238bceSAndroid Build Coastguard Worker 
1051*35238bceSAndroid Build Coastguard Worker     // log
1052*35238bceSAndroid Build Coastguard Worker     m_testCtx.getLog() << tcu::TestLog::Message << "Rendering line strip, width = " << m_lineWidth << ", "
1053*35238bceSAndroid Build Coastguard Worker                        << outData.size() << " vertices." << tcu::TestLog::EndMessage;
1054*35238bceSAndroid Build Coastguard Worker     for (int vtxNdx = 0; vtxNdx < (int)outData.size(); ++vtxNdx)
1055*35238bceSAndroid Build Coastguard Worker     {
1056*35238bceSAndroid Build Coastguard Worker         m_testCtx.getLog() << tcu::TestLog::Message << "\t" << outData[vtxNdx] << tcu::TestLog::EndMessage;
1057*35238bceSAndroid Build Coastguard Worker     }
1058*35238bceSAndroid Build Coastguard Worker }
1059*35238bceSAndroid Build Coastguard Worker 
1060*35238bceSAndroid Build Coastguard Worker class LineLoopCase : public BaseLineCase
1061*35238bceSAndroid Build Coastguard Worker {
1062*35238bceSAndroid Build Coastguard Worker public:
1063*35238bceSAndroid Build Coastguard Worker     LineLoopCase(Context &context, const char *name, const char *desc, PrimitiveWideness wideness);
1064*35238bceSAndroid Build Coastguard Worker 
1065*35238bceSAndroid Build Coastguard Worker     void generateLines(int iteration, std::vector<tcu::Vec4> &outData, std::vector<LineSceneSpec::SceneLine> &outLines);
1066*35238bceSAndroid Build Coastguard Worker };
1067*35238bceSAndroid Build Coastguard Worker 
LineLoopCase(Context & context,const char * name,const char * desc,PrimitiveWideness wideness)1068*35238bceSAndroid Build Coastguard Worker LineLoopCase::LineLoopCase(Context &context, const char *name, const char *desc, PrimitiveWideness wideness)
1069*35238bceSAndroid Build Coastguard Worker     : BaseLineCase(context, name, desc, GL_LINE_LOOP, wideness)
1070*35238bceSAndroid Build Coastguard Worker {
1071*35238bceSAndroid Build Coastguard Worker }
1072*35238bceSAndroid Build Coastguard Worker 
generateLines(int iteration,std::vector<tcu::Vec4> & outData,std::vector<LineSceneSpec::SceneLine> & outLines)1073*35238bceSAndroid Build Coastguard Worker void LineLoopCase::generateLines(int iteration, std::vector<tcu::Vec4> &outData,
1074*35238bceSAndroid Build Coastguard Worker                                  std::vector<LineSceneSpec::SceneLine> &outLines)
1075*35238bceSAndroid Build Coastguard Worker {
1076*35238bceSAndroid Build Coastguard Worker     outData.resize(4);
1077*35238bceSAndroid Build Coastguard Worker 
1078*35238bceSAndroid Build Coastguard Worker     switch (iteration)
1079*35238bceSAndroid Build Coastguard Worker     {
1080*35238bceSAndroid Build Coastguard Worker     case 0:
1081*35238bceSAndroid Build Coastguard Worker         // \note: these values are chosen arbitrarily
1082*35238bceSAndroid Build Coastguard Worker         outData[0] = tcu::Vec4(0.01f, 0.0f, 0.0f, 1.0f);
1083*35238bceSAndroid Build Coastguard Worker         outData[1] = tcu::Vec4(0.5f, 0.2f, 0.0f, 1.0f);
1084*35238bceSAndroid Build Coastguard Worker         outData[2] = tcu::Vec4(0.46f, 0.3f, 0.0f, 1.0f);
1085*35238bceSAndroid Build Coastguard Worker         outData[3] = tcu::Vec4(-0.5f, 0.2f, 0.0f, 1.0f);
1086*35238bceSAndroid Build Coastguard Worker         break;
1087*35238bceSAndroid Build Coastguard Worker 
1088*35238bceSAndroid Build Coastguard Worker     case 1:
1089*35238bceSAndroid Build Coastguard Worker         outData[0] = tcu::Vec4(-0.499f, 0.128f, 0.0f, 1.0f);
1090*35238bceSAndroid Build Coastguard Worker         outData[1] = tcu::Vec4(-0.501f, -0.3f, 0.0f, 1.0f);
1091*35238bceSAndroid Build Coastguard Worker         outData[2] = tcu::Vec4(0.11f, -0.2f, 0.0f, 1.0f);
1092*35238bceSAndroid Build Coastguard Worker         outData[3] = tcu::Vec4(0.11f, 0.2f, 0.0f, 1.0f);
1093*35238bceSAndroid Build Coastguard Worker         break;
1094*35238bceSAndroid Build Coastguard Worker 
1095*35238bceSAndroid Build Coastguard Worker     case 2:
1096*35238bceSAndroid Build Coastguard Worker         outData[0] = tcu::Vec4(-0.9f, -0.3f, 0.0f, 1.0f);
1097*35238bceSAndroid Build Coastguard Worker         outData[1] = tcu::Vec4(1.1f, -0.9f, 0.0f, 1.0f);
1098*35238bceSAndroid Build Coastguard Worker         outData[2] = tcu::Vec4(0.7f, -0.1f, 0.0f, 1.0f);
1099*35238bceSAndroid Build Coastguard Worker         outData[3] = tcu::Vec4(0.11f, 0.2f, 0.0f, 1.0f);
1100*35238bceSAndroid Build Coastguard Worker         break;
1101*35238bceSAndroid Build Coastguard Worker     }
1102*35238bceSAndroid Build Coastguard Worker 
1103*35238bceSAndroid Build Coastguard Worker     outLines.resize(4);
1104*35238bceSAndroid Build Coastguard Worker     outLines[0].positions[0] = outData[0];
1105*35238bceSAndroid Build Coastguard Worker     outLines[0].positions[1] = outData[1];
1106*35238bceSAndroid Build Coastguard Worker     outLines[1].positions[0] = outData[1];
1107*35238bceSAndroid Build Coastguard Worker     outLines[1].positions[1] = outData[2];
1108*35238bceSAndroid Build Coastguard Worker     outLines[2].positions[0] = outData[2];
1109*35238bceSAndroid Build Coastguard Worker     outLines[2].positions[1] = outData[3];
1110*35238bceSAndroid Build Coastguard Worker     outLines[3].positions[0] = outData[3];
1111*35238bceSAndroid Build Coastguard Worker     outLines[3].positions[1] = outData[0];
1112*35238bceSAndroid Build Coastguard Worker 
1113*35238bceSAndroid Build Coastguard Worker     // log
1114*35238bceSAndroid Build Coastguard Worker     m_testCtx.getLog() << tcu::TestLog::Message << "Rendering line loop, width = " << m_lineWidth << ", "
1115*35238bceSAndroid Build Coastguard Worker                        << outData.size() << " vertices." << tcu::TestLog::EndMessage;
1116*35238bceSAndroid Build Coastguard Worker     for (int vtxNdx = 0; vtxNdx < (int)outData.size(); ++vtxNdx)
1117*35238bceSAndroid Build Coastguard Worker     {
1118*35238bceSAndroid Build Coastguard Worker         m_testCtx.getLog() << tcu::TestLog::Message << "\t" << outData[vtxNdx] << tcu::TestLog::EndMessage;
1119*35238bceSAndroid Build Coastguard Worker     }
1120*35238bceSAndroid Build Coastguard Worker }
1121*35238bceSAndroid Build Coastguard Worker 
1122*35238bceSAndroid Build Coastguard Worker class FillRuleCase : public BaseRenderingCase
1123*35238bceSAndroid Build Coastguard Worker {
1124*35238bceSAndroid Build Coastguard Worker public:
1125*35238bceSAndroid Build Coastguard Worker     enum FillRuleCaseType
1126*35238bceSAndroid Build Coastguard Worker     {
1127*35238bceSAndroid Build Coastguard Worker         FILLRULECASE_BASIC = 0,
1128*35238bceSAndroid Build Coastguard Worker         FILLRULECASE_REVERSED,
1129*35238bceSAndroid Build Coastguard Worker         FILLRULECASE_CLIPPED_FULL,
1130*35238bceSAndroid Build Coastguard Worker         FILLRULECASE_CLIPPED_PARTIAL,
1131*35238bceSAndroid Build Coastguard Worker         FILLRULECASE_PROJECTED,
1132*35238bceSAndroid Build Coastguard Worker 
1133*35238bceSAndroid Build Coastguard Worker         FILLRULECASE_LAST
1134*35238bceSAndroid Build Coastguard Worker     };
1135*35238bceSAndroid Build Coastguard Worker 
1136*35238bceSAndroid Build Coastguard Worker     FillRuleCase(Context &ctx, const char *name, const char *desc, FillRuleCaseType type);
1137*35238bceSAndroid Build Coastguard Worker     ~FillRuleCase(void);
1138*35238bceSAndroid Build Coastguard Worker     IterateResult iterate(void);
1139*35238bceSAndroid Build Coastguard Worker 
1140*35238bceSAndroid Build Coastguard Worker private:
1141*35238bceSAndroid Build Coastguard Worker     int getRenderSize(FillRuleCase::FillRuleCaseType type) const;
1142*35238bceSAndroid Build Coastguard Worker     int getNumIterations(FillRuleCase::FillRuleCaseType type) const;
1143*35238bceSAndroid Build Coastguard Worker     void generateTriangles(int iteration, std::vector<tcu::Vec4> &outData) const;
1144*35238bceSAndroid Build Coastguard Worker 
1145*35238bceSAndroid Build Coastguard Worker     const FillRuleCaseType m_caseType;
1146*35238bceSAndroid Build Coastguard Worker     int m_iteration;
1147*35238bceSAndroid Build Coastguard Worker     const int m_iterationCount;
1148*35238bceSAndroid Build Coastguard Worker     bool m_allIterationsPassed;
1149*35238bceSAndroid Build Coastguard Worker };
1150*35238bceSAndroid Build Coastguard Worker 
FillRuleCase(Context & ctx,const char * name,const char * desc,FillRuleCaseType type)1151*35238bceSAndroid Build Coastguard Worker FillRuleCase::FillRuleCase(Context &ctx, const char *name, const char *desc, FillRuleCaseType type)
1152*35238bceSAndroid Build Coastguard Worker     : BaseRenderingCase(ctx, name, desc, getRenderSize(type))
1153*35238bceSAndroid Build Coastguard Worker     , m_caseType(type)
1154*35238bceSAndroid Build Coastguard Worker     , m_iteration(0)
1155*35238bceSAndroid Build Coastguard Worker     , m_iterationCount(getNumIterations(type))
1156*35238bceSAndroid Build Coastguard Worker     , m_allIterationsPassed(true)
1157*35238bceSAndroid Build Coastguard Worker {
1158*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(type < FILLRULECASE_LAST);
1159*35238bceSAndroid Build Coastguard Worker }
1160*35238bceSAndroid Build Coastguard Worker 
~FillRuleCase(void)1161*35238bceSAndroid Build Coastguard Worker FillRuleCase::~FillRuleCase(void)
1162*35238bceSAndroid Build Coastguard Worker {
1163*35238bceSAndroid Build Coastguard Worker     deinit();
1164*35238bceSAndroid Build Coastguard Worker }
1165*35238bceSAndroid Build Coastguard Worker 
iterate(void)1166*35238bceSAndroid Build Coastguard Worker FillRuleCase::IterateResult FillRuleCase::iterate(void)
1167*35238bceSAndroid Build Coastguard Worker {
1168*35238bceSAndroid Build Coastguard Worker     const std::string iterationDescription =
1169*35238bceSAndroid Build Coastguard Worker         "Test iteration " + de::toString(m_iteration + 1) + " / " + de::toString(m_iterationCount);
1170*35238bceSAndroid Build Coastguard Worker     const tcu::ScopedLogSection section(m_testCtx.getLog(), iterationDescription, iterationDescription);
1171*35238bceSAndroid Build Coastguard Worker     const int thresholdRed   = 1 << (8 - m_context.getRenderTarget().getPixelFormat().redBits);
1172*35238bceSAndroid Build Coastguard Worker     const int thresholdGreen = 1 << (8 - m_context.getRenderTarget().getPixelFormat().greenBits);
1173*35238bceSAndroid Build Coastguard Worker     const int thresholdBlue  = 1 << (8 - m_context.getRenderTarget().getPixelFormat().blueBits);
1174*35238bceSAndroid Build Coastguard Worker     tcu::Surface resultImage(m_renderSize, m_renderSize);
1175*35238bceSAndroid Build Coastguard Worker     std::vector<tcu::Vec4> drawBuffer;
1176*35238bceSAndroid Build Coastguard Worker     bool imageShown = false;
1177*35238bceSAndroid Build Coastguard Worker 
1178*35238bceSAndroid Build Coastguard Worker     generateTriangles(m_iteration, drawBuffer);
1179*35238bceSAndroid Build Coastguard Worker 
1180*35238bceSAndroid Build Coastguard Worker     // draw image
1181*35238bceSAndroid Build Coastguard Worker     {
1182*35238bceSAndroid Build Coastguard Worker         const glw::Functions &gl = m_context.getRenderContext().getFunctions();
1183*35238bceSAndroid Build Coastguard Worker         const std::vector<tcu::Vec4> colorBuffer(drawBuffer.size(), tcu::Vec4(0.5f, 0.5f, 0.5f, 1.0f));
1184*35238bceSAndroid Build Coastguard Worker 
1185*35238bceSAndroid Build Coastguard Worker         m_testCtx.getLog()
1186*35238bceSAndroid Build Coastguard Worker             << tcu::TestLog::Message
1187*35238bceSAndroid Build Coastguard Worker             << "Drawing gray triangles with shared edges.\nEnabling additive blending to detect overlapping fragments."
1188*35238bceSAndroid Build Coastguard Worker             << tcu::TestLog::EndMessage;
1189*35238bceSAndroid Build Coastguard Worker 
1190*35238bceSAndroid Build Coastguard Worker         gl.enable(GL_BLEND);
1191*35238bceSAndroid Build Coastguard Worker         gl.blendEquation(GL_FUNC_ADD);
1192*35238bceSAndroid Build Coastguard Worker         gl.blendFunc(GL_ONE, GL_ONE);
1193*35238bceSAndroid Build Coastguard Worker         drawPrimitives(resultImage, drawBuffer, colorBuffer, GL_TRIANGLES);
1194*35238bceSAndroid Build Coastguard Worker     }
1195*35238bceSAndroid Build Coastguard Worker 
1196*35238bceSAndroid Build Coastguard Worker     // verify no overdraw
1197*35238bceSAndroid Build Coastguard Worker     {
1198*35238bceSAndroid Build Coastguard Worker         const tcu::RGBA triangleColor = tcu::RGBA(127, 127, 127, 255);
1199*35238bceSAndroid Build Coastguard Worker         bool overdraw                 = false;
1200*35238bceSAndroid Build Coastguard Worker 
1201*35238bceSAndroid Build Coastguard Worker         m_testCtx.getLog() << tcu::TestLog::Message << "Verifying result." << tcu::TestLog::EndMessage;
1202*35238bceSAndroid Build Coastguard Worker 
1203*35238bceSAndroid Build Coastguard Worker         for (int y = 0; y < resultImage.getHeight(); ++y)
1204*35238bceSAndroid Build Coastguard Worker             for (int x = 0; x < resultImage.getWidth(); ++x)
1205*35238bceSAndroid Build Coastguard Worker             {
1206*35238bceSAndroid Build Coastguard Worker                 const tcu::RGBA color = resultImage.getPixel(x, y);
1207*35238bceSAndroid Build Coastguard Worker 
1208*35238bceSAndroid Build Coastguard Worker                 // color values are greater than triangle color? Allow lower values for multisampled edges and background.
1209*35238bceSAndroid Build Coastguard Worker                 if ((color.getRed() - triangleColor.getRed()) > thresholdRed ||
1210*35238bceSAndroid Build Coastguard Worker                     (color.getGreen() - triangleColor.getGreen()) > thresholdGreen ||
1211*35238bceSAndroid Build Coastguard Worker                     (color.getBlue() - triangleColor.getBlue()) > thresholdBlue)
1212*35238bceSAndroid Build Coastguard Worker                     overdraw = true;
1213*35238bceSAndroid Build Coastguard Worker             }
1214*35238bceSAndroid Build Coastguard Worker 
1215*35238bceSAndroid Build Coastguard Worker         // results
1216*35238bceSAndroid Build Coastguard Worker         if (!overdraw)
1217*35238bceSAndroid Build Coastguard Worker             m_testCtx.getLog() << tcu::TestLog::Message << "No overlapping fragments detected."
1218*35238bceSAndroid Build Coastguard Worker                                << tcu::TestLog::EndMessage;
1219*35238bceSAndroid Build Coastguard Worker         else
1220*35238bceSAndroid Build Coastguard Worker         {
1221*35238bceSAndroid Build Coastguard Worker             m_testCtx.getLog() << tcu::TestLog::Message << "Overlapping fragments detected, image is not valid."
1222*35238bceSAndroid Build Coastguard Worker                                << tcu::TestLog::EndMessage;
1223*35238bceSAndroid Build Coastguard Worker             m_testCtx.getLog() << tcu::TestLog::ImageSet("Result of rendering", "Result of rendering")
1224*35238bceSAndroid Build Coastguard Worker                                << tcu::TestLog::Image("Result", "Result", resultImage) << tcu::TestLog::EndImageSet;
1225*35238bceSAndroid Build Coastguard Worker 
1226*35238bceSAndroid Build Coastguard Worker             imageShown            = true;
1227*35238bceSAndroid Build Coastguard Worker             m_allIterationsPassed = false;
1228*35238bceSAndroid Build Coastguard Worker         }
1229*35238bceSAndroid Build Coastguard Worker     }
1230*35238bceSAndroid Build Coastguard Worker 
1231*35238bceSAndroid Build Coastguard Worker     // verify no missing fragments in the full viewport case
1232*35238bceSAndroid Build Coastguard Worker     if (m_caseType == FILLRULECASE_CLIPPED_FULL)
1233*35238bceSAndroid Build Coastguard Worker     {
1234*35238bceSAndroid Build Coastguard Worker         bool missingFragments = false;
1235*35238bceSAndroid Build Coastguard Worker 
1236*35238bceSAndroid Build Coastguard Worker         m_testCtx.getLog() << tcu::TestLog::Message << "Searching missing fragments." << tcu::TestLog::EndMessage;
1237*35238bceSAndroid Build Coastguard Worker 
1238*35238bceSAndroid Build Coastguard Worker         for (int y = 0; y < resultImage.getHeight(); ++y)
1239*35238bceSAndroid Build Coastguard Worker             for (int x = 0; x < resultImage.getWidth(); ++x)
1240*35238bceSAndroid Build Coastguard Worker             {
1241*35238bceSAndroid Build Coastguard Worker                 const tcu::RGBA color = resultImage.getPixel(x, y);
1242*35238bceSAndroid Build Coastguard Worker 
1243*35238bceSAndroid Build Coastguard Worker                 // black? (background)
1244*35238bceSAndroid Build Coastguard Worker                 if (color.getRed() <= thresholdRed || color.getGreen() <= thresholdGreen ||
1245*35238bceSAndroid Build Coastguard Worker                     color.getBlue() <= thresholdBlue)
1246*35238bceSAndroid Build Coastguard Worker                     missingFragments = true;
1247*35238bceSAndroid Build Coastguard Worker             }
1248*35238bceSAndroid Build Coastguard Worker 
1249*35238bceSAndroid Build Coastguard Worker         // results
1250*35238bceSAndroid Build Coastguard Worker         if (!missingFragments)
1251*35238bceSAndroid Build Coastguard Worker             m_testCtx.getLog() << tcu::TestLog::Message << "No missing fragments detected." << tcu::TestLog::EndMessage;
1252*35238bceSAndroid Build Coastguard Worker         else
1253*35238bceSAndroid Build Coastguard Worker         {
1254*35238bceSAndroid Build Coastguard Worker             m_testCtx.getLog() << tcu::TestLog::Message << "Missing fragments detected, image is not valid."
1255*35238bceSAndroid Build Coastguard Worker                                << tcu::TestLog::EndMessage;
1256*35238bceSAndroid Build Coastguard Worker 
1257*35238bceSAndroid Build Coastguard Worker             if (!imageShown)
1258*35238bceSAndroid Build Coastguard Worker             {
1259*35238bceSAndroid Build Coastguard Worker                 m_testCtx.getLog() << tcu::TestLog::ImageSet("Result of rendering", "Result of rendering")
1260*35238bceSAndroid Build Coastguard Worker                                    << tcu::TestLog::Image("Result", "Result", resultImage) << tcu::TestLog::EndImageSet;
1261*35238bceSAndroid Build Coastguard Worker             }
1262*35238bceSAndroid Build Coastguard Worker 
1263*35238bceSAndroid Build Coastguard Worker             m_allIterationsPassed = false;
1264*35238bceSAndroid Build Coastguard Worker         }
1265*35238bceSAndroid Build Coastguard Worker     }
1266*35238bceSAndroid Build Coastguard Worker 
1267*35238bceSAndroid Build Coastguard Worker     // result
1268*35238bceSAndroid Build Coastguard Worker     if (++m_iteration == m_iterationCount)
1269*35238bceSAndroid Build Coastguard Worker     {
1270*35238bceSAndroid Build Coastguard Worker         if (m_allIterationsPassed)
1271*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
1272*35238bceSAndroid Build Coastguard Worker         else
1273*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Found invalid pixels");
1274*35238bceSAndroid Build Coastguard Worker 
1275*35238bceSAndroid Build Coastguard Worker         return STOP;
1276*35238bceSAndroid Build Coastguard Worker     }
1277*35238bceSAndroid Build Coastguard Worker     else
1278*35238bceSAndroid Build Coastguard Worker         return CONTINUE;
1279*35238bceSAndroid Build Coastguard Worker }
1280*35238bceSAndroid Build Coastguard Worker 
getRenderSize(FillRuleCase::FillRuleCaseType type) const1281*35238bceSAndroid Build Coastguard Worker int FillRuleCase::getRenderSize(FillRuleCase::FillRuleCaseType type) const
1282*35238bceSAndroid Build Coastguard Worker {
1283*35238bceSAndroid Build Coastguard Worker     if (type == FILLRULECASE_CLIPPED_FULL || type == FILLRULECASE_CLIPPED_PARTIAL)
1284*35238bceSAndroid Build Coastguard Worker         return 64;
1285*35238bceSAndroid Build Coastguard Worker     else
1286*35238bceSAndroid Build Coastguard Worker         return 256;
1287*35238bceSAndroid Build Coastguard Worker }
1288*35238bceSAndroid Build Coastguard Worker 
getNumIterations(FillRuleCase::FillRuleCaseType type) const1289*35238bceSAndroid Build Coastguard Worker int FillRuleCase::getNumIterations(FillRuleCase::FillRuleCaseType type) const
1290*35238bceSAndroid Build Coastguard Worker {
1291*35238bceSAndroid Build Coastguard Worker     if (type == FILLRULECASE_CLIPPED_FULL || type == FILLRULECASE_CLIPPED_PARTIAL)
1292*35238bceSAndroid Build Coastguard Worker         return 15;
1293*35238bceSAndroid Build Coastguard Worker     else
1294*35238bceSAndroid Build Coastguard Worker         return 2;
1295*35238bceSAndroid Build Coastguard Worker }
1296*35238bceSAndroid Build Coastguard Worker 
generateTriangles(int iteration,std::vector<tcu::Vec4> & outData) const1297*35238bceSAndroid Build Coastguard Worker void FillRuleCase::generateTriangles(int iteration, std::vector<tcu::Vec4> &outData) const
1298*35238bceSAndroid Build Coastguard Worker {
1299*35238bceSAndroid Build Coastguard Worker     switch (m_caseType)
1300*35238bceSAndroid Build Coastguard Worker     {
1301*35238bceSAndroid Build Coastguard Worker     case FILLRULECASE_BASIC:
1302*35238bceSAndroid Build Coastguard Worker     case FILLRULECASE_REVERSED:
1303*35238bceSAndroid Build Coastguard Worker     case FILLRULECASE_PROJECTED:
1304*35238bceSAndroid Build Coastguard Worker     {
1305*35238bceSAndroid Build Coastguard Worker         const int numRows    = 4;
1306*35238bceSAndroid Build Coastguard Worker         const int numColumns = 4;
1307*35238bceSAndroid Build Coastguard Worker         const float quadSide = 0.15f;
1308*35238bceSAndroid Build Coastguard Worker         de::Random rnd(0xabcd);
1309*35238bceSAndroid Build Coastguard Worker 
1310*35238bceSAndroid Build Coastguard Worker         outData.resize(6 * numRows * numColumns);
1311*35238bceSAndroid Build Coastguard Worker 
1312*35238bceSAndroid Build Coastguard Worker         for (int col = 0; col < numColumns; ++col)
1313*35238bceSAndroid Build Coastguard Worker             for (int row = 0; row < numRows; ++row)
1314*35238bceSAndroid Build Coastguard Worker             {
1315*35238bceSAndroid Build Coastguard Worker                 const tcu::Vec2 center = tcu::Vec2(((float)row + 0.5f) / (float)numRows * 2.0f - 1.0f,
1316*35238bceSAndroid Build Coastguard Worker                                                    ((float)col + 0.5f) / (float)numColumns * 2.0f - 1.0f);
1317*35238bceSAndroid Build Coastguard Worker                 const float rotation   = float(iteration * numColumns * numRows + col * numRows + row) /
1318*35238bceSAndroid Build Coastguard Worker                                        (float)(m_iterationCount * numColumns * numRows) * DE_PI / 2.0f;
1319*35238bceSAndroid Build Coastguard Worker                 const tcu::Vec2 sideH   = quadSide * tcu::Vec2(deFloatCos(rotation), deFloatSin(rotation));
1320*35238bceSAndroid Build Coastguard Worker                 const tcu::Vec2 sideV   = tcu::Vec2(sideH.y(), -sideH.x());
1321*35238bceSAndroid Build Coastguard Worker                 const tcu::Vec2 quad[4] = {
1322*35238bceSAndroid Build Coastguard Worker                     center + sideH + sideV,
1323*35238bceSAndroid Build Coastguard Worker                     center + sideH - sideV,
1324*35238bceSAndroid Build Coastguard Worker                     center - sideH - sideV,
1325*35238bceSAndroid Build Coastguard Worker                     center - sideH + sideV,
1326*35238bceSAndroid Build Coastguard Worker                 };
1327*35238bceSAndroid Build Coastguard Worker 
1328*35238bceSAndroid Build Coastguard Worker                 if (m_caseType == FILLRULECASE_BASIC)
1329*35238bceSAndroid Build Coastguard Worker                 {
1330*35238bceSAndroid Build Coastguard Worker                     outData[6 * (col * numRows + row) + 0] = tcu::Vec4(quad[0].x(), quad[0].y(), 0.0f, 1.0f);
1331*35238bceSAndroid Build Coastguard Worker                     outData[6 * (col * numRows + row) + 1] = tcu::Vec4(quad[1].x(), quad[1].y(), 0.0f, 1.0f);
1332*35238bceSAndroid Build Coastguard Worker                     outData[6 * (col * numRows + row) + 2] = tcu::Vec4(quad[2].x(), quad[2].y(), 0.0f, 1.0f);
1333*35238bceSAndroid Build Coastguard Worker                     outData[6 * (col * numRows + row) + 3] = tcu::Vec4(quad[2].x(), quad[2].y(), 0.0f, 1.0f);
1334*35238bceSAndroid Build Coastguard Worker                     outData[6 * (col * numRows + row) + 4] = tcu::Vec4(quad[0].x(), quad[0].y(), 0.0f, 1.0f);
1335*35238bceSAndroid Build Coastguard Worker                     outData[6 * (col * numRows + row) + 5] = tcu::Vec4(quad[3].x(), quad[3].y(), 0.0f, 1.0f);
1336*35238bceSAndroid Build Coastguard Worker                 }
1337*35238bceSAndroid Build Coastguard Worker                 else if (m_caseType == FILLRULECASE_REVERSED)
1338*35238bceSAndroid Build Coastguard Worker                 {
1339*35238bceSAndroid Build Coastguard Worker                     outData[6 * (col * numRows + row) + 0] = tcu::Vec4(quad[0].x(), quad[0].y(), 0.0f, 1.0f);
1340*35238bceSAndroid Build Coastguard Worker                     outData[6 * (col * numRows + row) + 1] = tcu::Vec4(quad[1].x(), quad[1].y(), 0.0f, 1.0f);
1341*35238bceSAndroid Build Coastguard Worker                     outData[6 * (col * numRows + row) + 2] = tcu::Vec4(quad[2].x(), quad[2].y(), 0.0f, 1.0f);
1342*35238bceSAndroid Build Coastguard Worker                     outData[6 * (col * numRows + row) + 3] = tcu::Vec4(quad[0].x(), quad[0].y(), 0.0f, 1.0f);
1343*35238bceSAndroid Build Coastguard Worker                     outData[6 * (col * numRows + row) + 4] = tcu::Vec4(quad[2].x(), quad[2].y(), 0.0f, 1.0f);
1344*35238bceSAndroid Build Coastguard Worker                     outData[6 * (col * numRows + row) + 5] = tcu::Vec4(quad[3].x(), quad[3].y(), 0.0f, 1.0f);
1345*35238bceSAndroid Build Coastguard Worker                 }
1346*35238bceSAndroid Build Coastguard Worker                 else if (m_caseType == FILLRULECASE_PROJECTED)
1347*35238bceSAndroid Build Coastguard Worker                 {
1348*35238bceSAndroid Build Coastguard Worker                     const float w0 = rnd.getFloat(0.1f, 4.0f);
1349*35238bceSAndroid Build Coastguard Worker                     const float w1 = rnd.getFloat(0.1f, 4.0f);
1350*35238bceSAndroid Build Coastguard Worker                     const float w2 = rnd.getFloat(0.1f, 4.0f);
1351*35238bceSAndroid Build Coastguard Worker                     const float w3 = rnd.getFloat(0.1f, 4.0f);
1352*35238bceSAndroid Build Coastguard Worker 
1353*35238bceSAndroid Build Coastguard Worker                     outData[6 * (col * numRows + row) + 0] = tcu::Vec4(quad[0].x() * w0, quad[0].y() * w0, 0.0f, w0);
1354*35238bceSAndroid Build Coastguard Worker                     outData[6 * (col * numRows + row) + 1] = tcu::Vec4(quad[1].x() * w1, quad[1].y() * w1, 0.0f, w1);
1355*35238bceSAndroid Build Coastguard Worker                     outData[6 * (col * numRows + row) + 2] = tcu::Vec4(quad[2].x() * w2, quad[2].y() * w2, 0.0f, w2);
1356*35238bceSAndroid Build Coastguard Worker                     outData[6 * (col * numRows + row) + 3] = tcu::Vec4(quad[2].x() * w2, quad[2].y() * w2, 0.0f, w2);
1357*35238bceSAndroid Build Coastguard Worker                     outData[6 * (col * numRows + row) + 4] = tcu::Vec4(quad[0].x() * w0, quad[0].y() * w0, 0.0f, w0);
1358*35238bceSAndroid Build Coastguard Worker                     outData[6 * (col * numRows + row) + 5] = tcu::Vec4(quad[3].x() * w3, quad[3].y() * w3, 0.0f, w3);
1359*35238bceSAndroid Build Coastguard Worker                 }
1360*35238bceSAndroid Build Coastguard Worker                 else
1361*35238bceSAndroid Build Coastguard Worker                     DE_ASSERT(false);
1362*35238bceSAndroid Build Coastguard Worker             }
1363*35238bceSAndroid Build Coastguard Worker 
1364*35238bceSAndroid Build Coastguard Worker         break;
1365*35238bceSAndroid Build Coastguard Worker     }
1366*35238bceSAndroid Build Coastguard Worker 
1367*35238bceSAndroid Build Coastguard Worker     case FILLRULECASE_CLIPPED_PARTIAL:
1368*35238bceSAndroid Build Coastguard Worker     case FILLRULECASE_CLIPPED_FULL:
1369*35238bceSAndroid Build Coastguard Worker     {
1370*35238bceSAndroid Build Coastguard Worker         const float quadSide = (m_caseType == FILLRULECASE_CLIPPED_PARTIAL) ? (1.0f) : (2.0f);
1371*35238bceSAndroid Build Coastguard Worker         const tcu::Vec2 center =
1372*35238bceSAndroid Build Coastguard Worker             (m_caseType == FILLRULECASE_CLIPPED_PARTIAL) ? (tcu::Vec2(0.5f, 0.5f)) : (tcu::Vec2(0.0f, 0.0f));
1373*35238bceSAndroid Build Coastguard Worker         const float rotation    = (float)(iteration) / (float)(m_iterationCount - 1) * DE_PI / 2.0f;
1374*35238bceSAndroid Build Coastguard Worker         const tcu::Vec2 sideH   = quadSide * tcu::Vec2(deFloatCos(rotation), deFloatSin(rotation));
1375*35238bceSAndroid Build Coastguard Worker         const tcu::Vec2 sideV   = tcu::Vec2(sideH.y(), -sideH.x());
1376*35238bceSAndroid Build Coastguard Worker         const tcu::Vec2 quad[4] = {
1377*35238bceSAndroid Build Coastguard Worker             center + sideH + sideV,
1378*35238bceSAndroid Build Coastguard Worker             center + sideH - sideV,
1379*35238bceSAndroid Build Coastguard Worker             center - sideH - sideV,
1380*35238bceSAndroid Build Coastguard Worker             center - sideH + sideV,
1381*35238bceSAndroid Build Coastguard Worker         };
1382*35238bceSAndroid Build Coastguard Worker 
1383*35238bceSAndroid Build Coastguard Worker         outData.resize(6);
1384*35238bceSAndroid Build Coastguard Worker         outData[0] = tcu::Vec4(quad[0].x(), quad[0].y(), 0.0f, 1.0f);
1385*35238bceSAndroid Build Coastguard Worker         outData[1] = tcu::Vec4(quad[1].x(), quad[1].y(), 0.0f, 1.0f);
1386*35238bceSAndroid Build Coastguard Worker         outData[2] = tcu::Vec4(quad[2].x(), quad[2].y(), 0.0f, 1.0f);
1387*35238bceSAndroid Build Coastguard Worker         outData[3] = tcu::Vec4(quad[2].x(), quad[2].y(), 0.0f, 1.0f);
1388*35238bceSAndroid Build Coastguard Worker         outData[4] = tcu::Vec4(quad[0].x(), quad[0].y(), 0.0f, 1.0f);
1389*35238bceSAndroid Build Coastguard Worker         outData[5] = tcu::Vec4(quad[3].x(), quad[3].y(), 0.0f, 1.0f);
1390*35238bceSAndroid Build Coastguard Worker         break;
1391*35238bceSAndroid Build Coastguard Worker     }
1392*35238bceSAndroid Build Coastguard Worker 
1393*35238bceSAndroid Build Coastguard Worker     default:
1394*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
1395*35238bceSAndroid Build Coastguard Worker     }
1396*35238bceSAndroid Build Coastguard Worker }
1397*35238bceSAndroid Build Coastguard Worker 
1398*35238bceSAndroid Build Coastguard Worker class CullingTest : public BaseRenderingCase
1399*35238bceSAndroid Build Coastguard Worker {
1400*35238bceSAndroid Build Coastguard Worker public:
1401*35238bceSAndroid Build Coastguard Worker     CullingTest(Context &ctx, const char *name, const char *desc, glw::GLenum cullMode, glw::GLenum primitive,
1402*35238bceSAndroid Build Coastguard Worker                 glw::GLenum faceOrder);
1403*35238bceSAndroid Build Coastguard Worker     ~CullingTest(void);
1404*35238bceSAndroid Build Coastguard Worker     IterateResult iterate(void);
1405*35238bceSAndroid Build Coastguard Worker 
1406*35238bceSAndroid Build Coastguard Worker private:
1407*35238bceSAndroid Build Coastguard Worker     void generateVertices(std::vector<tcu::Vec4> &outData) const;
1408*35238bceSAndroid Build Coastguard Worker     void extractTriangles(std::vector<TriangleSceneSpec::SceneTriangle> &outTriangles,
1409*35238bceSAndroid Build Coastguard Worker                           const std::vector<tcu::Vec4> &vertices) const;
1410*35238bceSAndroid Build Coastguard Worker     bool triangleOrder(const tcu::Vec4 &v0, const tcu::Vec4 &v1, const tcu::Vec4 &v2) const;
1411*35238bceSAndroid Build Coastguard Worker 
1412*35238bceSAndroid Build Coastguard Worker     const glw::GLenum m_cullMode;
1413*35238bceSAndroid Build Coastguard Worker     const glw::GLenum m_primitive;
1414*35238bceSAndroid Build Coastguard Worker     const glw::GLenum m_faceOrder;
1415*35238bceSAndroid Build Coastguard Worker };
1416*35238bceSAndroid Build Coastguard Worker 
CullingTest(Context & ctx,const char * name,const char * desc,glw::GLenum cullMode,glw::GLenum primitive,glw::GLenum faceOrder)1417*35238bceSAndroid Build Coastguard Worker CullingTest::CullingTest(Context &ctx, const char *name, const char *desc, glw::GLenum cullMode, glw::GLenum primitive,
1418*35238bceSAndroid Build Coastguard Worker                          glw::GLenum faceOrder)
1419*35238bceSAndroid Build Coastguard Worker     : BaseRenderingCase(ctx, name, desc)
1420*35238bceSAndroid Build Coastguard Worker     , m_cullMode(cullMode)
1421*35238bceSAndroid Build Coastguard Worker     , m_primitive(primitive)
1422*35238bceSAndroid Build Coastguard Worker     , m_faceOrder(faceOrder)
1423*35238bceSAndroid Build Coastguard Worker {
1424*35238bceSAndroid Build Coastguard Worker }
1425*35238bceSAndroid Build Coastguard Worker 
~CullingTest(void)1426*35238bceSAndroid Build Coastguard Worker CullingTest::~CullingTest(void)
1427*35238bceSAndroid Build Coastguard Worker {
1428*35238bceSAndroid Build Coastguard Worker }
1429*35238bceSAndroid Build Coastguard Worker 
iterate(void)1430*35238bceSAndroid Build Coastguard Worker CullingTest::IterateResult CullingTest::iterate(void)
1431*35238bceSAndroid Build Coastguard Worker {
1432*35238bceSAndroid Build Coastguard Worker     tcu::Surface resultImage(m_renderSize, m_renderSize);
1433*35238bceSAndroid Build Coastguard Worker     std::vector<tcu::Vec4> drawBuffer;
1434*35238bceSAndroid Build Coastguard Worker     std::vector<TriangleSceneSpec::SceneTriangle> triangles;
1435*35238bceSAndroid Build Coastguard Worker 
1436*35238bceSAndroid Build Coastguard Worker     // generate scene
1437*35238bceSAndroid Build Coastguard Worker     generateVertices(drawBuffer);
1438*35238bceSAndroid Build Coastguard Worker     extractTriangles(triangles, drawBuffer);
1439*35238bceSAndroid Build Coastguard Worker 
1440*35238bceSAndroid Build Coastguard Worker     // draw image
1441*35238bceSAndroid Build Coastguard Worker     {
1442*35238bceSAndroid Build Coastguard Worker         const glw::Functions &gl = m_context.getRenderContext().getFunctions();
1443*35238bceSAndroid Build Coastguard Worker 
1444*35238bceSAndroid Build Coastguard Worker         gl.enable(GL_CULL_FACE);
1445*35238bceSAndroid Build Coastguard Worker         gl.cullFace(m_cullMode);
1446*35238bceSAndroid Build Coastguard Worker         gl.frontFace(m_faceOrder);
1447*35238bceSAndroid Build Coastguard Worker 
1448*35238bceSAndroid Build Coastguard Worker         m_testCtx.getLog() << tcu::TestLog::Message << "Setting front face to " << glu::getWindingName(m_faceOrder)
1449*35238bceSAndroid Build Coastguard Worker                            << tcu::TestLog::EndMessage;
1450*35238bceSAndroid Build Coastguard Worker         m_testCtx.getLog() << tcu::TestLog::Message << "Setting cull face to " << glu::getFaceName(m_cullMode)
1451*35238bceSAndroid Build Coastguard Worker                            << tcu::TestLog::EndMessage;
1452*35238bceSAndroid Build Coastguard Worker         m_testCtx.getLog() << tcu::TestLog::Message << "Drawing test pattern ("
1453*35238bceSAndroid Build Coastguard Worker                            << glu::getPrimitiveTypeName(m_primitive) << ")" << tcu::TestLog::EndMessage;
1454*35238bceSAndroid Build Coastguard Worker 
1455*35238bceSAndroid Build Coastguard Worker         drawPrimitives(resultImage, drawBuffer, m_primitive);
1456*35238bceSAndroid Build Coastguard Worker     }
1457*35238bceSAndroid Build Coastguard Worker 
1458*35238bceSAndroid Build Coastguard Worker     // compare
1459*35238bceSAndroid Build Coastguard Worker     {
1460*35238bceSAndroid Build Coastguard Worker         RasterizationArguments args;
1461*35238bceSAndroid Build Coastguard Worker         TriangleSceneSpec scene;
1462*35238bceSAndroid Build Coastguard Worker 
1463*35238bceSAndroid Build Coastguard Worker         args.numSamples   = m_numSamples;
1464*35238bceSAndroid Build Coastguard Worker         args.subpixelBits = m_subpixelBits;
1465*35238bceSAndroid Build Coastguard Worker         args.redBits      = m_context.getRenderTarget().getPixelFormat().redBits;
1466*35238bceSAndroid Build Coastguard Worker         args.greenBits    = m_context.getRenderTarget().getPixelFormat().greenBits;
1467*35238bceSAndroid Build Coastguard Worker         args.blueBits     = m_context.getRenderTarget().getPixelFormat().blueBits;
1468*35238bceSAndroid Build Coastguard Worker 
1469*35238bceSAndroid Build Coastguard Worker         scene.triangles.swap(triangles);
1470*35238bceSAndroid Build Coastguard Worker 
1471*35238bceSAndroid Build Coastguard Worker         if (verifyTriangleGroupRasterization(resultImage, scene, args, m_testCtx.getLog(), tcu::VERIFICATIONMODE_WEAK))
1472*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
1473*35238bceSAndroid Build Coastguard Worker         else
1474*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Incorrect rendering");
1475*35238bceSAndroid Build Coastguard Worker     }
1476*35238bceSAndroid Build Coastguard Worker 
1477*35238bceSAndroid Build Coastguard Worker     return STOP;
1478*35238bceSAndroid Build Coastguard Worker }
1479*35238bceSAndroid Build Coastguard Worker 
generateVertices(std::vector<tcu::Vec4> & outData) const1480*35238bceSAndroid Build Coastguard Worker void CullingTest::generateVertices(std::vector<tcu::Vec4> &outData) const
1481*35238bceSAndroid Build Coastguard Worker {
1482*35238bceSAndroid Build Coastguard Worker     de::Random rnd(543210);
1483*35238bceSAndroid Build Coastguard Worker 
1484*35238bceSAndroid Build Coastguard Worker     outData.resize(6);
1485*35238bceSAndroid Build Coastguard Worker     for (int vtxNdx = 0; vtxNdx < (int)outData.size(); ++vtxNdx)
1486*35238bceSAndroid Build Coastguard Worker     {
1487*35238bceSAndroid Build Coastguard Worker         outData[vtxNdx].x() = rnd.getFloat(-0.9f, 0.9f);
1488*35238bceSAndroid Build Coastguard Worker         outData[vtxNdx].y() = rnd.getFloat(-0.9f, 0.9f);
1489*35238bceSAndroid Build Coastguard Worker         outData[vtxNdx].z() = 0.0f;
1490*35238bceSAndroid Build Coastguard Worker         outData[vtxNdx].w() = 1.0f;
1491*35238bceSAndroid Build Coastguard Worker     }
1492*35238bceSAndroid Build Coastguard Worker }
1493*35238bceSAndroid Build Coastguard Worker 
extractTriangles(std::vector<TriangleSceneSpec::SceneTriangle> & outTriangles,const std::vector<tcu::Vec4> & vertices) const1494*35238bceSAndroid Build Coastguard Worker void CullingTest::extractTriangles(std::vector<TriangleSceneSpec::SceneTriangle> &outTriangles,
1495*35238bceSAndroid Build Coastguard Worker                                    const std::vector<tcu::Vec4> &vertices) const
1496*35238bceSAndroid Build Coastguard Worker {
1497*35238bceSAndroid Build Coastguard Worker     const bool cullDirection = (m_cullMode == GL_FRONT) ^ (m_faceOrder == GL_CCW);
1498*35238bceSAndroid Build Coastguard Worker 
1499*35238bceSAndroid Build Coastguard Worker     // No triangles
1500*35238bceSAndroid Build Coastguard Worker     if (m_cullMode == GL_FRONT_AND_BACK)
1501*35238bceSAndroid Build Coastguard Worker         return;
1502*35238bceSAndroid Build Coastguard Worker 
1503*35238bceSAndroid Build Coastguard Worker     switch (m_primitive)
1504*35238bceSAndroid Build Coastguard Worker     {
1505*35238bceSAndroid Build Coastguard Worker     case GL_TRIANGLES:
1506*35238bceSAndroid Build Coastguard Worker     {
1507*35238bceSAndroid Build Coastguard Worker         for (int vtxNdx = 0; vtxNdx < (int)vertices.size() - 2; vtxNdx += 3)
1508*35238bceSAndroid Build Coastguard Worker         {
1509*35238bceSAndroid Build Coastguard Worker             const tcu::Vec4 &v0 = vertices[vtxNdx + 0];
1510*35238bceSAndroid Build Coastguard Worker             const tcu::Vec4 &v1 = vertices[vtxNdx + 1];
1511*35238bceSAndroid Build Coastguard Worker             const tcu::Vec4 &v2 = vertices[vtxNdx + 2];
1512*35238bceSAndroid Build Coastguard Worker 
1513*35238bceSAndroid Build Coastguard Worker             if (triangleOrder(v0, v1, v2) != cullDirection)
1514*35238bceSAndroid Build Coastguard Worker             {
1515*35238bceSAndroid Build Coastguard Worker                 TriangleSceneSpec::SceneTriangle tri;
1516*35238bceSAndroid Build Coastguard Worker                 tri.positions[0]  = v0;
1517*35238bceSAndroid Build Coastguard Worker                 tri.sharedEdge[0] = false;
1518*35238bceSAndroid Build Coastguard Worker                 tri.positions[1]  = v1;
1519*35238bceSAndroid Build Coastguard Worker                 tri.sharedEdge[1] = false;
1520*35238bceSAndroid Build Coastguard Worker                 tri.positions[2]  = v2;
1521*35238bceSAndroid Build Coastguard Worker                 tri.sharedEdge[2] = false;
1522*35238bceSAndroid Build Coastguard Worker 
1523*35238bceSAndroid Build Coastguard Worker                 outTriangles.push_back(tri);
1524*35238bceSAndroid Build Coastguard Worker             }
1525*35238bceSAndroid Build Coastguard Worker         }
1526*35238bceSAndroid Build Coastguard Worker         break;
1527*35238bceSAndroid Build Coastguard Worker     }
1528*35238bceSAndroid Build Coastguard Worker 
1529*35238bceSAndroid Build Coastguard Worker     case GL_TRIANGLE_STRIP:
1530*35238bceSAndroid Build Coastguard Worker     {
1531*35238bceSAndroid Build Coastguard Worker         for (int vtxNdx = 0; vtxNdx < (int)vertices.size() - 2; ++vtxNdx)
1532*35238bceSAndroid Build Coastguard Worker         {
1533*35238bceSAndroid Build Coastguard Worker             const tcu::Vec4 &v0 = vertices[vtxNdx + 0];
1534*35238bceSAndroid Build Coastguard Worker             const tcu::Vec4 &v1 = vertices[vtxNdx + 1];
1535*35238bceSAndroid Build Coastguard Worker             const tcu::Vec4 &v2 = vertices[vtxNdx + 2];
1536*35238bceSAndroid Build Coastguard Worker 
1537*35238bceSAndroid Build Coastguard Worker             if (triangleOrder(v0, v1, v2) != (cullDirection ^ (vtxNdx % 2 != 0)))
1538*35238bceSAndroid Build Coastguard Worker             {
1539*35238bceSAndroid Build Coastguard Worker                 TriangleSceneSpec::SceneTriangle tri;
1540*35238bceSAndroid Build Coastguard Worker                 tri.positions[0]  = v0;
1541*35238bceSAndroid Build Coastguard Worker                 tri.sharedEdge[0] = false;
1542*35238bceSAndroid Build Coastguard Worker                 tri.positions[1]  = v1;
1543*35238bceSAndroid Build Coastguard Worker                 tri.sharedEdge[1] = false;
1544*35238bceSAndroid Build Coastguard Worker                 tri.positions[2]  = v2;
1545*35238bceSAndroid Build Coastguard Worker                 tri.sharedEdge[2] = false;
1546*35238bceSAndroid Build Coastguard Worker 
1547*35238bceSAndroid Build Coastguard Worker                 outTriangles.push_back(tri);
1548*35238bceSAndroid Build Coastguard Worker             }
1549*35238bceSAndroid Build Coastguard Worker         }
1550*35238bceSAndroid Build Coastguard Worker         break;
1551*35238bceSAndroid Build Coastguard Worker     }
1552*35238bceSAndroid Build Coastguard Worker 
1553*35238bceSAndroid Build Coastguard Worker     case GL_TRIANGLE_FAN:
1554*35238bceSAndroid Build Coastguard Worker     {
1555*35238bceSAndroid Build Coastguard Worker         for (int vtxNdx = 1; vtxNdx < (int)vertices.size() - 1; ++vtxNdx)
1556*35238bceSAndroid Build Coastguard Worker         {
1557*35238bceSAndroid Build Coastguard Worker             const tcu::Vec4 &v0 = vertices[0];
1558*35238bceSAndroid Build Coastguard Worker             const tcu::Vec4 &v1 = vertices[vtxNdx + 0];
1559*35238bceSAndroid Build Coastguard Worker             const tcu::Vec4 &v2 = vertices[vtxNdx + 1];
1560*35238bceSAndroid Build Coastguard Worker 
1561*35238bceSAndroid Build Coastguard Worker             if (triangleOrder(v0, v1, v2) != cullDirection)
1562*35238bceSAndroid Build Coastguard Worker             {
1563*35238bceSAndroid Build Coastguard Worker                 TriangleSceneSpec::SceneTriangle tri;
1564*35238bceSAndroid Build Coastguard Worker                 tri.positions[0]  = v0;
1565*35238bceSAndroid Build Coastguard Worker                 tri.sharedEdge[0] = false;
1566*35238bceSAndroid Build Coastguard Worker                 tri.positions[1]  = v1;
1567*35238bceSAndroid Build Coastguard Worker                 tri.sharedEdge[1] = false;
1568*35238bceSAndroid Build Coastguard Worker                 tri.positions[2]  = v2;
1569*35238bceSAndroid Build Coastguard Worker                 tri.sharedEdge[2] = false;
1570*35238bceSAndroid Build Coastguard Worker 
1571*35238bceSAndroid Build Coastguard Worker                 outTriangles.push_back(tri);
1572*35238bceSAndroid Build Coastguard Worker             }
1573*35238bceSAndroid Build Coastguard Worker         }
1574*35238bceSAndroid Build Coastguard Worker         break;
1575*35238bceSAndroid Build Coastguard Worker     }
1576*35238bceSAndroid Build Coastguard Worker 
1577*35238bceSAndroid Build Coastguard Worker     default:
1578*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
1579*35238bceSAndroid Build Coastguard Worker     }
1580*35238bceSAndroid Build Coastguard Worker }
1581*35238bceSAndroid Build Coastguard Worker 
triangleOrder(const tcu::Vec4 & v0,const tcu::Vec4 & v1,const tcu::Vec4 & v2) const1582*35238bceSAndroid Build Coastguard Worker bool CullingTest::triangleOrder(const tcu::Vec4 &v0, const tcu::Vec4 &v1, const tcu::Vec4 &v2) const
1583*35238bceSAndroid Build Coastguard Worker {
1584*35238bceSAndroid Build Coastguard Worker     const tcu::Vec2 s0 = v0.swizzle(0, 1) / v0.w();
1585*35238bceSAndroid Build Coastguard Worker     const tcu::Vec2 s1 = v1.swizzle(0, 1) / v1.w();
1586*35238bceSAndroid Build Coastguard Worker     const tcu::Vec2 s2 = v2.swizzle(0, 1) / v2.w();
1587*35238bceSAndroid Build Coastguard Worker 
1588*35238bceSAndroid Build Coastguard Worker     // cross
1589*35238bceSAndroid Build Coastguard Worker     return ((s1.x() - s0.x()) * (s2.y() - s0.y()) - (s2.x() - s0.x()) * (s1.y() - s0.y())) < 0;
1590*35238bceSAndroid Build Coastguard Worker }
1591*35238bceSAndroid Build Coastguard Worker 
1592*35238bceSAndroid Build Coastguard Worker class TriangleInterpolationTest : public BaseRenderingCase
1593*35238bceSAndroid Build Coastguard Worker {
1594*35238bceSAndroid Build Coastguard Worker public:
1595*35238bceSAndroid Build Coastguard Worker     TriangleInterpolationTest(Context &ctx, const char *name, const char *desc, glw::GLenum primitive, int flags);
1596*35238bceSAndroid Build Coastguard Worker     ~TriangleInterpolationTest(void);
1597*35238bceSAndroid Build Coastguard Worker     IterateResult iterate(void);
1598*35238bceSAndroid Build Coastguard Worker 
1599*35238bceSAndroid Build Coastguard Worker private:
1600*35238bceSAndroid Build Coastguard Worker     void generateVertices(int iteration, std::vector<tcu::Vec4> &outVertices, std::vector<tcu::Vec4> &outColors) const;
1601*35238bceSAndroid Build Coastguard Worker     void extractTriangles(std::vector<TriangleSceneSpec::SceneTriangle> &outTriangles,
1602*35238bceSAndroid Build Coastguard Worker                           const std::vector<tcu::Vec4> &vertices, const std::vector<tcu::Vec4> &colors) const;
1603*35238bceSAndroid Build Coastguard Worker 
1604*35238bceSAndroid Build Coastguard Worker     const glw::GLenum m_primitive;
1605*35238bceSAndroid Build Coastguard Worker     const bool m_projective;
1606*35238bceSAndroid Build Coastguard Worker     const int m_iterationCount;
1607*35238bceSAndroid Build Coastguard Worker 
1608*35238bceSAndroid Build Coastguard Worker     int m_iteration;
1609*35238bceSAndroid Build Coastguard Worker     bool m_allIterationsPassed;
1610*35238bceSAndroid Build Coastguard Worker };
1611*35238bceSAndroid Build Coastguard Worker 
TriangleInterpolationTest(Context & ctx,const char * name,const char * desc,glw::GLenum primitive,int flags)1612*35238bceSAndroid Build Coastguard Worker TriangleInterpolationTest::TriangleInterpolationTest(Context &ctx, const char *name, const char *desc,
1613*35238bceSAndroid Build Coastguard Worker                                                      glw::GLenum primitive, int flags)
1614*35238bceSAndroid Build Coastguard Worker     : BaseRenderingCase(ctx, name, desc)
1615*35238bceSAndroid Build Coastguard Worker     , m_primitive(primitive)
1616*35238bceSAndroid Build Coastguard Worker     , m_projective((flags & INTERPOLATIONFLAGS_PROJECTED) != 0)
1617*35238bceSAndroid Build Coastguard Worker     , m_iterationCount(3)
1618*35238bceSAndroid Build Coastguard Worker     , m_iteration(0)
1619*35238bceSAndroid Build Coastguard Worker     , m_allIterationsPassed(true)
1620*35238bceSAndroid Build Coastguard Worker {
1621*35238bceSAndroid Build Coastguard Worker }
1622*35238bceSAndroid Build Coastguard Worker 
~TriangleInterpolationTest(void)1623*35238bceSAndroid Build Coastguard Worker TriangleInterpolationTest::~TriangleInterpolationTest(void)
1624*35238bceSAndroid Build Coastguard Worker {
1625*35238bceSAndroid Build Coastguard Worker     deinit();
1626*35238bceSAndroid Build Coastguard Worker }
1627*35238bceSAndroid Build Coastguard Worker 
iterate(void)1628*35238bceSAndroid Build Coastguard Worker TriangleInterpolationTest::IterateResult TriangleInterpolationTest::iterate(void)
1629*35238bceSAndroid Build Coastguard Worker {
1630*35238bceSAndroid Build Coastguard Worker     const std::string iterationDescription =
1631*35238bceSAndroid Build Coastguard Worker         "Test iteration " + de::toString(m_iteration + 1) + " / " + de::toString(m_iterationCount);
1632*35238bceSAndroid Build Coastguard Worker     const tcu::ScopedLogSection section(m_testCtx.getLog(), "Iteration" + de::toString(m_iteration + 1),
1633*35238bceSAndroid Build Coastguard Worker                                         iterationDescription);
1634*35238bceSAndroid Build Coastguard Worker     tcu::Surface resultImage(m_renderSize, m_renderSize);
1635*35238bceSAndroid Build Coastguard Worker     std::vector<tcu::Vec4> drawBuffer;
1636*35238bceSAndroid Build Coastguard Worker     std::vector<tcu::Vec4> colorBuffer;
1637*35238bceSAndroid Build Coastguard Worker     std::vector<TriangleSceneSpec::SceneTriangle> triangles;
1638*35238bceSAndroid Build Coastguard Worker 
1639*35238bceSAndroid Build Coastguard Worker     // generate scene
1640*35238bceSAndroid Build Coastguard Worker     generateVertices(m_iteration, drawBuffer, colorBuffer);
1641*35238bceSAndroid Build Coastguard Worker     extractTriangles(triangles, drawBuffer, colorBuffer);
1642*35238bceSAndroid Build Coastguard Worker 
1643*35238bceSAndroid Build Coastguard Worker     // log
1644*35238bceSAndroid Build Coastguard Worker     {
1645*35238bceSAndroid Build Coastguard Worker         m_testCtx.getLog() << tcu::TestLog::Message << "Generated vertices:" << tcu::TestLog::EndMessage;
1646*35238bceSAndroid Build Coastguard Worker         for (int vtxNdx = 0; vtxNdx < (int)drawBuffer.size(); ++vtxNdx)
1647*35238bceSAndroid Build Coastguard Worker             m_testCtx.getLog() << tcu::TestLog::Message << "\t" << drawBuffer[vtxNdx]
1648*35238bceSAndroid Build Coastguard Worker                                << ",\tcolor= " << colorBuffer[vtxNdx] << tcu::TestLog::EndMessage;
1649*35238bceSAndroid Build Coastguard Worker     }
1650*35238bceSAndroid Build Coastguard Worker 
1651*35238bceSAndroid Build Coastguard Worker     // draw image
1652*35238bceSAndroid Build Coastguard Worker     drawPrimitives(resultImage, drawBuffer, colorBuffer, m_primitive);
1653*35238bceSAndroid Build Coastguard Worker 
1654*35238bceSAndroid Build Coastguard Worker     // compare
1655*35238bceSAndroid Build Coastguard Worker     {
1656*35238bceSAndroid Build Coastguard Worker         RasterizationArguments args;
1657*35238bceSAndroid Build Coastguard Worker         TriangleSceneSpec scene;
1658*35238bceSAndroid Build Coastguard Worker 
1659*35238bceSAndroid Build Coastguard Worker         args.numSamples   = m_numSamples;
1660*35238bceSAndroid Build Coastguard Worker         args.subpixelBits = m_subpixelBits;
1661*35238bceSAndroid Build Coastguard Worker         args.redBits      = m_context.getRenderTarget().getPixelFormat().redBits;
1662*35238bceSAndroid Build Coastguard Worker         args.greenBits    = m_context.getRenderTarget().getPixelFormat().greenBits;
1663*35238bceSAndroid Build Coastguard Worker         args.blueBits     = m_context.getRenderTarget().getPixelFormat().blueBits;
1664*35238bceSAndroid Build Coastguard Worker 
1665*35238bceSAndroid Build Coastguard Worker         scene.triangles.swap(triangles);
1666*35238bceSAndroid Build Coastguard Worker 
1667*35238bceSAndroid Build Coastguard Worker         if (!verifyTriangleGroupInterpolation(resultImage, scene, args, m_testCtx.getLog()))
1668*35238bceSAndroid Build Coastguard Worker             m_allIterationsPassed = false;
1669*35238bceSAndroid Build Coastguard Worker     }
1670*35238bceSAndroid Build Coastguard Worker 
1671*35238bceSAndroid Build Coastguard Worker     // result
1672*35238bceSAndroid Build Coastguard Worker     if (++m_iteration == m_iterationCount)
1673*35238bceSAndroid Build Coastguard Worker     {
1674*35238bceSAndroid Build Coastguard Worker         if (m_allIterationsPassed)
1675*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
1676*35238bceSAndroid Build Coastguard Worker         else
1677*35238bceSAndroid Build Coastguard Worker             m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Found invalid pixel values");
1678*35238bceSAndroid Build Coastguard Worker 
1679*35238bceSAndroid Build Coastguard Worker         return STOP;
1680*35238bceSAndroid Build Coastguard Worker     }
1681*35238bceSAndroid Build Coastguard Worker     else
1682*35238bceSAndroid Build Coastguard Worker         return CONTINUE;
1683*35238bceSAndroid Build Coastguard Worker }
1684*35238bceSAndroid Build Coastguard Worker 
generateVertices(int iteration,std::vector<tcu::Vec4> & outVertices,std::vector<tcu::Vec4> & outColors) const1685*35238bceSAndroid Build Coastguard Worker void TriangleInterpolationTest::generateVertices(int iteration, std::vector<tcu::Vec4> &outVertices,
1686*35238bceSAndroid Build Coastguard Worker                                                  std::vector<tcu::Vec4> &outColors) const
1687*35238bceSAndroid Build Coastguard Worker {
1688*35238bceSAndroid Build Coastguard Worker     // use only red, green and blue
1689*35238bceSAndroid Build Coastguard Worker     const tcu::Vec4 colors[] = {
1690*35238bceSAndroid Build Coastguard Worker         tcu::Vec4(1.0f, 0.0f, 0.0f, 1.0f),
1691*35238bceSAndroid Build Coastguard Worker         tcu::Vec4(0.0f, 1.0f, 0.0f, 1.0f),
1692*35238bceSAndroid Build Coastguard Worker         tcu::Vec4(0.0f, 0.0f, 1.0f, 1.0f),
1693*35238bceSAndroid Build Coastguard Worker     };
1694*35238bceSAndroid Build Coastguard Worker 
1695*35238bceSAndroid Build Coastguard Worker     de::Random rnd(123 + iteration * 1000 + (int)m_primitive);
1696*35238bceSAndroid Build Coastguard Worker 
1697*35238bceSAndroid Build Coastguard Worker     outVertices.resize(6);
1698*35238bceSAndroid Build Coastguard Worker     outColors.resize(6);
1699*35238bceSAndroid Build Coastguard Worker 
1700*35238bceSAndroid Build Coastguard Worker     for (int vtxNdx = 0; vtxNdx < (int)outVertices.size(); ++vtxNdx)
1701*35238bceSAndroid Build Coastguard Worker     {
1702*35238bceSAndroid Build Coastguard Worker         outVertices[vtxNdx].x() = rnd.getFloat(-0.9f, 0.9f);
1703*35238bceSAndroid Build Coastguard Worker         outVertices[vtxNdx].y() = rnd.getFloat(-0.9f, 0.9f);
1704*35238bceSAndroid Build Coastguard Worker         outVertices[vtxNdx].z() = 0.0f;
1705*35238bceSAndroid Build Coastguard Worker 
1706*35238bceSAndroid Build Coastguard Worker         if (!m_projective)
1707*35238bceSAndroid Build Coastguard Worker             outVertices[vtxNdx].w() = 1.0f;
1708*35238bceSAndroid Build Coastguard Worker         else
1709*35238bceSAndroid Build Coastguard Worker         {
1710*35238bceSAndroid Build Coastguard Worker             const float w = rnd.getFloat(0.2f, 4.0f);
1711*35238bceSAndroid Build Coastguard Worker 
1712*35238bceSAndroid Build Coastguard Worker             outVertices[vtxNdx].x() *= w;
1713*35238bceSAndroid Build Coastguard Worker             outVertices[vtxNdx].y() *= w;
1714*35238bceSAndroid Build Coastguard Worker             outVertices[vtxNdx].z() *= w;
1715*35238bceSAndroid Build Coastguard Worker             outVertices[vtxNdx].w() = w;
1716*35238bceSAndroid Build Coastguard Worker         }
1717*35238bceSAndroid Build Coastguard Worker 
1718*35238bceSAndroid Build Coastguard Worker         outColors[vtxNdx] = colors[vtxNdx % DE_LENGTH_OF_ARRAY(colors)];
1719*35238bceSAndroid Build Coastguard Worker     }
1720*35238bceSAndroid Build Coastguard Worker }
1721*35238bceSAndroid Build Coastguard Worker 
extractTriangles(std::vector<TriangleSceneSpec::SceneTriangle> & outTriangles,const std::vector<tcu::Vec4> & vertices,const std::vector<tcu::Vec4> & colors) const1722*35238bceSAndroid Build Coastguard Worker void TriangleInterpolationTest::extractTriangles(std::vector<TriangleSceneSpec::SceneTriangle> &outTriangles,
1723*35238bceSAndroid Build Coastguard Worker                                                  const std::vector<tcu::Vec4> &vertices,
1724*35238bceSAndroid Build Coastguard Worker                                                  const std::vector<tcu::Vec4> &colors) const
1725*35238bceSAndroid Build Coastguard Worker {
1726*35238bceSAndroid Build Coastguard Worker     switch (m_primitive)
1727*35238bceSAndroid Build Coastguard Worker     {
1728*35238bceSAndroid Build Coastguard Worker     case GL_TRIANGLES:
1729*35238bceSAndroid Build Coastguard Worker     {
1730*35238bceSAndroid Build Coastguard Worker         for (int vtxNdx = 0; vtxNdx < (int)vertices.size() - 2; vtxNdx += 3)
1731*35238bceSAndroid Build Coastguard Worker         {
1732*35238bceSAndroid Build Coastguard Worker             TriangleSceneSpec::SceneTriangle tri;
1733*35238bceSAndroid Build Coastguard Worker             tri.positions[0]  = vertices[vtxNdx + 0];
1734*35238bceSAndroid Build Coastguard Worker             tri.positions[1]  = vertices[vtxNdx + 1];
1735*35238bceSAndroid Build Coastguard Worker             tri.positions[2]  = vertices[vtxNdx + 2];
1736*35238bceSAndroid Build Coastguard Worker             tri.sharedEdge[0] = false;
1737*35238bceSAndroid Build Coastguard Worker             tri.sharedEdge[1] = false;
1738*35238bceSAndroid Build Coastguard Worker             tri.sharedEdge[2] = false;
1739*35238bceSAndroid Build Coastguard Worker 
1740*35238bceSAndroid Build Coastguard Worker             tri.colors[0] = colors[vtxNdx + 0];
1741*35238bceSAndroid Build Coastguard Worker             tri.colors[1] = colors[vtxNdx + 1];
1742*35238bceSAndroid Build Coastguard Worker             tri.colors[2] = colors[vtxNdx + 2];
1743*35238bceSAndroid Build Coastguard Worker 
1744*35238bceSAndroid Build Coastguard Worker             outTriangles.push_back(tri);
1745*35238bceSAndroid Build Coastguard Worker         }
1746*35238bceSAndroid Build Coastguard Worker         break;
1747*35238bceSAndroid Build Coastguard Worker     }
1748*35238bceSAndroid Build Coastguard Worker 
1749*35238bceSAndroid Build Coastguard Worker     case GL_TRIANGLE_STRIP:
1750*35238bceSAndroid Build Coastguard Worker     {
1751*35238bceSAndroid Build Coastguard Worker         for (int vtxNdx = 0; vtxNdx < (int)vertices.size() - 2; ++vtxNdx)
1752*35238bceSAndroid Build Coastguard Worker         {
1753*35238bceSAndroid Build Coastguard Worker             TriangleSceneSpec::SceneTriangle tri;
1754*35238bceSAndroid Build Coastguard Worker             tri.positions[0]  = vertices[vtxNdx + 0];
1755*35238bceSAndroid Build Coastguard Worker             tri.positions[1]  = vertices[vtxNdx + 1];
1756*35238bceSAndroid Build Coastguard Worker             tri.positions[2]  = vertices[vtxNdx + 2];
1757*35238bceSAndroid Build Coastguard Worker             tri.sharedEdge[0] = false;
1758*35238bceSAndroid Build Coastguard Worker             tri.sharedEdge[1] = false;
1759*35238bceSAndroid Build Coastguard Worker             tri.sharedEdge[2] = false;
1760*35238bceSAndroid Build Coastguard Worker 
1761*35238bceSAndroid Build Coastguard Worker             tri.colors[0] = colors[vtxNdx + 0];
1762*35238bceSAndroid Build Coastguard Worker             tri.colors[1] = colors[vtxNdx + 1];
1763*35238bceSAndroid Build Coastguard Worker             tri.colors[2] = colors[vtxNdx + 2];
1764*35238bceSAndroid Build Coastguard Worker 
1765*35238bceSAndroid Build Coastguard Worker             outTriangles.push_back(tri);
1766*35238bceSAndroid Build Coastguard Worker         }
1767*35238bceSAndroid Build Coastguard Worker         break;
1768*35238bceSAndroid Build Coastguard Worker     }
1769*35238bceSAndroid Build Coastguard Worker 
1770*35238bceSAndroid Build Coastguard Worker     case GL_TRIANGLE_FAN:
1771*35238bceSAndroid Build Coastguard Worker     {
1772*35238bceSAndroid Build Coastguard Worker         for (int vtxNdx = 1; vtxNdx < (int)vertices.size() - 1; ++vtxNdx)
1773*35238bceSAndroid Build Coastguard Worker         {
1774*35238bceSAndroid Build Coastguard Worker             TriangleSceneSpec::SceneTriangle tri;
1775*35238bceSAndroid Build Coastguard Worker             tri.positions[0]  = vertices[0];
1776*35238bceSAndroid Build Coastguard Worker             tri.positions[1]  = vertices[vtxNdx + 0];
1777*35238bceSAndroid Build Coastguard Worker             tri.positions[2]  = vertices[vtxNdx + 1];
1778*35238bceSAndroid Build Coastguard Worker             tri.sharedEdge[0] = false;
1779*35238bceSAndroid Build Coastguard Worker             tri.sharedEdge[1] = false;
1780*35238bceSAndroid Build Coastguard Worker             tri.sharedEdge[2] = false;
1781*35238bceSAndroid Build Coastguard Worker 
1782*35238bceSAndroid Build Coastguard Worker             tri.colors[0] = colors[0];
1783*35238bceSAndroid Build Coastguard Worker             tri.colors[1] = colors[vtxNdx + 0];
1784*35238bceSAndroid Build Coastguard Worker             tri.colors[2] = colors[vtxNdx + 1];
1785*35238bceSAndroid Build Coastguard Worker 
1786*35238bceSAndroid Build Coastguard Worker             outTriangles.push_back(tri);
1787*35238bceSAndroid Build Coastguard Worker         }
1788*35238bceSAndroid Build Coastguard Worker         break;
1789*35238bceSAndroid Build Coastguard Worker     }
1790*35238bceSAndroid Build Coastguard Worker 
1791*35238bceSAndroid Build Coastguard Worker     default:
1792*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
1793*35238bceSAndroid Build Coastguard Worker     }
1794*35238bceSAndroid Build Coastguard Worker }
1795*35238bceSAndroid Build Coastguard Worker 
1796*35238bceSAndroid Build Coastguard Worker class LineInterpolationTest : public BaseRenderingCase
1797*35238bceSAndroid Build Coastguard Worker {
1798*35238bceSAndroid Build Coastguard Worker public:
1799*35238bceSAndroid Build Coastguard Worker     LineInterpolationTest(Context &ctx, const char *name, const char *desc, glw::GLenum primitive, int flags,
1800*35238bceSAndroid Build Coastguard Worker                           float lineWidth);
1801*35238bceSAndroid Build Coastguard Worker     ~LineInterpolationTest(void);
1802*35238bceSAndroid Build Coastguard Worker     IterateResult iterate(void);
1803*35238bceSAndroid Build Coastguard Worker 
1804*35238bceSAndroid Build Coastguard Worker private:
1805*35238bceSAndroid Build Coastguard Worker     void generateVertices(int iteration, std::vector<tcu::Vec4> &outVertices, std::vector<tcu::Vec4> &outColors) const;
1806*35238bceSAndroid Build Coastguard Worker     void extractLines(std::vector<LineSceneSpec::SceneLine> &outLines, const std::vector<tcu::Vec4> &vertices,
1807*35238bceSAndroid Build Coastguard Worker                       const std::vector<tcu::Vec4> &colors) const;
1808*35238bceSAndroid Build Coastguard Worker 
1809*35238bceSAndroid Build Coastguard Worker     const glw::GLenum m_primitive;
1810*35238bceSAndroid Build Coastguard Worker     const bool m_projective;
1811*35238bceSAndroid Build Coastguard Worker     const int m_iterationCount;
1812*35238bceSAndroid Build Coastguard Worker 
1813*35238bceSAndroid Build Coastguard Worker     int m_iteration;
1814*35238bceSAndroid Build Coastguard Worker     tcu::ResultCollector m_result;
1815*35238bceSAndroid Build Coastguard Worker };
1816*35238bceSAndroid Build Coastguard Worker 
LineInterpolationTest(Context & ctx,const char * name,const char * desc,glw::GLenum primitive,int flags,float lineWidth)1817*35238bceSAndroid Build Coastguard Worker LineInterpolationTest::LineInterpolationTest(Context &ctx, const char *name, const char *desc, glw::GLenum primitive,
1818*35238bceSAndroid Build Coastguard Worker                                              int flags, float lineWidth)
1819*35238bceSAndroid Build Coastguard Worker     : BaseRenderingCase(ctx, name, desc)
1820*35238bceSAndroid Build Coastguard Worker     , m_primitive(primitive)
1821*35238bceSAndroid Build Coastguard Worker     , m_projective((flags & INTERPOLATIONFLAGS_PROJECTED) != 0)
1822*35238bceSAndroid Build Coastguard Worker     , m_iterationCount(3)
1823*35238bceSAndroid Build Coastguard Worker     , m_iteration(0)
1824*35238bceSAndroid Build Coastguard Worker {
1825*35238bceSAndroid Build Coastguard Worker     m_lineWidth = lineWidth;
1826*35238bceSAndroid Build Coastguard Worker }
1827*35238bceSAndroid Build Coastguard Worker 
~LineInterpolationTest(void)1828*35238bceSAndroid Build Coastguard Worker LineInterpolationTest::~LineInterpolationTest(void)
1829*35238bceSAndroid Build Coastguard Worker {
1830*35238bceSAndroid Build Coastguard Worker     deinit();
1831*35238bceSAndroid Build Coastguard Worker }
1832*35238bceSAndroid Build Coastguard Worker 
iterate(void)1833*35238bceSAndroid Build Coastguard Worker LineInterpolationTest::IterateResult LineInterpolationTest::iterate(void)
1834*35238bceSAndroid Build Coastguard Worker {
1835*35238bceSAndroid Build Coastguard Worker     const std::string iterationDescription =
1836*35238bceSAndroid Build Coastguard Worker         "Test iteration " + de::toString(m_iteration + 1) + " / " + de::toString(m_iterationCount);
1837*35238bceSAndroid Build Coastguard Worker     const tcu::ScopedLogSection section(m_testCtx.getLog(), "Iteration" + de::toString(m_iteration + 1),
1838*35238bceSAndroid Build Coastguard Worker                                         iterationDescription);
1839*35238bceSAndroid Build Coastguard Worker     tcu::Surface resultImage(m_renderSize, m_renderSize);
1840*35238bceSAndroid Build Coastguard Worker     std::vector<tcu::Vec4> drawBuffer;
1841*35238bceSAndroid Build Coastguard Worker     std::vector<tcu::Vec4> colorBuffer;
1842*35238bceSAndroid Build Coastguard Worker     std::vector<LineSceneSpec::SceneLine> lines;
1843*35238bceSAndroid Build Coastguard Worker 
1844*35238bceSAndroid Build Coastguard Worker     // generate scene
1845*35238bceSAndroid Build Coastguard Worker     generateVertices(m_iteration, drawBuffer, colorBuffer);
1846*35238bceSAndroid Build Coastguard Worker     extractLines(lines, drawBuffer, colorBuffer);
1847*35238bceSAndroid Build Coastguard Worker 
1848*35238bceSAndroid Build Coastguard Worker     // log
1849*35238bceSAndroid Build Coastguard Worker     {
1850*35238bceSAndroid Build Coastguard Worker         m_testCtx.getLog() << tcu::TestLog::Message << "Generated vertices:" << tcu::TestLog::EndMessage;
1851*35238bceSAndroid Build Coastguard Worker         for (int vtxNdx = 0; vtxNdx < (int)drawBuffer.size(); ++vtxNdx)
1852*35238bceSAndroid Build Coastguard Worker             m_testCtx.getLog() << tcu::TestLog::Message << "\t" << drawBuffer[vtxNdx]
1853*35238bceSAndroid Build Coastguard Worker                                << ",\tcolor= " << colorBuffer[vtxNdx] << tcu::TestLog::EndMessage;
1854*35238bceSAndroid Build Coastguard Worker     }
1855*35238bceSAndroid Build Coastguard Worker 
1856*35238bceSAndroid Build Coastguard Worker     // draw image
1857*35238bceSAndroid Build Coastguard Worker     drawPrimitives(resultImage, drawBuffer, colorBuffer, m_primitive);
1858*35238bceSAndroid Build Coastguard Worker 
1859*35238bceSAndroid Build Coastguard Worker     // compare
1860*35238bceSAndroid Build Coastguard Worker     {
1861*35238bceSAndroid Build Coastguard Worker         RasterizationArguments args;
1862*35238bceSAndroid Build Coastguard Worker         LineSceneSpec scene;
1863*35238bceSAndroid Build Coastguard Worker         LineInterpolationMethod iterationResult;
1864*35238bceSAndroid Build Coastguard Worker 
1865*35238bceSAndroid Build Coastguard Worker         args.numSamples   = m_numSamples;
1866*35238bceSAndroid Build Coastguard Worker         args.subpixelBits = m_subpixelBits;
1867*35238bceSAndroid Build Coastguard Worker         args.redBits      = m_context.getRenderTarget().getPixelFormat().redBits;
1868*35238bceSAndroid Build Coastguard Worker         args.greenBits    = m_context.getRenderTarget().getPixelFormat().greenBits;
1869*35238bceSAndroid Build Coastguard Worker         args.blueBits     = m_context.getRenderTarget().getPixelFormat().blueBits;
1870*35238bceSAndroid Build Coastguard Worker 
1871*35238bceSAndroid Build Coastguard Worker         scene.lines.swap(lines);
1872*35238bceSAndroid Build Coastguard Worker         scene.lineWidth                      = m_lineWidth;
1873*35238bceSAndroid Build Coastguard Worker         scene.stippleFactor                  = 1;
1874*35238bceSAndroid Build Coastguard Worker         scene.stipplePattern                 = 0xFFFF;
1875*35238bceSAndroid Build Coastguard Worker         scene.allowNonProjectedInterpolation = true;
1876*35238bceSAndroid Build Coastguard Worker 
1877*35238bceSAndroid Build Coastguard Worker         iterationResult = verifyLineGroupInterpolation(resultImage, scene, args, m_testCtx.getLog());
1878*35238bceSAndroid Build Coastguard Worker         switch (iterationResult)
1879*35238bceSAndroid Build Coastguard Worker         {
1880*35238bceSAndroid Build Coastguard Worker         case tcu::LINEINTERPOLATION_STRICTLY_CORRECT:
1881*35238bceSAndroid Build Coastguard Worker             // line interpolation matches the specification
1882*35238bceSAndroid Build Coastguard Worker             m_result.addResult(QP_TEST_RESULT_PASS, "Pass");
1883*35238bceSAndroid Build Coastguard Worker             break;
1884*35238bceSAndroid Build Coastguard Worker 
1885*35238bceSAndroid Build Coastguard Worker         case tcu::LINEINTERPOLATION_PROJECTED:
1886*35238bceSAndroid Build Coastguard Worker             // line interpolation weights are otherwise correct, but they are projected onto major axis
1887*35238bceSAndroid Build Coastguard Worker             m_testCtx.getLog() << tcu::TestLog::Message
1888*35238bceSAndroid Build Coastguard Worker                                << "Interpolation was calculated using coordinates projected onto major axis. "
1889*35238bceSAndroid Build Coastguard Worker                                   "This method does not produce the same values as the non-projecting method defined "
1890*35238bceSAndroid Build Coastguard Worker                                   "in the specification."
1891*35238bceSAndroid Build Coastguard Worker                                << tcu::TestLog::EndMessage;
1892*35238bceSAndroid Build Coastguard Worker             m_result.addResult(QP_TEST_RESULT_QUALITY_WARNING,
1893*35238bceSAndroid Build Coastguard Worker                                "Interpolation was calculated using projected coordinateds");
1894*35238bceSAndroid Build Coastguard Worker             break;
1895*35238bceSAndroid Build Coastguard Worker 
1896*35238bceSAndroid Build Coastguard Worker         case tcu::LINEINTERPOLATION_INCORRECT:
1897*35238bceSAndroid Build Coastguard Worker             if (scene.lineWidth != 1.0f && m_numSamples > 1)
1898*35238bceSAndroid Build Coastguard Worker             {
1899*35238bceSAndroid Build Coastguard Worker                 // multisampled wide lines might not be supported
1900*35238bceSAndroid Build Coastguard Worker                 m_result.addResult(QP_TEST_RESULT_COMPATIBILITY_WARNING,
1901*35238bceSAndroid Build Coastguard Worker                                    "Interpolation of multisampled wide lines failed");
1902*35238bceSAndroid Build Coastguard Worker             }
1903*35238bceSAndroid Build Coastguard Worker             else
1904*35238bceSAndroid Build Coastguard Worker             {
1905*35238bceSAndroid Build Coastguard Worker                 // line interpolation is incorrect
1906*35238bceSAndroid Build Coastguard Worker                 m_result.addResult(QP_TEST_RESULT_FAIL, "Found invalid pixel values");
1907*35238bceSAndroid Build Coastguard Worker             }
1908*35238bceSAndroid Build Coastguard Worker             break;
1909*35238bceSAndroid Build Coastguard Worker 
1910*35238bceSAndroid Build Coastguard Worker         default:
1911*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(false);
1912*35238bceSAndroid Build Coastguard Worker             break;
1913*35238bceSAndroid Build Coastguard Worker         }
1914*35238bceSAndroid Build Coastguard Worker     }
1915*35238bceSAndroid Build Coastguard Worker 
1916*35238bceSAndroid Build Coastguard Worker     // result
1917*35238bceSAndroid Build Coastguard Worker     if (++m_iteration == m_iterationCount)
1918*35238bceSAndroid Build Coastguard Worker     {
1919*35238bceSAndroid Build Coastguard Worker         m_result.setTestContextResult(m_testCtx);
1920*35238bceSAndroid Build Coastguard Worker         return STOP;
1921*35238bceSAndroid Build Coastguard Worker     }
1922*35238bceSAndroid Build Coastguard Worker     else
1923*35238bceSAndroid Build Coastguard Worker         return CONTINUE;
1924*35238bceSAndroid Build Coastguard Worker }
1925*35238bceSAndroid Build Coastguard Worker 
generateVertices(int iteration,std::vector<tcu::Vec4> & outVertices,std::vector<tcu::Vec4> & outColors) const1926*35238bceSAndroid Build Coastguard Worker void LineInterpolationTest::generateVertices(int iteration, std::vector<tcu::Vec4> &outVertices,
1927*35238bceSAndroid Build Coastguard Worker                                              std::vector<tcu::Vec4> &outColors) const
1928*35238bceSAndroid Build Coastguard Worker {
1929*35238bceSAndroid Build Coastguard Worker     // use only red, green and blue
1930*35238bceSAndroid Build Coastguard Worker     const tcu::Vec4 colors[] = {
1931*35238bceSAndroid Build Coastguard Worker         tcu::Vec4(1.0f, 0.0f, 0.0f, 1.0f),
1932*35238bceSAndroid Build Coastguard Worker         tcu::Vec4(0.0f, 1.0f, 0.0f, 1.0f),
1933*35238bceSAndroid Build Coastguard Worker         tcu::Vec4(0.0f, 0.0f, 1.0f, 1.0f),
1934*35238bceSAndroid Build Coastguard Worker     };
1935*35238bceSAndroid Build Coastguard Worker 
1936*35238bceSAndroid Build Coastguard Worker     de::Random rnd(123 + iteration * 1000 + (int)m_primitive);
1937*35238bceSAndroid Build Coastguard Worker 
1938*35238bceSAndroid Build Coastguard Worker     outVertices.resize(6);
1939*35238bceSAndroid Build Coastguard Worker     outColors.resize(6);
1940*35238bceSAndroid Build Coastguard Worker 
1941*35238bceSAndroid Build Coastguard Worker     for (int vtxNdx = 0; vtxNdx < (int)outVertices.size(); ++vtxNdx)
1942*35238bceSAndroid Build Coastguard Worker     {
1943*35238bceSAndroid Build Coastguard Worker         outVertices[vtxNdx].x() = rnd.getFloat(-0.9f, 0.9f);
1944*35238bceSAndroid Build Coastguard Worker         outVertices[vtxNdx].y() = rnd.getFloat(-0.9f, 0.9f);
1945*35238bceSAndroid Build Coastguard Worker         outVertices[vtxNdx].z() = 0.0f;
1946*35238bceSAndroid Build Coastguard Worker 
1947*35238bceSAndroid Build Coastguard Worker         if (!m_projective)
1948*35238bceSAndroid Build Coastguard Worker             outVertices[vtxNdx].w() = 1.0f;
1949*35238bceSAndroid Build Coastguard Worker         else
1950*35238bceSAndroid Build Coastguard Worker         {
1951*35238bceSAndroid Build Coastguard Worker             const float w = rnd.getFloat(0.2f, 4.0f);
1952*35238bceSAndroid Build Coastguard Worker 
1953*35238bceSAndroid Build Coastguard Worker             outVertices[vtxNdx].x() *= w;
1954*35238bceSAndroid Build Coastguard Worker             outVertices[vtxNdx].y() *= w;
1955*35238bceSAndroid Build Coastguard Worker             outVertices[vtxNdx].z() *= w;
1956*35238bceSAndroid Build Coastguard Worker             outVertices[vtxNdx].w() = w;
1957*35238bceSAndroid Build Coastguard Worker         }
1958*35238bceSAndroid Build Coastguard Worker 
1959*35238bceSAndroid Build Coastguard Worker         outColors[vtxNdx] = colors[vtxNdx % DE_LENGTH_OF_ARRAY(colors)];
1960*35238bceSAndroid Build Coastguard Worker     }
1961*35238bceSAndroid Build Coastguard Worker }
1962*35238bceSAndroid Build Coastguard Worker 
extractLines(std::vector<LineSceneSpec::SceneLine> & outLines,const std::vector<tcu::Vec4> & vertices,const std::vector<tcu::Vec4> & colors) const1963*35238bceSAndroid Build Coastguard Worker void LineInterpolationTest::extractLines(std::vector<LineSceneSpec::SceneLine> &outLines,
1964*35238bceSAndroid Build Coastguard Worker                                          const std::vector<tcu::Vec4> &vertices,
1965*35238bceSAndroid Build Coastguard Worker                                          const std::vector<tcu::Vec4> &colors) const
1966*35238bceSAndroid Build Coastguard Worker {
1967*35238bceSAndroid Build Coastguard Worker     switch (m_primitive)
1968*35238bceSAndroid Build Coastguard Worker     {
1969*35238bceSAndroid Build Coastguard Worker     case GL_LINES:
1970*35238bceSAndroid Build Coastguard Worker     {
1971*35238bceSAndroid Build Coastguard Worker         for (int vtxNdx = 0; vtxNdx < (int)vertices.size() - 1; vtxNdx += 2)
1972*35238bceSAndroid Build Coastguard Worker         {
1973*35238bceSAndroid Build Coastguard Worker             LineSceneSpec::SceneLine line;
1974*35238bceSAndroid Build Coastguard Worker             line.positions[0] = vertices[vtxNdx + 0];
1975*35238bceSAndroid Build Coastguard Worker             line.positions[1] = vertices[vtxNdx + 1];
1976*35238bceSAndroid Build Coastguard Worker 
1977*35238bceSAndroid Build Coastguard Worker             line.colors[0] = colors[vtxNdx + 0];
1978*35238bceSAndroid Build Coastguard Worker             line.colors[1] = colors[vtxNdx + 1];
1979*35238bceSAndroid Build Coastguard Worker 
1980*35238bceSAndroid Build Coastguard Worker             outLines.push_back(line);
1981*35238bceSAndroid Build Coastguard Worker         }
1982*35238bceSAndroid Build Coastguard Worker         break;
1983*35238bceSAndroid Build Coastguard Worker     }
1984*35238bceSAndroid Build Coastguard Worker 
1985*35238bceSAndroid Build Coastguard Worker     case GL_LINE_STRIP:
1986*35238bceSAndroid Build Coastguard Worker     {
1987*35238bceSAndroid Build Coastguard Worker         for (int vtxNdx = 0; vtxNdx < (int)vertices.size() - 1; ++vtxNdx)
1988*35238bceSAndroid Build Coastguard Worker         {
1989*35238bceSAndroid Build Coastguard Worker             LineSceneSpec::SceneLine line;
1990*35238bceSAndroid Build Coastguard Worker             line.positions[0] = vertices[vtxNdx + 0];
1991*35238bceSAndroid Build Coastguard Worker             line.positions[1] = vertices[vtxNdx + 1];
1992*35238bceSAndroid Build Coastguard Worker 
1993*35238bceSAndroid Build Coastguard Worker             line.colors[0] = colors[vtxNdx + 0];
1994*35238bceSAndroid Build Coastguard Worker             line.colors[1] = colors[vtxNdx + 1];
1995*35238bceSAndroid Build Coastguard Worker 
1996*35238bceSAndroid Build Coastguard Worker             outLines.push_back(line);
1997*35238bceSAndroid Build Coastguard Worker         }
1998*35238bceSAndroid Build Coastguard Worker         break;
1999*35238bceSAndroid Build Coastguard Worker     }
2000*35238bceSAndroid Build Coastguard Worker 
2001*35238bceSAndroid Build Coastguard Worker     case GL_LINE_LOOP:
2002*35238bceSAndroid Build Coastguard Worker     {
2003*35238bceSAndroid Build Coastguard Worker         for (int vtxNdx = 0; vtxNdx < (int)vertices.size(); ++vtxNdx)
2004*35238bceSAndroid Build Coastguard Worker         {
2005*35238bceSAndroid Build Coastguard Worker             LineSceneSpec::SceneLine line;
2006*35238bceSAndroid Build Coastguard Worker             line.positions[0] = vertices[(vtxNdx + 0) % (int)vertices.size()];
2007*35238bceSAndroid Build Coastguard Worker             line.positions[1] = vertices[(vtxNdx + 1) % (int)vertices.size()];
2008*35238bceSAndroid Build Coastguard Worker 
2009*35238bceSAndroid Build Coastguard Worker             line.colors[0] = colors[(vtxNdx + 0) % (int)vertices.size()];
2010*35238bceSAndroid Build Coastguard Worker             line.colors[1] = colors[(vtxNdx + 1) % (int)vertices.size()];
2011*35238bceSAndroid Build Coastguard Worker 
2012*35238bceSAndroid Build Coastguard Worker             outLines.push_back(line);
2013*35238bceSAndroid Build Coastguard Worker         }
2014*35238bceSAndroid Build Coastguard Worker         break;
2015*35238bceSAndroid Build Coastguard Worker     }
2016*35238bceSAndroid Build Coastguard Worker 
2017*35238bceSAndroid Build Coastguard Worker     default:
2018*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
2019*35238bceSAndroid Build Coastguard Worker     }
2020*35238bceSAndroid Build Coastguard Worker }
2021*35238bceSAndroid Build Coastguard Worker 
2022*35238bceSAndroid Build Coastguard Worker } // namespace
2023*35238bceSAndroid Build Coastguard Worker 
RasterizationTests(Context & context)2024*35238bceSAndroid Build Coastguard Worker RasterizationTests::RasterizationTests(Context &context)
2025*35238bceSAndroid Build Coastguard Worker     : TestCaseGroup(context, "rasterization", "Rasterization Tests")
2026*35238bceSAndroid Build Coastguard Worker {
2027*35238bceSAndroid Build Coastguard Worker }
2028*35238bceSAndroid Build Coastguard Worker 
~RasterizationTests(void)2029*35238bceSAndroid Build Coastguard Worker RasterizationTests::~RasterizationTests(void)
2030*35238bceSAndroid Build Coastguard Worker {
2031*35238bceSAndroid Build Coastguard Worker }
2032*35238bceSAndroid Build Coastguard Worker 
init(void)2033*35238bceSAndroid Build Coastguard Worker void RasterizationTests::init(void)
2034*35238bceSAndroid Build Coastguard Worker {
2035*35238bceSAndroid Build Coastguard Worker     // .primitives
2036*35238bceSAndroid Build Coastguard Worker     {
2037*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *const primitives =
2038*35238bceSAndroid Build Coastguard Worker             new tcu::TestCaseGroup(m_testCtx, "primitives", "Primitive rasterization");
2039*35238bceSAndroid Build Coastguard Worker 
2040*35238bceSAndroid Build Coastguard Worker         addChild(primitives);
2041*35238bceSAndroid Build Coastguard Worker 
2042*35238bceSAndroid Build Coastguard Worker         primitives->addChild(new TrianglesCase(m_context, "triangles",
2043*35238bceSAndroid Build Coastguard Worker                                                "Render primitives as GL_TRIANGLES, verify rasterization result"));
2044*35238bceSAndroid Build Coastguard Worker         primitives->addChild(new TriangleStripCase(
2045*35238bceSAndroid Build Coastguard Worker             m_context, "triangle_strip", "Render primitives as GL_TRIANGLE_STRIP, verify rasterization result"));
2046*35238bceSAndroid Build Coastguard Worker         primitives->addChild(new TriangleFanCase(m_context, "triangle_fan",
2047*35238bceSAndroid Build Coastguard Worker                                                  "Render primitives as GL_TRIANGLE_FAN, verify rasterization result"));
2048*35238bceSAndroid Build Coastguard Worker         primitives->addChild(new LinesCase(m_context, "lines",
2049*35238bceSAndroid Build Coastguard Worker                                            "Render primitives as GL_LINES, verify rasterization result",
2050*35238bceSAndroid Build Coastguard Worker                                            PRIMITIVEWIDENESS_NARROW));
2051*35238bceSAndroid Build Coastguard Worker         primitives->addChild(new LineStripCase(m_context, "line_strip",
2052*35238bceSAndroid Build Coastguard Worker                                                "Render primitives as GL_LINE_STRIP, verify rasterization result",
2053*35238bceSAndroid Build Coastguard Worker                                                PRIMITIVEWIDENESS_NARROW));
2054*35238bceSAndroid Build Coastguard Worker         primitives->addChild(new LineLoopCase(m_context, "line_loop",
2055*35238bceSAndroid Build Coastguard Worker                                               "Render primitives as GL_LINE_LOOP, verify rasterization result",
2056*35238bceSAndroid Build Coastguard Worker                                               PRIMITIVEWIDENESS_NARROW));
2057*35238bceSAndroid Build Coastguard Worker         primitives->addChild(new LinesCase(m_context, "lines_wide",
2058*35238bceSAndroid Build Coastguard Worker                                            "Render primitives as GL_LINES with wide lines, verify rasterization result",
2059*35238bceSAndroid Build Coastguard Worker                                            PRIMITIVEWIDENESS_WIDE));
2060*35238bceSAndroid Build Coastguard Worker         primitives->addChild(new LineStripCase(
2061*35238bceSAndroid Build Coastguard Worker             m_context, "line_strip_wide",
2062*35238bceSAndroid Build Coastguard Worker             "Render primitives as GL_LINE_STRIP with wide lines, verify rasterization result", PRIMITIVEWIDENESS_WIDE));
2063*35238bceSAndroid Build Coastguard Worker         primitives->addChild(new LineLoopCase(
2064*35238bceSAndroid Build Coastguard Worker             m_context, "line_loop_wide",
2065*35238bceSAndroid Build Coastguard Worker             "Render primitives as GL_LINE_LOOP with wide lines, verify rasterization result", PRIMITIVEWIDENESS_WIDE));
2066*35238bceSAndroid Build Coastguard Worker         primitives->addChild(new PointCase(m_context, "points",
2067*35238bceSAndroid Build Coastguard Worker                                            "Render primitives as GL_POINTS, verify rasterization result",
2068*35238bceSAndroid Build Coastguard Worker                                            PRIMITIVEWIDENESS_WIDE));
2069*35238bceSAndroid Build Coastguard Worker     }
2070*35238bceSAndroid Build Coastguard Worker 
2071*35238bceSAndroid Build Coastguard Worker     // .limits
2072*35238bceSAndroid Build Coastguard Worker     {
2073*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *const limits = new tcu::TestCaseGroup(m_testCtx, "limits", "Primitive width limits");
2074*35238bceSAndroid Build Coastguard Worker 
2075*35238bceSAndroid Build Coastguard Worker         addChild(limits);
2076*35238bceSAndroid Build Coastguard Worker 
2077*35238bceSAndroid Build Coastguard Worker         limits->addChild(
2078*35238bceSAndroid Build Coastguard Worker             new PointSizeClampedTest(m_context, "points", "gl_PointSize is clamped to ALIASED_POINT_SIZE_RANGE"));
2079*35238bceSAndroid Build Coastguard Worker     }
2080*35238bceSAndroid Build Coastguard Worker 
2081*35238bceSAndroid Build Coastguard Worker     // .fill_rules
2082*35238bceSAndroid Build Coastguard Worker     {
2083*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *const fillRules = new tcu::TestCaseGroup(m_testCtx, "fill_rules", "Primitive fill rules");
2084*35238bceSAndroid Build Coastguard Worker 
2085*35238bceSAndroid Build Coastguard Worker         addChild(fillRules);
2086*35238bceSAndroid Build Coastguard Worker 
2087*35238bceSAndroid Build Coastguard Worker         fillRules->addChild(
2088*35238bceSAndroid Build Coastguard Worker             new FillRuleCase(m_context, "basic_quad", "Verify fill rules", FillRuleCase::FILLRULECASE_BASIC));
2089*35238bceSAndroid Build Coastguard Worker         fillRules->addChild(new FillRuleCase(m_context, "basic_quad_reverse", "Verify fill rules",
2090*35238bceSAndroid Build Coastguard Worker                                              FillRuleCase::FILLRULECASE_REVERSED));
2091*35238bceSAndroid Build Coastguard Worker         fillRules->addChild(
2092*35238bceSAndroid Build Coastguard Worker             new FillRuleCase(m_context, "clipped_full", "Verify fill rules", FillRuleCase::FILLRULECASE_CLIPPED_FULL));
2093*35238bceSAndroid Build Coastguard Worker         fillRules->addChild(new FillRuleCase(m_context, "clipped_partly", "Verify fill rules",
2094*35238bceSAndroid Build Coastguard Worker                                              FillRuleCase::FILLRULECASE_CLIPPED_PARTIAL));
2095*35238bceSAndroid Build Coastguard Worker         fillRules->addChild(
2096*35238bceSAndroid Build Coastguard Worker             new FillRuleCase(m_context, "projected", "Verify fill rules", FillRuleCase::FILLRULECASE_PROJECTED));
2097*35238bceSAndroid Build Coastguard Worker     }
2098*35238bceSAndroid Build Coastguard Worker 
2099*35238bceSAndroid Build Coastguard Worker     // .culling
2100*35238bceSAndroid Build Coastguard Worker     {
2101*35238bceSAndroid Build Coastguard Worker         static const struct CullMode
2102*35238bceSAndroid Build Coastguard Worker         {
2103*35238bceSAndroid Build Coastguard Worker             glw::GLenum mode;
2104*35238bceSAndroid Build Coastguard Worker             const char *prefix;
2105*35238bceSAndroid Build Coastguard Worker         } cullModes[] = {
2106*35238bceSAndroid Build Coastguard Worker             {GL_FRONT, "front_"},
2107*35238bceSAndroid Build Coastguard Worker             {GL_BACK, "back_"},
2108*35238bceSAndroid Build Coastguard Worker             {GL_FRONT_AND_BACK, "both_"},
2109*35238bceSAndroid Build Coastguard Worker         };
2110*35238bceSAndroid Build Coastguard Worker         static const struct PrimitiveType
2111*35238bceSAndroid Build Coastguard Worker         {
2112*35238bceSAndroid Build Coastguard Worker             glw::GLenum type;
2113*35238bceSAndroid Build Coastguard Worker             const char *name;
2114*35238bceSAndroid Build Coastguard Worker         } primitiveTypes[] = {
2115*35238bceSAndroid Build Coastguard Worker             {GL_TRIANGLES, "triangles"},
2116*35238bceSAndroid Build Coastguard Worker             {GL_TRIANGLE_STRIP, "triangle_strip"},
2117*35238bceSAndroid Build Coastguard Worker             {GL_TRIANGLE_FAN, "triangle_fan"},
2118*35238bceSAndroid Build Coastguard Worker         };
2119*35238bceSAndroid Build Coastguard Worker         static const struct FrontFaceOrder
2120*35238bceSAndroid Build Coastguard Worker         {
2121*35238bceSAndroid Build Coastguard Worker             glw::GLenum mode;
2122*35238bceSAndroid Build Coastguard Worker             const char *postfix;
2123*35238bceSAndroid Build Coastguard Worker         } frontOrders[] = {
2124*35238bceSAndroid Build Coastguard Worker             {GL_CCW, ""},
2125*35238bceSAndroid Build Coastguard Worker             {GL_CW, "_reverse"},
2126*35238bceSAndroid Build Coastguard Worker         };
2127*35238bceSAndroid Build Coastguard Worker 
2128*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *const culling = new tcu::TestCaseGroup(m_testCtx, "culling", "Culling");
2129*35238bceSAndroid Build Coastguard Worker 
2130*35238bceSAndroid Build Coastguard Worker         addChild(culling);
2131*35238bceSAndroid Build Coastguard Worker 
2132*35238bceSAndroid Build Coastguard Worker         for (int cullModeNdx = 0; cullModeNdx < DE_LENGTH_OF_ARRAY(cullModes); ++cullModeNdx)
2133*35238bceSAndroid Build Coastguard Worker             for (int primitiveNdx = 0; primitiveNdx < DE_LENGTH_OF_ARRAY(primitiveTypes); ++primitiveNdx)
2134*35238bceSAndroid Build Coastguard Worker                 for (int frontOrderNdx = 0; frontOrderNdx < DE_LENGTH_OF_ARRAY(frontOrders); ++frontOrderNdx)
2135*35238bceSAndroid Build Coastguard Worker                 {
2136*35238bceSAndroid Build Coastguard Worker                     const std::string name = std::string(cullModes[cullModeNdx].prefix) +
2137*35238bceSAndroid Build Coastguard Worker                                              primitiveTypes[primitiveNdx].name + frontOrders[frontOrderNdx].postfix;
2138*35238bceSAndroid Build Coastguard Worker 
2139*35238bceSAndroid Build Coastguard Worker                     culling->addChild(new CullingTest(m_context, name.c_str(), "Test primitive culling.",
2140*35238bceSAndroid Build Coastguard Worker                                                       cullModes[cullModeNdx].mode, primitiveTypes[primitiveNdx].type,
2141*35238bceSAndroid Build Coastguard Worker                                                       frontOrders[frontOrderNdx].mode));
2142*35238bceSAndroid Build Coastguard Worker                 }
2143*35238bceSAndroid Build Coastguard Worker     }
2144*35238bceSAndroid Build Coastguard Worker 
2145*35238bceSAndroid Build Coastguard Worker     // .interpolation
2146*35238bceSAndroid Build Coastguard Worker     {
2147*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *const interpolation =
2148*35238bceSAndroid Build Coastguard Worker             new tcu::TestCaseGroup(m_testCtx, "interpolation", "Test interpolation");
2149*35238bceSAndroid Build Coastguard Worker 
2150*35238bceSAndroid Build Coastguard Worker         addChild(interpolation);
2151*35238bceSAndroid Build Coastguard Worker 
2152*35238bceSAndroid Build Coastguard Worker         // .basic
2153*35238bceSAndroid Build Coastguard Worker         {
2154*35238bceSAndroid Build Coastguard Worker             tcu::TestCaseGroup *const basic =
2155*35238bceSAndroid Build Coastguard Worker                 new tcu::TestCaseGroup(m_testCtx, "basic", "Non-projective interpolation");
2156*35238bceSAndroid Build Coastguard Worker 
2157*35238bceSAndroid Build Coastguard Worker             interpolation->addChild(basic);
2158*35238bceSAndroid Build Coastguard Worker 
2159*35238bceSAndroid Build Coastguard Worker             basic->addChild(new TriangleInterpolationTest(m_context, "triangles", "Verify triangle interpolation",
2160*35238bceSAndroid Build Coastguard Worker                                                           GL_TRIANGLES, INTERPOLATIONFLAGS_NONE));
2161*35238bceSAndroid Build Coastguard Worker             basic->addChild(new TriangleInterpolationTest(m_context, "triangle_strip",
2162*35238bceSAndroid Build Coastguard Worker                                                           "Verify triangle strip interpolation", GL_TRIANGLE_STRIP,
2163*35238bceSAndroid Build Coastguard Worker                                                           INTERPOLATIONFLAGS_NONE));
2164*35238bceSAndroid Build Coastguard Worker             basic->addChild(new TriangleInterpolationTest(m_context, "triangle_fan",
2165*35238bceSAndroid Build Coastguard Worker                                                           "Verify triangle fan interpolation", GL_TRIANGLE_FAN,
2166*35238bceSAndroid Build Coastguard Worker                                                           INTERPOLATIONFLAGS_NONE));
2167*35238bceSAndroid Build Coastguard Worker             basic->addChild(new LineInterpolationTest(m_context, "lines", "Verify line interpolation", GL_LINES,
2168*35238bceSAndroid Build Coastguard Worker                                                       INTERPOLATIONFLAGS_NONE, 1.0f));
2169*35238bceSAndroid Build Coastguard Worker             basic->addChild(new LineInterpolationTest(m_context, "line_strip", "Verify line strip interpolation",
2170*35238bceSAndroid Build Coastguard Worker                                                       GL_LINE_STRIP, INTERPOLATIONFLAGS_NONE, 1.0f));
2171*35238bceSAndroid Build Coastguard Worker             basic->addChild(new LineInterpolationTest(m_context, "line_loop", "Verify line loop interpolation",
2172*35238bceSAndroid Build Coastguard Worker                                                       GL_LINE_LOOP, INTERPOLATIONFLAGS_NONE, 1.0f));
2173*35238bceSAndroid Build Coastguard Worker             basic->addChild(new LineInterpolationTest(m_context, "lines_wide", "Verify wide line interpolation",
2174*35238bceSAndroid Build Coastguard Worker                                                       GL_LINES, INTERPOLATIONFLAGS_NONE, 5.0f));
2175*35238bceSAndroid Build Coastguard Worker             basic->addChild(new LineInterpolationTest(m_context, "line_strip_wide",
2176*35238bceSAndroid Build Coastguard Worker                                                       "Verify wide line strip interpolation", GL_LINE_STRIP,
2177*35238bceSAndroid Build Coastguard Worker                                                       INTERPOLATIONFLAGS_NONE, 5.0f));
2178*35238bceSAndroid Build Coastguard Worker             basic->addChild(new LineInterpolationTest(m_context, "line_loop_wide",
2179*35238bceSAndroid Build Coastguard Worker                                                       "Verify wide line loop interpolation", GL_LINE_LOOP,
2180*35238bceSAndroid Build Coastguard Worker                                                       INTERPOLATIONFLAGS_NONE, 5.0f));
2181*35238bceSAndroid Build Coastguard Worker         }
2182*35238bceSAndroid Build Coastguard Worker 
2183*35238bceSAndroid Build Coastguard Worker         // .projected
2184*35238bceSAndroid Build Coastguard Worker         {
2185*35238bceSAndroid Build Coastguard Worker             tcu::TestCaseGroup *const projected =
2186*35238bceSAndroid Build Coastguard Worker                 new tcu::TestCaseGroup(m_testCtx, "projected", "Projective interpolation");
2187*35238bceSAndroid Build Coastguard Worker 
2188*35238bceSAndroid Build Coastguard Worker             interpolation->addChild(projected);
2189*35238bceSAndroid Build Coastguard Worker 
2190*35238bceSAndroid Build Coastguard Worker             projected->addChild(new TriangleInterpolationTest(m_context, "triangles", "Verify triangle interpolation",
2191*35238bceSAndroid Build Coastguard Worker                                                               GL_TRIANGLES, INTERPOLATIONFLAGS_PROJECTED));
2192*35238bceSAndroid Build Coastguard Worker             projected->addChild(new TriangleInterpolationTest(m_context, "triangle_strip",
2193*35238bceSAndroid Build Coastguard Worker                                                               "Verify triangle strip interpolation", GL_TRIANGLE_STRIP,
2194*35238bceSAndroid Build Coastguard Worker                                                               INTERPOLATIONFLAGS_PROJECTED));
2195*35238bceSAndroid Build Coastguard Worker             projected->addChild(new TriangleInterpolationTest(m_context, "triangle_fan",
2196*35238bceSAndroid Build Coastguard Worker                                                               "Verify triangle fan interpolation", GL_TRIANGLE_FAN,
2197*35238bceSAndroid Build Coastguard Worker                                                               INTERPOLATIONFLAGS_PROJECTED));
2198*35238bceSAndroid Build Coastguard Worker             projected->addChild(new LineInterpolationTest(m_context, "lines", "Verify line interpolation", GL_LINES,
2199*35238bceSAndroid Build Coastguard Worker                                                           INTERPOLATIONFLAGS_PROJECTED, 1.0f));
2200*35238bceSAndroid Build Coastguard Worker             projected->addChild(new LineInterpolationTest(m_context, "line_strip", "Verify line strip interpolation",
2201*35238bceSAndroid Build Coastguard Worker                                                           GL_LINE_STRIP, INTERPOLATIONFLAGS_PROJECTED, 1.0f));
2202*35238bceSAndroid Build Coastguard Worker             projected->addChild(new LineInterpolationTest(m_context, "line_loop", "Verify line loop interpolation",
2203*35238bceSAndroid Build Coastguard Worker                                                           GL_LINE_LOOP, INTERPOLATIONFLAGS_PROJECTED, 1.0f));
2204*35238bceSAndroid Build Coastguard Worker             projected->addChild(new LineInterpolationTest(m_context, "lines_wide", "Verify wide line interpolation",
2205*35238bceSAndroid Build Coastguard Worker                                                           GL_LINES, INTERPOLATIONFLAGS_PROJECTED, 5.0f));
2206*35238bceSAndroid Build Coastguard Worker             projected->addChild(new LineInterpolationTest(m_context, "line_strip_wide",
2207*35238bceSAndroid Build Coastguard Worker                                                           "Verify wide line strip interpolation", GL_LINE_STRIP,
2208*35238bceSAndroid Build Coastguard Worker                                                           INTERPOLATIONFLAGS_PROJECTED, 5.0f));
2209*35238bceSAndroid Build Coastguard Worker             projected->addChild(new LineInterpolationTest(m_context, "line_loop_wide",
2210*35238bceSAndroid Build Coastguard Worker                                                           "Verify wide line loop interpolation", GL_LINE_LOOP,
2211*35238bceSAndroid Build Coastguard Worker                                                           INTERPOLATIONFLAGS_PROJECTED, 5.0f));
2212*35238bceSAndroid Build Coastguard Worker         }
2213*35238bceSAndroid Build Coastguard Worker     }
2214*35238bceSAndroid Build Coastguard Worker }
2215*35238bceSAndroid Build Coastguard Worker 
2216*35238bceSAndroid Build Coastguard Worker } // namespace Functional
2217*35238bceSAndroid Build Coastguard Worker } // namespace gles2
2218*35238bceSAndroid Build Coastguard Worker } // namespace deqp
2219