1e5c31af7Sopenharmony_ci/*-------------------------------------------------------------------------
2e5c31af7Sopenharmony_ci * OpenGL Conformance Test Suite
3e5c31af7Sopenharmony_ci * -----------------------------
4e5c31af7Sopenharmony_ci *
5e5c31af7Sopenharmony_ci * Copyright (c) 2014-2016 The Khronos Group Inc.
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
22e5c31af7Sopenharmony_ci */ /*-------------------------------------------------------------------*/
23e5c31af7Sopenharmony_ci
24e5c31af7Sopenharmony_ci#include "esextcGeometryShaderLayeredRenderingBoundaryCondition.hpp"
25e5c31af7Sopenharmony_ci
26e5c31af7Sopenharmony_ci#include "gluDefs.hpp"
27e5c31af7Sopenharmony_ci#include "glwEnums.hpp"
28e5c31af7Sopenharmony_ci#include "glwFunctions.hpp"
29e5c31af7Sopenharmony_ci#include "tcuTestLog.hpp"
30e5c31af7Sopenharmony_ci#include <cstring>
31e5c31af7Sopenharmony_ci#include <sstream>
32e5c31af7Sopenharmony_ci#include <string>
33e5c31af7Sopenharmony_ci
34e5c31af7Sopenharmony_cinamespace glcts
35e5c31af7Sopenharmony_ci{
36e5c31af7Sopenharmony_ci/* Configure constant values */
37e5c31af7Sopenharmony_ciconst glw::GLint GeometryShaderLayeredRenderingBoundaryCondition::m_width			   = 4;
38e5c31af7Sopenharmony_ciconst glw::GLint GeometryShaderLayeredRenderingBoundaryCondition::m_height			   = 4;
39e5c31af7Sopenharmony_ciconst glw::GLint GeometryShaderLayeredRenderingBoundaryCondition::m_max_depth		   = 4;
40e5c31af7Sopenharmony_ciconst glw::GLint GeometryShaderLayeredRenderingBoundaryCondition::m_texture_components = 4;
41e5c31af7Sopenharmony_ci
42e5c31af7Sopenharmony_ci/** Constructor
43e5c31af7Sopenharmony_ci *
44e5c31af7Sopenharmony_ci * @param context       Test context
45e5c31af7Sopenharmony_ci * @param name          Test case's name
46e5c31af7Sopenharmony_ci * @param description   Test case's desricption
47e5c31af7Sopenharmony_ci **/
48e5c31af7Sopenharmony_ciGeometryShaderLayeredRenderingBoundaryCondition::GeometryShaderLayeredRenderingBoundaryCondition(
49e5c31af7Sopenharmony_ci	Context& context, const ExtParameters& extParams, const char* name, const char* description)
50e5c31af7Sopenharmony_ci	: TestCaseBase(context, extParams, name, description)
51e5c31af7Sopenharmony_ci	, m_draw_mode(GL_TEXTURE_3D)
52e5c31af7Sopenharmony_ci	, m_n_points(0)
53e5c31af7Sopenharmony_ci	, m_is_fbo_layered(false)
54e5c31af7Sopenharmony_ci	, m_fbo_draw_id(0)
55e5c31af7Sopenharmony_ci	, m_fbo_read_id(0)
56e5c31af7Sopenharmony_ci	, m_fs_id(0)
57e5c31af7Sopenharmony_ci	, m_gs_id(0)
58e5c31af7Sopenharmony_ci	, m_po_id(0)
59e5c31af7Sopenharmony_ci	, m_vao_id(0)
60e5c31af7Sopenharmony_ci	, m_vs_id(0)
61e5c31af7Sopenharmony_ci{
62e5c31af7Sopenharmony_ci	unsigned char blue[]  = { 0, 0, 255, 255 };
63e5c31af7Sopenharmony_ci	unsigned char green[] = { 0, 255, 0, 255 };
64e5c31af7Sopenharmony_ci	unsigned char red[]   = { 255, 0, 0, 255 };
65e5c31af7Sopenharmony_ci	unsigned char white[] = { 255, 255, 255, 255 };
66e5c31af7Sopenharmony_ci
67e5c31af7Sopenharmony_ci	m_blue_color  = new unsigned char[m_texture_components];
68e5c31af7Sopenharmony_ci	m_green_color = new unsigned char[m_texture_components];
69e5c31af7Sopenharmony_ci	m_red_color   = new unsigned char[m_texture_components];
70e5c31af7Sopenharmony_ci	m_white_color = new unsigned char[m_texture_components];
71e5c31af7Sopenharmony_ci
72e5c31af7Sopenharmony_ci	memcpy(m_blue_color, blue, sizeof(blue));
73e5c31af7Sopenharmony_ci	memcpy(m_green_color, green, sizeof(green));
74e5c31af7Sopenharmony_ci	memcpy(m_red_color, red, sizeof(red));
75e5c31af7Sopenharmony_ci	memcpy(m_white_color, white, sizeof(white));
76e5c31af7Sopenharmony_ci}
77e5c31af7Sopenharmony_ci
78e5c31af7Sopenharmony_ciGeometryShaderLayeredRenderingBoundaryCondition::~GeometryShaderLayeredRenderingBoundaryCondition(void)
79e5c31af7Sopenharmony_ci{
80e5c31af7Sopenharmony_ci	if (m_blue_color)
81e5c31af7Sopenharmony_ci	{
82e5c31af7Sopenharmony_ci		delete[] m_blue_color;
83e5c31af7Sopenharmony_ci		m_blue_color = 0;
84e5c31af7Sopenharmony_ci	}
85e5c31af7Sopenharmony_ci
86e5c31af7Sopenharmony_ci	if (m_green_color)
87e5c31af7Sopenharmony_ci	{
88e5c31af7Sopenharmony_ci		delete[] m_green_color;
89e5c31af7Sopenharmony_ci		m_green_color = 0;
90e5c31af7Sopenharmony_ci	}
91e5c31af7Sopenharmony_ci
92e5c31af7Sopenharmony_ci	if (m_red_color)
93e5c31af7Sopenharmony_ci	{
94e5c31af7Sopenharmony_ci		delete[] m_red_color;
95e5c31af7Sopenharmony_ci		m_red_color = 0;
96e5c31af7Sopenharmony_ci	}
97e5c31af7Sopenharmony_ci	if (m_white_color)
98e5c31af7Sopenharmony_ci	{
99e5c31af7Sopenharmony_ci		delete[] m_white_color;
100e5c31af7Sopenharmony_ci		m_white_color = 0;
101e5c31af7Sopenharmony_ci	}
102e5c31af7Sopenharmony_ci}
103e5c31af7Sopenharmony_ci
104e5c31af7Sopenharmony_ci/** Check if given data contains the same values as reference pixel
105e5c31af7Sopenharmony_ci *
106e5c31af7Sopenharmony_ci *   @param width          Texture width
107e5c31af7Sopenharmony_ci *   @param height         Texture height
108e5c31af7Sopenharmony_ci *   @param pixelSize      Size of pixel
109e5c31af7Sopenharmony_ci *   @param textureData    buffer with data read from texture
110e5c31af7Sopenharmony_ci *   @param referencePixel contains expected color value
111e5c31af7Sopenharmony_ci *   @param attachment     Attachment number (written to log on failure)
112e5c31af7Sopenharmony_ci *   @param layer          Layer number (written to log on failure)
113e5c31af7Sopenharmony_ci *
114e5c31af7Sopenharmony_ci *   @return  true    If all data in scope from textureData contains the same color as in referencePixel
115e5c31af7Sopenharmony_ci *            false   in other case
116e5c31af7Sopenharmony_ci **/
117e5c31af7Sopenharmony_cibool GeometryShaderLayeredRenderingBoundaryCondition::comparePixels(glw::GLint width, glw::GLint height,
118e5c31af7Sopenharmony_ci																	glw::GLint			 pixelSize,
119e5c31af7Sopenharmony_ci																	const unsigned char* textureData,
120e5c31af7Sopenharmony_ci																	const unsigned char* referencePixel, int attachment,
121e5c31af7Sopenharmony_ci																	int layer)
122e5c31af7Sopenharmony_ci{
123e5c31af7Sopenharmony_ci	unsigned int rowWidth = pixelSize * width;
124e5c31af7Sopenharmony_ci
125e5c31af7Sopenharmony_ci	for (int y = 0; y < height; ++y)
126e5c31af7Sopenharmony_ci	{
127e5c31af7Sopenharmony_ci		for (int x = 0; x < width; ++x)
128e5c31af7Sopenharmony_ci		{
129e5c31af7Sopenharmony_ci			const unsigned char* renderedData = textureData + y * rowWidth + x * m_texture_components;
130e5c31af7Sopenharmony_ci
131e5c31af7Sopenharmony_ci			if (memcmp(referencePixel, renderedData, m_texture_components) != 0)
132e5c31af7Sopenharmony_ci			{
133e5c31af7Sopenharmony_ci				m_testCtx.getLog() << tcu::TestLog::Message << "Rendered data for [x=" << x << " y=" << y
134e5c31af7Sopenharmony_ci								   << " attachment=" << attachment << " layer=" << layer << "] "
135e5c31af7Sopenharmony_ci								   << "[" << (int)renderedData[0] << ", " << (int)renderedData[1] << ", "
136e5c31af7Sopenharmony_ci								   << (int)renderedData[2] << ", " << (int)renderedData[3] << "]"
137e5c31af7Sopenharmony_ci								   << " are different from reference data [" << (int)referencePixel[0] << ", "
138e5c31af7Sopenharmony_ci								   << (int)referencePixel[1] << ", " << (int)referencePixel[2] << ", "
139e5c31af7Sopenharmony_ci								   << (int)referencePixel[3] << "] !" << tcu::TestLog::EndMessage;
140e5c31af7Sopenharmony_ci				return false;
141e5c31af7Sopenharmony_ci			} /* if (data comparison failed) */
142e5c31af7Sopenharmony_ci		}	 /* for (all columns) */
143e5c31af7Sopenharmony_ci	}		  /* for (all rows) */
144e5c31af7Sopenharmony_ci	return true;
145e5c31af7Sopenharmony_ci}
146e5c31af7Sopenharmony_ci
147e5c31af7Sopenharmony_ci/** Deinitializes GLES objects created during the test.
148e5c31af7Sopenharmony_ci *
149e5c31af7Sopenharmony_ci */
150e5c31af7Sopenharmony_civoid GeometryShaderLayeredRenderingBoundaryCondition::deinit(void)
151e5c31af7Sopenharmony_ci{
152e5c31af7Sopenharmony_ci	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
153e5c31af7Sopenharmony_ci
154e5c31af7Sopenharmony_ci	/* Reset OpenGL ES state */
155e5c31af7Sopenharmony_ci	gl.useProgram(0);
156e5c31af7Sopenharmony_ci	gl.bindVertexArray(0);
157e5c31af7Sopenharmony_ci	gl.bindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
158e5c31af7Sopenharmony_ci	gl.bindFramebuffer(GL_READ_FRAMEBUFFER, 0);
159e5c31af7Sopenharmony_ci
160e5c31af7Sopenharmony_ci	for (unsigned int i = 0; i < m_textures_info.size(); i++)
161e5c31af7Sopenharmony_ci	{
162e5c31af7Sopenharmony_ci		gl.bindTexture(m_textures_info[i].m_texture_target, 0);
163e5c31af7Sopenharmony_ci	}
164e5c31af7Sopenharmony_ci
165e5c31af7Sopenharmony_ci	if (m_po_id != 0)
166e5c31af7Sopenharmony_ci	{
167e5c31af7Sopenharmony_ci		gl.deleteProgram(m_po_id);
168e5c31af7Sopenharmony_ci	}
169e5c31af7Sopenharmony_ci
170e5c31af7Sopenharmony_ci	if (m_fs_id != 0)
171e5c31af7Sopenharmony_ci	{
172e5c31af7Sopenharmony_ci		gl.deleteShader(m_fs_id);
173e5c31af7Sopenharmony_ci	}
174e5c31af7Sopenharmony_ci
175e5c31af7Sopenharmony_ci	if (m_gs_id != 0)
176e5c31af7Sopenharmony_ci	{
177e5c31af7Sopenharmony_ci		gl.deleteShader(m_gs_id);
178e5c31af7Sopenharmony_ci	}
179e5c31af7Sopenharmony_ci
180e5c31af7Sopenharmony_ci	if (m_vs_id != 0)
181e5c31af7Sopenharmony_ci	{
182e5c31af7Sopenharmony_ci		gl.deleteShader(m_vs_id);
183e5c31af7Sopenharmony_ci	}
184e5c31af7Sopenharmony_ci
185e5c31af7Sopenharmony_ci	for (unsigned int i = 0; i < m_textures_info.size(); i++)
186e5c31af7Sopenharmony_ci	{
187e5c31af7Sopenharmony_ci		gl.deleteTextures(1, &m_textures_info[i].m_id);
188e5c31af7Sopenharmony_ci	}
189e5c31af7Sopenharmony_ci
190e5c31af7Sopenharmony_ci	if (m_fbo_read_id != 0)
191e5c31af7Sopenharmony_ci	{
192e5c31af7Sopenharmony_ci		gl.deleteFramebuffers(1, &m_fbo_read_id);
193e5c31af7Sopenharmony_ci	}
194e5c31af7Sopenharmony_ci
195e5c31af7Sopenharmony_ci	if (m_fbo_draw_id != 0)
196e5c31af7Sopenharmony_ci	{
197e5c31af7Sopenharmony_ci		gl.deleteFramebuffers(1, &m_fbo_draw_id);
198e5c31af7Sopenharmony_ci	}
199e5c31af7Sopenharmony_ci
200e5c31af7Sopenharmony_ci	if (m_vao_id != 0)
201e5c31af7Sopenharmony_ci	{
202e5c31af7Sopenharmony_ci		gl.deleteVertexArrays(1, &m_vao_id);
203e5c31af7Sopenharmony_ci	}
204e5c31af7Sopenharmony_ci
205e5c31af7Sopenharmony_ci	/* Release base class */
206e5c31af7Sopenharmony_ci	TestCaseBase::deinit();
207e5c31af7Sopenharmony_ci}
208e5c31af7Sopenharmony_ci
209e5c31af7Sopenharmony_ci/** Returns code for Geometry Shader.
210e5c31af7Sopenharmony_ci *
211e5c31af7Sopenharmony_ci *  @return NULL
212e5c31af7Sopenharmony_ci **/
213e5c31af7Sopenharmony_ciconst char* GeometryShaderLayeredRenderingBoundaryCondition::getGeometryShaderCode()
214e5c31af7Sopenharmony_ci{
215e5c31af7Sopenharmony_ci	return 0;
216e5c31af7Sopenharmony_ci}
217e5c31af7Sopenharmony_ci
218e5c31af7Sopenharmony_ci/** Returns code for Fragment Shader
219e5c31af7Sopenharmony_ci * @return pointer to literal with Fragment Shader code
220e5c31af7Sopenharmony_ci **/
221e5c31af7Sopenharmony_ciconst char* GeometryShaderLayeredRenderingBoundaryCondition::getFragmentShaderCode()
222e5c31af7Sopenharmony_ci{
223e5c31af7Sopenharmony_ci	static const char* result = "${VERSION}\n"
224e5c31af7Sopenharmony_ci								"\n"
225e5c31af7Sopenharmony_ci								"precision highp float;\n"
226e5c31af7Sopenharmony_ci								"\n"
227e5c31af7Sopenharmony_ci								"flat in  int  layer_id;\n"
228e5c31af7Sopenharmony_ci								"     out vec4 color;\n"
229e5c31af7Sopenharmony_ci								"\n"
230e5c31af7Sopenharmony_ci								"void main()\n"
231e5c31af7Sopenharmony_ci								"{\n"
232e5c31af7Sopenharmony_ci								"    color = vec4(1, 1, 1, 1);\n"
233e5c31af7Sopenharmony_ci								"}\n";
234e5c31af7Sopenharmony_ci	return result;
235e5c31af7Sopenharmony_ci}
236e5c31af7Sopenharmony_ci
237e5c31af7Sopenharmony_ci/** Returns code for Vertex Shader
238e5c31af7Sopenharmony_ci *
239e5c31af7Sopenharmony_ci * @return pointer to literal with Vertex Shader code
240e5c31af7Sopenharmony_ci **/
241e5c31af7Sopenharmony_ciconst char* GeometryShaderLayeredRenderingBoundaryCondition::getVertexShaderCode()
242e5c31af7Sopenharmony_ci{
243e5c31af7Sopenharmony_ci	static const char* result = "${VERSION}\n"
244e5c31af7Sopenharmony_ci								"\n"
245e5c31af7Sopenharmony_ci								"precision highp float;\n"
246e5c31af7Sopenharmony_ci								"\n"
247e5c31af7Sopenharmony_ci								"flat out int layer_id;\n"
248e5c31af7Sopenharmony_ci								"\n"
249e5c31af7Sopenharmony_ci								"void main()\n"
250e5c31af7Sopenharmony_ci								"{\n"
251e5c31af7Sopenharmony_ci								"    layer_id = 0;\n"
252e5c31af7Sopenharmony_ci								"}\n";
253e5c31af7Sopenharmony_ci
254e5c31af7Sopenharmony_ci	return result;
255e5c31af7Sopenharmony_ci}
256e5c31af7Sopenharmony_ci
257e5c31af7Sopenharmony_ci/** Initializes GLES objects used during the test.
258e5c31af7Sopenharmony_ci *
259e5c31af7Sopenharmony_ci **/
260e5c31af7Sopenharmony_civoid GeometryShaderLayeredRenderingBoundaryCondition::initTest(void)
261e5c31af7Sopenharmony_ci{
262e5c31af7Sopenharmony_ci	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
263e5c31af7Sopenharmony_ci
264e5c31af7Sopenharmony_ci	/* Create shader and program objects */
265e5c31af7Sopenharmony_ci	const char* fsCode = getFragmentShaderCode();
266e5c31af7Sopenharmony_ci	const char* gsCode = getGeometryShaderCode();
267e5c31af7Sopenharmony_ci	const char* vsCode = getVertexShaderCode();
268e5c31af7Sopenharmony_ci
269e5c31af7Sopenharmony_ci	m_fs_id = gl.createShader(GL_FRAGMENT_SHADER);
270e5c31af7Sopenharmony_ci	m_vs_id = gl.createShader(GL_VERTEX_SHADER);
271e5c31af7Sopenharmony_ci	m_gs_id = gl.createShader(m_glExtTokens.GEOMETRY_SHADER);
272e5c31af7Sopenharmony_ci	m_po_id = gl.createProgram();
273e5c31af7Sopenharmony_ci
274e5c31af7Sopenharmony_ci	GLU_EXPECT_NO_ERROR(gl.getError(), "Error creating program/shader objects.");
275e5c31af7Sopenharmony_ci
276e5c31af7Sopenharmony_ci	if (!buildProgram(m_po_id, (fsCode) ? m_fs_id : 0, (fsCode) ? 1 : 0 /* part */, (fsCode) ? &fsCode : 0,
277e5c31af7Sopenharmony_ci					  (gsCode) ? m_gs_id : 0, (gsCode) ? 1 : 0 /* part */, (gsCode) ? &gsCode : 0,
278e5c31af7Sopenharmony_ci					  (vsCode) ? m_vs_id : 0, (vsCode) ? 1 : 0 /* part */, (vsCode) ? &vsCode : 0))
279e5c31af7Sopenharmony_ci	{
280e5c31af7Sopenharmony_ci		TCU_FAIL("Could not create a program object from a valid vertex/geometry/fragment shader!");
281e5c31af7Sopenharmony_ci	}
282e5c31af7Sopenharmony_ci
283e5c31af7Sopenharmony_ci	/* Set up framebuffer objects */
284e5c31af7Sopenharmony_ci	gl.genFramebuffers(1, &m_fbo_read_id);
285e5c31af7Sopenharmony_ci	gl.genFramebuffers(1, &m_fbo_draw_id);
286e5c31af7Sopenharmony_ci
287e5c31af7Sopenharmony_ci	GLU_EXPECT_NO_ERROR(gl.getError(), "Error creating framebuffer objects!");
288e5c31af7Sopenharmony_ci
289e5c31af7Sopenharmony_ci	/* Set up vertex array object */
290e5c31af7Sopenharmony_ci	gl.genVertexArrays(1, &m_vao_id);
291e5c31af7Sopenharmony_ci
292e5c31af7Sopenharmony_ci	GLU_EXPECT_NO_ERROR(gl.getError(), "Error creating vertex array object!");
293e5c31af7Sopenharmony_ci
294e5c31af7Sopenharmony_ci	for (unsigned int i = 0; i < m_textures_info.size(); i++)
295e5c31af7Sopenharmony_ci	{
296e5c31af7Sopenharmony_ci		gl.genTextures(1, &m_textures_info[i].m_id);
297e5c31af7Sopenharmony_ci	}
298e5c31af7Sopenharmony_ci
299e5c31af7Sopenharmony_ci	GLU_EXPECT_NO_ERROR(gl.getError(), "Error creating texture objects!");
300e5c31af7Sopenharmony_ci}
301e5c31af7Sopenharmony_ci
302e5c31af7Sopenharmony_ci/** Executes the test.
303e5c31af7Sopenharmony_ci *  Sets the test result to QP_TEST_RESULT_FAIL if the test failed, QP_TEST_RESULT_PASS otherwise.
304e5c31af7Sopenharmony_ci *  @return STOP if the test has finished, CONTINUE to indicate iterate should be called once again.
305e5c31af7Sopenharmony_ci *  Note the function throws exception should an error occur!
306e5c31af7Sopenharmony_ci **/
307e5c31af7Sopenharmony_citcu::TestNode::IterateResult GeometryShaderLayeredRenderingBoundaryCondition::iterate(void)
308e5c31af7Sopenharmony_ci{
309e5c31af7Sopenharmony_ci	/* check if EXT_geometry_shader extension is supported */
310e5c31af7Sopenharmony_ci	if (!m_is_geometry_shader_extension_supported)
311e5c31af7Sopenharmony_ci	{
312e5c31af7Sopenharmony_ci		throw tcu::NotSupportedError(GEOMETRY_SHADER_EXTENSION_NOT_SUPPORTED, "", __FILE__, __LINE__);
313e5c31af7Sopenharmony_ci	}
314e5c31af7Sopenharmony_ci
315e5c31af7Sopenharmony_ci	initTest();
316e5c31af7Sopenharmony_ci
317e5c31af7Sopenharmony_ci	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
318e5c31af7Sopenharmony_ci
319e5c31af7Sopenharmony_ci	/* Bind draw framebuffer */
320e5c31af7Sopenharmony_ci	gl.bindFramebuffer(GL_DRAW_FRAMEBUFFER, m_fbo_draw_id);
321e5c31af7Sopenharmony_ci
322e5c31af7Sopenharmony_ci	/* Set up all textures */
323e5c31af7Sopenharmony_ci	unsigned char buffer[m_width * m_height * m_max_depth * m_texture_components];
324e5c31af7Sopenharmony_ci
325e5c31af7Sopenharmony_ci	memset(buffer, 0, sizeof(buffer));
326e5c31af7Sopenharmony_ci
327e5c31af7Sopenharmony_ci	for (unsigned int i = 0; i < m_textures_info.size(); i++)
328e5c31af7Sopenharmony_ci	{
329e5c31af7Sopenharmony_ci		gl.bindTexture(m_textures_info[i].m_texture_target, m_textures_info[i].m_id);
330e5c31af7Sopenharmony_ci		gl.texStorage3D(m_textures_info[i].m_texture_target, 1, GL_RGBA8, m_width, m_height,
331e5c31af7Sopenharmony_ci						m_textures_info[i].m_depth);
332e5c31af7Sopenharmony_ci		gl.texSubImage3D(m_textures_info[i].m_texture_target, 0, 0, 0, 0, m_width, m_height, m_textures_info[i].m_depth,
333e5c31af7Sopenharmony_ci						 GL_RGBA, GL_UNSIGNED_BYTE, buffer);
334e5c31af7Sopenharmony_ci
335e5c31af7Sopenharmony_ci		GLU_EXPECT_NO_ERROR(gl.getError(), "Error configuring a texture object!");
336e5c31af7Sopenharmony_ci	}
337e5c31af7Sopenharmony_ci
338e5c31af7Sopenharmony_ci	/* Set up draw buffers */
339e5c31af7Sopenharmony_ci	{
340e5c31af7Sopenharmony_ci		glw::GLenum* drawBuffers = new glw::GLenum[m_textures_info.size()];
341e5c31af7Sopenharmony_ci
342e5c31af7Sopenharmony_ci		for (unsigned int i = 0; i < m_textures_info.size(); i++)
343e5c31af7Sopenharmony_ci		{
344e5c31af7Sopenharmony_ci			drawBuffers[i] = m_textures_info[i].m_draw_buffer;
345e5c31af7Sopenharmony_ci		}
346e5c31af7Sopenharmony_ci
347e5c31af7Sopenharmony_ci		gl.drawBuffers((glw::GLsizei)m_textures_info.size(), drawBuffers);
348e5c31af7Sopenharmony_ci
349e5c31af7Sopenharmony_ci		delete[] drawBuffers;
350e5c31af7Sopenharmony_ci		drawBuffers = 0;
351e5c31af7Sopenharmony_ci	}
352e5c31af7Sopenharmony_ci
353e5c31af7Sopenharmony_ci	GLU_EXPECT_NO_ERROR(gl.getError(), "Error setting draw buffers!");
354e5c31af7Sopenharmony_ci
355e5c31af7Sopenharmony_ci	/* Configure draw FBO so that it uses texture attachments */
356e5c31af7Sopenharmony_ci	for (unsigned int i = 0; i < m_textures_info.size(); i++)
357e5c31af7Sopenharmony_ci	{
358e5c31af7Sopenharmony_ci		if (m_is_fbo_layered)
359e5c31af7Sopenharmony_ci		{
360e5c31af7Sopenharmony_ci			gl.framebufferTexture(GL_DRAW_FRAMEBUFFER, m_textures_info[i].m_draw_buffer, m_textures_info[i].m_id,
361e5c31af7Sopenharmony_ci								  0 /* level */);
362e5c31af7Sopenharmony_ci		}
363e5c31af7Sopenharmony_ci		else
364e5c31af7Sopenharmony_ci		{
365e5c31af7Sopenharmony_ci			gl.framebufferTextureLayer(GL_DRAW_FRAMEBUFFER, m_textures_info[i].m_draw_buffer, m_textures_info[i].m_id,
366e5c31af7Sopenharmony_ci									   0 /* level */, i /* layer */);
367e5c31af7Sopenharmony_ci		}
368e5c31af7Sopenharmony_ci
369e5c31af7Sopenharmony_ci		GLU_EXPECT_NO_ERROR(gl.getError(), "Error configuring framebuffer objects!");
370e5c31af7Sopenharmony_ci	} /* for (all textures considered) */
371e5c31af7Sopenharmony_ci
372e5c31af7Sopenharmony_ci	/* Verify draw framebuffer is considered complete */
373e5c31af7Sopenharmony_ci	glw::GLenum fboCompleteness = gl.checkFramebufferStatus(GL_DRAW_FRAMEBUFFER);
374e5c31af7Sopenharmony_ci
375e5c31af7Sopenharmony_ci	if (fboCompleteness != GL_FRAMEBUFFER_COMPLETE)
376e5c31af7Sopenharmony_ci	{
377e5c31af7Sopenharmony_ci		m_testCtx.getLog() << tcu::TestLog::Message << "Draw FBO is incomplete: "
378e5c31af7Sopenharmony_ci						   << "[" << fboCompleteness << "]" << tcu::TestLog::EndMessage;
379e5c31af7Sopenharmony_ci
380e5c31af7Sopenharmony_ci		TCU_FAIL("Draw FBO is incomplete.");
381e5c31af7Sopenharmony_ci	}
382e5c31af7Sopenharmony_ci
383e5c31af7Sopenharmony_ci	/* Set up viewport */
384e5c31af7Sopenharmony_ci	gl.viewport(0, 0, m_width, m_height);
385e5c31af7Sopenharmony_ci
386e5c31af7Sopenharmony_ci	GLU_EXPECT_NO_ERROR(gl.getError(), "Error setting up viewport!");
387e5c31af7Sopenharmony_ci
388e5c31af7Sopenharmony_ci	/** Bind a vertex array object */
389e5c31af7Sopenharmony_ci	gl.bindVertexArray(m_vao_id);
390e5c31af7Sopenharmony_ci
391e5c31af7Sopenharmony_ci	GLU_EXPECT_NO_ERROR(gl.getError(), "Error configuring vertex array object!");
392e5c31af7Sopenharmony_ci
393e5c31af7Sopenharmony_ci	/* Render */
394e5c31af7Sopenharmony_ci	gl.useProgram(m_po_id);
395e5c31af7Sopenharmony_ci
396e5c31af7Sopenharmony_ci	GLU_EXPECT_NO_ERROR(gl.getError(), "Error using program object!");
397e5c31af7Sopenharmony_ci
398e5c31af7Sopenharmony_ci	gl.drawArrays(m_draw_mode, 0, m_n_points);
399e5c31af7Sopenharmony_ci
400e5c31af7Sopenharmony_ci	GLU_EXPECT_NO_ERROR(gl.getError(), "Rendering failed!");
401e5c31af7Sopenharmony_ci
402e5c31af7Sopenharmony_ci	/* Bind read framebuffer object. */
403e5c31af7Sopenharmony_ci	gl.bindFramebuffer(GL_READ_FRAMEBUFFER, m_fbo_read_id);
404e5c31af7Sopenharmony_ci
405e5c31af7Sopenharmony_ci	/* Compare the rendered data against reference representation */
406e5c31af7Sopenharmony_ci	unsigned int min_depth = 0;
407e5c31af7Sopenharmony_ci
408e5c31af7Sopenharmony_ci	if (m_textures_info.size() > 0)
409e5c31af7Sopenharmony_ci	{
410e5c31af7Sopenharmony_ci		min_depth = m_textures_info[0].m_depth;
411e5c31af7Sopenharmony_ci
412e5c31af7Sopenharmony_ci		for (unsigned int nTexture = 1; nTexture < m_textures_info.size(); nTexture++)
413e5c31af7Sopenharmony_ci		{
414e5c31af7Sopenharmony_ci			if (min_depth > (unsigned)m_textures_info[nTexture].m_depth)
415e5c31af7Sopenharmony_ci			{
416e5c31af7Sopenharmony_ci				min_depth = m_textures_info[nTexture].m_depth;
417e5c31af7Sopenharmony_ci			}
418e5c31af7Sopenharmony_ci		}
419e5c31af7Sopenharmony_ci	}
420e5c31af7Sopenharmony_ci
421e5c31af7Sopenharmony_ci	for (unsigned int nTexture = 0; nTexture < m_textures_info.size(); nTexture++)
422e5c31af7Sopenharmony_ci	{
423e5c31af7Sopenharmony_ci		for (unsigned int nLayer = 0; nLayer < min_depth; nLayer++)
424e5c31af7Sopenharmony_ci		{
425e5c31af7Sopenharmony_ci			/* Configure read FBO's color attachment */
426e5c31af7Sopenharmony_ci			gl.framebufferTextureLayer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m_textures_info[nTexture].m_id, 0,
427e5c31af7Sopenharmony_ci									   nLayer);
428e5c31af7Sopenharmony_ci
429e5c31af7Sopenharmony_ci			GLU_EXPECT_NO_ERROR(gl.getError(), "Could not set up read framebuffer!");
430e5c31af7Sopenharmony_ci
431e5c31af7Sopenharmony_ci			/* Verify read framebuffer is considered complete */
432e5c31af7Sopenharmony_ci			glw::GLenum _fboCompleteness = gl.checkFramebufferStatus(GL_DRAW_FRAMEBUFFER);
433e5c31af7Sopenharmony_ci
434e5c31af7Sopenharmony_ci			if (_fboCompleteness != GL_FRAMEBUFFER_COMPLETE)
435e5c31af7Sopenharmony_ci			{
436e5c31af7Sopenharmony_ci				m_testCtx.getLog() << tcu::TestLog::Message << "Read FBO is incomplete: "
437e5c31af7Sopenharmony_ci								   << "[" << _fboCompleteness << "]" << tcu::TestLog::EndMessage;
438e5c31af7Sopenharmony_ci
439e5c31af7Sopenharmony_ci				TCU_FAIL("Read FBO is incomplete.");
440e5c31af7Sopenharmony_ci			}
441e5c31af7Sopenharmony_ci			gl.viewport(0, 0, m_width, m_height);
442e5c31af7Sopenharmony_ci
443e5c31af7Sopenharmony_ci			/* Read the rendered data */
444e5c31af7Sopenharmony_ci			gl.readPixels(0 /* x */, 0 /* y */, m_width /* width */, m_height /* height */, GL_RGBA, GL_UNSIGNED_BYTE,
445e5c31af7Sopenharmony_ci						  buffer);
446e5c31af7Sopenharmony_ci
447e5c31af7Sopenharmony_ci			GLU_EXPECT_NO_ERROR(gl.getError(), "Could not read pixels using glReadPixels()");
448e5c31af7Sopenharmony_ci
449e5c31af7Sopenharmony_ci			/* Retrieve reference color for layer */
450e5c31af7Sopenharmony_ci			unsigned char expectedData[m_texture_components];
451e5c31af7Sopenharmony_ci
452e5c31af7Sopenharmony_ci			getReferenceColor(nLayer, expectedData, m_texture_components);
453e5c31af7Sopenharmony_ci
454e5c31af7Sopenharmony_ci			/* Compare the retrieved data with reference data */
455e5c31af7Sopenharmony_ci			if (!comparePixels(m_width, m_height, m_texture_components, buffer, expectedData, nTexture, nLayer))
456e5c31af7Sopenharmony_ci			{
457e5c31af7Sopenharmony_ci				m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
458e5c31af7Sopenharmony_ci				return STOP;
459e5c31af7Sopenharmony_ci			} /* if (data comparison failed) */
460e5c31af7Sopenharmony_ci		}	 /* for (all layers) */
461e5c31af7Sopenharmony_ci	}		  /* for (all texture objects) */
462e5c31af7Sopenharmony_ci
463e5c31af7Sopenharmony_ci	m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
464e5c31af7Sopenharmony_ci	return STOP;
465e5c31af7Sopenharmony_ci}
466e5c31af7Sopenharmony_ci
467e5c31af7Sopenharmony_ci/** Constructor
468e5c31af7Sopenharmony_ci *
469e5c31af7Sopenharmony_ci * @param context       Test context
470e5c31af7Sopenharmony_ci * @param name          Test case's name
471e5c31af7Sopenharmony_ci * @param description   Test case's desricption
472e5c31af7Sopenharmony_ci **/
473e5c31af7Sopenharmony_ciGeometryShaderLayeredRenderingBoundaryConditionVariousTextures::
474e5c31af7Sopenharmony_ci	GeometryShaderLayeredRenderingBoundaryConditionVariousTextures(Context& context, const ExtParameters& extParams,
475e5c31af7Sopenharmony_ci																   const char* name, const char* description)
476e5c31af7Sopenharmony_ci	: GeometryShaderLayeredRenderingBoundaryCondition(context, extParams, name, description)
477e5c31af7Sopenharmony_ci{
478e5c31af7Sopenharmony_ci	TextureInfo texInfo;
479e5c31af7Sopenharmony_ci
480e5c31af7Sopenharmony_ci	texInfo.m_depth			 = 2;
481e5c31af7Sopenharmony_ci	texInfo.m_draw_buffer	= GL_COLOR_ATTACHMENT0;
482e5c31af7Sopenharmony_ci	texInfo.m_id			 = 0;
483e5c31af7Sopenharmony_ci	texInfo.m_texture_target = GL_TEXTURE_3D;
484e5c31af7Sopenharmony_ci
485e5c31af7Sopenharmony_ci	m_textures_info.push_back(texInfo);
486e5c31af7Sopenharmony_ci
487e5c31af7Sopenharmony_ci	texInfo.m_depth			 = 4;
488e5c31af7Sopenharmony_ci	texInfo.m_draw_buffer	= GL_COLOR_ATTACHMENT1;
489e5c31af7Sopenharmony_ci	texInfo.m_id			 = 0;
490e5c31af7Sopenharmony_ci	texInfo.m_texture_target = GL_TEXTURE_3D;
491e5c31af7Sopenharmony_ci
492e5c31af7Sopenharmony_ci	m_textures_info.push_back(texInfo);
493e5c31af7Sopenharmony_ci
494e5c31af7Sopenharmony_ci	m_draw_mode		 = GL_POINTS;
495e5c31af7Sopenharmony_ci	m_n_points		 = 1;
496e5c31af7Sopenharmony_ci	m_is_fbo_layered = true;
497e5c31af7Sopenharmony_ci}
498e5c31af7Sopenharmony_ci
499e5c31af7Sopenharmony_ci/** Returns code for Fragment Shader
500e5c31af7Sopenharmony_ci *
501e5c31af7Sopenharmony_ci * @return pointer to literal with Fragment Shader code
502e5c31af7Sopenharmony_ci **/
503e5c31af7Sopenharmony_ciconst char* GeometryShaderLayeredRenderingBoundaryConditionVariousTextures::getFragmentShaderCode()
504e5c31af7Sopenharmony_ci{
505e5c31af7Sopenharmony_ci	static const char* result = "${VERSION}\n"
506e5c31af7Sopenharmony_ci								"\n"
507e5c31af7Sopenharmony_ci								"precision highp float;\n"
508e5c31af7Sopenharmony_ci								"\n"
509e5c31af7Sopenharmony_ci								"flat in  int  layer_id;\n"
510e5c31af7Sopenharmony_ci								"layout(location=0) out vec4 color0;\n"
511e5c31af7Sopenharmony_ci								"layout(location=1) out vec4 color1;\n"
512e5c31af7Sopenharmony_ci								"\n"
513e5c31af7Sopenharmony_ci								"void main()\n"
514e5c31af7Sopenharmony_ci								"{\n"
515e5c31af7Sopenharmony_ci								"    vec4 color;\n"
516e5c31af7Sopenharmony_ci								"    switch (layer_id)\n"
517e5c31af7Sopenharmony_ci								"    {\n"
518e5c31af7Sopenharmony_ci								"        case 0:  color = vec4(1, 0, 0, 1); break;\n"
519e5c31af7Sopenharmony_ci								"        case 1:  color = vec4(0, 1, 0, 1); break;\n"
520e5c31af7Sopenharmony_ci								"        case 2:  color = vec4(0, 0, 1, 1); break;\n"
521e5c31af7Sopenharmony_ci								"        case 3:  color = vec4(1, 1, 1, 1); break;\n"
522e5c31af7Sopenharmony_ci								"        default: color = vec4(0, 0, 0, 0); break;\n"
523e5c31af7Sopenharmony_ci								"    }\n"
524e5c31af7Sopenharmony_ci								"    color0 = color;\n"
525e5c31af7Sopenharmony_ci								"    color1 = color;\n"
526e5c31af7Sopenharmony_ci								"}\n";
527e5c31af7Sopenharmony_ci	return result;
528e5c31af7Sopenharmony_ci}
529e5c31af7Sopenharmony_ci
530e5c31af7Sopenharmony_ci/** Returns code for Geometry Shader
531e5c31af7Sopenharmony_ci *
532e5c31af7Sopenharmony_ci * @return pointer to literal with Geometry Shader code
533e5c31af7Sopenharmony_ci **/
534e5c31af7Sopenharmony_ciconst char* GeometryShaderLayeredRenderingBoundaryConditionVariousTextures::getGeometryShaderCode()
535e5c31af7Sopenharmony_ci{
536e5c31af7Sopenharmony_ci	static const char* result = "${VERSION}\n"
537e5c31af7Sopenharmony_ci								"\n"
538e5c31af7Sopenharmony_ci								"${GEOMETRY_SHADER_REQUIRE}\n"
539e5c31af7Sopenharmony_ci								"\n"
540e5c31af7Sopenharmony_ci								"precision highp float;\n"
541e5c31af7Sopenharmony_ci								"\n"
542e5c31af7Sopenharmony_ci								"#define MAX_VERTICES 16\n"
543e5c31af7Sopenharmony_ci								"#define N_LAYERS     2\n"
544e5c31af7Sopenharmony_ci								"\n"
545e5c31af7Sopenharmony_ci								"layout(points)                                    in;\n"
546e5c31af7Sopenharmony_ci								"layout(triangle_strip, max_vertices=MAX_VERTICES) out;\n"
547e5c31af7Sopenharmony_ci								"\n"
548e5c31af7Sopenharmony_ci								"precision highp float;\n"
549e5c31af7Sopenharmony_ci								"\n"
550e5c31af7Sopenharmony_ci								"flat out int layer_id;\n"
551e5c31af7Sopenharmony_ci								"\n"
552e5c31af7Sopenharmony_ci								"void main()\n"
553e5c31af7Sopenharmony_ci								"{\n"
554e5c31af7Sopenharmony_ci								"    for (int n = 0;n < N_LAYERS;++n)\n"
555e5c31af7Sopenharmony_ci								"    {\n"
556e5c31af7Sopenharmony_ci								"        gl_Layer    = n;\n"
557e5c31af7Sopenharmony_ci								"        layer_id    = gl_Layer;\n"
558e5c31af7Sopenharmony_ci								"        gl_Position = vec4(1, 1, 0, 1);\n"
559e5c31af7Sopenharmony_ci								"        EmitVertex();\n"
560e5c31af7Sopenharmony_ci								"\n"
561e5c31af7Sopenharmony_ci								"        gl_Layer    = n;\n"
562e5c31af7Sopenharmony_ci								"        layer_id    = gl_Layer;\n"
563e5c31af7Sopenharmony_ci								"        gl_Position = vec4(1, -1, 0, 1);\n"
564e5c31af7Sopenharmony_ci								"        EmitVertex();\n"
565e5c31af7Sopenharmony_ci								"\n"
566e5c31af7Sopenharmony_ci								"        gl_Layer    = n;\n"
567e5c31af7Sopenharmony_ci								"        layer_id    = gl_Layer;\n"
568e5c31af7Sopenharmony_ci								"        gl_Position = vec4(-1, 1, 0, 1);\n"
569e5c31af7Sopenharmony_ci								"        EmitVertex();\n"
570e5c31af7Sopenharmony_ci								"\n"
571e5c31af7Sopenharmony_ci								"        gl_Layer    = n;\n"
572e5c31af7Sopenharmony_ci								"        layer_id    = gl_Layer;\n"
573e5c31af7Sopenharmony_ci								"        gl_Position = vec4(-1, -1, 0, 1);\n"
574e5c31af7Sopenharmony_ci								"        EmitVertex();\n"
575e5c31af7Sopenharmony_ci								"\n"
576e5c31af7Sopenharmony_ci								"        EndPrimitive();\n"
577e5c31af7Sopenharmony_ci								"    }\n"
578e5c31af7Sopenharmony_ci								"}\n";
579e5c31af7Sopenharmony_ci	return result;
580e5c31af7Sopenharmony_ci}
581e5c31af7Sopenharmony_ci
582e5c31af7Sopenharmony_ci/** Get reference color for test result verification
583e5c31af7Sopenharmony_ci * @param layerIndex      index of layer
584e5c31af7Sopenharmony_ci * @param colorBuffer     will be used to store the requested data(buffor size should be greater than or equal colorBufferSize)
585e5c31af7Sopenharmony_ci * @param colorBufferSize components number
586e5c31af7Sopenharmony_ci **/
587e5c31af7Sopenharmony_civoid GeometryShaderLayeredRenderingBoundaryConditionVariousTextures::getReferenceColor(glw::GLint	 layerIndex,
588e5c31af7Sopenharmony_ci																					   unsigned char* colorBuffer,
589e5c31af7Sopenharmony_ci																					   int			  colorBufferSize)
590e5c31af7Sopenharmony_ci{
591e5c31af7Sopenharmony_ci	if (layerIndex == 0)
592e5c31af7Sopenharmony_ci	{
593e5c31af7Sopenharmony_ci		memcpy(colorBuffer, m_red_color, colorBufferSize);
594e5c31af7Sopenharmony_ci	}
595e5c31af7Sopenharmony_ci	else if (layerIndex == 1)
596e5c31af7Sopenharmony_ci	{
597e5c31af7Sopenharmony_ci		memcpy(colorBuffer, m_green_color, colorBufferSize);
598e5c31af7Sopenharmony_ci	}
599e5c31af7Sopenharmony_ci	else
600e5c31af7Sopenharmony_ci	{
601e5c31af7Sopenharmony_ci		memset(colorBuffer, 0, colorBufferSize);
602e5c31af7Sopenharmony_ci	}
603e5c31af7Sopenharmony_ci}
604e5c31af7Sopenharmony_ci
605e5c31af7Sopenharmony_ci/** Constructor
606e5c31af7Sopenharmony_ci *
607e5c31af7Sopenharmony_ci * @param context     Test context
608e5c31af7Sopenharmony_ci * @param name        Test case's name
609e5c31af7Sopenharmony_ci * @param description Test case's description
610e5c31af7Sopenharmony_ci **/
611e5c31af7Sopenharmony_ciGeometryShaderLayeredRenderingBoundaryConditionNoGS::GeometryShaderLayeredRenderingBoundaryConditionNoGS(
612e5c31af7Sopenharmony_ci	Context& context, const ExtParameters& extParams, const char* name, const char* description)
613e5c31af7Sopenharmony_ci	: GeometryShaderLayeredRenderingBoundaryCondition(context, extParams, name, description)
614e5c31af7Sopenharmony_ci{
615e5c31af7Sopenharmony_ci	TextureInfo texInfo;
616e5c31af7Sopenharmony_ci
617e5c31af7Sopenharmony_ci	texInfo.m_depth			 = 4;
618e5c31af7Sopenharmony_ci	texInfo.m_draw_buffer	= GL_COLOR_ATTACHMENT0;
619e5c31af7Sopenharmony_ci	texInfo.m_id			 = 0;
620e5c31af7Sopenharmony_ci	texInfo.m_texture_target = GL_TEXTURE_3D;
621e5c31af7Sopenharmony_ci
622e5c31af7Sopenharmony_ci	m_textures_info.push_back(texInfo);
623e5c31af7Sopenharmony_ci
624e5c31af7Sopenharmony_ci	m_draw_mode		 = GL_TRIANGLE_FAN;
625e5c31af7Sopenharmony_ci	m_n_points		 = 4;
626e5c31af7Sopenharmony_ci	m_is_fbo_layered = true;
627e5c31af7Sopenharmony_ci}
628e5c31af7Sopenharmony_ci
629e5c31af7Sopenharmony_ci/** Get reference color for test result verification
630e5c31af7Sopenharmony_ci * @param layerIndex      index of layer
631e5c31af7Sopenharmony_ci * @param colorBuffer     will be used to store the requested data(buffer size should be greater than or equal colorBufferSize)
632e5c31af7Sopenharmony_ci * @param colorBufferSize components number
633e5c31af7Sopenharmony_ci **/
634e5c31af7Sopenharmony_civoid GeometryShaderLayeredRenderingBoundaryConditionNoGS::getReferenceColor(glw::GLint	 layerIndex,
635e5c31af7Sopenharmony_ci																			unsigned char* colorBuffer,
636e5c31af7Sopenharmony_ci																			int			   colorBufferSize)
637e5c31af7Sopenharmony_ci{
638e5c31af7Sopenharmony_ci	if (layerIndex == 0)
639e5c31af7Sopenharmony_ci	{
640e5c31af7Sopenharmony_ci		memcpy(colorBuffer, m_white_color, colorBufferSize);
641e5c31af7Sopenharmony_ci	}
642e5c31af7Sopenharmony_ci	else
643e5c31af7Sopenharmony_ci	{
644e5c31af7Sopenharmony_ci		memset(colorBuffer, 0, colorBufferSize);
645e5c31af7Sopenharmony_ci	}
646e5c31af7Sopenharmony_ci}
647e5c31af7Sopenharmony_ci
648e5c31af7Sopenharmony_ci/** Returns code for Vertex Shader
649e5c31af7Sopenharmony_ci * @return pointer to literal with Vertex Shader code
650e5c31af7Sopenharmony_ci **/
651e5c31af7Sopenharmony_ciconst char* GeometryShaderLayeredRenderingBoundaryConditionNoGS::getVertexShaderCode()
652e5c31af7Sopenharmony_ci{
653e5c31af7Sopenharmony_ci	static const char* result = "${VERSION}\n"
654e5c31af7Sopenharmony_ci								"\n"
655e5c31af7Sopenharmony_ci								"precision highp float;\n"
656e5c31af7Sopenharmony_ci								"\n"
657e5c31af7Sopenharmony_ci								"flat out int layer_id;\n"
658e5c31af7Sopenharmony_ci								"\n"
659e5c31af7Sopenharmony_ci								"void main()\n"
660e5c31af7Sopenharmony_ci								"{\n"
661e5c31af7Sopenharmony_ci								"    layer_id = 0;\n"
662e5c31af7Sopenharmony_ci								"\n"
663e5c31af7Sopenharmony_ci								"    switch (gl_VertexID)\n"
664e5c31af7Sopenharmony_ci								"    {\n"
665e5c31af7Sopenharmony_ci								"        case 0:  gl_Position = vec4(-1, -1, 0, 1); break;\n"
666e5c31af7Sopenharmony_ci								"        case 1:  gl_Position = vec4(-1,  1, 0, 1); break;\n"
667e5c31af7Sopenharmony_ci								"        case 2:  gl_Position = vec4( 1,  1, 0, 1); break;\n"
668e5c31af7Sopenharmony_ci								"        default: gl_Position = vec4( 1, -1, 0, 1); break;\n"
669e5c31af7Sopenharmony_ci								"    }\n"
670e5c31af7Sopenharmony_ci								"}\n";
671e5c31af7Sopenharmony_ci	return result;
672e5c31af7Sopenharmony_ci}
673e5c31af7Sopenharmony_ci
674e5c31af7Sopenharmony_ci/** Constructor
675e5c31af7Sopenharmony_ci *
676e5c31af7Sopenharmony_ci * @param context       Test context
677e5c31af7Sopenharmony_ci * @param name          Test case's name
678e5c31af7Sopenharmony_ci * @param description   Test case's desricption
679e5c31af7Sopenharmony_ci **/
680e5c31af7Sopenharmony_ciGeometryShaderLayeredRenderingBoundaryConditionNoLayerSet::GeometryShaderLayeredRenderingBoundaryConditionNoLayerSet(
681e5c31af7Sopenharmony_ci	Context& context, const ExtParameters& extParams, const char* name, const char* description)
682e5c31af7Sopenharmony_ci	: GeometryShaderLayeredRenderingBoundaryCondition(context, extParams, name, description)
683e5c31af7Sopenharmony_ci{
684e5c31af7Sopenharmony_ci	TextureInfo texInfo;
685e5c31af7Sopenharmony_ci
686e5c31af7Sopenharmony_ci	texInfo.m_depth			 = 4;
687e5c31af7Sopenharmony_ci	texInfo.m_draw_buffer	= GL_COLOR_ATTACHMENT0;
688e5c31af7Sopenharmony_ci	texInfo.m_id			 = 0;
689e5c31af7Sopenharmony_ci	texInfo.m_texture_target = GL_TEXTURE_3D;
690e5c31af7Sopenharmony_ci
691e5c31af7Sopenharmony_ci	m_textures_info.push_back(texInfo);
692e5c31af7Sopenharmony_ci
693e5c31af7Sopenharmony_ci	m_draw_mode		 = GL_POINTS;
694e5c31af7Sopenharmony_ci	m_n_points		 = 1;
695e5c31af7Sopenharmony_ci	m_is_fbo_layered = true;
696e5c31af7Sopenharmony_ci}
697e5c31af7Sopenharmony_ci
698e5c31af7Sopenharmony_ci/** Returns code for Geometry Shader
699e5c31af7Sopenharmony_ci * @return pointer to literal with Geometry Shader code
700e5c31af7Sopenharmony_ci **/
701e5c31af7Sopenharmony_ciconst char* GeometryShaderLayeredRenderingBoundaryConditionNoLayerSet::getGeometryShaderCode()
702e5c31af7Sopenharmony_ci{
703e5c31af7Sopenharmony_ci	static const char* result = "${VERSION}\n"
704e5c31af7Sopenharmony_ci								"\n"
705e5c31af7Sopenharmony_ci								"${GEOMETRY_SHADER_REQUIRE}\n"
706e5c31af7Sopenharmony_ci								"\n"
707e5c31af7Sopenharmony_ci								"precision highp float;\n"
708e5c31af7Sopenharmony_ci								"\n"
709e5c31af7Sopenharmony_ci								"#define MAX_VERTICES 4\n"
710e5c31af7Sopenharmony_ci								"\n"
711e5c31af7Sopenharmony_ci								"layout(points)                                    in;\n"
712e5c31af7Sopenharmony_ci								"layout(triangle_strip, max_vertices=MAX_VERTICES) out;\n"
713e5c31af7Sopenharmony_ci								"\n"
714e5c31af7Sopenharmony_ci								"precision highp float;\n"
715e5c31af7Sopenharmony_ci								"\n"
716e5c31af7Sopenharmony_ci								"flat out int layer_id;\n"
717e5c31af7Sopenharmony_ci								"\n"
718e5c31af7Sopenharmony_ci								"void main()\n"
719e5c31af7Sopenharmony_ci								"{\n"
720e5c31af7Sopenharmony_ci								"    layer_id    = 0;\n"
721e5c31af7Sopenharmony_ci								"    gl_Position = vec4(1, 1, 0, 1);\n"
722e5c31af7Sopenharmony_ci								"    EmitVertex();\n"
723e5c31af7Sopenharmony_ci								"\n"
724e5c31af7Sopenharmony_ci								"    layer_id    = 0;\n"
725e5c31af7Sopenharmony_ci								"    gl_Position = vec4(1, -1, 0, 1);\n"
726e5c31af7Sopenharmony_ci								"    EmitVertex();\n"
727e5c31af7Sopenharmony_ci								"\n"
728e5c31af7Sopenharmony_ci								"    layer_id    = 0;\n"
729e5c31af7Sopenharmony_ci								"    gl_Position = vec4(-1, 1, 0, 1);\n"
730e5c31af7Sopenharmony_ci								"    EmitVertex();\n"
731e5c31af7Sopenharmony_ci								"\n"
732e5c31af7Sopenharmony_ci								"    layer_id    = 0;\n"
733e5c31af7Sopenharmony_ci								"    gl_Position = vec4(-1, -1, 0, 1);\n"
734e5c31af7Sopenharmony_ci								"    EmitVertex();\n"
735e5c31af7Sopenharmony_ci								"\n"
736e5c31af7Sopenharmony_ci								"    EndPrimitive();\n"
737e5c31af7Sopenharmony_ci								"}\n";
738e5c31af7Sopenharmony_ci	return result;
739e5c31af7Sopenharmony_ci}
740e5c31af7Sopenharmony_ci
741e5c31af7Sopenharmony_ci/** Get reference color for test result verification
742e5c31af7Sopenharmony_ci * @param layerIndex      index of layer
743e5c31af7Sopenharmony_ci * @param colorBuffer     will be used to store the requested data(buffer size should be greater than or equal colorBufferSize)
744e5c31af7Sopenharmony_ci * @param colorBufferSize components number
745e5c31af7Sopenharmony_ci **/
746e5c31af7Sopenharmony_civoid GeometryShaderLayeredRenderingBoundaryConditionNoLayerSet::getReferenceColor(glw::GLint	 layerIndex,
747e5c31af7Sopenharmony_ci																				  unsigned char* colorBuffer,
748e5c31af7Sopenharmony_ci																				  int			 colorBufferSize)
749e5c31af7Sopenharmony_ci{
750e5c31af7Sopenharmony_ci	if (layerIndex == 0)
751e5c31af7Sopenharmony_ci	{
752e5c31af7Sopenharmony_ci		memcpy(colorBuffer, m_white_color, colorBufferSize);
753e5c31af7Sopenharmony_ci	}
754e5c31af7Sopenharmony_ci	else
755e5c31af7Sopenharmony_ci	{
756e5c31af7Sopenharmony_ci		memset(colorBuffer, 0, colorBufferSize);
757e5c31af7Sopenharmony_ci	}
758e5c31af7Sopenharmony_ci}
759e5c31af7Sopenharmony_ci
760e5c31af7Sopenharmony_ci/** Constructor
761e5c31af7Sopenharmony_ci *
762e5c31af7Sopenharmony_ci * @param context       Test context
763e5c31af7Sopenharmony_ci * @param name          Test case's name
764e5c31af7Sopenharmony_ci * @param description   Test case's desricption
765e5c31af7Sopenharmony_ci **/
766e5c31af7Sopenharmony_ciGeometryShaderLayeredRenderingBoundaryConditionNoLayeredFBO::
767e5c31af7Sopenharmony_ci	GeometryShaderLayeredRenderingBoundaryConditionNoLayeredFBO(Context& context, const ExtParameters& extParams,
768e5c31af7Sopenharmony_ci																const char* name, const char* description)
769e5c31af7Sopenharmony_ci	: GeometryShaderLayeredRenderingBoundaryCondition(context, extParams, name, description)
770e5c31af7Sopenharmony_ci{
771e5c31af7Sopenharmony_ci	TextureInfo texInfo;
772e5c31af7Sopenharmony_ci
773e5c31af7Sopenharmony_ci	texInfo.m_depth			 = 4;
774e5c31af7Sopenharmony_ci	texInfo.m_draw_buffer	= GL_COLOR_ATTACHMENT0;
775e5c31af7Sopenharmony_ci	texInfo.m_id			 = 0;
776e5c31af7Sopenharmony_ci	texInfo.m_texture_target = GL_TEXTURE_3D;
777e5c31af7Sopenharmony_ci
778e5c31af7Sopenharmony_ci	m_textures_info.push_back(texInfo);
779e5c31af7Sopenharmony_ci
780e5c31af7Sopenharmony_ci	m_draw_mode		 = GL_POINTS;
781e5c31af7Sopenharmony_ci	m_n_points		 = 1;
782e5c31af7Sopenharmony_ci	m_is_fbo_layered = false;
783e5c31af7Sopenharmony_ci}
784e5c31af7Sopenharmony_ci
785e5c31af7Sopenharmony_ci/** Returns code for Geometry Shader
786e5c31af7Sopenharmony_ci * @return pointer to literal with Geometry Shader code
787e5c31af7Sopenharmony_ci **/
788e5c31af7Sopenharmony_ciconst char* GeometryShaderLayeredRenderingBoundaryConditionNoLayeredFBO::getGeometryShaderCode()
789e5c31af7Sopenharmony_ci{
790e5c31af7Sopenharmony_ci	static const char* result = "${VERSION}\n"
791e5c31af7Sopenharmony_ci								"\n"
792e5c31af7Sopenharmony_ci								"${GEOMETRY_SHADER_REQUIRE}\n"
793e5c31af7Sopenharmony_ci								"\n"
794e5c31af7Sopenharmony_ci								"precision highp float;\n"
795e5c31af7Sopenharmony_ci								"\n"
796e5c31af7Sopenharmony_ci								"#define MAX_VERTICES 4\n"
797e5c31af7Sopenharmony_ci								"\n"
798e5c31af7Sopenharmony_ci								"layout(points)                                    in;\n"
799e5c31af7Sopenharmony_ci								"layout(triangle_strip, max_vertices=MAX_VERTICES) out;\n"
800e5c31af7Sopenharmony_ci								"\n"
801e5c31af7Sopenharmony_ci								"precision highp float;\n"
802e5c31af7Sopenharmony_ci								"\n"
803e5c31af7Sopenharmony_ci								"flat out int layer_id;\n"
804e5c31af7Sopenharmony_ci								"\n"
805e5c31af7Sopenharmony_ci								"void main()\n"
806e5c31af7Sopenharmony_ci								"{\n"
807e5c31af7Sopenharmony_ci								"    gl_Layer = 1;\n"
808e5c31af7Sopenharmony_ci								"\n"
809e5c31af7Sopenharmony_ci								"    layer_id    = gl_Layer;\n"
810e5c31af7Sopenharmony_ci								"    gl_Position = vec4(1, 1, 0, 1);\n"
811e5c31af7Sopenharmony_ci								"    EmitVertex();\n"
812e5c31af7Sopenharmony_ci								"\n"
813e5c31af7Sopenharmony_ci								"    layer_id    = gl_Layer;\n"
814e5c31af7Sopenharmony_ci								"    gl_Position = vec4(1, -1, 0, 1);\n"
815e5c31af7Sopenharmony_ci								"    EmitVertex();\n"
816e5c31af7Sopenharmony_ci								"\n"
817e5c31af7Sopenharmony_ci								"    layer_id    = gl_Layer;\n"
818e5c31af7Sopenharmony_ci								"    gl_Position = vec4(-1, 1, 0, 1);\n"
819e5c31af7Sopenharmony_ci								"    EmitVertex();\n"
820e5c31af7Sopenharmony_ci								"\n"
821e5c31af7Sopenharmony_ci								"    layer_id    = gl_Layer;\n"
822e5c31af7Sopenharmony_ci								"    gl_Position = vec4(-1, -1, 0, 1);\n"
823e5c31af7Sopenharmony_ci								"    EmitVertex();\n"
824e5c31af7Sopenharmony_ci								"\n"
825e5c31af7Sopenharmony_ci								"    EndPrimitive();\n"
826e5c31af7Sopenharmony_ci								"}\n";
827e5c31af7Sopenharmony_ci	return result;
828e5c31af7Sopenharmony_ci}
829e5c31af7Sopenharmony_ci
830e5c31af7Sopenharmony_ci/** Get reference color for test result verification
831e5c31af7Sopenharmony_ci * @param layerIndex      index of layer
832e5c31af7Sopenharmony_ci * @param colorBuffer     will be used to store the requested data(buffer size should be greater than or equal colorBufferSize)
833e5c31af7Sopenharmony_ci * @param colorBufferSize components number
834e5c31af7Sopenharmony_ci **/
835e5c31af7Sopenharmony_civoid GeometryShaderLayeredRenderingBoundaryConditionNoLayeredFBO::getReferenceColor(glw::GLint	 layerIndex,
836e5c31af7Sopenharmony_ci																					unsigned char* colorBuffer,
837e5c31af7Sopenharmony_ci																					int			   colorBufferSize)
838e5c31af7Sopenharmony_ci{
839e5c31af7Sopenharmony_ci	if (layerIndex == 0)
840e5c31af7Sopenharmony_ci	{
841e5c31af7Sopenharmony_ci		memcpy(colorBuffer, m_white_color, colorBufferSize);
842e5c31af7Sopenharmony_ci	}
843e5c31af7Sopenharmony_ci	else
844e5c31af7Sopenharmony_ci	{
845e5c31af7Sopenharmony_ci		memset(colorBuffer, 0, colorBufferSize);
846e5c31af7Sopenharmony_ci	}
847e5c31af7Sopenharmony_ci}
848e5c31af7Sopenharmony_ci
849e5c31af7Sopenharmony_ci} // namespace glcts
850