1901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski/*-------------------------------------------------------------------------
2901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski* OpenGL Conformance Test Suite
3901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski* -----------------------------
4901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*
5901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski* Copyright (c) 2014-2017 The Khronos Group Inc.
6901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*
7901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski* Licensed under the Apache License, Version 2.0 (the "License");
8901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski* you may not use this file except in compliance with the License.
9901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski* You may obtain a copy of the License at
10901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*
11901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*      http://www.apache.org/licenses/LICENSE-2.0
12901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*
13901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski* Unless required by applicable law or agreed to in writing, software
14901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski* distributed under the License is distributed on an "AS IS" BASIS,
15901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski* See the License for the specific language governing permissions and
17901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski* limitations under the License.
18901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*
19901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*/ /*!
20901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski* \file  gl4cShaderBallotTests.cpp
21901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski* \brief Conformance tests for the ARB_shader_ballot functionality.
22901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*/ /*-------------------------------------------------------------------*/
23901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
24901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski#include "gl4cShaderBallotTests.hpp"
25901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
26901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski#include "glcContext.hpp"
27901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski#include "gluContextInfo.hpp"
28901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski#include "gluDefs.hpp"
29901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski#include "gluDrawUtil.hpp"
30901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski#include "gluObjectWrapper.hpp"
31901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski#include "gluProgramInterfaceQuery.hpp"
32901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski#include "gluShaderProgram.hpp"
33901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski#include "glwEnums.hpp"
34901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski#include "glwFunctions.hpp"
35901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski#include "tcuRenderTarget.hpp"
36901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
37901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewskinamespace gl4cts
38901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski{
39901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
40901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip DemczewskiShaderBallotBaseTestCase::ShaderPipeline::ShaderPipeline(glu::ShaderType	testedShader,
41901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski														 const std::string& contentSnippet,
42901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski														 std::map<std::string, std::string> specMap)
43901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	: m_programRender(NULL), m_programCompute(NULL), m_testedShader(testedShader), m_specializationMap(specMap)
44901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski{
45901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	std::string testedHeadPart = "#extension GL_ARB_shader_ballot : enable\n"
46901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski								 "#extension GL_ARB_gpu_shader_int64 : enable\n";
47901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
48901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	std::string testedContentPart = contentSnippet;
49901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
50901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	// vertex shader parts
51901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
52901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_shaders[glu::SHADERTYPE_VERTEX].push_back("#version 450 core\n");
53901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_shaders[glu::SHADERTYPE_VERTEX].push_back(m_testedShader == glu::SHADERTYPE_VERTEX ? testedHeadPart : "");
54901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_shaders[glu::SHADERTYPE_VERTEX].push_back("in highp vec2 inPosition;\n"
55901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski												"in highp vec4 inColor;\n"
56901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski												"out highp vec3 vsPosition;\n"
57901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski												"out highp vec4 vsColor;\n"
58901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski												"void main()\n"
59901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski												"{\n"
60901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski												"	gl_Position = vec4(inPosition, 0.0, 1.0);\n"
61901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski												"	vsPosition = vec3(inPosition, 0.0);\n"
62901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski												"	vec4 outColor = vec4(0.0); \n");
63901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_shaders[glu::SHADERTYPE_VERTEX].push_back(m_testedShader == glu::SHADERTYPE_VERTEX ? testedContentPart :
64901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski																						   "	outColor = inColor;\n");
65901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_shaders[glu::SHADERTYPE_VERTEX].push_back("	vsColor = outColor;\n"
66901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski												"}\n");
67901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
68901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	// fragment shader parts
69901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
70901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_shaders[glu::SHADERTYPE_FRAGMENT].push_back("#version 450 core\n");
71901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_shaders[glu::SHADERTYPE_FRAGMENT].push_back(m_testedShader == glu::SHADERTYPE_FRAGMENT ? testedHeadPart : "");
72901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_shaders[glu::SHADERTYPE_FRAGMENT].push_back("in highp vec4 gsColor;\n"
73901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski												  "out highp vec4 fsColor;\n"
74901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski												  "void main()\n"
75901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski												  "{\n"
76901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski												  "	vec4 outColor = vec4(0.0); \n");
77901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_shaders[glu::SHADERTYPE_FRAGMENT].push_back(
78901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		m_testedShader == glu::SHADERTYPE_FRAGMENT ? testedContentPart : "	outColor = gsColor;\n");
79901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_shaders[glu::SHADERTYPE_FRAGMENT].push_back("	fsColor = outColor;\n"
80901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski												  "}\n");
81901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
82901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	// tessellation control shader parts
83901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
84901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_shaders[glu::SHADERTYPE_TESSELLATION_CONTROL].push_back("#version 450 core\n");
85901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_shaders[glu::SHADERTYPE_TESSELLATION_CONTROL].push_back(
86901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		m_testedShader == glu::SHADERTYPE_TESSELLATION_CONTROL ? testedHeadPart : "");
87901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_shaders[glu::SHADERTYPE_TESSELLATION_CONTROL].push_back(
88901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		"layout(vertices = 3) out;\n"
89901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		"in highp vec4 vsColor[];\n"
90901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		"in highp vec3 vsPosition[];\n"
91901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		"out highp vec3 tcsPosition[];\n"
92901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		"out highp vec4 tcsColor[];\n"
93901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		"void main()\n"
94901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		"{\n"
95901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		"	tcsPosition[gl_InvocationID] = vsPosition[gl_InvocationID];\n"
96901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		"	vec4 outColor = vec4(0.0);\n");
97901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_shaders[glu::SHADERTYPE_TESSELLATION_CONTROL].push_back(m_testedShader == glu::SHADERTYPE_TESSELLATION_CONTROL ?
98901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski																  testedContentPart :
99901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski																  "	outColor = vsColor[gl_InvocationID];\n");
100901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_shaders[glu::SHADERTYPE_TESSELLATION_CONTROL].push_back("	tcsColor[gl_InvocationID] = outColor;\n"
101901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski															  "	gl_TessLevelInner[0] = 3;\n"
102901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski															  "	gl_TessLevelOuter[0] = 3;\n"
103901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski															  "	gl_TessLevelOuter[1] = 3;\n"
104901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski															  "	gl_TessLevelOuter[2] = 3;\n"
105901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski															  "}\n");
106901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
107901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	// tessellation evaluation shader parts
108901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
109901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_shaders[glu::SHADERTYPE_TESSELLATION_EVALUATION].push_back("#version 450 core\n");
110901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_shaders[glu::SHADERTYPE_TESSELLATION_EVALUATION].push_back(
111901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		m_testedShader == glu::SHADERTYPE_TESSELLATION_EVALUATION ? testedHeadPart : "");
112901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_shaders[glu::SHADERTYPE_TESSELLATION_EVALUATION].push_back("layout(triangles, equal_spacing, cw) in;\n"
113901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski																 "in highp vec3 tcsPosition[];\n"
114901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski																 "in highp vec4 tcsColor[];\n"
115901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski																 "out highp vec4 tesColor;\n"
116901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski																 "void main()\n"
117901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski																 "{\n"
118901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski																 "	vec3 p0 = gl_TessCoord.x * tcsPosition[0];\n"
119901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski																 "	vec3 p1 = gl_TessCoord.y * tcsPosition[1];\n"
120901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski																 "	vec3 p2 = gl_TessCoord.z * tcsPosition[2];\n"
121901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski																 "	vec4 outColor = vec4(0.0);\n");
122901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_shaders[glu::SHADERTYPE_TESSELLATION_EVALUATION].push_back(
123901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		m_testedShader == glu::SHADERTYPE_TESSELLATION_EVALUATION ? testedContentPart : "	outColor = tcsColor[0];\n");
124901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_shaders[glu::SHADERTYPE_TESSELLATION_EVALUATION].push_back("	tesColor = outColor;\n"
125901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski																 "	gl_Position = vec4(normalize(p0 + p1 + p2), 1.0);\n"
126901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski																 "}\n");
127901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
128901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	// geometry shader parts
129901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
130901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_shaders[glu::SHADERTYPE_GEOMETRY].push_back("#version 450 core\n");
131901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_shaders[glu::SHADERTYPE_GEOMETRY].push_back(m_testedShader == glu::SHADERTYPE_GEOMETRY ? testedHeadPart : "");
132901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_shaders[glu::SHADERTYPE_GEOMETRY].push_back("layout(triangles) in;\n"
133901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski												  "layout(triangle_strip, max_vertices = 3) out;\n"
134901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski												  "in highp vec4 tesColor[];\n"
135901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski												  "out highp vec4 gsColor;\n"
136901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski												  "void main()\n"
137901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski												  "{\n"
138901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski												  "	for (int i = 0; i<3; i++)\n"
139901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski												  "	{\n"
140901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski												  "		gl_Position = gl_in[i].gl_Position;\n"
141901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski												  "		vec4 outColor = vec4(0.0);\n");
142901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_shaders[glu::SHADERTYPE_GEOMETRY].push_back(
143901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		m_testedShader == glu::SHADERTYPE_GEOMETRY ? testedContentPart : "		outColor = tesColor[i];\n");
144901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_shaders[glu::SHADERTYPE_GEOMETRY].push_back("		gsColor = outColor;\n"
145901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski												  "		EmitVertex();\n"
146901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski												  "	}\n"
147901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski												  "	EndPrimitive();\n"
148901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski												  "}\n");
149901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
150901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	// compute shader parts
151901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
152901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_shaders[glu::SHADERTYPE_COMPUTE].push_back("#version 450 core\n");
153901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_shaders[glu::SHADERTYPE_COMPUTE].push_back(m_testedShader == glu::SHADERTYPE_COMPUTE ? testedHeadPart : "");
154901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_shaders[glu::SHADERTYPE_COMPUTE].push_back(
155901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		"layout(rgba32f, binding = 1) writeonly uniform highp image2D destImage;\n"
156901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		"layout (local_size_x = 16, local_size_y = 16) in;\n"
157901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		"void main (void)\n"
158901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		"{\n"
159901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		"vec4 outColor = vec4(0.0);\n");
160901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_shaders[glu::SHADERTYPE_COMPUTE].push_back(m_testedShader == glu::SHADERTYPE_COMPUTE ? testedContentPart : "");
161901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_shaders[glu::SHADERTYPE_COMPUTE].push_back("imageStore(destImage, ivec2(gl_GlobalInvocationID.xy), outColor);\n"
162901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski												 "}\n");
163901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
164901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	// create shader chunks
165901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
166901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	for (unsigned int shaderType = 0; shaderType < glu::SHADERTYPE_LAST; ++shaderType)
167901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	{
168901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		m_shaderChunks[shaderType] = new char*[m_shaders[shaderType].size()];
169901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		for (unsigned int i = 0; i < m_shaders[i].size(); ++i)
170901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		{
171901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski			m_shaderChunks[shaderType][i] = (char*)m_shaders[shaderType][i].data();
172901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		}
173901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	}
174901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski}
175901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
176901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip DemczewskiShaderBallotBaseTestCase::ShaderPipeline::~ShaderPipeline()
177901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski{
178901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	if (m_programRender)
179901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	{
180901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		delete m_programRender;
181901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	}
182901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
183901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	if (m_programCompute)
184901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	{
185901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		delete m_programCompute;
186901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	}
187901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
188901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	for (unsigned int shaderType = 0; shaderType < glu::SHADERTYPE_LAST; ++shaderType)
189901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	{
190901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		delete[] m_shaderChunks[shaderType];
191901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	}
192901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski}
193901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
194901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewskiconst char* const* ShaderBallotBaseTestCase::ShaderPipeline::getShaderParts(glu::ShaderType shaderType) const
195901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski{
196901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	return m_shaderChunks[shaderType];
197901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski}
198901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
199901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewskiunsigned int ShaderBallotBaseTestCase::ShaderPipeline::getShaderPartsCount(glu::ShaderType shaderType) const
200901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski{
201901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	return m_shaders[shaderType].size();
202901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski}
203901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
204901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewskivoid ShaderBallotBaseTestCase::ShaderPipeline::renderQuad(deqp::Context& context)
205901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski{
206901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	const glw::Functions& gl = context.getRenderContext().getFunctions();
207901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
208901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	deUint16 const quadIndices[] = { 0, 1, 2, 2, 1, 3 };
209901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
210901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	float const position[] = { -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f };
211901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
212901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	glu::VertexArrayBinding vertexArrays[] = { glu::va::Float("inPosition", 2, 4, 0, position) };
213901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
214901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	this->use(context);
215901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
216901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	glu::PrimitiveList primitiveList = glu::pr::Patches(DE_LENGTH_OF_ARRAY(quadIndices), quadIndices);
217901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
218901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	glu::draw(context.getRenderContext(), m_programRender->getProgram(), DE_LENGTH_OF_ARRAY(vertexArrays), vertexArrays,
219901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski			  primitiveList);
220901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
221901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "glu::draw error");
222901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski}
223901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
224901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewskivoid ShaderBallotBaseTestCase::ShaderPipeline::executeComputeShader(deqp::Context& context)
225901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski{
226901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	const glw::Functions& gl = context.getRenderContext().getFunctions();
227901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
228901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	const glu::Texture outputTexture(context.getRenderContext());
229901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
230901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	gl.useProgram(m_programCompute->getProgram());
231901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
232901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	// output image
233901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	gl.bindTexture(GL_TEXTURE_2D, *outputTexture);
234901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	gl.texStorage2D(GL_TEXTURE_2D, 1, GL_RGBA32UI, 16, 16);
235901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
236901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
237901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "Uploading image data failed");
238901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
239901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	// bind image
240901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	gl.bindImageTexture(1, *outputTexture, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32UI);
241901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "Image setup failed");
242901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
243901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	// dispatch compute
244901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	gl.dispatchCompute(1, 1, 1);
245901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "glDispatchCompute()");
246901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
247901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	gl.memoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT);
248901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "glMemoryBarrier()");
249901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
250901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	// render output texture
251901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
252901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	std::string vs = "#version 450 core\n"
253901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski					 "in highp vec2 position;\n"
254901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski					 "in vec2 inTexcoord;\n"
255901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski					 "out vec2 texcoord;\n"
256901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski					 "void main()\n"
257901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski					 "{\n"
258901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski					 "	texcoord = inTexcoord;\n"
259901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski					 "	gl_Position = vec4(position, 0.0, 1.0);\n"
260901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski					 "}\n";
261901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
262901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	std::string fs = "#version 450 core\n"
263901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski					 "uniform sampler2D sampler;\n"
264901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski					 "in vec2 texcoord;\n"
265901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski					 "out vec4 color;\n"
266901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski					 "void main()\n"
267901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski					 "{\n"
268901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski					 "	color = texture(sampler, texcoord);\n"
269901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski					 "}\n";
270901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
271901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	glu::ProgramSources sources;
272901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	sources.sources[glu::SHADERTYPE_VERTEX].push_back(vs);
273901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	sources.sources[glu::SHADERTYPE_FRAGMENT].push_back(fs);
274901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	glu::ShaderProgram renderShader(context.getRenderContext(), sources);
275901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
276901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	if (!m_programRender->isOk())
277901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	{
278901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		TCU_FAIL("Shader compilation failed");
279901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	}
280901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
281901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	gl.bindTexture(GL_TEXTURE_2D, *outputTexture);
282901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture() call failed.");
283901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
284901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
285901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
286901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
287901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	gl.useProgram(renderShader.getProgram());
288901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
289901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	gl.uniform1i(gl.getUniformLocation(renderShader.getProgram(), "sampler"), 0);
290901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "glUniform1i failed");
291901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
292901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	deUint16 const quadIndices[] = { 0, 1, 2, 2, 1, 3 };
293901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
294901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	float const position[] = { -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f };
295901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
296901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	float const texCoord[] = { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f };
297901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
298901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	glu::VertexArrayBinding vertexArrays[] = { glu::va::Float("position", 2, 4, 0, position),
299901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski											   glu::va::Float("inTexcoord", 2, 4, 0, texCoord) };
300901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
301901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	glu::draw(context.getRenderContext(), renderShader.getProgram(), DE_LENGTH_OF_ARRAY(vertexArrays), vertexArrays,
302901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski			  glu::pr::TriangleStrip(DE_LENGTH_OF_ARRAY(quadIndices), quadIndices));
303901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
304901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "glu::draw error");
305901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski}
306901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
307901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewskivoid ShaderBallotBaseTestCase::ShaderPipeline::use(deqp::Context& context)
308901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski{
309901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	const glw::Functions& gl = context.getRenderContext().getFunctions();
310901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	gl.useProgram(m_programRender->getProgram());
311901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram failed");
312901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski}
313901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
314901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewskivoid ShaderBallotBaseTestCase::ShaderPipeline::test(deqp::Context& context)
315901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski{
316901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	if (m_testedShader == glu::SHADERTYPE_COMPUTE)
317901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	{
318901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		executeComputeShader(context);
319901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	}
320901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	else
321901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	{
322901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		renderQuad(context);
323901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	}
324901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski}
325901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
326901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewskivoid ShaderBallotBaseTestCase::createShaderPrograms(ShaderPipeline& pipeline)
327901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski{
328901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	glu::ProgramSources sourcesRender;
329901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
330901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	for (unsigned int i = 0; i < glu::SHADERTYPE_COMPUTE; ++i)
331901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	{
332901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		glu::ShaderType shaderType = (glu::ShaderType)i;
333901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
334901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		std::map<std::string, std::string>::const_iterator mapIter;
335901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		for (mapIter = pipeline.getSpecializationMap().begin(); mapIter != pipeline.getSpecializationMap().end();
336901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski			 mapIter++)
337901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski			m_specializationMap[mapIter->first] = mapIter->second;
338901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
339901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		std::string shader =
340901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski			specializeShader(pipeline.getShaderPartsCount(shaderType), pipeline.getShaderParts(shaderType));
341901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		sourcesRender.sources[i].push_back(shader);
342901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	}
343901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
344901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	glu::ShaderProgram* programRender = new glu::ShaderProgram(m_context.getRenderContext(), sourcesRender);
345901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
346901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	if (!programRender->isOk())
347901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	{
348901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		TCU_FAIL("Shader compilation failed");
349901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	}
350901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
351901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	glu::ProgramSources sourcesCompute;
352901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
353901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_specializationMap.insert(pipeline.getSpecializationMap().begin(), pipeline.getSpecializationMap().end());
354901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	std::string shaderCompute = specializeShader(pipeline.getShaderPartsCount(glu::SHADERTYPE_COMPUTE),
355901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski												 pipeline.getShaderParts(glu::SHADERTYPE_COMPUTE));
356901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	sourcesCompute.sources[glu::SHADERTYPE_COMPUTE].push_back(shaderCompute);
357901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
358901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	glu::ShaderProgram* programCompute = new glu::ShaderProgram(m_context.getRenderContext(), sourcesCompute);
359901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
360901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	if (!programCompute->isOk())
361901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	{
362901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		TCU_FAIL("Shader compilation failed");
363901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	}
364901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
365901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	pipeline.setShaderPrograms(programRender, programCompute);
366901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski}
367901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
368901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip DemczewskiShaderBallotBaseTestCase::~ShaderBallotBaseTestCase()
369901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski{
370901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	for (ShaderPipelineIter iter = m_shaderPipelines.begin(); iter != m_shaderPipelines.end(); ++iter)
371901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	{
372901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		delete *iter;
373901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	}
374901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski}
375901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
376901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewskibool ShaderBallotBaseTestCase::validateScreenPixels(deqp::Context& context, tcu::Vec4 desiredColor,
377901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski													tcu::Vec4 ignoredColor)
378901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski{
379901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	const glw::Functions&   gl			 = context.getRenderContext().getFunctions();
380901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	const tcu::RenderTarget renderTarget = context.getRenderContext().getRenderTarget();
381901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	tcu::IVec2				size(renderTarget.getWidth(), renderTarget.getHeight());
382901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
383901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	glw::GLfloat* pixels = new glw::GLfloat[size.x() * size.y() * 4];
384901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
385901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	// clear buffer
386901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	for (int x = 0; x < size.x(); ++x)
387901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	{
388901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		for (int y = 0; y < size.y(); ++y)
389901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		{
390901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski			int mappedPixelPosition = y * size.x() + x;
391901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
392901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski			pixels[mappedPixelPosition * 4 + 0] = -1.0f;
393901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski			pixels[mappedPixelPosition * 4 + 1] = -1.0f;
394901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski			pixels[mappedPixelPosition * 4 + 2] = -1.0f;
395901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski			pixels[mappedPixelPosition * 4 + 3] = -1.0f;
396901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		}
397901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	}
398901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
399901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	// read pixels
400901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	gl.readPixels(0, 0, size.x(), size.y(), GL_RGBA, GL_FLOAT, pixels);
401901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
402901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	// validate pixels
403901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	bool rendered = false;
404901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	for (int x = 0; x < size.x(); ++x)
405901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	{
406901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		for (int y = 0; y < size.y(); ++y)
407901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		{
408901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski			int mappedPixelPosition = y * size.x() + x;
409901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
410901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski			tcu::Vec4 color(pixels[mappedPixelPosition * 4 + 0], pixels[mappedPixelPosition * 4 + 1],
411901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski							pixels[mappedPixelPosition * 4 + 2], pixels[mappedPixelPosition * 4 + 3]);
412901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
413901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski			if (!ShaderBallotBaseTestCase::validateColor(color, ignoredColor))
414901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski			{
415901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski				rendered = true;
416901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski				if (!ShaderBallotBaseTestCase::validateColor(color, desiredColor))
417901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski				{
418901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski					return false;
419901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski				}
420901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski			}
421901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		}
422901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	}
423901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
424901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	delete[] pixels;
425901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
426901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	return rendered;
427901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski}
428901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
429901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewskibool ShaderBallotBaseTestCase::validateScreenPixelsSameColor(deqp::Context& context, tcu::Vec4 ignoredColor)
430901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski{
431901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	const glw::Functions&   gl			 = context.getRenderContext().getFunctions();
432901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	const tcu::RenderTarget renderTarget = context.getRenderContext().getRenderTarget();
433901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	tcu::IVec2				size(renderTarget.getWidth(), renderTarget.getHeight());
434901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
435901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	glw::GLfloat* centerPixel = new glw::GLfloat[4];
436901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	centerPixel[0]			  = -1.0f;
437901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	centerPixel[1]			  = -1.0f;
438901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	centerPixel[2]			  = -1.0f;
439901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	centerPixel[3]			  = -1.0f;
440901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
441901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	// read pixel
442901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	gl.readPixels(size.x() / 2, size.y() / 2, 1, 1, GL_RGBA, GL_FLOAT, centerPixel);
443901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
444901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	tcu::Vec4 desiredColor(centerPixel[0], centerPixel[1], centerPixel[2], centerPixel[3]);
445901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
446901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	delete[] centerPixel;
447901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
448901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	// validation
449901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	return ShaderBallotBaseTestCase::validateScreenPixels(context, desiredColor, ignoredColor);
450901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski}
451901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
452901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewskibool ShaderBallotBaseTestCase::validateColor(tcu::Vec4 testedColor, tcu::Vec4 desiredColor)
453901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski{
454901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	const float epsilon = 0.008f;
455901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	return de::abs(testedColor.x() - desiredColor.x()) < epsilon &&
456901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		   de::abs(testedColor.y() - desiredColor.y()) < epsilon &&
457901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		   de::abs(testedColor.z() - desiredColor.z()) < epsilon &&
458901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		   de::abs(testedColor.w() - desiredColor.w()) < epsilon;
459901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski}
460901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
461901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski/** Constructor.
462901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*
463901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*  @param context Rendering context
464901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*/
465901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip DemczewskiShaderBallotAvailabilityTestCase::ShaderBallotAvailabilityTestCase(deqp::Context& context)
466901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	: ShaderBallotBaseTestCase(context, "ShaderBallotAvailability",
467901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski							   "Implements verification of availability for new build-in features")
468901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski{
469901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	std::string colorShaderSnippet =
470901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		"	float red = gl_SubGroupSizeARB / 64.0f;\n"
471901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		"	float green = 1.0f - (gl_SubGroupInvocationARB / float(gl_SubGroupSizeARB));\n"
472901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		"	float blue = float(ballotARB(true) % 256) / 256.0f;\n"
473901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		"	outColor = readInvocationARB(vec4(red, green, blue, 1.0f), gl_SubGroupInvocationARB);\n";
474901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
475901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	for (unsigned int i = 0; i < glu::SHADERTYPE_LAST; ++i)
476901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	{
477901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		m_shaderPipelines.push_back(new ShaderPipeline((glu::ShaderType)i, colorShaderSnippet));
478901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	}
479901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski}
480901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
481901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski/** Initializes the test
482901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*/
483901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewskivoid ShaderBallotAvailabilityTestCase::init()
484901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski{
485901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski}
486901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
487901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski/** Executes test iteration.
488901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*
489901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*  @return Returns STOP when test has finished executing, CONTINUE if more iterations are needed.
490901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*/
491901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewskitcu::TestNode::IterateResult ShaderBallotAvailabilityTestCase::iterate()
492901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski{
493901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	if (!m_context.getContextInfo().isExtensionSupported("GL_ARB_shader_ballot") ||
494901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		!m_context.getContextInfo().isExtensionSupported("GL_ARB_gpu_shader_int64"))
495901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	{
496901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "Not supported");
497901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		return STOP;
498901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	}
499901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
500901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	for (ShaderPipelineIter iter = m_shaderPipelines.begin(); iter != m_shaderPipelines.end(); ++iter)
501901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	{
502901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		createShaderPrograms(**iter);
503901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	}
504901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
505901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
506901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
507901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	for (ShaderPipelineIter pipelineIter = m_shaderPipelines.begin(); pipelineIter != m_shaderPipelines.end();
508901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		 ++pipelineIter)
509901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	{
510901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		gl.clearColor(0.0f, 0.0f, 0.0f, 1.0f);
511901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		gl.clear(GL_COLOR_BUFFER_BIT);
512901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
513901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		(*pipelineIter)->test(m_context);
514901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
515901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		gl.flush();
516901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	}
517901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
518901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
519901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	return STOP;
520901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski}
521901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
522901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski/** Constructor.
523901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*
524901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*  @param context Rendering context
525901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*/
526901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip DemczewskiShaderBallotBitmasksTestCase::ShaderBallotBitmasksTestCase(deqp::Context& context)
527901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	: ShaderBallotBaseTestCase(context, "ShaderBallotBitmasks",
528901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski							   "Implements verification of values of gl_SubGroup*MaskARB variables")
529901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski{
530901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_maskVars["gl_SubGroupEqMaskARB"] = "==";
531901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_maskVars["gl_SubGroupGeMaskARB"] = ">=";
532901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_maskVars["gl_SubGroupGtMaskARB"] = ">";
533901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_maskVars["gl_SubGroupLeMaskARB"] = "<=";
534901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_maskVars["gl_SubGroupLtMaskARB"] = "<";
535901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
536901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	std::string colorShaderSnippet = "	uint64_t mask = 0;\n"
537901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski									 "	for(uint i = 0; i < gl_SubGroupSizeARB; ++i)\n"
538901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski									 "	{\n"
539901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski									 "		if(i ${MASK_OPERATOR} gl_SubGroupInvocationARB)\n"
540901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski									 "			mask = mask | (1ul << i);\n"
541901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski									 "	}\n"
542901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski									 "	float color = (${MASK_VAR} ^ mask) == 0ul ? 1.0 : 0.0;\n"
543901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski									 "	outColor = vec4(color, color, color, 1.0);\n";
544901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
545901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	for (MaskVarIter maskIter = m_maskVars.begin(); maskIter != m_maskVars.end(); maskIter++)
546901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	{
547901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		for (unsigned int i = 0; i < glu::SHADERTYPE_LAST; ++i)
548901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		{
549901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski			std::map<std::string, std::string> specMap;
550901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski			specMap["MASK_VAR"]		 = maskIter->first;
551901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski			specMap["MASK_OPERATOR"] = maskIter->second;
552bd49bc4c1acd4dec3075706beb7916fc925ffe23James Helferty			m_shaderPipelines.push_back(new ShaderPipeline((glu::ShaderType)i, colorShaderSnippet, specMap));
553901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		}
554901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	}
555901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski}
556901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
557901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski/** Initializes the test
558901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*/
559901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewskivoid ShaderBallotBitmasksTestCase::init()
560901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski{
561901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski}
562901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
563901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski/** Executes test iteration.
564901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*
565901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*  @return Returns STOP when test has finished executing, CONTINUE if more iterations are needed.
566901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*/
567901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewskitcu::TestNode::IterateResult ShaderBallotBitmasksTestCase::iterate()
568901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski{
569901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	if (!m_context.getContextInfo().isExtensionSupported("GL_ARB_shader_ballot") ||
570901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		!m_context.getContextInfo().isExtensionSupported("GL_ARB_gpu_shader_int64"))
571901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	{
572901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "Not supported");
573901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		return STOP;
574901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	}
575901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
576901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	for (ShaderPipelineIter iter = m_shaderPipelines.begin(); iter != m_shaderPipelines.end(); ++iter)
577901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	{
578901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		createShaderPrograms(**iter);
579901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	}
580901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
581901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
582901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
583901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	for (ShaderPipelineIter pipelineIter = m_shaderPipelines.begin(); pipelineIter != m_shaderPipelines.end();
584901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		 ++pipelineIter)
585901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	{
586901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		gl.clearColor(1.0f, 0.0f, 0.0f, 1.0f);
587901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		gl.clear(GL_COLOR_BUFFER_BIT);
588901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
589901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		(*pipelineIter)->test(m_context);
590901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
591901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		gl.flush();
592901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
593901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		bool validationResult = ShaderBallotBaseTestCase::validateScreenPixels(
594901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski			m_context, tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f), tcu::Vec4(1.0f, 0.0f, 0.0f, 1.0f));
595901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		TCU_CHECK_MSG(validationResult, "Bitmask value is not correct");
596901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	}
597901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
598901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
599901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	return STOP;
600901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski}
601901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
602901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski/** Constructor.
603901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*
604901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*  @param context Rendering context
605901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*/
606901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip DemczewskiShaderBallotFunctionBallotTestCase::ShaderBallotFunctionBallotTestCase(deqp::Context& context)
607901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	: ShaderBallotBaseTestCase(context, "ShaderBallotFunctionBallot",
608901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski							   "Implements verification of ballotARB calls and returned results")
609901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski{
610901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	std::string ballotFalseSnippet = "	uint64_t result = ballotARB(false);\n"
611901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski									 "	float color = result == 0ul ? 1.0 : 0.0;\n"
612901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski									 "	outColor = vec4(color, color, color, 1.0);\n";
613901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
614901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	std::string ballotTrueSnippet = "	uint64_t result = ballotARB(true);\n"
615901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski									"	float color = result != 0ul ? 1.0 : 0.0;\n"
616901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski									"	uint64_t invocationBit = 1ul << gl_SubGroupInvocationARB;\n"
617901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski									"	color *= float(invocationBit & result);\n"
618901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski									"	outColor = vec4(color, color, color, 1.0);\n";
619901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
620901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	std::string ballotMixedSnippet = "	bool param = (gl_SubGroupInvocationARB % 2) == 0ul;\n"
621901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski									 "	uint64_t result = ballotARB(param);\n"
622901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski									 "	float color = (param && result != 0ul) || !param ? 1.0 : 0.0;\n"
623901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski									 "	outColor = vec4(color, color, color, 1.0);\n";
624901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
625901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	for (unsigned int i = 0; i < glu::SHADERTYPE_LAST; ++i)
626901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	{
627901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		m_shaderPipelines.push_back(new ShaderPipeline((glu::ShaderType)i, ballotFalseSnippet));
628901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		m_shaderPipelines.push_back(new ShaderPipeline((glu::ShaderType)i, ballotTrueSnippet));
629901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		m_shaderPipelines.push_back(new ShaderPipeline((glu::ShaderType)i, ballotMixedSnippet));
630901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	}
631901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski}
632901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
633901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski/** Initializes the test
634901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*/
635901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewskivoid ShaderBallotFunctionBallotTestCase::init()
636901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski{
637901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski}
638901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
639901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski/** Executes test iteration.
640901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*
641901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*  @return Returns STOP when test has finished executing, CONTINUE if more iterations are needed.
642901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*/
643901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewskitcu::TestNode::IterateResult ShaderBallotFunctionBallotTestCase::iterate()
644901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski{
645901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	if (!m_context.getContextInfo().isExtensionSupported("GL_ARB_shader_ballot") ||
646901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		!m_context.getContextInfo().isExtensionSupported("GL_ARB_gpu_shader_int64"))
647901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	{
648901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "Not supported");
649901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		return STOP;
650901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	}
651901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
652901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	for (ShaderPipelineIter iter = m_shaderPipelines.begin(); iter != m_shaderPipelines.end(); ++iter)
653901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	{
654901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		createShaderPrograms(**iter);
655901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	}
656901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
657901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
658901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
659901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	for (ShaderPipelineIter pipelineIter = m_shaderPipelines.begin(); pipelineIter != m_shaderPipelines.end();
660901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		 ++pipelineIter)
661901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	{
662901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		gl.clearColor(1.0f, 0.0f, 0.0f, 1.0f);
663901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		gl.clear(GL_COLOR_BUFFER_BIT);
664901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
665901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		(*pipelineIter)->test(m_context);
666901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
667901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		gl.flush();
668901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
669901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		bool validationResult = ShaderBallotBaseTestCase::validateScreenPixels(
670901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski			m_context, tcu::Vec4(1.0f, 1.0f, 1.0f, 1.0f), tcu::Vec4(1.0f, 0.0f, 0.0f, 1.0f));
671901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		TCU_CHECK_MSG(validationResult, "Value returned from ballotARB function is not correct");
672901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	}
673901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
674901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
675901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	return STOP;
676901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski}
677901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
678901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski/** Constructor.
679901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*
680901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*  @param context Rendering context
681901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*/
682901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip DemczewskiShaderBallotFunctionReadTestCase::ShaderBallotFunctionReadTestCase(deqp::Context& context)
683901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	: ShaderBallotBaseTestCase(context, "ShaderBallotFunctionRead",
684901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski							   "Implements verification of readInvocationARB and readFirstInvocationARB function calls")
685901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski{
686901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	std::string readFirstInvSnippet = "float color = 1.0f - (gl_SubGroupInvocationARB / float(gl_SubGroupSizeARB));\n"
687901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski									  "outColor = readFirstInvocationARB(vec4(color, color, color, 1.0f));\n";
688901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
689901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	std::string readInvSnippet = "float color = 1.0 - (gl_SubGroupInvocationARB / float(gl_SubGroupSizeARB));\n"
690bd49bc4c1acd4dec3075706beb7916fc925ffe23James Helferty								 "uvec2 parts = unpackUint2x32(ballotARB(true));\n"
691bd49bc4c1acd4dec3075706beb7916fc925ffe23James Helferty								 "uint invocation;\n"
692bd49bc4c1acd4dec3075706beb7916fc925ffe23James Helferty								 "if (parts.x != 0) {\n"
693bd49bc4c1acd4dec3075706beb7916fc925ffe23James Helferty								 "    invocation = findLSB(parts.x);\n"
694bd49bc4c1acd4dec3075706beb7916fc925ffe23James Helferty								 "} else {\n"
695bd49bc4c1acd4dec3075706beb7916fc925ffe23James Helferty								 "    invocation = findLSB(parts.y) + 32;\n"
696901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski								 "}\n"
697bd49bc4c1acd4dec3075706beb7916fc925ffe23James Helferty								 "outColor = readInvocationARB(vec4(color, color, color, 1.0f), invocation);\n";
698901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
699901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	for (unsigned int i = 0; i < glu::SHADERTYPE_LAST; ++i)
700901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	{
701901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		m_shaderPipelines.push_back(new ShaderPipeline((glu::ShaderType)i, readFirstInvSnippet));
702bd49bc4c1acd4dec3075706beb7916fc925ffe23James Helferty		m_shaderPipelines.push_back(new ShaderPipeline((glu::ShaderType)i, readInvSnippet));
703901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	}
704901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski}
705901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
706901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski/** Initializes the test
707901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*/
708901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewskivoid ShaderBallotFunctionReadTestCase::init()
709901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski{
710901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski}
711901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
712901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski/** Executes test iteration.
713901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*
714901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*  @return Returns STOP when test has finished executing, CONTINUE if more iterations are needed.
715901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*/
716901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewskitcu::TestNode::IterateResult ShaderBallotFunctionReadTestCase::iterate()
717901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski{
718901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	if (!m_context.getContextInfo().isExtensionSupported("GL_ARB_shader_ballot") ||
719901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		!m_context.getContextInfo().isExtensionSupported("GL_ARB_gpu_shader_int64"))
720901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	{
721901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "Not supported");
722901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		return STOP;
723901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	}
724901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
725901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	for (ShaderPipelineIter iter = m_shaderPipelines.begin(); iter != m_shaderPipelines.end(); ++iter)
726901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	{
727901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		createShaderPrograms(**iter);
728901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	}
729901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
730901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	const glw::Functions&   gl			 = m_context.getRenderContext().getFunctions();
731901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	const tcu::RenderTarget renderTarget = m_context.getRenderContext().getRenderTarget();
732901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
733901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	gl.clearColor(1.0f, 0.0f, 0.0f, 1.0f);
734901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	gl.viewport(renderTarget.getWidth() / 2 - 1, renderTarget.getHeight() / 2 - 1, 2, 2);
735901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
736901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	for (ShaderPipelineIter pipelineIter = m_shaderPipelines.begin(); pipelineIter != m_shaderPipelines.end();
737901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		 ++pipelineIter)
738901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	{
739901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		gl.clear(GL_COLOR_BUFFER_BIT);
740901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
741901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		(*pipelineIter)->test(m_context);
742901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
743901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		gl.flush();
744901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
745901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		bool validationResult =
746901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski			ShaderBallotBaseTestCase::validateScreenPixelsSameColor(m_context, tcu::Vec4(1.0f, 0.0f, 0.0f, 1.0f));
747901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski		TCU_CHECK_MSG(validationResult, "Read functions result is not correct");
748901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	}
749901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
750901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
751901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	return STOP;
752901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski}
753901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
754901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski/** Constructor.
755901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*
756901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*  @param context Rendering context.
757901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski**/
758901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip DemczewskiShaderBallotTests::ShaderBallotTests(deqp::Context& context)
759901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	: TestCaseGroup(context, "shader_ballot_tests", "Verify conformance of CTS_ARB_shader_ballot implementation")
760901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski{
761901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski}
762901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski
763901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski/** Initializes the shader_ballot test group.
764901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski*
765901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski**/
766901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewskivoid ShaderBallotTests::init(void)
767901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski{
768901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	addChild(new ShaderBallotAvailabilityTestCase(m_context));
769901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	addChild(new ShaderBallotBitmasksTestCase(m_context));
770901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	addChild(new ShaderBallotFunctionBallotTestCase(m_context));
771901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski	addChild(new ShaderBallotFunctionReadTestCase(m_context));
772901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski}
773901e638276ca7c97c5439c6e32f31a1644c0bb4aFilip Demczewski} /* glcts namespace */
774