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