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