Commit 574ab04c by Rex Xu

Implement the extension GL_ARB_shader_ballot

Add new built-in variables and functions to the parser (SPIR-V tokens are missing).
parent 97f4e0fe
...@@ -433,7 +433,7 @@ spv::BuiltIn TGlslangToSpvTraverser::TranslateBuiltInDecoration(glslang::TBuiltI ...@@ -433,7 +433,7 @@ spv::BuiltIn TGlslangToSpvTraverser::TranslateBuiltInDecoration(glslang::TBuiltI
case glslang::EbvBaseInstance: case glslang::EbvBaseInstance:
case glslang::EbvDrawId: case glslang::EbvDrawId:
// TODO: Add SPIR-V builtin ID. // TODO: Add SPIR-V builtin ID.
spv::MissingFunctionality("Draw parameters"); spv::MissingFunctionality("shader draw parameters");
return (spv::BuiltIn)spv::BadValue; return (spv::BuiltIn)spv::BadValue;
case glslang::EbvPrimitiveId: return spv::BuiltInPrimitiveId; case glslang::EbvPrimitiveId: return spv::BuiltInPrimitiveId;
case glslang::EbvInvocationId: return spv::BuiltInInvocationId; case glslang::EbvInvocationId: return spv::BuiltInInvocationId;
...@@ -453,6 +453,16 @@ spv::BuiltIn TGlslangToSpvTraverser::TranslateBuiltInDecoration(glslang::TBuiltI ...@@ -453,6 +453,16 @@ spv::BuiltIn TGlslangToSpvTraverser::TranslateBuiltInDecoration(glslang::TBuiltI
case glslang::EbvLocalInvocationId: return spv::BuiltInLocalInvocationId; case glslang::EbvLocalInvocationId: return spv::BuiltInLocalInvocationId;
case glslang::EbvLocalInvocationIndex: return spv::BuiltInLocalInvocationIndex; case glslang::EbvLocalInvocationIndex: return spv::BuiltInLocalInvocationIndex;
case glslang::EbvGlobalInvocationId: return spv::BuiltInGlobalInvocationId; case glslang::EbvGlobalInvocationId: return spv::BuiltInGlobalInvocationId;
case glslang::EbvSubGroupSize:
case glslang::EbvSubGroupInvocation:
case glslang::EbvSubGroupEqMask:
case glslang::EbvSubGroupGeMask:
case glslang::EbvSubGroupGtMask:
case glslang::EbvSubGroupLeMask:
case glslang::EbvSubGroupLtMask:
// TODO: Add SPIR-V builtin ID.
spv::MissingFunctionality("shader ballot");
return (spv::BuiltIn)spv::BadValue;
default: return (spv::BuiltIn)spv::BadValue; default: return (spv::BuiltIn)spv::BadValue;
} }
} }
...@@ -3234,6 +3244,12 @@ spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, spv: ...@@ -3234,6 +3244,12 @@ spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, spv:
libCall = spv::GLSLstd450FindSMsb; libCall = spv::GLSLstd450FindSMsb;
break; break;
case glslang::EOpBallot:
case glslang::EOpReadFirstInvocation:
spv::MissingFunctionality("shader ballot");
libCall = spv::GLSLstd450Bad;
break;
default: default:
return 0; return 0;
} }
...@@ -3687,6 +3703,11 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv:: ...@@ -3687,6 +3703,11 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv::
libCall = spv::GLSLstd450Ldexp; libCall = spv::GLSLstd450Ldexp;
break; break;
case glslang::EOpReadInvocation:
spv::MissingFunctionality("shader ballot");
libCall = spv::GLSLstd450Bad;
break;
default: default:
return 0; return 0;
} }
......
#version 450
#extension GL_ARB_gpu_shader_int64: enable
#extension GL_ARB_shader_ballot: enable
layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
layout(binding = 0) buffer Buffers
{
vec4 f4;
ivec4 i4;
uvec4 u4;
} data[4];
void main()
{
uint invocation = (gl_SubGroupInvocationARB + gl_SubGroupSizeARB) % 4;
uint64_t relMask = gl_SubGroupEqMaskARB +
gl_SubGroupGeMaskARB +
gl_SubGroupGtMaskARB +
gl_SubGroupLeMaskARB +
gl_SubGroupLtMaskARB;
if (relMask == ballotARB(true))
{
data[invocation].f4.x = readInvocationARB(data[0].f4.x, invocation);
data[invocation].f4.xy = readInvocationARB(data[1].f4.xy, invocation);
data[invocation].f4.xyz = readInvocationARB(data[2].f4.xyz, invocation);
data[invocation].f4 = readInvocationARB(data[3].f4, invocation);
data[invocation].i4.x = readInvocationARB(data[0].i4.x, invocation);
data[invocation].i4.xy = readInvocationARB(data[1].i4.xy, invocation);
data[invocation].i4.xyz = readInvocationARB(data[2].i4.xyz, invocation);
data[invocation].i4 = readInvocationARB(data[3].i4, invocation);
data[invocation].u4.x = readInvocationARB(data[0].u4.x, invocation);
data[invocation].u4.xy = readInvocationARB(data[1].u4.xy, invocation);
data[invocation].u4.xyz = readInvocationARB(data[2].u4.xyz, invocation);
data[invocation].u4 = readInvocationARB(data[3].u4, invocation);
}
else
{
data[invocation].f4.x = readFirstInvocationARB(data[0].f4.x);
data[invocation].f4.xy = readFirstInvocationARB(data[1].f4.xy);
data[invocation].f4.xyz = readFirstInvocationARB(data[2].f4.xyz);
data[invocation].f4 = readFirstInvocationARB(data[3].f4);
data[invocation].i4.x = readFirstInvocationARB(data[0].i4.x);
data[invocation].i4.xy = readFirstInvocationARB(data[1].i4.xy);
data[invocation].i4.xyz = readFirstInvocationARB(data[2].i4.xyz);
data[invocation].i4 = readFirstInvocationARB(data[3].i4);
data[invocation].u4.x = readFirstInvocationARB(data[0].u4.x);
data[invocation].u4.xy = readFirstInvocationARB(data[1].u4.xy);
data[invocation].u4.xyz = readFirstInvocationARB(data[2].u4.xyz);
data[invocation].u4 = readFirstInvocationARB(data[3].u4);
}
}
\ No newline at end of file
...@@ -72,6 +72,7 @@ spv.intOps.vert ...@@ -72,6 +72,7 @@ spv.intOps.vert
spv.precision.frag spv.precision.frag
spv.prepost.frag spv.prepost.frag
spv.qualifiers.vert spv.qualifiers.vert
spv.shaderBallot.comp
spv.shiftOps.frag spv.shiftOps.frag
spv.simpleFunctionCall.frag spv.simpleFunctionCall.frag
spv.simpleMat.vert spv.simpleMat.vert
......
...@@ -130,6 +130,13 @@ enum TBuiltInVariable { ...@@ -130,6 +130,13 @@ enum TBuiltInVariable {
EbvLocalInvocationId, EbvLocalInvocationId,
EbvGlobalInvocationId, EbvGlobalInvocationId,
EbvLocalInvocationIndex, EbvLocalInvocationIndex,
EbvSubGroupSize,
EbvSubGroupInvocation,
EbvSubGroupEqMask,
EbvSubGroupGeMask,
EbvSubGroupGtMask,
EbvSubGroupLeMask,
EbvSubGroupLtMask,
EbvVertexId, EbvVertexId,
EbvInstanceId, EbvInstanceId,
EbvVertexIndex, EbvVertexIndex,
...@@ -223,6 +230,13 @@ __inline const char* GetBuiltInVariableString(TBuiltInVariable v) ...@@ -223,6 +230,13 @@ __inline const char* GetBuiltInVariableString(TBuiltInVariable v)
case EbvLocalInvocationId: return "LocalInvocationID"; case EbvLocalInvocationId: return "LocalInvocationID";
case EbvGlobalInvocationId: return "GlobalInvocationID"; case EbvGlobalInvocationId: return "GlobalInvocationID";
case EbvLocalInvocationIndex: return "LocalInvocationIndex"; case EbvLocalInvocationIndex: return "LocalInvocationIndex";
case EbvSubGroupSize: return "SubGroupSize";
case EbvSubGroupInvocation: return "SubGroupInvocation";
case EbvSubGroupEqMask: return "SubGroupEqMask";
case EbvSubGroupGeMask: return "SubGroupGeMask";
case EbvSubGroupGtMask: return "SubGroupGtMask";
case EbvSubGroupLeMask: return "SubGroupLeMask";
case EbvSubGroupLtMask: return "SubGroupLtMask";
case EbvVertexId: return "VertexId"; case EbvVertexId: return "VertexId";
case EbvInstanceId: return "InstanceId"; case EbvInstanceId: return "InstanceId";
case EbvVertexIndex: return "VertexIndex"; case EbvVertexIndex: return "VertexIndex";
......
...@@ -283,6 +283,10 @@ enum TOperator { ...@@ -283,6 +283,10 @@ enum TOperator {
EOpMemoryBarrierShared, // compute only EOpMemoryBarrierShared, // compute only
EOpGroupMemoryBarrier, // compute only EOpGroupMemoryBarrier, // compute only
EOpBallot,
EOpReadInvocation,
EOpReadFirstInvocation,
EOpAtomicAdd, EOpAtomicAdd,
EOpAtomicMin, EOpAtomicMin,
EOpAtomicMax, EOpAtomicMax,
......
...@@ -1325,6 +1325,44 @@ void TBuiltIns::initialize(int version, EProfile profile, int spv, int vulkan) ...@@ -1325,6 +1325,44 @@ void TBuiltIns::initialize(int version, EProfile profile, int spv, int vulkan)
"\n"); "\n");
} }
// GL_ARB_shader_ballot
if (profile != EEsProfile && version >= 450) {
commonBuiltins.append(
"uint64_t ballotARB(bool);"
"float readInvocationARB(float, uint);"
"vec2 readInvocationARB(vec2, uint);"
"vec3 readInvocationARB(vec3, uint);"
"vec4 readInvocationARB(vec4, uint);"
"int readInvocationARB(int, uint);"
"ivec2 readInvocationARB(ivec2, uint);"
"ivec3 readInvocationARB(ivec3, uint);"
"ivec4 readInvocationARB(ivec4, uint);"
"uint readInvocationARB(uint, uint);"
"uvec2 readInvocationARB(uvec2, uint);"
"uvec3 readInvocationARB(uvec3, uint);"
"uvec4 readInvocationARB(uvec4, uint);"
"float readFirstInvocationARB(float);"
"vec2 readFirstInvocationARB(vec2);"
"vec3 readFirstInvocationARB(vec3);"
"vec4 readFirstInvocationARB(vec4);"
"int readFirstInvocationARB(int);"
"ivec2 readFirstInvocationARB(ivec2);"
"ivec3 readFirstInvocationARB(ivec3);"
"ivec4 readFirstInvocationARB(ivec4);"
"uint readFirstInvocationARB(uint);"
"uvec2 readFirstInvocationARB(uvec2);"
"uvec3 readFirstInvocationARB(uvec3);"
"uvec4 readFirstInvocationARB(uvec4);"
"\n");
}
//============================================================================ //============================================================================
// //
// Prototypes for built-in functions seen by vertex shaders only. // Prototypes for built-in functions seen by vertex shaders only.
...@@ -2232,6 +2270,21 @@ void TBuiltIns::initialize(int version, EProfile profile, int spv, int vulkan) ...@@ -2232,6 +2270,21 @@ void TBuiltIns::initialize(int version, EProfile profile, int spv, int vulkan)
if (version >= 130) if (version >= 130)
add2ndGenerationSamplingImaging(version, profile, spv, vulkan); add2ndGenerationSamplingImaging(version, profile, spv, vulkan);
// GL_ARB_shader_ballot
if (profile != EEsProfile && version >= 450) {
commonBuiltins.append(
"uniform uint gl_SubGroupSizeARB;"
"in uint gl_SubGroupInvocationARB;"
"in uint64_t gl_SubGroupEqMaskARB;"
"in uint64_t gl_SubGroupGeMaskARB;"
"in uint64_t gl_SubGroupGtMaskARB;"
"in uint64_t gl_SubGroupLeMaskARB;"
"in uint64_t gl_SubGroupLtMaskARB;"
"\n");
}
//printf("%s\n", commonBuiltins.c_str()); //printf("%s\n", commonBuiltins.c_str());
//printf("%s\n", stageBuiltins[EShLangFragment].c_str()); //printf("%s\n", stageBuiltins[EShLangFragment].c_str());
} }
...@@ -3394,7 +3447,7 @@ void IdentifyBuiltIns(int version, EProfile profile, int spv, int vulkan, EShLan ...@@ -3394,7 +3447,7 @@ void IdentifyBuiltIns(int version, EProfile profile, int spv, int vulkan, EShLan
switch(language) { switch(language) {
case EShLangVertex: case EShLangVertex:
if (profile != EEsProfile && version >= 440) { if (profile != EEsProfile) {
symbolTable.setVariableExtensions("gl_BaseVertexARB", 1, &E_GL_ARB_shader_draw_parameters); symbolTable.setVariableExtensions("gl_BaseVertexARB", 1, &E_GL_ARB_shader_draw_parameters);
symbolTable.setVariableExtensions("gl_BaseInstanceARB", 1, &E_GL_ARB_shader_draw_parameters); symbolTable.setVariableExtensions("gl_BaseInstanceARB", 1, &E_GL_ARB_shader_draw_parameters);
symbolTable.setVariableExtensions("gl_DrawIDARB", 1, &E_GL_ARB_shader_draw_parameters); symbolTable.setVariableExtensions("gl_DrawIDARB", 1, &E_GL_ARB_shader_draw_parameters);
...@@ -3404,6 +3457,28 @@ void IdentifyBuiltIns(int version, EProfile profile, int spv, int vulkan, EShLan ...@@ -3404,6 +3457,28 @@ void IdentifyBuiltIns(int version, EProfile profile, int spv, int vulkan, EShLan
BuiltInVariable("gl_DrawIDARB", EbvDrawId, symbolTable); BuiltInVariable("gl_DrawIDARB", EbvDrawId, symbolTable);
} }
if (profile != EEsProfile) {
symbolTable.setVariableExtensions("gl_SubGroupSizeARB", 1, &E_GL_ARB_shader_ballot);
symbolTable.setVariableExtensions("gl_SubGroupInvocationARB", 1, &E_GL_ARB_shader_ballot);
symbolTable.setVariableExtensions("gl_SubGroupEqMaskARB", 1, &E_GL_ARB_shader_ballot);
symbolTable.setVariableExtensions("gl_SubGroupGeMaskARB", 1, &E_GL_ARB_shader_ballot);
symbolTable.setVariableExtensions("gl_SubGroupGtMaskARB", 1, &E_GL_ARB_shader_ballot);
symbolTable.setVariableExtensions("gl_SubGroupLeMaskARB", 1, &E_GL_ARB_shader_ballot);
symbolTable.setVariableExtensions("gl_SubGroupLtMaskARB", 1, &E_GL_ARB_shader_ballot);
symbolTable.setFunctionExtensions("ballotARB", 1, &E_GL_ARB_shader_ballot);
symbolTable.setFunctionExtensions("readInvocationARB", 1, &E_GL_ARB_shader_ballot);
symbolTable.setFunctionExtensions("readFirstInvocationARB", 1, &E_GL_ARB_shader_ballot);
BuiltInVariable("gl_SubGroupSizeARB", EbvSubGroupSize, symbolTable);
BuiltInVariable("gl_SubGroupInvocationARB", EbvSubGroupInvocation, symbolTable);
BuiltInVariable("gl_SubGroupEqMaskARB", EbvSubGroupEqMask, symbolTable);
BuiltInVariable("gl_SubGroupGeMaskARB", EbvSubGroupGeMask, symbolTable);
BuiltInVariable("gl_SubGroupGtMaskARB", EbvSubGroupGtMask, symbolTable);
BuiltInVariable("gl_SubGroupLeMaskARB", EbvSubGroupLeMask, symbolTable);
BuiltInVariable("gl_SubGroupLtMaskARB", EbvSubGroupLtMask, symbolTable);
}
// Compatibility variables, vertex only // Compatibility variables, vertex only
if (spv == 0) { if (spv == 0) {
BuiltInVariable("gl_Color", EbvColor, symbolTable); BuiltInVariable("gl_Color", EbvColor, symbolTable);
...@@ -3963,8 +4038,7 @@ void IdentifyBuiltIns(int version, EProfile profile, int spv, int vulkan, EShLan ...@@ -3963,8 +4038,7 @@ void IdentifyBuiltIns(int version, EProfile profile, int spv, int vulkan, EShLan
symbolTable.relateToOperator("shadow2DProjLod", EOpTextureProjLod); symbolTable.relateToOperator("shadow2DProjLod", EOpTextureProjLod);
} }
if (profile != EEsProfile) if (profile != EEsProfile) {
{
symbolTable.relateToOperator("sparseTextureARB", EOpSparseTexture); symbolTable.relateToOperator("sparseTextureARB", EOpSparseTexture);
symbolTable.relateToOperator("sparseTextureLodARB", EOpSparseTextureLod); symbolTable.relateToOperator("sparseTextureLodARB", EOpSparseTextureLod);
symbolTable.relateToOperator("sparseTextureOffsetARB", EOpSparseTextureOffset); symbolTable.relateToOperator("sparseTextureOffsetARB", EOpSparseTextureOffset);
...@@ -3987,6 +4061,10 @@ void IdentifyBuiltIns(int version, EProfile profile, int spv, int vulkan, EShLan ...@@ -3987,6 +4061,10 @@ void IdentifyBuiltIns(int version, EProfile profile, int spv, int vulkan, EShLan
symbolTable.relateToOperator("textureOffsetClampARB", EOpTextureOffsetClamp); symbolTable.relateToOperator("textureOffsetClampARB", EOpTextureOffsetClamp);
symbolTable.relateToOperator("textureGradClampARB", EOpTextureGradClamp); symbolTable.relateToOperator("textureGradClampARB", EOpTextureGradClamp);
symbolTable.relateToOperator("textureGradOffsetClampARB", EOpTextureGradOffsetClamp); symbolTable.relateToOperator("textureGradOffsetClampARB", EOpTextureGradOffsetClamp);
symbolTable.relateToOperator("ballotARB", EOpBallot);
symbolTable.relateToOperator("readInvocationARB", EOpReadInvocation);
symbolTable.relateToOperator("readFirstInvocationARB", EOpReadFirstInvocation);
} }
} }
...@@ -4023,8 +4101,8 @@ void IdentifyBuiltIns(int version, EProfile profile, int spv, int vulkan, EShLan ...@@ -4023,8 +4101,8 @@ void IdentifyBuiltIns(int version, EProfile profile, int spv, int vulkan, EShLan
break; break;
case EShLangCompute: case EShLangCompute:
symbolTable.relateToOperator("memoryBarrierShared", EOpMemoryBarrierShared); symbolTable.relateToOperator("memoryBarrierShared", EOpMemoryBarrierShared);
symbolTable.relateToOperator("groupMemoryBarrier", EOpGroupMemoryBarrier); symbolTable.relateToOperator("groupMemoryBarrier", EOpGroupMemoryBarrier);
break; break;
default: default:
......
...@@ -176,6 +176,7 @@ void TParseVersions::initializeExtensionBehavior() ...@@ -176,6 +176,7 @@ void TParseVersions::initializeExtensionBehavior()
extensionBehavior[E_GL_ARB_viewport_array] = EBhDisable; extensionBehavior[E_GL_ARB_viewport_array] = EBhDisable;
extensionBehavior[E_GL_ARB_gpu_shader_int64] = EBhDisable; extensionBehavior[E_GL_ARB_gpu_shader_int64] = EBhDisable;
extensionBehavior[E_GL_ARB_gl_spirv] = EBhDisable; extensionBehavior[E_GL_ARB_gl_spirv] = EBhDisable;
extensionBehavior[E_GL_ARB_shader_ballot] = EBhDisable;
extensionBehavior[E_GL_ARB_sparse_texture2] = EBhDisable; extensionBehavior[E_GL_ARB_sparse_texture2] = EBhDisable;
extensionBehavior[E_GL_ARB_sparse_texture_clamp] = EBhDisable; extensionBehavior[E_GL_ARB_sparse_texture_clamp] = EBhDisable;
// extensionBehavior[E_GL_ARB_cull_distance] = EBhDisable; // present for 4.5, but need extension control over block members // extensionBehavior[E_GL_ARB_cull_distance] = EBhDisable; // present for 4.5, but need extension control over block members
...@@ -277,6 +278,7 @@ void TParseVersions::getPreamble(std::string& preamble) ...@@ -277,6 +278,7 @@ void TParseVersions::getPreamble(std::string& preamble)
"#define GL_ARB_viewport_array 1\n" "#define GL_ARB_viewport_array 1\n"
"#define GL_ARB_gpu_shader_int64 1\n" "#define GL_ARB_gpu_shader_int64 1\n"
"#define GL_ARB_gl_spirv 1\n" "#define GL_ARB_gl_spirv 1\n"
"#define GL_ARB_shader_ballot 1\n"
"#define GL_ARB_sparse_texture2 1\n" "#define GL_ARB_sparse_texture2 1\n"
"#define GL_ARB_sparse_texture_clamp 1\n" "#define GL_ARB_sparse_texture_clamp 1\n"
// "#define GL_ARB_cull_distance 1\n" // present for 4.5, but need extension control over block members // "#define GL_ARB_cull_distance 1\n" // present for 4.5, but need extension control over block members
......
...@@ -113,6 +113,7 @@ const char* const E_GL_ARB_shader_texture_image_samples = "GL_ARB_shader_texture ...@@ -113,6 +113,7 @@ const char* const E_GL_ARB_shader_texture_image_samples = "GL_ARB_shader_texture
const char* const E_GL_ARB_viewport_array = "GL_ARB_viewport_array"; const char* const E_GL_ARB_viewport_array = "GL_ARB_viewport_array";
const char* const E_GL_ARB_gpu_shader_int64 = "GL_ARB_gpu_shader_int64"; const char* const E_GL_ARB_gpu_shader_int64 = "GL_ARB_gpu_shader_int64";
const char* const E_GL_ARB_gl_spirv = "GL_ARB_gl_spirv"; const char* const E_GL_ARB_gl_spirv = "GL_ARB_gl_spirv";
const char* const E_GL_ARB_shader_ballot = "GL_ARB_shader_ballot";
const char* const E_GL_ARB_sparse_texture2 = "GL_ARB_sparse_texture2"; const char* const E_GL_ARB_sparse_texture2 = "GL_ARB_sparse_texture2";
const char* const E_GL_ARB_sparse_texture_clamp = "GL_ARB_sparse_texture_clamp"; const char* const E_GL_ARB_sparse_texture_clamp = "GL_ARB_sparse_texture_clamp";
//const char* const E_GL_ARB_cull_distance = "GL_ARB_cull_distance"; // present for 4.5, but need extension control over block members //const char* const E_GL_ARB_cull_distance = "GL_ARB_cull_distance"; // present for 4.5, but need extension control over block members
......
...@@ -351,6 +351,9 @@ bool TOutputTraverser::visitUnary(TVisit /* visit */, TIntermUnary* node) ...@@ -351,6 +351,9 @@ bool TOutputTraverser::visitUnary(TVisit /* visit */, TIntermUnary* node)
case EOpNoise: out.debug << "noise"; break; case EOpNoise: out.debug << "noise"; break;
case EOpBallot: out.debug << "ballot"; break;
case EOpReadFirstInvocation: out.debug << "readFirstInvocation"; break;
default: out.debug.message(EPrefixError, "Bad unary op"); default: out.debug.message(EPrefixError, "Bad unary op");
} }
...@@ -466,6 +469,8 @@ bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node ...@@ -466,6 +469,8 @@ bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node
case EOpMemoryBarrierShared: out.debug << "MemoryBarrierShared"; break; case EOpMemoryBarrierShared: out.debug << "MemoryBarrierShared"; break;
case EOpGroupMemoryBarrier: out.debug << "GroupMemoryBarrier"; break; case EOpGroupMemoryBarrier: out.debug << "GroupMemoryBarrier"; break;
case EOpReadInvocation: out.debug << "readInvocation"; break;
case EOpAtomicAdd: out.debug << "AtomicAdd"; break; case EOpAtomicAdd: out.debug << "AtomicAdd"; break;
case EOpAtomicMin: out.debug << "AtomicMin"; break; case EOpAtomicMin: out.debug << "AtomicMin"; break;
case EOpAtomicMax: out.debug << "AtomicMax"; break; case EOpAtomicMax: out.debug << "AtomicMax"; break;
......
...@@ -138,6 +138,7 @@ INSTANTIATE_TEST_CASE_P( ...@@ -138,6 +138,7 @@ INSTANTIATE_TEST_CASE_P(
"spv.precision.frag", "spv.precision.frag",
"spv.prepost.frag", "spv.prepost.frag",
"spv.qualifiers.vert", "spv.qualifiers.vert",
"spv.shaderBallot.comp",
"spv.shiftOps.frag", "spv.shiftOps.frag",
"spv.simpleFunctionCall.frag", "spv.simpleFunctionCall.frag",
"spv.simpleMat.vert", "spv.simpleMat.vert",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment