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