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 Pixel Buffer Object tests
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "es3fPixelBufferObjectTests.hpp"
25*35238bceSAndroid Build Coastguard Worker
26*35238bceSAndroid Build Coastguard Worker #include "tcuTexture.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "tcuTextureUtil.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "tcuImageCompare.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "tcuRenderTarget.hpp"
31*35238bceSAndroid Build Coastguard Worker
32*35238bceSAndroid Build Coastguard Worker #include "gluTextureUtil.hpp"
33*35238bceSAndroid Build Coastguard Worker #include "gluPixelTransfer.hpp"
34*35238bceSAndroid Build Coastguard Worker #include "gluShaderProgram.hpp"
35*35238bceSAndroid Build Coastguard Worker
36*35238bceSAndroid Build Coastguard Worker #include "deRandom.hpp"
37*35238bceSAndroid Build Coastguard Worker #include "deString.h"
38*35238bceSAndroid Build Coastguard Worker
39*35238bceSAndroid Build Coastguard Worker #include <string>
40*35238bceSAndroid Build Coastguard Worker #include <sstream>
41*35238bceSAndroid Build Coastguard Worker
42*35238bceSAndroid Build Coastguard Worker #include "glw.h"
43*35238bceSAndroid Build Coastguard Worker
44*35238bceSAndroid Build Coastguard Worker using std::string;
45*35238bceSAndroid Build Coastguard Worker using std::stringstream;
46*35238bceSAndroid Build Coastguard Worker
47*35238bceSAndroid Build Coastguard Worker namespace deqp
48*35238bceSAndroid Build Coastguard Worker {
49*35238bceSAndroid Build Coastguard Worker namespace gles3
50*35238bceSAndroid Build Coastguard Worker {
51*35238bceSAndroid Build Coastguard Worker namespace Functional
52*35238bceSAndroid Build Coastguard Worker {
53*35238bceSAndroid Build Coastguard Worker
54*35238bceSAndroid Build Coastguard Worker namespace
55*35238bceSAndroid Build Coastguard Worker {
56*35238bceSAndroid Build Coastguard Worker
57*35238bceSAndroid Build Coastguard Worker class ReadPixelsTest : public TestCase
58*35238bceSAndroid Build Coastguard Worker {
59*35238bceSAndroid Build Coastguard Worker public:
60*35238bceSAndroid Build Coastguard Worker struct TestSpec
61*35238bceSAndroid Build Coastguard Worker {
62*35238bceSAndroid Build Coastguard Worker enum FramebufferType
63*35238bceSAndroid Build Coastguard Worker {
64*35238bceSAndroid Build Coastguard Worker FRAMEBUFFERTYPE_NATIVE = 0,
65*35238bceSAndroid Build Coastguard Worker FRAMEBUFFERTYPE_RENDERBUFFER
66*35238bceSAndroid Build Coastguard Worker };
67*35238bceSAndroid Build Coastguard Worker
68*35238bceSAndroid Build Coastguard Worker string name;
69*35238bceSAndroid Build Coastguard Worker string description;
70*35238bceSAndroid Build Coastguard Worker
71*35238bceSAndroid Build Coastguard Worker bool useColorClear;
72*35238bceSAndroid Build Coastguard Worker bool renderTriangles;
73*35238bceSAndroid Build Coastguard Worker
74*35238bceSAndroid Build Coastguard Worker FramebufferType framebufferType;
75*35238bceSAndroid Build Coastguard Worker GLenum renderbufferFormat;
76*35238bceSAndroid Build Coastguard Worker };
77*35238bceSAndroid Build Coastguard Worker
78*35238bceSAndroid Build Coastguard Worker ReadPixelsTest(Context &context, const TestSpec &spec);
79*35238bceSAndroid Build Coastguard Worker ~ReadPixelsTest(void);
80*35238bceSAndroid Build Coastguard Worker
81*35238bceSAndroid Build Coastguard Worker void init(void);
82*35238bceSAndroid Build Coastguard Worker void deinit(void);
83*35238bceSAndroid Build Coastguard Worker
84*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void);
85*35238bceSAndroid Build Coastguard Worker
86*35238bceSAndroid Build Coastguard Worker private:
87*35238bceSAndroid Build Coastguard Worker void renderTriangle(const tcu::Vec3 &a, const tcu::Vec3 &b, const tcu::Vec3 &c);
88*35238bceSAndroid Build Coastguard Worker void clearColor(float r, float g, float b, float a);
89*35238bceSAndroid Build Coastguard Worker
90*35238bceSAndroid Build Coastguard Worker de::Random m_random;
91*35238bceSAndroid Build Coastguard Worker tcu::TestLog &m_log;
92*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram *m_program;
93*35238bceSAndroid Build Coastguard Worker
94*35238bceSAndroid Build Coastguard Worker TestSpec::FramebufferType m_framebuffeType;
95*35238bceSAndroid Build Coastguard Worker
96*35238bceSAndroid Build Coastguard Worker GLenum m_renderbufferFormat;
97*35238bceSAndroid Build Coastguard Worker tcu::TextureChannelClass m_texChannelClass;
98*35238bceSAndroid Build Coastguard Worker
99*35238bceSAndroid Build Coastguard Worker bool m_useColorClears;
100*35238bceSAndroid Build Coastguard Worker bool m_renderTriangles;
101*35238bceSAndroid Build Coastguard Worker
102*35238bceSAndroid Build Coastguard Worker GLfloat m_colorScale;
103*35238bceSAndroid Build Coastguard Worker };
104*35238bceSAndroid Build Coastguard Worker
ReadPixelsTest(Context & context,const TestSpec & spec)105*35238bceSAndroid Build Coastguard Worker ReadPixelsTest::ReadPixelsTest(Context &context, const TestSpec &spec)
106*35238bceSAndroid Build Coastguard Worker : TestCase(context, spec.name.c_str(), spec.description.c_str())
107*35238bceSAndroid Build Coastguard Worker , m_random(deStringHash(spec.name.c_str()))
108*35238bceSAndroid Build Coastguard Worker , m_log(m_testCtx.getLog())
109*35238bceSAndroid Build Coastguard Worker , m_program(NULL)
110*35238bceSAndroid Build Coastguard Worker , m_framebuffeType(spec.framebufferType)
111*35238bceSAndroid Build Coastguard Worker , m_renderbufferFormat(spec.renderbufferFormat)
112*35238bceSAndroid Build Coastguard Worker , m_texChannelClass(tcu::TEXTURECHANNELCLASS_LAST)
113*35238bceSAndroid Build Coastguard Worker , m_useColorClears(spec.useColorClear)
114*35238bceSAndroid Build Coastguard Worker , m_renderTriangles(spec.renderTriangles)
115*35238bceSAndroid Build Coastguard Worker , m_colorScale(1.0f)
116*35238bceSAndroid Build Coastguard Worker {
117*35238bceSAndroid Build Coastguard Worker
118*35238bceSAndroid Build Coastguard Worker if (m_framebuffeType == TestSpec::FRAMEBUFFERTYPE_NATIVE)
119*35238bceSAndroid Build Coastguard Worker {
120*35238bceSAndroid Build Coastguard Worker m_colorScale = 1.0f;
121*35238bceSAndroid Build Coastguard Worker }
122*35238bceSAndroid Build Coastguard Worker else if (m_framebuffeType == TestSpec::FRAMEBUFFERTYPE_RENDERBUFFER)
123*35238bceSAndroid Build Coastguard Worker {
124*35238bceSAndroid Build Coastguard Worker m_texChannelClass = tcu::getTextureChannelClass(glu::mapGLInternalFormat(spec.renderbufferFormat).type);
125*35238bceSAndroid Build Coastguard Worker switch (m_texChannelClass)
126*35238bceSAndroid Build Coastguard Worker {
127*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
128*35238bceSAndroid Build Coastguard Worker m_colorScale = 1.0f;
129*35238bceSAndroid Build Coastguard Worker break;
130*35238bceSAndroid Build Coastguard Worker
131*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
132*35238bceSAndroid Build Coastguard Worker m_colorScale = 100.0f;
133*35238bceSAndroid Build Coastguard Worker break;
134*35238bceSAndroid Build Coastguard Worker
135*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
136*35238bceSAndroid Build Coastguard Worker m_colorScale = 100.0f;
137*35238bceSAndroid Build Coastguard Worker break;
138*35238bceSAndroid Build Coastguard Worker
139*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
140*35238bceSAndroid Build Coastguard Worker m_colorScale = 100.0f;
141*35238bceSAndroid Build Coastguard Worker break;
142*35238bceSAndroid Build Coastguard Worker
143*35238bceSAndroid Build Coastguard Worker default:
144*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
145*35238bceSAndroid Build Coastguard Worker }
146*35238bceSAndroid Build Coastguard Worker }
147*35238bceSAndroid Build Coastguard Worker else
148*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
149*35238bceSAndroid Build Coastguard Worker }
150*35238bceSAndroid Build Coastguard Worker
~ReadPixelsTest(void)151*35238bceSAndroid Build Coastguard Worker ReadPixelsTest::~ReadPixelsTest(void)
152*35238bceSAndroid Build Coastguard Worker {
153*35238bceSAndroid Build Coastguard Worker }
154*35238bceSAndroid Build Coastguard Worker
init(void)155*35238bceSAndroid Build Coastguard Worker void ReadPixelsTest::init(void)
156*35238bceSAndroid Build Coastguard Worker {
157*35238bceSAndroid Build Coastguard Worker // Check extensions
158*35238bceSAndroid Build Coastguard Worker if (m_framebuffeType == TestSpec::FRAMEBUFFERTYPE_RENDERBUFFER)
159*35238bceSAndroid Build Coastguard Worker {
160*35238bceSAndroid Build Coastguard Worker bool supported = false;
161*35238bceSAndroid Build Coastguard Worker
162*35238bceSAndroid Build Coastguard Worker if (m_renderbufferFormat == GL_RGBA16F || m_renderbufferFormat == GL_RG16F)
163*35238bceSAndroid Build Coastguard Worker {
164*35238bceSAndroid Build Coastguard Worker std::istringstream extensions(std::string((const char *)glGetString(GL_EXTENSIONS)));
165*35238bceSAndroid Build Coastguard Worker std::string extension;
166*35238bceSAndroid Build Coastguard Worker
167*35238bceSAndroid Build Coastguard Worker while (std::getline(extensions, extension, ' '))
168*35238bceSAndroid Build Coastguard Worker {
169*35238bceSAndroid Build Coastguard Worker if (extension == "GL_EXT_color_buffer_half_float")
170*35238bceSAndroid Build Coastguard Worker {
171*35238bceSAndroid Build Coastguard Worker supported = true;
172*35238bceSAndroid Build Coastguard Worker break;
173*35238bceSAndroid Build Coastguard Worker }
174*35238bceSAndroid Build Coastguard Worker if (extension == "GL_EXT_color_buffer_float")
175*35238bceSAndroid Build Coastguard Worker {
176*35238bceSAndroid Build Coastguard Worker supported = true;
177*35238bceSAndroid Build Coastguard Worker break;
178*35238bceSAndroid Build Coastguard Worker }
179*35238bceSAndroid Build Coastguard Worker }
180*35238bceSAndroid Build Coastguard Worker }
181*35238bceSAndroid Build Coastguard Worker else if (m_renderbufferFormat == GL_RGBA32F || m_renderbufferFormat == GL_RG32F ||
182*35238bceSAndroid Build Coastguard Worker m_renderbufferFormat == GL_R11F_G11F_B10F)
183*35238bceSAndroid Build Coastguard Worker {
184*35238bceSAndroid Build Coastguard Worker std::istringstream extensions(std::string((const char *)glGetString(GL_EXTENSIONS)));
185*35238bceSAndroid Build Coastguard Worker std::string extension;
186*35238bceSAndroid Build Coastguard Worker
187*35238bceSAndroid Build Coastguard Worker while (std::getline(extensions, extension, ' '))
188*35238bceSAndroid Build Coastguard Worker {
189*35238bceSAndroid Build Coastguard Worker if (extension == "GL_EXT_color_buffer_float")
190*35238bceSAndroid Build Coastguard Worker {
191*35238bceSAndroid Build Coastguard Worker supported = true;
192*35238bceSAndroid Build Coastguard Worker break;
193*35238bceSAndroid Build Coastguard Worker }
194*35238bceSAndroid Build Coastguard Worker }
195*35238bceSAndroid Build Coastguard Worker }
196*35238bceSAndroid Build Coastguard Worker else
197*35238bceSAndroid Build Coastguard Worker supported = true;
198*35238bceSAndroid Build Coastguard Worker
199*35238bceSAndroid Build Coastguard Worker if (!supported)
200*35238bceSAndroid Build Coastguard Worker throw tcu::NotSupportedError("Renderbuffer format not supported", "", __FILE__, __LINE__);
201*35238bceSAndroid Build Coastguard Worker }
202*35238bceSAndroid Build Coastguard Worker
203*35238bceSAndroid Build Coastguard Worker std::string outtype = "";
204*35238bceSAndroid Build Coastguard Worker
205*35238bceSAndroid Build Coastguard Worker if (m_framebuffeType == TestSpec::FRAMEBUFFERTYPE_NATIVE)
206*35238bceSAndroid Build Coastguard Worker outtype = "vec4";
207*35238bceSAndroid Build Coastguard Worker else if (m_framebuffeType == TestSpec::FRAMEBUFFERTYPE_RENDERBUFFER)
208*35238bceSAndroid Build Coastguard Worker {
209*35238bceSAndroid Build Coastguard Worker switch (m_texChannelClass)
210*35238bceSAndroid Build Coastguard Worker {
211*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
212*35238bceSAndroid Build Coastguard Worker outtype = "vec4";
213*35238bceSAndroid Build Coastguard Worker break;
214*35238bceSAndroid Build Coastguard Worker
215*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
216*35238bceSAndroid Build Coastguard Worker outtype = "ivec4";
217*35238bceSAndroid Build Coastguard Worker break;
218*35238bceSAndroid Build Coastguard Worker
219*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
220*35238bceSAndroid Build Coastguard Worker outtype = "uvec4";
221*35238bceSAndroid Build Coastguard Worker break;
222*35238bceSAndroid Build Coastguard Worker
223*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
224*35238bceSAndroid Build Coastguard Worker outtype = "vec4";
225*35238bceSAndroid Build Coastguard Worker break;
226*35238bceSAndroid Build Coastguard Worker
227*35238bceSAndroid Build Coastguard Worker default:
228*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
229*35238bceSAndroid Build Coastguard Worker }
230*35238bceSAndroid Build Coastguard Worker }
231*35238bceSAndroid Build Coastguard Worker else
232*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
233*35238bceSAndroid Build Coastguard Worker
234*35238bceSAndroid Build Coastguard Worker const char *vertexShaderSource = "#version 300 es\n"
235*35238bceSAndroid Build Coastguard Worker "in mediump vec3 a_position;\n"
236*35238bceSAndroid Build Coastguard Worker "in mediump vec4 a_color;\n"
237*35238bceSAndroid Build Coastguard Worker "uniform mediump float u_colorScale;\n"
238*35238bceSAndroid Build Coastguard Worker "out mediump vec4 v_color;\n"
239*35238bceSAndroid Build Coastguard Worker "void main(void)\n"
240*35238bceSAndroid Build Coastguard Worker "{\n"
241*35238bceSAndroid Build Coastguard Worker "\tgl_Position = vec4(a_position, 1.0);\n"
242*35238bceSAndroid Build Coastguard Worker "\tv_color = u_colorScale * a_color;\n"
243*35238bceSAndroid Build Coastguard Worker "}";
244*35238bceSAndroid Build Coastguard Worker
245*35238bceSAndroid Build Coastguard Worker stringstream fragmentShaderSource;
246*35238bceSAndroid Build Coastguard Worker
247*35238bceSAndroid Build Coastguard Worker fragmentShaderSource << "#version 300 es\n"
248*35238bceSAndroid Build Coastguard Worker "in mediump vec4 v_color;\n";
249*35238bceSAndroid Build Coastguard Worker
250*35238bceSAndroid Build Coastguard Worker fragmentShaderSource << "layout (location = 0) out mediump " << outtype
251*35238bceSAndroid Build Coastguard Worker << " o_color;\n"
252*35238bceSAndroid Build Coastguard Worker "void main(void)\n"
253*35238bceSAndroid Build Coastguard Worker "{\n"
254*35238bceSAndroid Build Coastguard Worker "\to_color = "
255*35238bceSAndroid Build Coastguard Worker << outtype
256*35238bceSAndroid Build Coastguard Worker << "(v_color);\n"
257*35238bceSAndroid Build Coastguard Worker "}";
258*35238bceSAndroid Build Coastguard Worker
259*35238bceSAndroid Build Coastguard Worker m_program = new glu::ShaderProgram(m_context.getRenderContext(),
260*35238bceSAndroid Build Coastguard Worker glu::makeVtxFragSources(vertexShaderSource, fragmentShaderSource.str()));
261*35238bceSAndroid Build Coastguard Worker
262*35238bceSAndroid Build Coastguard Worker if (!m_program->isOk())
263*35238bceSAndroid Build Coastguard Worker {
264*35238bceSAndroid Build Coastguard Worker m_log << *m_program;
265*35238bceSAndroid Build Coastguard Worker TCU_FAIL("Failed to compile shader");
266*35238bceSAndroid Build Coastguard Worker }
267*35238bceSAndroid Build Coastguard Worker }
268*35238bceSAndroid Build Coastguard Worker
deinit(void)269*35238bceSAndroid Build Coastguard Worker void ReadPixelsTest::deinit(void)
270*35238bceSAndroid Build Coastguard Worker {
271*35238bceSAndroid Build Coastguard Worker if (m_program)
272*35238bceSAndroid Build Coastguard Worker delete m_program;
273*35238bceSAndroid Build Coastguard Worker m_program = NULL;
274*35238bceSAndroid Build Coastguard Worker }
275*35238bceSAndroid Build Coastguard Worker
renderTriangle(const tcu::Vec3 & a,const tcu::Vec3 & b,const tcu::Vec3 & c)276*35238bceSAndroid Build Coastguard Worker void ReadPixelsTest::renderTriangle(const tcu::Vec3 &a, const tcu::Vec3 &b, const tcu::Vec3 &c)
277*35238bceSAndroid Build Coastguard Worker {
278*35238bceSAndroid Build Coastguard Worker float positions[3 * 3];
279*35238bceSAndroid Build Coastguard Worker
280*35238bceSAndroid Build Coastguard Worker positions[0] = a.x();
281*35238bceSAndroid Build Coastguard Worker positions[1] = a.y();
282*35238bceSAndroid Build Coastguard Worker positions[2] = a.z();
283*35238bceSAndroid Build Coastguard Worker
284*35238bceSAndroid Build Coastguard Worker positions[3] = b.x();
285*35238bceSAndroid Build Coastguard Worker positions[4] = b.y();
286*35238bceSAndroid Build Coastguard Worker positions[5] = b.z();
287*35238bceSAndroid Build Coastguard Worker
288*35238bceSAndroid Build Coastguard Worker positions[6] = c.x();
289*35238bceSAndroid Build Coastguard Worker positions[7] = c.y();
290*35238bceSAndroid Build Coastguard Worker positions[8] = c.z();
291*35238bceSAndroid Build Coastguard Worker
292*35238bceSAndroid Build Coastguard Worker float colors[] = {1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f};
293*35238bceSAndroid Build Coastguard Worker
294*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glUseProgram(m_program->getProgram()));
295*35238bceSAndroid Build Coastguard Worker
296*35238bceSAndroid Build Coastguard Worker GLuint coordLoc = (GLuint)-1;
297*35238bceSAndroid Build Coastguard Worker GLuint colorLoc = (GLuint)-1;
298*35238bceSAndroid Build Coastguard Worker GLuint colorScaleLoc = (GLuint)-1;
299*35238bceSAndroid Build Coastguard Worker
300*35238bceSAndroid Build Coastguard Worker colorScaleLoc = glGetUniformLocation(m_program->getProgram(), "u_colorScale");
301*35238bceSAndroid Build Coastguard Worker TCU_CHECK(colorScaleLoc != (GLuint)-1);
302*35238bceSAndroid Build Coastguard Worker
303*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glUniform1f(colorScaleLoc, m_colorScale));
304*35238bceSAndroid Build Coastguard Worker
305*35238bceSAndroid Build Coastguard Worker coordLoc = glGetAttribLocation(m_program->getProgram(), "a_position");
306*35238bceSAndroid Build Coastguard Worker TCU_CHECK(coordLoc != (GLuint)-1);
307*35238bceSAndroid Build Coastguard Worker
308*35238bceSAndroid Build Coastguard Worker colorLoc = glGetAttribLocation(m_program->getProgram(), "a_color");
309*35238bceSAndroid Build Coastguard Worker TCU_CHECK(colorLoc != (GLuint)-1);
310*35238bceSAndroid Build Coastguard Worker
311*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glEnableVertexAttribArray(colorLoc));
312*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glEnableVertexAttribArray(coordLoc));
313*35238bceSAndroid Build Coastguard Worker
314*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glVertexAttribPointer(coordLoc, 3, GL_FLOAT, GL_FALSE, 0, positions));
315*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glVertexAttribPointer(colorLoc, 4, GL_FLOAT, GL_FALSE, 0, colors));
316*35238bceSAndroid Build Coastguard Worker
317*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glDrawArrays(GL_TRIANGLES, 0, 3));
318*35238bceSAndroid Build Coastguard Worker
319*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glDisableVertexAttribArray(colorLoc));
320*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glDisableVertexAttribArray(coordLoc));
321*35238bceSAndroid Build Coastguard Worker }
322*35238bceSAndroid Build Coastguard Worker
clearColor(float r,float g,float b,float a)323*35238bceSAndroid Build Coastguard Worker void ReadPixelsTest::clearColor(float r, float g, float b, float a)
324*35238bceSAndroid Build Coastguard Worker {
325*35238bceSAndroid Build Coastguard Worker if (m_framebuffeType == TestSpec::FRAMEBUFFERTYPE_NATIVE)
326*35238bceSAndroid Build Coastguard Worker {
327*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glClearColor(r, g, b, a));
328*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glClear(GL_COLOR_BUFFER_BIT));
329*35238bceSAndroid Build Coastguard Worker }
330*35238bceSAndroid Build Coastguard Worker else if (m_framebuffeType == TestSpec::FRAMEBUFFERTYPE_RENDERBUFFER)
331*35238bceSAndroid Build Coastguard Worker {
332*35238bceSAndroid Build Coastguard Worker switch (m_texChannelClass)
333*35238bceSAndroid Build Coastguard Worker {
334*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
335*35238bceSAndroid Build Coastguard Worker {
336*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glClearColor(r, g, b, a));
337*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glClear(GL_COLOR_BUFFER_BIT));
338*35238bceSAndroid Build Coastguard Worker break;
339*35238bceSAndroid Build Coastguard Worker }
340*35238bceSAndroid Build Coastguard Worker
341*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
342*35238bceSAndroid Build Coastguard Worker {
343*35238bceSAndroid Build Coastguard Worker GLint color[4] = {(GLint)r, (GLint)g, (GLint)b, (GLint)a};
344*35238bceSAndroid Build Coastguard Worker
345*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glClearBufferiv(GL_COLOR, 0, color));
346*35238bceSAndroid Build Coastguard Worker break;
347*35238bceSAndroid Build Coastguard Worker }
348*35238bceSAndroid Build Coastguard Worker
349*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
350*35238bceSAndroid Build Coastguard Worker {
351*35238bceSAndroid Build Coastguard Worker GLuint color[4] = {(GLuint)r, (GLuint)g, (GLuint)b, (GLuint)a};
352*35238bceSAndroid Build Coastguard Worker
353*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glClearBufferuiv(GL_COLOR, 0, color));
354*35238bceSAndroid Build Coastguard Worker break;
355*35238bceSAndroid Build Coastguard Worker }
356*35238bceSAndroid Build Coastguard Worker
357*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
358*35238bceSAndroid Build Coastguard Worker {
359*35238bceSAndroid Build Coastguard Worker GLfloat color[4] = {(GLfloat)r, (GLfloat)g, (GLfloat)b, (GLfloat)a};
360*35238bceSAndroid Build Coastguard Worker
361*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glClearBufferfv(GL_COLOR, 0, color));
362*35238bceSAndroid Build Coastguard Worker break;
363*35238bceSAndroid Build Coastguard Worker }
364*35238bceSAndroid Build Coastguard Worker
365*35238bceSAndroid Build Coastguard Worker default:
366*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
367*35238bceSAndroid Build Coastguard Worker }
368*35238bceSAndroid Build Coastguard Worker }
369*35238bceSAndroid Build Coastguard Worker else
370*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
371*35238bceSAndroid Build Coastguard Worker }
372*35238bceSAndroid Build Coastguard Worker
iterate(void)373*35238bceSAndroid Build Coastguard Worker TestCase::IterateResult ReadPixelsTest::iterate(void)
374*35238bceSAndroid Build Coastguard Worker {
375*35238bceSAndroid Build Coastguard Worker int width = m_context.getRenderTarget().getWidth();
376*35238bceSAndroid Build Coastguard Worker int height = m_context.getRenderTarget().getHeight();
377*35238bceSAndroid Build Coastguard Worker
378*35238bceSAndroid Build Coastguard Worker GLuint framebuffer = 0;
379*35238bceSAndroid Build Coastguard Worker GLuint renderbuffer = 0;
380*35238bceSAndroid Build Coastguard Worker
381*35238bceSAndroid Build Coastguard Worker switch (m_framebuffeType)
382*35238bceSAndroid Build Coastguard Worker {
383*35238bceSAndroid Build Coastguard Worker case TestSpec::FRAMEBUFFERTYPE_NATIVE:
384*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glBindFramebuffer(GL_FRAMEBUFFER, framebuffer));
385*35238bceSAndroid Build Coastguard Worker break;
386*35238bceSAndroid Build Coastguard Worker
387*35238bceSAndroid Build Coastguard Worker case TestSpec::FRAMEBUFFERTYPE_RENDERBUFFER:
388*35238bceSAndroid Build Coastguard Worker {
389*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glGenFramebuffers(1, &framebuffer));
390*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glGenRenderbuffers(1, &renderbuffer));
391*35238bceSAndroid Build Coastguard Worker
392*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer));
393*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glRenderbufferStorage(GL_RENDERBUFFER, m_renderbufferFormat, width, height));
394*35238bceSAndroid Build Coastguard Worker
395*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glBindFramebuffer(GL_FRAMEBUFFER, framebuffer));
396*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer));
397*35238bceSAndroid Build Coastguard Worker
398*35238bceSAndroid Build Coastguard Worker break;
399*35238bceSAndroid Build Coastguard Worker }
400*35238bceSAndroid Build Coastguard Worker
401*35238bceSAndroid Build Coastguard Worker default:
402*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
403*35238bceSAndroid Build Coastguard Worker }
404*35238bceSAndroid Build Coastguard Worker
405*35238bceSAndroid Build Coastguard Worker clearColor(m_colorScale * 0.4f, m_colorScale * 1.0f, m_colorScale * 0.5f, m_colorScale * 1.0f);
406*35238bceSAndroid Build Coastguard Worker
407*35238bceSAndroid Build Coastguard Worker if (m_useColorClears)
408*35238bceSAndroid Build Coastguard Worker {
409*35238bceSAndroid Build Coastguard Worker const int maxClearCount = 10;
410*35238bceSAndroid Build Coastguard Worker const int minClearCount = 6;
411*35238bceSAndroid Build Coastguard Worker const int minClearSize = 15;
412*35238bceSAndroid Build Coastguard Worker
413*35238bceSAndroid Build Coastguard Worker int clearCount = m_random.getInt(minClearCount, maxClearCount);
414*35238bceSAndroid Build Coastguard Worker
415*35238bceSAndroid Build Coastguard Worker for (int clearNdx = 0; clearNdx < clearCount; clearNdx++)
416*35238bceSAndroid Build Coastguard Worker {
417*35238bceSAndroid Build Coastguard Worker int clearX = m_random.getInt(0, width - minClearSize);
418*35238bceSAndroid Build Coastguard Worker int clearY = m_random.getInt(0, height - minClearSize);
419*35238bceSAndroid Build Coastguard Worker
420*35238bceSAndroid Build Coastguard Worker int clearWidth = m_random.getInt(minClearSize, width - clearX);
421*35238bceSAndroid Build Coastguard Worker int clearHeight = m_random.getInt(minClearSize, height - clearY);
422*35238bceSAndroid Build Coastguard Worker
423*35238bceSAndroid Build Coastguard Worker float clearRed = m_colorScale * m_random.getFloat();
424*35238bceSAndroid Build Coastguard Worker float clearGreen = m_colorScale * m_random.getFloat();
425*35238bceSAndroid Build Coastguard Worker float clearBlue = m_colorScale * m_random.getFloat();
426*35238bceSAndroid Build Coastguard Worker float clearAlpha = m_colorScale * (0.5f + 0.5f * m_random.getFloat());
427*35238bceSAndroid Build Coastguard Worker
428*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glEnable(GL_SCISSOR_TEST));
429*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glScissor(clearX, clearY, clearWidth, clearHeight));
430*35238bceSAndroid Build Coastguard Worker
431*35238bceSAndroid Build Coastguard Worker clearColor(clearRed, clearGreen, clearBlue, clearAlpha);
432*35238bceSAndroid Build Coastguard Worker }
433*35238bceSAndroid Build Coastguard Worker
434*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glDisable(GL_SCISSOR_TEST));
435*35238bceSAndroid Build Coastguard Worker }
436*35238bceSAndroid Build Coastguard Worker
437*35238bceSAndroid Build Coastguard Worker if (m_renderTriangles)
438*35238bceSAndroid Build Coastguard Worker {
439*35238bceSAndroid Build Coastguard Worker const int minTriangleCount = 4;
440*35238bceSAndroid Build Coastguard Worker const int maxTriangleCount = 10;
441*35238bceSAndroid Build Coastguard Worker
442*35238bceSAndroid Build Coastguard Worker int triangleCount = m_random.getInt(minTriangleCount, maxTriangleCount);
443*35238bceSAndroid Build Coastguard Worker
444*35238bceSAndroid Build Coastguard Worker for (int triangleNdx = 0; triangleNdx < triangleCount; triangleNdx++)
445*35238bceSAndroid Build Coastguard Worker {
446*35238bceSAndroid Build Coastguard Worker float x1 = 2.0f * m_random.getFloat() - 1.0f;
447*35238bceSAndroid Build Coastguard Worker float y1 = 2.0f * m_random.getFloat() - 1.0f;
448*35238bceSAndroid Build Coastguard Worker float z1 = 2.0f * m_random.getFloat() - 1.0f;
449*35238bceSAndroid Build Coastguard Worker
450*35238bceSAndroid Build Coastguard Worker float x2 = 2.0f * m_random.getFloat() - 1.0f;
451*35238bceSAndroid Build Coastguard Worker float y2 = 2.0f * m_random.getFloat() - 1.0f;
452*35238bceSAndroid Build Coastguard Worker float z2 = 2.0f * m_random.getFloat() - 1.0f;
453*35238bceSAndroid Build Coastguard Worker
454*35238bceSAndroid Build Coastguard Worker float x3 = 2.0f * m_random.getFloat() - 1.0f;
455*35238bceSAndroid Build Coastguard Worker float y3 = 2.0f * m_random.getFloat() - 1.0f;
456*35238bceSAndroid Build Coastguard Worker float z3 = 2.0f * m_random.getFloat() - 1.0f;
457*35238bceSAndroid Build Coastguard Worker
458*35238bceSAndroid Build Coastguard Worker renderTriangle(tcu::Vec3(x1, y1, z1), tcu::Vec3(x2, y2, z2), tcu::Vec3(x3, y3, z3));
459*35238bceSAndroid Build Coastguard Worker }
460*35238bceSAndroid Build Coastguard Worker }
461*35238bceSAndroid Build Coastguard Worker
462*35238bceSAndroid Build Coastguard Worker tcu::TextureFormat readFormat;
463*35238bceSAndroid Build Coastguard Worker GLenum readPixelsFormat;
464*35238bceSAndroid Build Coastguard Worker GLenum readPixelsType;
465*35238bceSAndroid Build Coastguard Worker bool floatCompare;
466*35238bceSAndroid Build Coastguard Worker
467*35238bceSAndroid Build Coastguard Worker if (m_framebuffeType == TestSpec::FRAMEBUFFERTYPE_NATIVE)
468*35238bceSAndroid Build Coastguard Worker {
469*35238bceSAndroid Build Coastguard Worker readFormat = glu::mapGLTransferFormat(GL_RGBA, GL_UNSIGNED_BYTE);
470*35238bceSAndroid Build Coastguard Worker readPixelsFormat = GL_RGBA;
471*35238bceSAndroid Build Coastguard Worker readPixelsType = GL_UNSIGNED_BYTE;
472*35238bceSAndroid Build Coastguard Worker floatCompare = false;
473*35238bceSAndroid Build Coastguard Worker }
474*35238bceSAndroid Build Coastguard Worker else if (m_framebuffeType == TestSpec::FRAMEBUFFERTYPE_RENDERBUFFER)
475*35238bceSAndroid Build Coastguard Worker {
476*35238bceSAndroid Build Coastguard Worker switch (m_texChannelClass)
477*35238bceSAndroid Build Coastguard Worker {
478*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT:
479*35238bceSAndroid Build Coastguard Worker readFormat = glu::mapGLTransferFormat(GL_RGBA, GL_UNSIGNED_BYTE);
480*35238bceSAndroid Build Coastguard Worker readPixelsFormat = GL_RGBA;
481*35238bceSAndroid Build Coastguard Worker readPixelsType = GL_UNSIGNED_BYTE;
482*35238bceSAndroid Build Coastguard Worker floatCompare = true;
483*35238bceSAndroid Build Coastguard Worker break;
484*35238bceSAndroid Build Coastguard Worker
485*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER:
486*35238bceSAndroid Build Coastguard Worker readFormat = glu::mapGLTransferFormat(GL_RGBA_INTEGER, GL_INT);
487*35238bceSAndroid Build Coastguard Worker readPixelsFormat = GL_RGBA_INTEGER;
488*35238bceSAndroid Build Coastguard Worker readPixelsType = GL_INT;
489*35238bceSAndroid Build Coastguard Worker floatCompare = false;
490*35238bceSAndroid Build Coastguard Worker break;
491*35238bceSAndroid Build Coastguard Worker
492*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER:
493*35238bceSAndroid Build Coastguard Worker readFormat = glu::mapGLTransferFormat(GL_RGBA_INTEGER, GL_UNSIGNED_INT);
494*35238bceSAndroid Build Coastguard Worker readPixelsFormat = GL_RGBA_INTEGER;
495*35238bceSAndroid Build Coastguard Worker readPixelsType = GL_UNSIGNED_INT;
496*35238bceSAndroid Build Coastguard Worker floatCompare = false;
497*35238bceSAndroid Build Coastguard Worker break;
498*35238bceSAndroid Build Coastguard Worker
499*35238bceSAndroid Build Coastguard Worker case tcu::TEXTURECHANNELCLASS_FLOATING_POINT:
500*35238bceSAndroid Build Coastguard Worker readFormat = glu::mapGLTransferFormat(GL_RGBA, GL_FLOAT);
501*35238bceSAndroid Build Coastguard Worker readPixelsFormat = GL_RGBA;
502*35238bceSAndroid Build Coastguard Worker readPixelsType = GL_FLOAT;
503*35238bceSAndroid Build Coastguard Worker floatCompare = true;
504*35238bceSAndroid Build Coastguard Worker break;
505*35238bceSAndroid Build Coastguard Worker
506*35238bceSAndroid Build Coastguard Worker default:
507*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
508*35238bceSAndroid Build Coastguard Worker // Silence warnings
509*35238bceSAndroid Build Coastguard Worker readFormat = glu::mapGLTransferFormat(GL_RGBA, GL_FLOAT);
510*35238bceSAndroid Build Coastguard Worker readPixelsFormat = GL_RGBA;
511*35238bceSAndroid Build Coastguard Worker readPixelsType = GL_FLOAT;
512*35238bceSAndroid Build Coastguard Worker floatCompare = true;
513*35238bceSAndroid Build Coastguard Worker }
514*35238bceSAndroid Build Coastguard Worker }
515*35238bceSAndroid Build Coastguard Worker else
516*35238bceSAndroid Build Coastguard Worker {
517*35238bceSAndroid Build Coastguard Worker // Silence warnings
518*35238bceSAndroid Build Coastguard Worker readFormat = glu::mapGLTransferFormat(GL_RGBA, GL_FLOAT);
519*35238bceSAndroid Build Coastguard Worker readPixelsFormat = GL_RGBA;
520*35238bceSAndroid Build Coastguard Worker readPixelsType = GL_FLOAT;
521*35238bceSAndroid Build Coastguard Worker floatCompare = true;
522*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
523*35238bceSAndroid Build Coastguard Worker }
524*35238bceSAndroid Build Coastguard Worker
525*35238bceSAndroid Build Coastguard Worker tcu::Texture2D readRefrence(readFormat, width, height);
526*35238bceSAndroid Build Coastguard Worker const int readDataSize = readRefrence.getWidth() * readRefrence.getHeight() * readFormat.getPixelSize();
527*35238bceSAndroid Build Coastguard Worker
528*35238bceSAndroid Build Coastguard Worker readRefrence.allocLevel(0);
529*35238bceSAndroid Build Coastguard Worker
530*35238bceSAndroid Build Coastguard Worker GLuint pixelBuffer = (GLuint)-1;
531*35238bceSAndroid Build Coastguard Worker
532*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glGenBuffers(1, &pixelBuffer));
533*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, pixelBuffer));
534*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glBufferData(GL_PIXEL_PACK_BUFFER, readDataSize, NULL, GL_STREAM_READ));
535*35238bceSAndroid Build Coastguard Worker
536*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glReadPixels(0, 0, width, height, readPixelsFormat, readPixelsType, 0));
537*35238bceSAndroid Build Coastguard Worker
538*35238bceSAndroid Build Coastguard Worker const uint8_t *bufferData =
539*35238bceSAndroid Build Coastguard Worker (const uint8_t *)glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, readDataSize, GL_MAP_READ_BIT);
540*35238bceSAndroid Build Coastguard Worker GLU_CHECK_MSG("glMapBufferRange() failed");
541*35238bceSAndroid Build Coastguard Worker
542*35238bceSAndroid Build Coastguard Worker tcu::ConstPixelBufferAccess readResult(readFormat, width, height, 1, bufferData);
543*35238bceSAndroid Build Coastguard Worker
544*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, 0));
545*35238bceSAndroid Build Coastguard Worker
546*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(
547*35238bceSAndroid Build Coastguard Worker glReadPixels(0, 0, width, height, readPixelsFormat, readPixelsType, readRefrence.getLevel(0).getDataPtr()));
548*35238bceSAndroid Build Coastguard Worker
549*35238bceSAndroid Build Coastguard Worker if (framebuffer)
550*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glDeleteFramebuffers(1, &framebuffer));
551*35238bceSAndroid Build Coastguard Worker
552*35238bceSAndroid Build Coastguard Worker if (renderbuffer)
553*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glDeleteRenderbuffers(1, &renderbuffer));
554*35238bceSAndroid Build Coastguard Worker
555*35238bceSAndroid Build Coastguard Worker bool isOk = false;
556*35238bceSAndroid Build Coastguard Worker
557*35238bceSAndroid Build Coastguard Worker if (floatCompare)
558*35238bceSAndroid Build Coastguard Worker {
559*35238bceSAndroid Build Coastguard Worker const tcu::IVec4 formatBitDepths = tcu::getTextureFormatBitDepth(readFormat);
560*35238bceSAndroid Build Coastguard Worker const float redThreshold =
561*35238bceSAndroid Build Coastguard Worker 2.0f / (float)(1 << deMin32(m_context.getRenderTarget().getPixelFormat().redBits, formatBitDepths.x()));
562*35238bceSAndroid Build Coastguard Worker const float greenThreshold =
563*35238bceSAndroid Build Coastguard Worker 2.0f / (float)(1 << deMin32(m_context.getRenderTarget().getPixelFormat().greenBits, formatBitDepths.y()));
564*35238bceSAndroid Build Coastguard Worker const float blueThreshold =
565*35238bceSAndroid Build Coastguard Worker 2.0f / (float)(1 << deMin32(m_context.getRenderTarget().getPixelFormat().blueBits, formatBitDepths.z()));
566*35238bceSAndroid Build Coastguard Worker const float alphaThreshold =
567*35238bceSAndroid Build Coastguard Worker 2.0f / (float)(1 << deMin32(m_context.getRenderTarget().getPixelFormat().alphaBits, formatBitDepths.w()));
568*35238bceSAndroid Build Coastguard Worker
569*35238bceSAndroid Build Coastguard Worker isOk = tcu::floatThresholdCompare(
570*35238bceSAndroid Build Coastguard Worker m_log, "Result comparision",
571*35238bceSAndroid Build Coastguard Worker "Result of read pixels to memory compared with result of read pixels to buffer", readRefrence.getLevel(0),
572*35238bceSAndroid Build Coastguard Worker readResult, tcu::Vec4(redThreshold, greenThreshold, blueThreshold, alphaThreshold),
573*35238bceSAndroid Build Coastguard Worker tcu::COMPARE_LOG_RESULT);
574*35238bceSAndroid Build Coastguard Worker }
575*35238bceSAndroid Build Coastguard Worker else
576*35238bceSAndroid Build Coastguard Worker {
577*35238bceSAndroid Build Coastguard Worker isOk = tcu::intThresholdCompare(m_log, "Result comparision",
578*35238bceSAndroid Build Coastguard Worker "Result of read pixels to memory compared with result of read pixels to buffer",
579*35238bceSAndroid Build Coastguard Worker readRefrence.getLevel(0), readResult, tcu::UVec4(0, 0, 0, 0),
580*35238bceSAndroid Build Coastguard Worker tcu::COMPARE_LOG_RESULT);
581*35238bceSAndroid Build Coastguard Worker }
582*35238bceSAndroid Build Coastguard Worker
583*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, pixelBuffer));
584*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glUnmapBuffer(GL_PIXEL_PACK_BUFFER));
585*35238bceSAndroid Build Coastguard Worker GLU_CHECK_CALL(glDeleteBuffers(1, &pixelBuffer));
586*35238bceSAndroid Build Coastguard Worker
587*35238bceSAndroid Build Coastguard Worker if (isOk)
588*35238bceSAndroid Build Coastguard Worker {
589*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
590*35238bceSAndroid Build Coastguard Worker return STOP;
591*35238bceSAndroid Build Coastguard Worker }
592*35238bceSAndroid Build Coastguard Worker else
593*35238bceSAndroid Build Coastguard Worker {
594*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
595*35238bceSAndroid Build Coastguard Worker return STOP;
596*35238bceSAndroid Build Coastguard Worker }
597*35238bceSAndroid Build Coastguard Worker }
598*35238bceSAndroid Build Coastguard Worker
599*35238bceSAndroid Build Coastguard Worker } // namespace
600*35238bceSAndroid Build Coastguard Worker
PixelBufferObjectTests(Context & context)601*35238bceSAndroid Build Coastguard Worker PixelBufferObjectTests::PixelBufferObjectTests(Context &context)
602*35238bceSAndroid Build Coastguard Worker : TestCaseGroup(context, "pbo", "Pixel buffer objects tests")
603*35238bceSAndroid Build Coastguard Worker {
604*35238bceSAndroid Build Coastguard Worker }
605*35238bceSAndroid Build Coastguard Worker
~PixelBufferObjectTests(void)606*35238bceSAndroid Build Coastguard Worker PixelBufferObjectTests::~PixelBufferObjectTests(void)
607*35238bceSAndroid Build Coastguard Worker {
608*35238bceSAndroid Build Coastguard Worker }
609*35238bceSAndroid Build Coastguard Worker
init(void)610*35238bceSAndroid Build Coastguard Worker void PixelBufferObjectTests::init(void)
611*35238bceSAndroid Build Coastguard Worker {
612*35238bceSAndroid Build Coastguard Worker TestCaseGroup *nativeFramebufferGroup =
613*35238bceSAndroid Build Coastguard Worker new TestCaseGroup(m_context, "native", "Tests with reading from native framebuffer");
614*35238bceSAndroid Build Coastguard Worker
615*35238bceSAndroid Build Coastguard Worker ReadPixelsTest::TestSpec nativeFramebufferTests[] = {
616*35238bceSAndroid Build Coastguard Worker {"clears", "Simple read pixels test with color clears", true, false,
617*35238bceSAndroid Build Coastguard Worker ReadPixelsTest::TestSpec::FRAMEBUFFERTYPE_NATIVE, GL_NONE},
618*35238bceSAndroid Build Coastguard Worker {"triangles", "Simple read pixels test rendering triangles", false, true,
619*35238bceSAndroid Build Coastguard Worker ReadPixelsTest::TestSpec::FRAMEBUFFERTYPE_NATIVE, GL_NONE}};
620*35238bceSAndroid Build Coastguard Worker
621*35238bceSAndroid Build Coastguard Worker for (int testNdx = 0; testNdx < DE_LENGTH_OF_ARRAY(nativeFramebufferTests); testNdx++)
622*35238bceSAndroid Build Coastguard Worker {
623*35238bceSAndroid Build Coastguard Worker nativeFramebufferGroup->addChild(new ReadPixelsTest(m_context, nativeFramebufferTests[testNdx]));
624*35238bceSAndroid Build Coastguard Worker }
625*35238bceSAndroid Build Coastguard Worker
626*35238bceSAndroid Build Coastguard Worker addChild(nativeFramebufferGroup);
627*35238bceSAndroid Build Coastguard Worker
628*35238bceSAndroid Build Coastguard Worker TestCaseGroup *renderbufferGroup =
629*35238bceSAndroid Build Coastguard Worker new TestCaseGroup(m_context, "renderbuffer", "Tests with reading from renderbuffer");
630*35238bceSAndroid Build Coastguard Worker
631*35238bceSAndroid Build Coastguard Worker GLenum renderbufferFormats[] = {GL_RGBA8,
632*35238bceSAndroid Build Coastguard Worker GL_RGBA8I,
633*35238bceSAndroid Build Coastguard Worker GL_RGBA8UI,
634*35238bceSAndroid Build Coastguard Worker GL_RGBA16F,
635*35238bceSAndroid Build Coastguard Worker GL_RGBA16I,
636*35238bceSAndroid Build Coastguard Worker GL_RGBA16UI,
637*35238bceSAndroid Build Coastguard Worker GL_RGBA32F,
638*35238bceSAndroid Build Coastguard Worker GL_RGBA32I,
639*35238bceSAndroid Build Coastguard Worker GL_RGBA32UI,
640*35238bceSAndroid Build Coastguard Worker
641*35238bceSAndroid Build Coastguard Worker GL_SRGB8_ALPHA8,
642*35238bceSAndroid Build Coastguard Worker GL_RGB10_A2,
643*35238bceSAndroid Build Coastguard Worker GL_RGB10_A2UI,
644*35238bceSAndroid Build Coastguard Worker GL_RGBA4,
645*35238bceSAndroid Build Coastguard Worker GL_RGB5_A1,
646*35238bceSAndroid Build Coastguard Worker
647*35238bceSAndroid Build Coastguard Worker GL_RGB8,
648*35238bceSAndroid Build Coastguard Worker GL_RGB565,
649*35238bceSAndroid Build Coastguard Worker
650*35238bceSAndroid Build Coastguard Worker GL_R11F_G11F_B10F,
651*35238bceSAndroid Build Coastguard Worker
652*35238bceSAndroid Build Coastguard Worker GL_RG8,
653*35238bceSAndroid Build Coastguard Worker GL_RG8I,
654*35238bceSAndroid Build Coastguard Worker GL_RG8UI,
655*35238bceSAndroid Build Coastguard Worker GL_RG16F,
656*35238bceSAndroid Build Coastguard Worker GL_RG16I,
657*35238bceSAndroid Build Coastguard Worker GL_RG16UI,
658*35238bceSAndroid Build Coastguard Worker GL_RG32F,
659*35238bceSAndroid Build Coastguard Worker GL_RG32I,
660*35238bceSAndroid Build Coastguard Worker GL_RG32UI};
661*35238bceSAndroid Build Coastguard Worker
662*35238bceSAndroid Build Coastguard Worker const char *renderbufferFormatsStr[] = {"rgba8",
663*35238bceSAndroid Build Coastguard Worker "rgba8i",
664*35238bceSAndroid Build Coastguard Worker "rgba8ui",
665*35238bceSAndroid Build Coastguard Worker "rgba16f",
666*35238bceSAndroid Build Coastguard Worker "rgba16i",
667*35238bceSAndroid Build Coastguard Worker "rgba16ui",
668*35238bceSAndroid Build Coastguard Worker "rgba32f",
669*35238bceSAndroid Build Coastguard Worker "rgba32i",
670*35238bceSAndroid Build Coastguard Worker "rgba32ui",
671*35238bceSAndroid Build Coastguard Worker
672*35238bceSAndroid Build Coastguard Worker "srgb8_alpha8",
673*35238bceSAndroid Build Coastguard Worker "rgb10_a2",
674*35238bceSAndroid Build Coastguard Worker "rgb10_a2ui",
675*35238bceSAndroid Build Coastguard Worker "rgba4",
676*35238bceSAndroid Build Coastguard Worker "rgb5_a1",
677*35238bceSAndroid Build Coastguard Worker
678*35238bceSAndroid Build Coastguard Worker "rgb8",
679*35238bceSAndroid Build Coastguard Worker "rgb565",
680*35238bceSAndroid Build Coastguard Worker
681*35238bceSAndroid Build Coastguard Worker "r11f_g11f_b10f",
682*35238bceSAndroid Build Coastguard Worker
683*35238bceSAndroid Build Coastguard Worker "rg8",
684*35238bceSAndroid Build Coastguard Worker "rg8i",
685*35238bceSAndroid Build Coastguard Worker "rg8ui",
686*35238bceSAndroid Build Coastguard Worker "rg16f",
687*35238bceSAndroid Build Coastguard Worker "rg16i",
688*35238bceSAndroid Build Coastguard Worker "rg16ui",
689*35238bceSAndroid Build Coastguard Worker "rg32f",
690*35238bceSAndroid Build Coastguard Worker "rg32i",
691*35238bceSAndroid Build Coastguard Worker "rg32ui"};
692*35238bceSAndroid Build Coastguard Worker
693*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(DE_LENGTH_OF_ARRAY(renderbufferFormatsStr) == DE_LENGTH_OF_ARRAY(renderbufferFormats));
694*35238bceSAndroid Build Coastguard Worker
695*35238bceSAndroid Build Coastguard Worker for (int formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(renderbufferFormats); formatNdx++)
696*35238bceSAndroid Build Coastguard Worker {
697*35238bceSAndroid Build Coastguard Worker for (int trianglesClears = 0; trianglesClears < 2; trianglesClears++)
698*35238bceSAndroid Build Coastguard Worker {
699*35238bceSAndroid Build Coastguard Worker ReadPixelsTest::TestSpec testSpec;
700*35238bceSAndroid Build Coastguard Worker
701*35238bceSAndroid Build Coastguard Worker testSpec.name =
702*35238bceSAndroid Build Coastguard Worker string(renderbufferFormatsStr[formatNdx]) + "_" + (trianglesClears == 0 ? "triangles" : "clears");
703*35238bceSAndroid Build Coastguard Worker testSpec.description = testSpec.name;
704*35238bceSAndroid Build Coastguard Worker testSpec.useColorClear = trianglesClears == 1;
705*35238bceSAndroid Build Coastguard Worker testSpec.renderTriangles = trianglesClears == 0;
706*35238bceSAndroid Build Coastguard Worker testSpec.framebufferType = ReadPixelsTest::TestSpec::FRAMEBUFFERTYPE_RENDERBUFFER;
707*35238bceSAndroid Build Coastguard Worker testSpec.renderbufferFormat = renderbufferFormats[formatNdx];
708*35238bceSAndroid Build Coastguard Worker
709*35238bceSAndroid Build Coastguard Worker renderbufferGroup->addChild(new ReadPixelsTest(m_context, testSpec));
710*35238bceSAndroid Build Coastguard Worker }
711*35238bceSAndroid Build Coastguard Worker }
712*35238bceSAndroid Build Coastguard Worker
713*35238bceSAndroid Build Coastguard Worker addChild(renderbufferGroup);
714*35238bceSAndroid Build Coastguard Worker }
715*35238bceSAndroid Build Coastguard Worker
716*35238bceSAndroid Build Coastguard Worker } // namespace Functional
717*35238bceSAndroid Build Coastguard Worker } // namespace gles3
718*35238bceSAndroid Build Coastguard Worker } // namespace deqp
719