1e5c31af7Sopenharmony_ci/*------------------------------------------------------------------------ 2e5c31af7Sopenharmony_ci * OpenGL Conformance Tests 3e5c31af7Sopenharmony_ci * ------------------------ 4e5c31af7Sopenharmony_ci * 5e5c31af7Sopenharmony_ci * Copyright (c) 2017-2019 The Khronos Group Inc. 6e5c31af7Sopenharmony_ci * Copyright (c) 2017 Codeplay Software Ltd. 7e5c31af7Sopenharmony_ci * Copyright (c) 2019 NVIDIA Corporation. 8e5c31af7Sopenharmony_ci * 9e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 10e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License. 11e5c31af7Sopenharmony_ci * You may obtain a copy of the License at 12e5c31af7Sopenharmony_ci * 13e5c31af7Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 14e5c31af7Sopenharmony_ci * 15e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 16e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 17e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and 19e5c31af7Sopenharmony_ci * limitations under the License. 20e5c31af7Sopenharmony_ci * 21e5c31af7Sopenharmony_ci */ /*! 22e5c31af7Sopenharmony_ci * \file 23e5c31af7Sopenharmony_ci * \brief Subgroups Tests 24e5c31af7Sopenharmony_ci */ /*--------------------------------------------------------------------*/ 25e5c31af7Sopenharmony_ci 26e5c31af7Sopenharmony_ci#include "glcSubgroupsShuffleTests.hpp" 27e5c31af7Sopenharmony_ci#include "glcSubgroupsTestsUtils.hpp" 28e5c31af7Sopenharmony_ci 29e5c31af7Sopenharmony_ci#include <string> 30e5c31af7Sopenharmony_ci#include <vector> 31e5c31af7Sopenharmony_ci 32e5c31af7Sopenharmony_ciusing namespace tcu; 33e5c31af7Sopenharmony_ciusing namespace std; 34e5c31af7Sopenharmony_ci 35e5c31af7Sopenharmony_cinamespace glc 36e5c31af7Sopenharmony_ci{ 37e5c31af7Sopenharmony_cinamespace subgroups 38e5c31af7Sopenharmony_ci{ 39e5c31af7Sopenharmony_cinamespace 40e5c31af7Sopenharmony_ci{ 41e5c31af7Sopenharmony_cienum OpType 42e5c31af7Sopenharmony_ci{ 43e5c31af7Sopenharmony_ci OPTYPE_SHUFFLE = 0, 44e5c31af7Sopenharmony_ci OPTYPE_SHUFFLE_XOR, 45e5c31af7Sopenharmony_ci OPTYPE_SHUFFLE_UP, 46e5c31af7Sopenharmony_ci OPTYPE_SHUFFLE_DOWN, 47e5c31af7Sopenharmony_ci OPTYPE_LAST 48e5c31af7Sopenharmony_ci}; 49e5c31af7Sopenharmony_ci 50e5c31af7Sopenharmony_cistatic bool checkVertexPipelineStages(std::vector<const void*> datas, 51e5c31af7Sopenharmony_ci deUint32 width, deUint32) 52e5c31af7Sopenharmony_ci{ 53e5c31af7Sopenharmony_ci return glc::subgroups::check(datas, width, 1); 54e5c31af7Sopenharmony_ci} 55e5c31af7Sopenharmony_ci 56e5c31af7Sopenharmony_cistatic bool checkComputeStage(std::vector<const void*> datas, 57e5c31af7Sopenharmony_ci const deUint32 numWorkgroups[3], const deUint32 localSize[3], 58e5c31af7Sopenharmony_ci deUint32) 59e5c31af7Sopenharmony_ci{ 60e5c31af7Sopenharmony_ci return glc::subgroups::checkCompute(datas, numWorkgroups, localSize, 1); 61e5c31af7Sopenharmony_ci} 62e5c31af7Sopenharmony_ci 63e5c31af7Sopenharmony_cistd::string getOpTypeName(int opType) 64e5c31af7Sopenharmony_ci{ 65e5c31af7Sopenharmony_ci switch (opType) 66e5c31af7Sopenharmony_ci { 67e5c31af7Sopenharmony_ci default: 68e5c31af7Sopenharmony_ci DE_FATAL("Unsupported op type"); 69e5c31af7Sopenharmony_ci return ""; 70e5c31af7Sopenharmony_ci case OPTYPE_SHUFFLE: 71e5c31af7Sopenharmony_ci return "subgroupShuffle"; 72e5c31af7Sopenharmony_ci case OPTYPE_SHUFFLE_XOR: 73e5c31af7Sopenharmony_ci return "subgroupShuffleXor"; 74e5c31af7Sopenharmony_ci case OPTYPE_SHUFFLE_UP: 75e5c31af7Sopenharmony_ci return "subgroupShuffleUp"; 76e5c31af7Sopenharmony_ci case OPTYPE_SHUFFLE_DOWN: 77e5c31af7Sopenharmony_ci return "subgroupShuffleDown"; 78e5c31af7Sopenharmony_ci } 79e5c31af7Sopenharmony_ci} 80e5c31af7Sopenharmony_ci 81e5c31af7Sopenharmony_cistruct CaseDefinition 82e5c31af7Sopenharmony_ci{ 83e5c31af7Sopenharmony_ci int opType; 84e5c31af7Sopenharmony_ci ShaderStageFlags shaderStage; 85e5c31af7Sopenharmony_ci Format format; 86e5c31af7Sopenharmony_ci}; 87e5c31af7Sopenharmony_ci 88e5c31af7Sopenharmony_ciconst std::string to_string(int x) { 89e5c31af7Sopenharmony_ci std::ostringstream oss; 90e5c31af7Sopenharmony_ci oss << x; 91e5c31af7Sopenharmony_ci return oss.str(); 92e5c31af7Sopenharmony_ci} 93e5c31af7Sopenharmony_ci 94e5c31af7Sopenharmony_ciconst std::string DeclSource(CaseDefinition caseDef, int baseBinding) 95e5c31af7Sopenharmony_ci{ 96e5c31af7Sopenharmony_ci return 97e5c31af7Sopenharmony_ci "layout(binding = " + to_string(baseBinding) + ", std430) readonly buffer BufferB0\n" 98e5c31af7Sopenharmony_ci "{\n" 99e5c31af7Sopenharmony_ci " " + subgroups::getFormatNameForGLSL(caseDef.format) + " data1[];\n" 100e5c31af7Sopenharmony_ci "};\n" 101e5c31af7Sopenharmony_ci "layout(binding = " + to_string(baseBinding + 1) + ", std430) readonly buffer BufferB1\n" 102e5c31af7Sopenharmony_ci "{\n" 103e5c31af7Sopenharmony_ci " uint data2[];\n" 104e5c31af7Sopenharmony_ci "};\n"; 105e5c31af7Sopenharmony_ci} 106e5c31af7Sopenharmony_ci 107e5c31af7Sopenharmony_ciconst std::string TestSource(CaseDefinition caseDef) 108e5c31af7Sopenharmony_ci{ 109e5c31af7Sopenharmony_ci std::string idTable[OPTYPE_LAST]; 110e5c31af7Sopenharmony_ci idTable[OPTYPE_SHUFFLE] = "id_in"; 111e5c31af7Sopenharmony_ci idTable[OPTYPE_SHUFFLE_XOR] = "gl_SubgroupInvocationID ^ id_in"; 112e5c31af7Sopenharmony_ci idTable[OPTYPE_SHUFFLE_UP] = "gl_SubgroupInvocationID - id_in"; 113e5c31af7Sopenharmony_ci idTable[OPTYPE_SHUFFLE_DOWN] = "gl_SubgroupInvocationID + id_in"; 114e5c31af7Sopenharmony_ci 115e5c31af7Sopenharmony_ci const std::string testSource = 116e5c31af7Sopenharmony_ci " uint temp_res;\n" 117e5c31af7Sopenharmony_ci " uvec4 mask = subgroupBallot(true);\n" 118e5c31af7Sopenharmony_ci " uint id_in = data2[gl_SubgroupInvocationID] & (gl_SubgroupSize - 1u);\n" 119e5c31af7Sopenharmony_ci " " + subgroups::getFormatNameForGLSL(caseDef.format) + " op = " 120e5c31af7Sopenharmony_ci + getOpTypeName(caseDef.opType) + "(data1[gl_SubgroupInvocationID], id_in);\n" 121e5c31af7Sopenharmony_ci " uint id = " + idTable[caseDef.opType] + ";\n" 122e5c31af7Sopenharmony_ci " if ((id < gl_SubgroupSize) && subgroupBallotBitExtract(mask, id))\n" 123e5c31af7Sopenharmony_ci " {\n" 124e5c31af7Sopenharmony_ci " temp_res = (op == data1[id]) ? 1u : 0u;\n" 125e5c31af7Sopenharmony_ci " }\n" 126e5c31af7Sopenharmony_ci " else\n" 127e5c31af7Sopenharmony_ci " {\n" 128e5c31af7Sopenharmony_ci " temp_res = 1u; // Invocation we read from was inactive, so we can't verify results!\n" 129e5c31af7Sopenharmony_ci " }\n"; 130e5c31af7Sopenharmony_ci 131e5c31af7Sopenharmony_ci return testSource; 132e5c31af7Sopenharmony_ci} 133e5c31af7Sopenharmony_ci 134e5c31af7Sopenharmony_civoid initFrameBufferPrograms (SourceCollections& programCollection, CaseDefinition caseDef) 135e5c31af7Sopenharmony_ci{ 136e5c31af7Sopenharmony_ci subgroups::setFragmentShaderFrameBuffer(programCollection); 137e5c31af7Sopenharmony_ci 138e5c31af7Sopenharmony_ci if (SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage) 139e5c31af7Sopenharmony_ci subgroups::setVertexShaderFrameBuffer(programCollection); 140e5c31af7Sopenharmony_ci 141e5c31af7Sopenharmony_ci const std::string extSource = 142e5c31af7Sopenharmony_ci (OPTYPE_SHUFFLE == caseDef.opType || OPTYPE_SHUFFLE_XOR == caseDef.opType) ? 143e5c31af7Sopenharmony_ci "#extension GL_KHR_shader_subgroup_shuffle: enable\n" : 144e5c31af7Sopenharmony_ci "#extension GL_KHR_shader_subgroup_shuffle_relative: enable\n"; 145e5c31af7Sopenharmony_ci 146e5c31af7Sopenharmony_ci const std::string testSource = TestSource(caseDef); 147e5c31af7Sopenharmony_ci 148e5c31af7Sopenharmony_ci if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage) 149e5c31af7Sopenharmony_ci { 150e5c31af7Sopenharmony_ci std::ostringstream vertexSrc; 151e5c31af7Sopenharmony_ci vertexSrc << "${VERSION_DECL}\n" 152e5c31af7Sopenharmony_ci << extSource 153e5c31af7Sopenharmony_ci << "#extension GL_KHR_shader_subgroup_ballot: enable\n" 154e5c31af7Sopenharmony_ci << "layout(location = 0) in highp vec4 in_position;\n" 155e5c31af7Sopenharmony_ci << "layout(location = 0) out float result;\n" 156e5c31af7Sopenharmony_ci << "layout(binding = 0, std140) uniform Buffer0\n" 157e5c31af7Sopenharmony_ci << "{\n" 158e5c31af7Sopenharmony_ci << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[" << subgroups::maxSupportedSubgroupSize() << "];\n" 159e5c31af7Sopenharmony_ci << "};\n" 160e5c31af7Sopenharmony_ci << "layout(binding = 1, std140) uniform Buffer1\n" 161e5c31af7Sopenharmony_ci << "{\n" 162e5c31af7Sopenharmony_ci << " uint data2[" << subgroups::maxSupportedSubgroupSize() << "];\n" 163e5c31af7Sopenharmony_ci << "};\n" 164e5c31af7Sopenharmony_ci << "\n" 165e5c31af7Sopenharmony_ci << "void main (void)\n" 166e5c31af7Sopenharmony_ci << "{\n" 167e5c31af7Sopenharmony_ci << testSource 168e5c31af7Sopenharmony_ci << " result = float(temp_res);\n" 169e5c31af7Sopenharmony_ci << " gl_Position = in_position;\n" 170e5c31af7Sopenharmony_ci << " gl_PointSize = 1.0f;\n" 171e5c31af7Sopenharmony_ci << "}\n"; 172e5c31af7Sopenharmony_ci programCollection.add("vert") << glu::VertexSource(vertexSrc.str()); 173e5c31af7Sopenharmony_ci } 174e5c31af7Sopenharmony_ci else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage) 175e5c31af7Sopenharmony_ci { 176e5c31af7Sopenharmony_ci std::ostringstream geometry; 177e5c31af7Sopenharmony_ci 178e5c31af7Sopenharmony_ci geometry << "${VERSION_DECL}\n" 179e5c31af7Sopenharmony_ci << extSource 180e5c31af7Sopenharmony_ci << "#extension GL_KHR_shader_subgroup_ballot: enable\n" 181e5c31af7Sopenharmony_ci << "layout(points) in;\n" 182e5c31af7Sopenharmony_ci << "layout(points, max_vertices = 1) out;\n" 183e5c31af7Sopenharmony_ci << "layout(location = 0) out float out_color;\n" 184e5c31af7Sopenharmony_ci << "layout(binding = 0, std140) uniform Buffer0\n" 185e5c31af7Sopenharmony_ci << "{\n" 186e5c31af7Sopenharmony_ci << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[" << subgroups::maxSupportedSubgroupSize() << "];\n" 187e5c31af7Sopenharmony_ci << "};\n" 188e5c31af7Sopenharmony_ci << "layout(binding = 1, std140) uniform Buffer1\n" 189e5c31af7Sopenharmony_ci << "{\n" 190e5c31af7Sopenharmony_ci << " uint data2[" << subgroups::maxSupportedSubgroupSize() << "];\n" 191e5c31af7Sopenharmony_ci << "};\n" 192e5c31af7Sopenharmony_ci << "\n" 193e5c31af7Sopenharmony_ci << "void main (void)\n" 194e5c31af7Sopenharmony_ci << "{\n" 195e5c31af7Sopenharmony_ci << testSource 196e5c31af7Sopenharmony_ci << " out_color = float(temp_res);\n" 197e5c31af7Sopenharmony_ci << " gl_Position = gl_in[0].gl_Position;\n" 198e5c31af7Sopenharmony_ci << " EmitVertex();\n" 199e5c31af7Sopenharmony_ci << " EndPrimitive();\n" 200e5c31af7Sopenharmony_ci << "}\n"; 201e5c31af7Sopenharmony_ci 202e5c31af7Sopenharmony_ci programCollection.add("geometry") << glu::GeometrySource(geometry.str()); 203e5c31af7Sopenharmony_ci } 204e5c31af7Sopenharmony_ci else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage) 205e5c31af7Sopenharmony_ci { 206e5c31af7Sopenharmony_ci std::ostringstream controlSource; 207e5c31af7Sopenharmony_ci 208e5c31af7Sopenharmony_ci controlSource << "${VERSION_DECL}\n" 209e5c31af7Sopenharmony_ci << extSource 210e5c31af7Sopenharmony_ci << "#extension GL_KHR_shader_subgroup_ballot: enable\n" 211e5c31af7Sopenharmony_ci << "layout(vertices = 2) out;\n" 212e5c31af7Sopenharmony_ci << "layout(location = 0) out float out_color[];\n" 213e5c31af7Sopenharmony_ci << "layout(binding = 0, std140) uniform Buffer0\n" 214e5c31af7Sopenharmony_ci << "{\n" 215e5c31af7Sopenharmony_ci << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[" << subgroups::maxSupportedSubgroupSize() << "];\n" 216e5c31af7Sopenharmony_ci << "};\n" 217e5c31af7Sopenharmony_ci << "layout(binding = 1, std140) uniform Buffer1\n" 218e5c31af7Sopenharmony_ci << "{\n" 219e5c31af7Sopenharmony_ci << " uint data2[" << subgroups::maxSupportedSubgroupSize() << "];\n" 220e5c31af7Sopenharmony_ci << "};\n" 221e5c31af7Sopenharmony_ci << "\n" 222e5c31af7Sopenharmony_ci << "void main (void)\n" 223e5c31af7Sopenharmony_ci << "{\n" 224e5c31af7Sopenharmony_ci << " if (gl_InvocationID == 0)\n" 225e5c31af7Sopenharmony_ci <<" {\n" 226e5c31af7Sopenharmony_ci << " gl_TessLevelOuter[0] = 1.0f;\n" 227e5c31af7Sopenharmony_ci << " gl_TessLevelOuter[1] = 1.0f;\n" 228e5c31af7Sopenharmony_ci << " }\n" 229e5c31af7Sopenharmony_ci << testSource 230e5c31af7Sopenharmony_ci << " out_color[gl_InvocationID] = float(temp_res);\n" 231e5c31af7Sopenharmony_ci << " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n" 232e5c31af7Sopenharmony_ci << "}\n"; 233e5c31af7Sopenharmony_ci 234e5c31af7Sopenharmony_ci programCollection.add("tesc") << glu::TessellationControlSource(controlSource.str()); 235e5c31af7Sopenharmony_ci subgroups::setTesEvalShaderFrameBuffer(programCollection); 236e5c31af7Sopenharmony_ci 237e5c31af7Sopenharmony_ci } 238e5c31af7Sopenharmony_ci else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage) 239e5c31af7Sopenharmony_ci { 240e5c31af7Sopenharmony_ci std::ostringstream evaluationSource; 241e5c31af7Sopenharmony_ci evaluationSource << "${VERSION_DECL}\n" 242e5c31af7Sopenharmony_ci << extSource 243e5c31af7Sopenharmony_ci << "#extension GL_KHR_shader_subgroup_ballot: enable\n" 244e5c31af7Sopenharmony_ci << "layout(isolines, equal_spacing, ccw ) in;\n" 245e5c31af7Sopenharmony_ci << "layout(location = 0) out float out_color;\n" 246e5c31af7Sopenharmony_ci << "layout(binding = 0, std140) uniform Buffer0\n" 247e5c31af7Sopenharmony_ci << "{\n" 248e5c31af7Sopenharmony_ci << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data1[" << subgroups::maxSupportedSubgroupSize() << "];\n" 249e5c31af7Sopenharmony_ci << "};\n" 250e5c31af7Sopenharmony_ci << "layout(binding = 1, std140) uniform Buffer1\n" 251e5c31af7Sopenharmony_ci << "{\n" 252e5c31af7Sopenharmony_ci << " uint data2[" << subgroups::maxSupportedSubgroupSize() << "];\n" 253e5c31af7Sopenharmony_ci << "};\n" 254e5c31af7Sopenharmony_ci << "\n" 255e5c31af7Sopenharmony_ci << "void main (void)\n" 256e5c31af7Sopenharmony_ci << "{\n" 257e5c31af7Sopenharmony_ci << testSource 258e5c31af7Sopenharmony_ci << " out_color = float(temp_res);\n" 259e5c31af7Sopenharmony_ci << " gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n" 260e5c31af7Sopenharmony_ci << "}\n"; 261e5c31af7Sopenharmony_ci 262e5c31af7Sopenharmony_ci subgroups::setTesCtrlShaderFrameBuffer(programCollection); 263e5c31af7Sopenharmony_ci programCollection.add("tese") << glu::TessellationEvaluationSource(evaluationSource.str()); 264e5c31af7Sopenharmony_ci } 265e5c31af7Sopenharmony_ci else 266e5c31af7Sopenharmony_ci { 267e5c31af7Sopenharmony_ci DE_FATAL("Unsupported shader stage"); 268e5c31af7Sopenharmony_ci } 269e5c31af7Sopenharmony_ci} 270e5c31af7Sopenharmony_ci 271e5c31af7Sopenharmony_civoid initPrograms(SourceCollections& programCollection, CaseDefinition caseDef) 272e5c31af7Sopenharmony_ci{ 273e5c31af7Sopenharmony_ci const std::string versionSource = 274e5c31af7Sopenharmony_ci "${VERSION_DECL}\n"; 275e5c31af7Sopenharmony_ci const std::string vSource = 276e5c31af7Sopenharmony_ci "#extension GL_KHR_shader_subgroup_ballot: enable\n"; 277e5c31af7Sopenharmony_ci const std::string eSource = 278e5c31af7Sopenharmony_ci (OPTYPE_SHUFFLE == caseDef.opType || OPTYPE_SHUFFLE_XOR == caseDef.opType) ? 279e5c31af7Sopenharmony_ci "#extension GL_KHR_shader_subgroup_shuffle: enable\n" : 280e5c31af7Sopenharmony_ci "#extension GL_KHR_shader_subgroup_shuffle_relative: enable\n"; 281e5c31af7Sopenharmony_ci const std::string extSource = vSource + eSource; 282e5c31af7Sopenharmony_ci 283e5c31af7Sopenharmony_ci const std::string testSource = TestSource(caseDef); 284e5c31af7Sopenharmony_ci 285e5c31af7Sopenharmony_ci if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage) 286e5c31af7Sopenharmony_ci { 287e5c31af7Sopenharmony_ci std::ostringstream src; 288e5c31af7Sopenharmony_ci 289e5c31af7Sopenharmony_ci src << versionSource + extSource 290e5c31af7Sopenharmony_ci << "layout (${LOCAL_SIZE_X}, ${LOCAL_SIZE_Y}, ${LOCAL_SIZE_Z}) in;\n" 291e5c31af7Sopenharmony_ci << "layout(binding = 0, std430) buffer Buffer0\n" 292e5c31af7Sopenharmony_ci << "{\n" 293e5c31af7Sopenharmony_ci << " uint result[];\n" 294e5c31af7Sopenharmony_ci << "};\n" 295e5c31af7Sopenharmony_ci << DeclSource(caseDef, 1) 296e5c31af7Sopenharmony_ci << "\n" 297e5c31af7Sopenharmony_ci << "void main (void)\n" 298e5c31af7Sopenharmony_ci << "{\n" 299e5c31af7Sopenharmony_ci << " uvec3 globalSize = gl_NumWorkGroups * gl_WorkGroupSize;\n" 300e5c31af7Sopenharmony_ci << " highp uint offset = globalSize.x * ((globalSize.y * " 301e5c31af7Sopenharmony_ci "gl_GlobalInvocationID.z) + gl_GlobalInvocationID.y) + " 302e5c31af7Sopenharmony_ci "gl_GlobalInvocationID.x;\n" 303e5c31af7Sopenharmony_ci << testSource 304e5c31af7Sopenharmony_ci << " result[offset] = temp_res;\n" 305e5c31af7Sopenharmony_ci << "}\n"; 306e5c31af7Sopenharmony_ci 307e5c31af7Sopenharmony_ci programCollection.add("comp") << glu::ComputeSource(src.str()); 308e5c31af7Sopenharmony_ci } 309e5c31af7Sopenharmony_ci else 310e5c31af7Sopenharmony_ci { 311e5c31af7Sopenharmony_ci const std::string declSource = DeclSource(caseDef, 4); 312e5c31af7Sopenharmony_ci 313e5c31af7Sopenharmony_ci { 314e5c31af7Sopenharmony_ci const string vertex = 315e5c31af7Sopenharmony_ci versionSource + extSource + 316e5c31af7Sopenharmony_ci "layout(binding = 0, std430) buffer Buffer0\n" 317e5c31af7Sopenharmony_ci "{\n" 318e5c31af7Sopenharmony_ci " uint result[];\n" 319e5c31af7Sopenharmony_ci "} b0;\n" 320e5c31af7Sopenharmony_ci + declSource + 321e5c31af7Sopenharmony_ci "\n" 322e5c31af7Sopenharmony_ci "void main (void)\n" 323e5c31af7Sopenharmony_ci "{\n" 324e5c31af7Sopenharmony_ci + testSource + 325e5c31af7Sopenharmony_ci " b0.result[gl_VertexID] = temp_res;\n" 326e5c31af7Sopenharmony_ci " float pixelSize = 2.0f/1024.0f;\n" 327e5c31af7Sopenharmony_ci " float pixelPosition = pixelSize/2.0f - 1.0f;\n" 328e5c31af7Sopenharmony_ci " gl_Position = vec4(float(gl_VertexID) * pixelSize + pixelPosition, 0.0f, 0.0f, 1.0f);\n" 329e5c31af7Sopenharmony_ci " gl_PointSize = 1.0f;\n" 330e5c31af7Sopenharmony_ci "}\n"; 331e5c31af7Sopenharmony_ci 332e5c31af7Sopenharmony_ci programCollection.add("vert") << glu::VertexSource(vertex); 333e5c31af7Sopenharmony_ci } 334e5c31af7Sopenharmony_ci 335e5c31af7Sopenharmony_ci { 336e5c31af7Sopenharmony_ci const string tesc = 337e5c31af7Sopenharmony_ci versionSource + extSource + 338e5c31af7Sopenharmony_ci "layout(vertices=1) out;\n" 339e5c31af7Sopenharmony_ci "layout(binding = 1, std430) buffer Buffer1\n" 340e5c31af7Sopenharmony_ci "{\n" 341e5c31af7Sopenharmony_ci " uint result[];\n" 342e5c31af7Sopenharmony_ci "} b1;\n" 343e5c31af7Sopenharmony_ci + declSource + 344e5c31af7Sopenharmony_ci "\n" 345e5c31af7Sopenharmony_ci "void main (void)\n" 346e5c31af7Sopenharmony_ci "{\n" 347e5c31af7Sopenharmony_ci + testSource + 348e5c31af7Sopenharmony_ci " b1.result[gl_PrimitiveID] = temp_res;\n" 349e5c31af7Sopenharmony_ci " if (gl_InvocationID == 0)\n" 350e5c31af7Sopenharmony_ci " {\n" 351e5c31af7Sopenharmony_ci " gl_TessLevelOuter[0] = 1.0f;\n" 352e5c31af7Sopenharmony_ci " gl_TessLevelOuter[1] = 1.0f;\n" 353e5c31af7Sopenharmony_ci " }\n" 354e5c31af7Sopenharmony_ci " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n" 355e5c31af7Sopenharmony_ci "}\n"; 356e5c31af7Sopenharmony_ci 357e5c31af7Sopenharmony_ci programCollection.add("tesc") << glu::TessellationControlSource(tesc); 358e5c31af7Sopenharmony_ci } 359e5c31af7Sopenharmony_ci 360e5c31af7Sopenharmony_ci { 361e5c31af7Sopenharmony_ci const string tese = 362e5c31af7Sopenharmony_ci versionSource + extSource + 363e5c31af7Sopenharmony_ci "layout(isolines) in;\n" 364e5c31af7Sopenharmony_ci "layout(binding = 2, std430) buffer Buffer2\n" 365e5c31af7Sopenharmony_ci "{\n" 366e5c31af7Sopenharmony_ci " uint result[];\n" 367e5c31af7Sopenharmony_ci "} b2;\n" 368e5c31af7Sopenharmony_ci + declSource + 369e5c31af7Sopenharmony_ci "\n" 370e5c31af7Sopenharmony_ci "void main (void)\n" 371e5c31af7Sopenharmony_ci "{\n" 372e5c31af7Sopenharmony_ci + testSource + 373e5c31af7Sopenharmony_ci " b2.result[gl_PrimitiveID * 2 + int(gl_TessCoord.x + 0.5)] = temp_res;\n" 374e5c31af7Sopenharmony_ci " float pixelSize = 2.0f/1024.0f;\n" 375e5c31af7Sopenharmony_ci " gl_Position = gl_in[0].gl_Position + gl_TessCoord.x * pixelSize / 2.0f;\n" 376e5c31af7Sopenharmony_ci "}\n"; 377e5c31af7Sopenharmony_ci 378e5c31af7Sopenharmony_ci programCollection.add("tese") << glu::TessellationEvaluationSource(tese); 379e5c31af7Sopenharmony_ci } 380e5c31af7Sopenharmony_ci 381e5c31af7Sopenharmony_ci { 382e5c31af7Sopenharmony_ci const string geometry = 383e5c31af7Sopenharmony_ci // version is added by addGeometryShadersFromTemplate 384e5c31af7Sopenharmony_ci extSource + 385e5c31af7Sopenharmony_ci "layout(${TOPOLOGY}) in;\n" 386e5c31af7Sopenharmony_ci "layout(points, max_vertices = 1) out;\n" 387e5c31af7Sopenharmony_ci "layout(binding = 3, std430) buffer Buffer3\n" 388e5c31af7Sopenharmony_ci "{\n" 389e5c31af7Sopenharmony_ci " uint result[];\n" 390e5c31af7Sopenharmony_ci "} b3;\n" 391e5c31af7Sopenharmony_ci + declSource + 392e5c31af7Sopenharmony_ci "\n" 393e5c31af7Sopenharmony_ci "void main (void)\n" 394e5c31af7Sopenharmony_ci "{\n" 395e5c31af7Sopenharmony_ci + testSource + 396e5c31af7Sopenharmony_ci " b3.result[gl_PrimitiveIDIn] = temp_res;\n" 397e5c31af7Sopenharmony_ci " gl_Position = gl_in[0].gl_Position;\n" 398e5c31af7Sopenharmony_ci " EmitVertex();\n" 399e5c31af7Sopenharmony_ci " EndPrimitive();\n" 400e5c31af7Sopenharmony_ci "}\n"; 401e5c31af7Sopenharmony_ci 402e5c31af7Sopenharmony_ci subgroups::addGeometryShadersFromTemplate(geometry, programCollection); 403e5c31af7Sopenharmony_ci } 404e5c31af7Sopenharmony_ci { 405e5c31af7Sopenharmony_ci const string fragment = 406e5c31af7Sopenharmony_ci versionSource + extSource + 407e5c31af7Sopenharmony_ci "precision highp int;\n" 408e5c31af7Sopenharmony_ci "precision highp float;\n" 409e5c31af7Sopenharmony_ci "layout(location = 0) out uint result;\n" 410e5c31af7Sopenharmony_ci + declSource + 411e5c31af7Sopenharmony_ci "void main (void)\n" 412e5c31af7Sopenharmony_ci "{\n" 413e5c31af7Sopenharmony_ci + testSource + 414e5c31af7Sopenharmony_ci " result = temp_res;\n" 415e5c31af7Sopenharmony_ci "}\n"; 416e5c31af7Sopenharmony_ci 417e5c31af7Sopenharmony_ci programCollection.add("fragment") << glu::FragmentSource(fragment); 418e5c31af7Sopenharmony_ci } 419e5c31af7Sopenharmony_ci 420e5c31af7Sopenharmony_ci subgroups::addNoSubgroupShader(programCollection); 421e5c31af7Sopenharmony_ci } 422e5c31af7Sopenharmony_ci} 423e5c31af7Sopenharmony_ci 424e5c31af7Sopenharmony_civoid supportedCheck (Context& context, CaseDefinition caseDef) 425e5c31af7Sopenharmony_ci{ 426e5c31af7Sopenharmony_ci if (!subgroups::isSubgroupSupported(context)) 427e5c31af7Sopenharmony_ci TCU_THROW(NotSupportedError, "Subgroup operations are not supported"); 428e5c31af7Sopenharmony_ci 429e5c31af7Sopenharmony_ci switch (caseDef.opType) 430e5c31af7Sopenharmony_ci { 431e5c31af7Sopenharmony_ci case OPTYPE_SHUFFLE: 432e5c31af7Sopenharmony_ci case OPTYPE_SHUFFLE_XOR: 433e5c31af7Sopenharmony_ci if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_SHUFFLE_BIT)) 434e5c31af7Sopenharmony_ci { 435e5c31af7Sopenharmony_ci TCU_THROW(NotSupportedError, "Device does not support subgroup shuffle operations"); 436e5c31af7Sopenharmony_ci } 437e5c31af7Sopenharmony_ci break; 438e5c31af7Sopenharmony_ci default: 439e5c31af7Sopenharmony_ci if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT)) 440e5c31af7Sopenharmony_ci { 441e5c31af7Sopenharmony_ci TCU_THROW(NotSupportedError, "Device does not support subgroup shuffle relative operations"); 442e5c31af7Sopenharmony_ci } 443e5c31af7Sopenharmony_ci break; 444e5c31af7Sopenharmony_ci } 445e5c31af7Sopenharmony_ci 446e5c31af7Sopenharmony_ci if (subgroups::isDoubleFormat(caseDef.format) && 447e5c31af7Sopenharmony_ci !subgroups::isDoubleSupportedForDevice(context)) 448e5c31af7Sopenharmony_ci TCU_THROW(NotSupportedError, "Device does not support subgroup double operations"); 449e5c31af7Sopenharmony_ci} 450e5c31af7Sopenharmony_ci 451e5c31af7Sopenharmony_citcu::TestStatus noSSBOtest (Context& context, const CaseDefinition caseDef) 452e5c31af7Sopenharmony_ci{ 453e5c31af7Sopenharmony_ci if (!subgroups::areSubgroupOperationsSupportedForStage( 454e5c31af7Sopenharmony_ci context, caseDef.shaderStage)) 455e5c31af7Sopenharmony_ci { 456e5c31af7Sopenharmony_ci if (subgroups::areSubgroupOperationsRequiredForStage( 457e5c31af7Sopenharmony_ci caseDef.shaderStage)) 458e5c31af7Sopenharmony_ci { 459e5c31af7Sopenharmony_ci return tcu::TestStatus::fail( 460e5c31af7Sopenharmony_ci "Shader stage " + 461e5c31af7Sopenharmony_ci subgroups::getShaderStageName(caseDef.shaderStage) + 462e5c31af7Sopenharmony_ci " is required to support subgroup operations!"); 463e5c31af7Sopenharmony_ci } 464e5c31af7Sopenharmony_ci else 465e5c31af7Sopenharmony_ci { 466e5c31af7Sopenharmony_ci TCU_THROW(NotSupportedError, "Device does not support subgroup operations for this stage"); 467e5c31af7Sopenharmony_ci } 468e5c31af7Sopenharmony_ci } 469e5c31af7Sopenharmony_ci 470e5c31af7Sopenharmony_ci subgroups::SSBOData inputData[2]; 471e5c31af7Sopenharmony_ci inputData[0].format = caseDef.format; 472e5c31af7Sopenharmony_ci inputData[0].layout = subgroups::SSBOData::LayoutStd140; 473e5c31af7Sopenharmony_ci inputData[0].numElements = subgroups::maxSupportedSubgroupSize(); 474e5c31af7Sopenharmony_ci inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero; 475e5c31af7Sopenharmony_ci inputData[0].binding = 0u; 476e5c31af7Sopenharmony_ci 477e5c31af7Sopenharmony_ci inputData[1].format = FORMAT_R32_UINT; 478e5c31af7Sopenharmony_ci inputData[1].layout = subgroups::SSBOData::LayoutStd140; 479e5c31af7Sopenharmony_ci inputData[1].numElements = inputData[0].numElements; 480e5c31af7Sopenharmony_ci inputData[1].initializeType = subgroups::SSBOData::InitializeNonZero; 481e5c31af7Sopenharmony_ci inputData[1].binding = 1u; 482e5c31af7Sopenharmony_ci 483e5c31af7Sopenharmony_ci if (SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage) 484e5c31af7Sopenharmony_ci return subgroups::makeVertexFrameBufferTest(context, FORMAT_R32_UINT, inputData, 2, checkVertexPipelineStages); 485e5c31af7Sopenharmony_ci else if (SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage) 486e5c31af7Sopenharmony_ci return subgroups::makeGeometryFrameBufferTest(context, FORMAT_R32_UINT, inputData, 2, checkVertexPipelineStages); 487e5c31af7Sopenharmony_ci else if (SHADER_STAGE_TESS_CONTROL_BIT == caseDef.shaderStage) 488e5c31af7Sopenharmony_ci return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, inputData, 2, checkVertexPipelineStages, SHADER_STAGE_TESS_CONTROL_BIT); 489e5c31af7Sopenharmony_ci else if (SHADER_STAGE_TESS_EVALUATION_BIT == caseDef.shaderStage) 490e5c31af7Sopenharmony_ci return subgroups::makeTessellationEvaluationFrameBufferTest(context, FORMAT_R32_UINT, inputData, 2, checkVertexPipelineStages, SHADER_STAGE_TESS_EVALUATION_BIT); 491e5c31af7Sopenharmony_ci else 492e5c31af7Sopenharmony_ci TCU_THROW(InternalError, "Unhandled shader stage"); 493e5c31af7Sopenharmony_ci} 494e5c31af7Sopenharmony_ci 495e5c31af7Sopenharmony_ci 496e5c31af7Sopenharmony_citcu::TestStatus test(Context& context, const CaseDefinition caseDef) 497e5c31af7Sopenharmony_ci{ 498e5c31af7Sopenharmony_ci switch (caseDef.opType) 499e5c31af7Sopenharmony_ci { 500e5c31af7Sopenharmony_ci case OPTYPE_SHUFFLE: 501e5c31af7Sopenharmony_ci case OPTYPE_SHUFFLE_XOR: 502e5c31af7Sopenharmony_ci if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_SHUFFLE_BIT)) 503e5c31af7Sopenharmony_ci { 504e5c31af7Sopenharmony_ci TCU_THROW(NotSupportedError, "Device does not support subgroup shuffle operations"); 505e5c31af7Sopenharmony_ci } 506e5c31af7Sopenharmony_ci break; 507e5c31af7Sopenharmony_ci default: 508e5c31af7Sopenharmony_ci if (!subgroups::isSubgroupFeatureSupportedForDevice(context, SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT)) 509e5c31af7Sopenharmony_ci { 510e5c31af7Sopenharmony_ci TCU_THROW(NotSupportedError, "Device does not support subgroup shuffle relative operations"); 511e5c31af7Sopenharmony_ci } 512e5c31af7Sopenharmony_ci break; 513e5c31af7Sopenharmony_ci } 514e5c31af7Sopenharmony_ci 515e5c31af7Sopenharmony_ci if (subgroups::isDoubleFormat(caseDef.format) && !subgroups::isDoubleSupportedForDevice(context)) 516e5c31af7Sopenharmony_ci { 517e5c31af7Sopenharmony_ci TCU_THROW(NotSupportedError, "Device does not support subgroup double operations"); 518e5c31af7Sopenharmony_ci } 519e5c31af7Sopenharmony_ci 520e5c31af7Sopenharmony_ci if (SHADER_STAGE_COMPUTE_BIT == caseDef.shaderStage) 521e5c31af7Sopenharmony_ci { 522e5c31af7Sopenharmony_ci if (!subgroups::areSubgroupOperationsSupportedForStage(context, caseDef.shaderStage)) 523e5c31af7Sopenharmony_ci { 524e5c31af7Sopenharmony_ci return tcu::TestStatus::fail( 525e5c31af7Sopenharmony_ci "Shader stage " + 526e5c31af7Sopenharmony_ci subgroups::getShaderStageName(caseDef.shaderStage) + 527e5c31af7Sopenharmony_ci " is required to support subgroup operations!"); 528e5c31af7Sopenharmony_ci } 529e5c31af7Sopenharmony_ci subgroups::SSBOData inputData[2]; 530e5c31af7Sopenharmony_ci inputData[0].format = caseDef.format; 531e5c31af7Sopenharmony_ci inputData[0].layout = subgroups::SSBOData::LayoutStd430; 532e5c31af7Sopenharmony_ci inputData[0].numElements = subgroups::maxSupportedSubgroupSize(); 533e5c31af7Sopenharmony_ci inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero; 534e5c31af7Sopenharmony_ci inputData[0].binding = 1u; 535e5c31af7Sopenharmony_ci 536e5c31af7Sopenharmony_ci inputData[1].format = FORMAT_R32_UINT; 537e5c31af7Sopenharmony_ci inputData[1].layout = subgroups::SSBOData::LayoutStd430; 538e5c31af7Sopenharmony_ci inputData[1].numElements = inputData[0].numElements; 539e5c31af7Sopenharmony_ci inputData[1].initializeType = subgroups::SSBOData::InitializeNonZero; 540e5c31af7Sopenharmony_ci inputData[1].binding = 2u; 541e5c31af7Sopenharmony_ci 542e5c31af7Sopenharmony_ci return subgroups::makeComputeTest(context, FORMAT_R32_UINT, inputData, 2, checkComputeStage); 543e5c31af7Sopenharmony_ci } 544e5c31af7Sopenharmony_ci 545e5c31af7Sopenharmony_ci else 546e5c31af7Sopenharmony_ci { 547e5c31af7Sopenharmony_ci int supportedStages = context.getDeqpContext().getContextInfo().getInt(GL_SUBGROUP_SUPPORTED_STAGES_KHR); 548e5c31af7Sopenharmony_ci 549e5c31af7Sopenharmony_ci ShaderStageFlags stages = (ShaderStageFlags)(caseDef.shaderStage & supportedStages); 550e5c31af7Sopenharmony_ci 551e5c31af7Sopenharmony_ci if (SHADER_STAGE_FRAGMENT_BIT != stages && !subgroups::isVertexSSBOSupportedForDevice(context)) 552e5c31af7Sopenharmony_ci { 553e5c31af7Sopenharmony_ci if ( (stages & SHADER_STAGE_FRAGMENT_BIT) == 0) 554e5c31af7Sopenharmony_ci TCU_THROW(NotSupportedError, "Device does not support vertex stage SSBO writes"); 555e5c31af7Sopenharmony_ci else 556e5c31af7Sopenharmony_ci stages = SHADER_STAGE_FRAGMENT_BIT; 557e5c31af7Sopenharmony_ci } 558e5c31af7Sopenharmony_ci 559e5c31af7Sopenharmony_ci if ((ShaderStageFlags)0u == stages) 560e5c31af7Sopenharmony_ci TCU_THROW(NotSupportedError, "Subgroup operations are not supported for any graphic shader"); 561e5c31af7Sopenharmony_ci 562e5c31af7Sopenharmony_ci subgroups::SSBOData inputData[2]; 563e5c31af7Sopenharmony_ci inputData[0].format = caseDef.format; 564e5c31af7Sopenharmony_ci inputData[0].layout = subgroups::SSBOData::LayoutStd430; 565e5c31af7Sopenharmony_ci inputData[0].numElements = subgroups::maxSupportedSubgroupSize(); 566e5c31af7Sopenharmony_ci inputData[0].initializeType = subgroups::SSBOData::InitializeNonZero; 567e5c31af7Sopenharmony_ci inputData[0].binding = 4u; 568e5c31af7Sopenharmony_ci inputData[0].stages = stages; 569e5c31af7Sopenharmony_ci 570e5c31af7Sopenharmony_ci inputData[1].format = FORMAT_R32_UINT; 571e5c31af7Sopenharmony_ci inputData[1].layout = subgroups::SSBOData::LayoutStd430; 572e5c31af7Sopenharmony_ci inputData[1].numElements = inputData[0].numElements; 573e5c31af7Sopenharmony_ci inputData[1].initializeType = subgroups::SSBOData::InitializeNonZero; 574e5c31af7Sopenharmony_ci inputData[1].binding = 5u; 575e5c31af7Sopenharmony_ci inputData[1].stages = stages; 576e5c31af7Sopenharmony_ci 577e5c31af7Sopenharmony_ci return subgroups::allStages(context, FORMAT_R32_UINT, inputData, 2, checkVertexPipelineStages, stages); 578e5c31af7Sopenharmony_ci } 579e5c31af7Sopenharmony_ci} 580e5c31af7Sopenharmony_ci} 581e5c31af7Sopenharmony_ci 582e5c31af7Sopenharmony_cideqp::TestCaseGroup* createSubgroupsShuffleTests(deqp::Context& testCtx) 583e5c31af7Sopenharmony_ci{ 584e5c31af7Sopenharmony_ci 585e5c31af7Sopenharmony_ci de::MovePtr<deqp::TestCaseGroup> graphicGroup(new deqp::TestCaseGroup( 586e5c31af7Sopenharmony_ci testCtx, "graphics", "Subgroup shuffle category tests: graphics")); 587e5c31af7Sopenharmony_ci de::MovePtr<deqp::TestCaseGroup> computeGroup(new deqp::TestCaseGroup( 588e5c31af7Sopenharmony_ci testCtx, "compute", "Subgroup shuffle category tests: compute")); 589e5c31af7Sopenharmony_ci de::MovePtr<deqp::TestCaseGroup> framebufferGroup(new deqp::TestCaseGroup( 590e5c31af7Sopenharmony_ci testCtx, "framebuffer", "Subgroup shuffle category tests: framebuffer")); 591e5c31af7Sopenharmony_ci 592e5c31af7Sopenharmony_ci const Format formats[] = 593e5c31af7Sopenharmony_ci { 594e5c31af7Sopenharmony_ci FORMAT_R32_SINT, FORMAT_R32G32_SINT, FORMAT_R32G32B32_SINT, 595e5c31af7Sopenharmony_ci FORMAT_R32G32B32A32_SINT, FORMAT_R32_UINT, FORMAT_R32G32_UINT, 596e5c31af7Sopenharmony_ci FORMAT_R32G32B32_UINT, FORMAT_R32G32B32A32_UINT, 597e5c31af7Sopenharmony_ci FORMAT_R32_SFLOAT, FORMAT_R32G32_SFLOAT, 598e5c31af7Sopenharmony_ci FORMAT_R32G32B32_SFLOAT, FORMAT_R32G32B32A32_SFLOAT, 599e5c31af7Sopenharmony_ci FORMAT_R64_SFLOAT, FORMAT_R64G64_SFLOAT, 600e5c31af7Sopenharmony_ci FORMAT_R64G64B64_SFLOAT, FORMAT_R64G64B64A64_SFLOAT, 601e5c31af7Sopenharmony_ci FORMAT_R32_BOOL, FORMAT_R32G32_BOOL, 602e5c31af7Sopenharmony_ci FORMAT_R32G32B32_BOOL, FORMAT_R32G32B32A32_BOOL, 603e5c31af7Sopenharmony_ci }; 604e5c31af7Sopenharmony_ci 605e5c31af7Sopenharmony_ci const ShaderStageFlags stages[] = 606e5c31af7Sopenharmony_ci { 607e5c31af7Sopenharmony_ci SHADER_STAGE_VERTEX_BIT, 608e5c31af7Sopenharmony_ci SHADER_STAGE_TESS_EVALUATION_BIT, 609e5c31af7Sopenharmony_ci SHADER_STAGE_TESS_CONTROL_BIT, 610e5c31af7Sopenharmony_ci SHADER_STAGE_GEOMETRY_BIT, 611e5c31af7Sopenharmony_ci }; 612e5c31af7Sopenharmony_ci 613e5c31af7Sopenharmony_ci for (int formatIndex = 0; formatIndex < DE_LENGTH_OF_ARRAY(formats); ++formatIndex) 614e5c31af7Sopenharmony_ci { 615e5c31af7Sopenharmony_ci const Format format = formats[formatIndex]; 616e5c31af7Sopenharmony_ci 617e5c31af7Sopenharmony_ci for (int opTypeIndex = 0; opTypeIndex < OPTYPE_LAST; ++opTypeIndex) 618e5c31af7Sopenharmony_ci { 619e5c31af7Sopenharmony_ci 620e5c31af7Sopenharmony_ci const string name = 621e5c31af7Sopenharmony_ci de::toLower(getOpTypeName(opTypeIndex)) + 622e5c31af7Sopenharmony_ci "_" + subgroups::getFormatNameForGLSL(format); 623e5c31af7Sopenharmony_ci 624e5c31af7Sopenharmony_ci { 625e5c31af7Sopenharmony_ci const CaseDefinition caseDef = 626e5c31af7Sopenharmony_ci { 627e5c31af7Sopenharmony_ci opTypeIndex, 628e5c31af7Sopenharmony_ci SHADER_STAGE_ALL_GRAPHICS, 629e5c31af7Sopenharmony_ci format 630e5c31af7Sopenharmony_ci }; 631e5c31af7Sopenharmony_ci SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(graphicGroup.get(), name, "", supportedCheck, initPrograms, test, caseDef); 632e5c31af7Sopenharmony_ci } 633e5c31af7Sopenharmony_ci 634e5c31af7Sopenharmony_ci { 635e5c31af7Sopenharmony_ci const CaseDefinition caseDef = {opTypeIndex, SHADER_STAGE_COMPUTE_BIT, format}; 636e5c31af7Sopenharmony_ci SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(computeGroup.get(), name, "", supportedCheck, initPrograms, test, caseDef); 637e5c31af7Sopenharmony_ci } 638e5c31af7Sopenharmony_ci 639e5c31af7Sopenharmony_ci for (int stageIndex = 0; stageIndex < DE_LENGTH_OF_ARRAY(stages); ++stageIndex) 640e5c31af7Sopenharmony_ci { 641e5c31af7Sopenharmony_ci const CaseDefinition caseDef = {opTypeIndex, stages[stageIndex], format}; 642e5c31af7Sopenharmony_ci SubgroupFactory<CaseDefinition>::addFunctionCaseWithPrograms(framebufferGroup.get(), name + "_" + getShaderStageName(caseDef.shaderStage), "", 643e5c31af7Sopenharmony_ci supportedCheck, initFrameBufferPrograms, noSSBOtest, caseDef); 644e5c31af7Sopenharmony_ci } 645e5c31af7Sopenharmony_ci } 646e5c31af7Sopenharmony_ci } 647e5c31af7Sopenharmony_ci 648e5c31af7Sopenharmony_ci de::MovePtr<deqp::TestCaseGroup> group(new deqp::TestCaseGroup( 649e5c31af7Sopenharmony_ci testCtx, "shuffle", "Subgroup shuffle category tests")); 650e5c31af7Sopenharmony_ci 651e5c31af7Sopenharmony_ci group->addChild(graphicGroup.release()); 652e5c31af7Sopenharmony_ci group->addChild(computeGroup.release()); 653e5c31af7Sopenharmony_ci group->addChild(framebufferGroup.release()); 654e5c31af7Sopenharmony_ci 655e5c31af7Sopenharmony_ci return group.release(); 656e5c31af7Sopenharmony_ci} 657e5c31af7Sopenharmony_ci 658e5c31af7Sopenharmony_ci} // subgroups 659e5c31af7Sopenharmony_ci} // glc 660