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