xref: /aosp_15_r20/external/deqp/modules/gles3/functional/es3fPixelBufferObjectTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program OpenGL ES 3.0 Module
3*35238bceSAndroid Build Coastguard Worker  * -------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker  *
5*35238bceSAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker  *
7*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker  *
11*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker  *
13*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker  *
19*35238bceSAndroid Build Coastguard Worker  *//*!
20*35238bceSAndroid Build Coastguard Worker  * \file
21*35238bceSAndroid Build Coastguard Worker  * \brief 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