Merge pull request #1804 from KhronosGroup/fix-930-subgroup--mask-ops

AST/SPV: Fix #930: translate uvec4 <-> uint64 for SubgroupGeMask et. al.
This commit is contained in:
John Kessenich 2019-06-18 02:00:46 -06:00 committed by GitHub
commit f9d08a25fb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 451 additions and 345 deletions

View File

@ -138,7 +138,7 @@ protected:
spv::LoopControlMask TranslateLoopControl(const glslang::TIntermLoop&, std::vector<unsigned int>& operands) const; spv::LoopControlMask TranslateLoopControl(const glslang::TIntermLoop&, std::vector<unsigned int>& operands) const;
spv::StorageClass TranslateStorageClass(const glslang::TType&); spv::StorageClass TranslateStorageClass(const glslang::TType&);
void addIndirectionIndexCapabilities(const glslang::TType& baseType, const glslang::TType& indexType); void addIndirectionIndexCapabilities(const glslang::TType& baseType, const glslang::TType& indexType);
spv::Id createSpvVariable(const glslang::TIntermSymbol*); spv::Id createSpvVariable(const glslang::TIntermSymbol*, spv::Id forcedType);
spv::Id getSampledType(const glslang::TSampler&); spv::Id getSampledType(const glslang::TSampler&);
spv::Id getInvertedSwizzleType(const glslang::TIntermTyped&); spv::Id getInvertedSwizzleType(const glslang::TIntermTyped&);
spv::Id createInvertedSwizzle(spv::Decoration precision, const glslang::TIntermTyped&, spv::Id parentResult); spv::Id createInvertedSwizzle(spv::Decoration precision, const glslang::TIntermTyped&, spv::Id parentResult);
@ -208,6 +208,8 @@ protected:
if (builder.getSpvVersion() < glslang::EShTargetSpv_1_3) if (builder.getSpvVersion() < glslang::EShTargetSpv_1_3)
builder.addExtension(ext); builder.addExtension(ext);
} }
std::pair<spv::Id, spv::Id> getForcedType(spv::BuiltIn, const glslang::TType&);
spv::Id translateForcedType(spv::Id object);
glslang::SpvOptions& options; glslang::SpvOptions& options;
spv::Function* shaderEntry; spv::Function* shaderEntry;
@ -238,6 +240,10 @@ protected:
std::unordered_map<std::string, const glslang::TIntermSymbol*> counterOriginator; std::unordered_map<std::string, const glslang::TIntermSymbol*> counterOriginator;
// Map pointee types for EbtReference to their forward pointers // Map pointee types for EbtReference to their forward pointers
std::map<const glslang::TType *, spv::Id> forwardPointers; std::map<const glslang::TType *, spv::Id> forwardPointers;
// Type forcing, for when SPIR-V wants a different type than the AST,
// requiring local translation to and from SPIR-V type on every access.
// Maps <builtin-variable-id -> AST-required-type-id>
std::unordered_map<spv::Id, spv::Id> forceType;
}; };
// //
@ -733,27 +739,27 @@ spv::BuiltIn TGlslangToSpvTraverser::TranslateBuiltInDecoration(glslang::TBuiltI
case glslang::EbvSubGroupEqMask: case glslang::EbvSubGroupEqMask:
builder.addExtension(spv::E_SPV_KHR_shader_ballot); builder.addExtension(spv::E_SPV_KHR_shader_ballot);
builder.addCapability(spv::CapabilitySubgroupBallotKHR); builder.addCapability(spv::CapabilitySubgroupBallotKHR);
return spv::BuiltInSubgroupEqMaskKHR; return spv::BuiltInSubgroupEqMask;
case glslang::EbvSubGroupGeMask: case glslang::EbvSubGroupGeMask:
builder.addExtension(spv::E_SPV_KHR_shader_ballot); builder.addExtension(spv::E_SPV_KHR_shader_ballot);
builder.addCapability(spv::CapabilitySubgroupBallotKHR); builder.addCapability(spv::CapabilitySubgroupBallotKHR);
return spv::BuiltInSubgroupGeMaskKHR; return spv::BuiltInSubgroupGeMask;
case glslang::EbvSubGroupGtMask: case glslang::EbvSubGroupGtMask:
builder.addExtension(spv::E_SPV_KHR_shader_ballot); builder.addExtension(spv::E_SPV_KHR_shader_ballot);
builder.addCapability(spv::CapabilitySubgroupBallotKHR); builder.addCapability(spv::CapabilitySubgroupBallotKHR);
return spv::BuiltInSubgroupGtMaskKHR; return spv::BuiltInSubgroupGtMask;
case glslang::EbvSubGroupLeMask: case glslang::EbvSubGroupLeMask:
builder.addExtension(spv::E_SPV_KHR_shader_ballot); builder.addExtension(spv::E_SPV_KHR_shader_ballot);
builder.addCapability(spv::CapabilitySubgroupBallotKHR); builder.addCapability(spv::CapabilitySubgroupBallotKHR);
return spv::BuiltInSubgroupLeMaskKHR; return spv::BuiltInSubgroupLeMask;
case glslang::EbvSubGroupLtMask: case glslang::EbvSubGroupLtMask:
builder.addExtension(spv::E_SPV_KHR_shader_ballot); builder.addExtension(spv::E_SPV_KHR_shader_ballot);
builder.addCapability(spv::CapabilitySubgroupBallotKHR); builder.addCapability(spv::CapabilitySubgroupBallotKHR);
return spv::BuiltInSubgroupLtMaskKHR; return spv::BuiltInSubgroupLtMask;
case glslang::EbvNumSubgroups: case glslang::EbvNumSubgroups:
builder.addCapability(spv::CapabilityGroupNonUniform); builder.addCapability(spv::CapabilityGroupNonUniform);
@ -795,6 +801,7 @@ spv::BuiltIn TGlslangToSpvTraverser::TranslateBuiltInDecoration(glslang::TBuiltI
builder.addCapability(spv::CapabilityGroupNonUniform); builder.addCapability(spv::CapabilityGroupNonUniform);
builder.addCapability(spv::CapabilityGroupNonUniformBallot); builder.addCapability(spv::CapabilityGroupNonUniformBallot);
return spv::BuiltInSubgroupLtMask; return spv::BuiltInSubgroupLtMask;
#ifdef AMD_EXTENSIONS #ifdef AMD_EXTENSIONS
case glslang::EbvBaryCoordNoPersp: case glslang::EbvBaryCoordNoPersp:
builder.addExtension(spv::E_SPV_AMD_shader_explicit_vertex_parameter); builder.addExtension(spv::E_SPV_AMD_shader_explicit_vertex_parameter);
@ -1620,8 +1627,8 @@ void TGlslangToSpvTraverser::visitSymbol(glslang::TIntermSymbol* symbol)
// Formal function parameters were mapped during makeFunctions(). // Formal function parameters were mapped during makeFunctions().
spv::Id id = getSymbolId(symbol); spv::Id id = getSymbolId(symbol);
// Include all "static use" and "linkage only" interface variables on the OpEntryPoint instruction
if (builder.isPointer(id)) { if (builder.isPointer(id)) {
// Include all "static use" and "linkage only" interface variables on the OpEntryPoint instruction
// Consider adding to the OpEntryPoint interface list. // Consider adding to the OpEntryPoint interface list.
// Only looking at structures if they have at least one member. // Only looking at structures if they have at least one member.
if (!symbol->getType().isStruct() || symbol->getType().getStruct()->size() > 0) { if (!symbol->getType().isStruct() || symbol->getType().getStruct()->size() > 0) {
@ -1633,6 +1640,14 @@ void TGlslangToSpvTraverser::visitSymbol(glslang::TIntermSymbol* symbol)
iOSet.insert(id); iOSet.insert(id);
} }
} }
// If the SPIR-V type is required to be different than the AST type,
// translate now from the SPIR-V type to the AST type, for the consuming
// operation.
// Note this turns it from an l-value to an r-value.
// Currently, all symbols needing this are inputs; avoid the map lookup when non-input.
if (symbol->getType().getQualifier().storage == glslang::EvqVaryingIn)
id = translateForcedType(id);
} }
// Only process non-linkage-only nodes for generating actual static uses // Only process non-linkage-only nodes for generating actual static uses
@ -1650,8 +1665,10 @@ void TGlslangToSpvTraverser::visitSymbol(glslang::TIntermSymbol* symbol)
// See comments in handleUserFunctionCall(). // See comments in handleUserFunctionCall().
// B) Specialization constants (normal constants don't even come in as a variable), // B) Specialization constants (normal constants don't even come in as a variable),
// These are also pure R-values. // These are also pure R-values.
// C) R-Values from type translation, see above call to translateForcedType()
glslang::TQualifier qualifier = symbol->getQualifier(); glslang::TQualifier qualifier = symbol->getQualifier();
if (qualifier.isSpecConstant() || rValueParameters.find(symbol->getId()) != rValueParameters.end()) if (qualifier.isSpecConstant() || rValueParameters.find(symbol->getId()) != rValueParameters.end() ||
!builder.isPointerType(builder.getTypeId(id)))
builder.setAccessChainRValue(id); builder.setAccessChainRValue(id);
else else
builder.setAccessChainLValue(id); builder.setAccessChainLValue(id);
@ -1908,6 +1925,71 @@ bool TGlslangToSpvTraverser::visitBinary(glslang::TVisit /* visit */, glslang::T
} }
} }
// Figure out what, if any, type changes are needed when accessing a specific built-in.
// Returns <the type SPIR-V requires for declarion, the type to translate to on use>.
// Also see comment for 'forceType', regarding tracking SPIR-V-required types.
std::pair<spv::Id, spv::Id> TGlslangToSpvTraverser::getForcedType(spv::BuiltIn builtIn,
const glslang::TType& glslangType)
{
switch(builtIn)
{
case spv::BuiltInSubgroupEqMask:
case spv::BuiltInSubgroupGeMask:
case spv::BuiltInSubgroupGtMask:
case spv::BuiltInSubgroupLeMask:
case spv::BuiltInSubgroupLtMask: {
// these require changing a 64-bit scaler -> a vector of 32-bit components
if (glslangType.isVector())
break;
std::pair<spv::Id, spv::Id> ret(builder.makeVectorType(builder.makeUintType(32), 4),
builder.makeUintType(64));
return ret;
}
default:
break;
}
std::pair<spv::Id, spv::Id> ret(spv::NoType, spv::NoType);
return ret;
}
// For an object previously identified (see getForcedType() and forceType)
// as needing type translations, do the translation needed for a load, turning
// an L-value into in R-value.
spv::Id TGlslangToSpvTraverser::translateForcedType(spv::Id object)
{
const auto forceIt = forceType.find(object);
if (forceIt == forceType.end())
return object;
spv::Id desiredTypeId = forceIt->second;
spv::Id objectTypeId = builder.getTypeId(object);
assert(builder.isPointerType(objectTypeId));
objectTypeId = builder.getContainedTypeId(objectTypeId);
if (builder.isVectorType(objectTypeId) &&
builder.getScalarTypeWidth(builder.getContainedTypeId(objectTypeId)) == 32) {
if (builder.getScalarTypeWidth(desiredTypeId) == 64) {
// handle 32-bit v.xy* -> 64-bit
builder.clearAccessChain();
builder.setAccessChainLValue(object);
object = builder.accessChainLoad(spv::NoPrecision, spv::DecorationMax, objectTypeId);
std::vector<spv::Id> components;
components.push_back(builder.createCompositeExtract(object, builder.getContainedTypeId(objectTypeId), 0));
components.push_back(builder.createCompositeExtract(object, builder.getContainedTypeId(objectTypeId), 1));
spv::Id vecType = builder.makeVectorType(builder.getContainedTypeId(objectTypeId), 2);
return builder.createUnaryOp(spv::OpBitcast, desiredTypeId,
builder.createCompositeConstruct(vecType, components));
} else {
logger->missingFunctionality("forcing 32-bit vector type to non 64-bit scalar");
}
} else {
logger->missingFunctionality("forcing non 32-bit vector type");
}
return object;
}
bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TIntermUnary* node) bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TIntermUnary* node)
{ {
builder.setLine(node->getLoc().line, node->getLoc().getFilename()); builder.setLine(node->getLoc().line, node->getLoc().getFilename());
@ -3037,7 +3119,7 @@ bool TGlslangToSpvTraverser::visitBranch(glslang::TVisit /* visit */, glslang::T
return false; return false;
} }
spv::Id TGlslangToSpvTraverser::createSpvVariable(const glslang::TIntermSymbol* node) spv::Id TGlslangToSpvTraverser::createSpvVariable(const glslang::TIntermSymbol* node, spv::Id forcedType)
{ {
// First, steer off constants, which are not SPIR-V variables, but // First, steer off constants, which are not SPIR-V variables, but
// can still have a mapping to a SPIR-V Id. // can still have a mapping to a SPIR-V Id.
@ -3050,7 +3132,8 @@ spv::Id TGlslangToSpvTraverser::createSpvVariable(const glslang::TIntermSymbol*
// Now, handle actual variables // Now, handle actual variables
spv::StorageClass storageClass = TranslateStorageClass(node->getType()); spv::StorageClass storageClass = TranslateStorageClass(node->getType());
spv::Id spvType = convertGlslangToSpvType(node->getType()); spv::Id spvType = forcedType == spv::NoType ? convertGlslangToSpvType(node->getType())
: forcedType;
const bool contains16BitType = node->getType().containsBasicType(glslang::EbtFloat16) || const bool contains16BitType = node->getType().containsBasicType(glslang::EbtFloat16) ||
node->getType().containsBasicType(glslang::EbtInt16) || node->getType().containsBasicType(glslang::EbtInt16) ||
@ -7543,8 +7626,12 @@ spv::Id TGlslangToSpvTraverser::getSymbolId(const glslang::TIntermSymbol* symbol
} }
// it was not found, create it // it was not found, create it
id = createSpvVariable(symbol); spv::BuiltIn builtIn = TranslateBuiltInDecoration(symbol->getQualifier().builtIn, false);
auto forcedType = getForcedType(builtIn, symbol->getType());
id = createSpvVariable(symbol, forcedType.first);
symbolValues[symbol->getId()] = id; symbolValues[symbol->getId()] = id;
if (forcedType.second != spv::NoType)
forceType[id] = forcedType.second;
if (symbol->getBasicType() != glslang::EbtBlock) { if (symbol->getBasicType() != glslang::EbtBlock) {
builder.addDecoration(id, TranslatePrecisionDecoration(symbol->getType())); builder.addDecoration(id, TranslatePrecisionDecoration(symbol->getType()));
@ -7604,10 +7691,10 @@ spv::Id TGlslangToSpvTraverser::getSymbolId(const glslang::TIntermSymbol* symbol
builder.addDecoration(id, memory[i]); builder.addDecoration(id, memory[i]);
} }
// built-in variable decorations // add built-in variable decoration
spv::BuiltIn builtIn = TranslateBuiltInDecoration(symbol->getQualifier().builtIn, false); if (builtIn != spv::BuiltInMax) {
if (builtIn != spv::BuiltInMax)
builder.addDecoration(id, spv::DecorationBuiltIn, (int)builtIn); builder.addDecoration(id, spv::DecorationBuiltIn, (int)builtIn);
}
// nonuniform // nonuniform
builder.addDecoration(id, TranslateNonUniformDecoration(symbol->getType().getQualifier())); builder.addDecoration(id, TranslateNonUniformDecoration(symbol->getType().getQualifier()));

View File

@ -1,8 +1,7 @@
spv.shaderBallot.comp spv.shaderBallot.comp
Validation failed
// Module Version 10000 // Module Version 10000
// Generated by (magic number): 80007 // Generated by (magic number): 80007
// Id's are bound by 298 // Id's are bound by 318
Capability Shader Capability Shader
Capability Int64 Capability Int64
@ -10,7 +9,7 @@ Validation failed
Extension "SPV_KHR_shader_ballot" Extension "SPV_KHR_shader_ballot"
1: ExtInstImport "GLSL.std.450" 1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450 MemoryModel Logical GLSL450
EntryPoint GLCompute 4 "main" 10 12 21 23 26 29 32 EntryPoint GLCompute 4 "main" 10 12 22 29 36 43 50
ExecutionMode 4 LocalSize 8 8 1 ExecutionMode 4 LocalSize 8 8 1
Source GLSL 450 Source GLSL 450
SourceExtension "GL_ARB_gpu_shader_int64" SourceExtension "GL_ARB_gpu_shader_int64"
@ -20,30 +19,30 @@ Validation failed
Name 10 "gl_SubGroupInvocationARB" Name 10 "gl_SubGroupInvocationARB"
Name 12 "gl_SubGroupSizeARB" Name 12 "gl_SubGroupSizeARB"
Name 19 "relMask" Name 19 "relMask"
Name 21 "gl_SubGroupEqMaskARB" Name 22 "gl_SubGroupEqMaskARB"
Name 23 "gl_SubGroupGeMaskARB" Name 29 "gl_SubGroupGeMaskARB"
Name 26 "gl_SubGroupGtMaskARB" Name 36 "gl_SubGroupGtMaskARB"
Name 29 "gl_SubGroupLeMaskARB" Name 43 "gl_SubGroupLeMaskARB"
Name 32 "gl_SubGroupLtMaskARB" Name 50 "gl_SubGroupLtMaskARB"
Name 52 "Buffers" Name 72 "Buffers"
MemberName 52(Buffers) 0 "f4" MemberName 72(Buffers) 0 "f4"
MemberName 52(Buffers) 1 "i4" MemberName 72(Buffers) 1 "i4"
MemberName 52(Buffers) 2 "u4" MemberName 72(Buffers) 2 "u4"
Name 55 "data" Name 75 "data"
Decorate 10(gl_SubGroupInvocationARB) BuiltIn SubgroupLocalInvocationId Decorate 10(gl_SubGroupInvocationARB) BuiltIn SubgroupLocalInvocationId
Decorate 12(gl_SubGroupSizeARB) BuiltIn SubgroupSize Decorate 12(gl_SubGroupSizeARB) BuiltIn SubgroupSize
Decorate 21(gl_SubGroupEqMaskARB) BuiltIn SubgroupEqMaskKHR Decorate 22(gl_SubGroupEqMaskARB) BuiltIn SubgroupEqMaskKHR
Decorate 23(gl_SubGroupGeMaskARB) BuiltIn SubgroupGeMaskKHR Decorate 29(gl_SubGroupGeMaskARB) BuiltIn SubgroupGeMaskKHR
Decorate 26(gl_SubGroupGtMaskARB) BuiltIn SubgroupGtMaskKHR Decorate 36(gl_SubGroupGtMaskARB) BuiltIn SubgroupGtMaskKHR
Decorate 29(gl_SubGroupLeMaskARB) BuiltIn SubgroupLeMaskKHR Decorate 43(gl_SubGroupLeMaskARB) BuiltIn SubgroupLeMaskKHR
Decorate 32(gl_SubGroupLtMaskARB) BuiltIn SubgroupLtMaskKHR Decorate 50(gl_SubGroupLtMaskARB) BuiltIn SubgroupLtMaskKHR
MemberDecorate 52(Buffers) 0 Offset 0 MemberDecorate 72(Buffers) 0 Offset 0
MemberDecorate 52(Buffers) 1 Offset 16 MemberDecorate 72(Buffers) 1 Offset 16
MemberDecorate 52(Buffers) 2 Offset 32 MemberDecorate 72(Buffers) 2 Offset 32
Decorate 52(Buffers) BufferBlock Decorate 72(Buffers) BufferBlock
Decorate 55(data) DescriptorSet 0 Decorate 75(data) DescriptorSet 0
Decorate 55(data) Binding 0 Decorate 75(data) Binding 0
Decorate 297 BuiltIn WorkgroupSize Decorate 317 BuiltIn WorkgroupSize
2: TypeVoid 2: TypeVoid
3: TypeFunction 2 3: TypeFunction 2
6: TypeInt 32 0 6: TypeInt 32 0
@ -54,43 +53,43 @@ Validation failed
15: 6(int) Constant 4 15: 6(int) Constant 4
17: TypeInt 64 0 17: TypeInt 64 0
18: TypePointer Function 17(int64_t) 18: TypePointer Function 17(int64_t)
20: TypePointer Input 17(int64_t) 20: TypeVector 6(int) 4
21(gl_SubGroupEqMaskARB): 20(ptr) Variable Input 21: TypePointer Input 20(ivec4)
23(gl_SubGroupGeMaskARB): 20(ptr) Variable Input 22(gl_SubGroupEqMaskARB): 21(ptr) Variable Input
26(gl_SubGroupGtMaskARB): 20(ptr) Variable Input 26: TypeVector 6(int) 2
29(gl_SubGroupLeMaskARB): 20(ptr) Variable Input 29(gl_SubGroupGeMaskARB): 21(ptr) Variable Input
32(gl_SubGroupLtMaskARB): 20(ptr) Variable Input 36(gl_SubGroupGtMaskARB): 21(ptr) Variable Input
36: TypeBool 43(gl_SubGroupLeMaskARB): 21(ptr) Variable Input
37: 36(bool) ConstantTrue 50(gl_SubGroupLtMaskARB): 21(ptr) Variable Input
38: TypeVector 6(int) 4 58: TypeBool
42: TypeVector 6(int) 2 59: 58(bool) ConstantTrue
48: TypeFloat 32 68: TypeFloat 32
49: TypeVector 48(float) 4 69: TypeVector 68(float) 4
50: TypeInt 32 1 70: TypeInt 32 1
51: TypeVector 50(int) 4 71: TypeVector 70(int) 4
52(Buffers): TypeStruct 49(fvec4) 51(ivec4) 38(ivec4) 72(Buffers): TypeStruct 69(fvec4) 71(ivec4) 20(ivec4)
53: TypeArray 52(Buffers) 15 73: TypeArray 72(Buffers) 15
54: TypePointer Uniform 53 74: TypePointer Uniform 73
55(data): 54(ptr) Variable Uniform 75(data): 74(ptr) Variable Uniform
57: 50(int) Constant 0 77: 70(int) Constant 0
58: 6(int) Constant 0 78: 6(int) Constant 0
59: TypePointer Uniform 48(float) 79: TypePointer Uniform 68(float)
66: 50(int) Constant 1 86: 70(int) Constant 1
67: TypeVector 48(float) 2 87: TypeVector 68(float) 2
68: TypePointer Uniform 49(fvec4) 88: TypePointer Uniform 69(fvec4)
82: 50(int) Constant 2 102: 70(int) Constant 2
83: TypeVector 48(float) 3 103: TypeVector 68(float) 3
99: 50(int) Constant 3 119: 70(int) Constant 3
114: TypePointer Uniform 50(int) 134: TypePointer Uniform 70(int)
121: TypeVector 50(int) 2 141: TypeVector 70(int) 2
122: TypePointer Uniform 51(ivec4) 142: TypePointer Uniform 71(ivec4)
136: TypeVector 50(int) 3 156: TypeVector 70(int) 3
166: TypePointer Uniform 6(int) 186: TypePointer Uniform 6(int)
173: TypePointer Uniform 38(ivec4) 193: TypePointer Uniform 20(ivec4)
187: TypeVector 6(int) 3 207: TypeVector 6(int) 3
295: 6(int) Constant 8 315: 6(int) Constant 8
296: 6(int) Constant 1 316: 6(int) Constant 1
297: 187(ivec3) ConstantComposite 295 295 296 317: 207(ivec3) ConstantComposite 315 315 316
4(main): 2 Function None 3 4(main): 2 Function None 3
5: Label 5: Label
8(invocation): 7(ptr) Variable Function 8(invocation): 7(ptr) Variable Function
@ -100,275 +99,295 @@ Validation failed
14: 6(int) IAdd 11 13 14: 6(int) IAdd 11 13
16: 6(int) UMod 14 15 16: 6(int) UMod 14 15
Store 8(invocation) 16 Store 8(invocation) 16
22: 17(int64_t) Load 21(gl_SubGroupEqMaskARB) 23: 20(ivec4) Load 22(gl_SubGroupEqMaskARB)
24: 17(int64_t) Load 23(gl_SubGroupGeMaskARB) 24: 6(int) CompositeExtract 23 0
25: 17(int64_t) IAdd 22 24 25: 6(int) CompositeExtract 23 1
27: 17(int64_t) Load 26(gl_SubGroupGtMaskARB) 27: 26(ivec2) CompositeConstruct 24 25
28: 17(int64_t) IAdd 25 27 28: 17(int64_t) Bitcast 27
30: 17(int64_t) Load 29(gl_SubGroupLeMaskARB) 30: 20(ivec4) Load 29(gl_SubGroupGeMaskARB)
31: 17(int64_t) IAdd 28 30 31: 6(int) CompositeExtract 30 0
33: 17(int64_t) Load 32(gl_SubGroupLtMaskARB) 32: 6(int) CompositeExtract 30 1
34: 17(int64_t) IAdd 31 33 33: 26(ivec2) CompositeConstruct 31 32
Store 19(relMask) 34 34: 17(int64_t) Bitcast 33
35: 17(int64_t) Load 19(relMask) 35: 17(int64_t) IAdd 28 34
39: 38(ivec4) SubgroupBallotKHR 37 37: 20(ivec4) Load 36(gl_SubGroupGtMaskARB)
40: 6(int) CompositeExtract 39 0 38: 6(int) CompositeExtract 37 0
41: 6(int) CompositeExtract 39 1 39: 6(int) CompositeExtract 37 1
43: 42(ivec2) CompositeConstruct 40 41 40: 26(ivec2) CompositeConstruct 38 39
44: 17(int64_t) Bitcast 43 41: 17(int64_t) Bitcast 40
45: 36(bool) IEqual 35 44 42: 17(int64_t) IAdd 35 41
SelectionMerge 47 None 44: 20(ivec4) Load 43(gl_SubGroupLeMaskARB)
BranchConditional 45 46 216 45: 6(int) CompositeExtract 44 0
46: Label 46: 6(int) CompositeExtract 44 1
56: 6(int) Load 8(invocation) 47: 26(ivec2) CompositeConstruct 45 46
60: 59(ptr) AccessChain 55(data) 57 57 58 48: 17(int64_t) Bitcast 47
61: 48(float) Load 60 49: 17(int64_t) IAdd 42 48
62: 6(int) Load 8(invocation) 51: 20(ivec4) Load 50(gl_SubGroupLtMaskARB)
63: 48(float) SubgroupReadInvocationKHR 61 62 52: 6(int) CompositeExtract 51 0
64: 59(ptr) AccessChain 55(data) 56 57 58 53: 6(int) CompositeExtract 51 1
Store 64 63 54: 26(ivec2) CompositeConstruct 52 53
65: 6(int) Load 8(invocation) 55: 17(int64_t) Bitcast 54
69: 68(ptr) AccessChain 55(data) 66 57 56: 17(int64_t) IAdd 49 55
70: 49(fvec4) Load 69 Store 19(relMask) 56
71: 67(fvec2) VectorShuffle 70 70 0 1 57: 17(int64_t) Load 19(relMask)
72: 6(int) Load 8(invocation) 60: 20(ivec4) SubgroupBallotKHR 59
73: 48(float) CompositeExtract 71 0 61: 6(int) CompositeExtract 60 0
74: 48(float) SubgroupReadInvocationKHR 73 72 62: 6(int) CompositeExtract 60 1
75: 48(float) CompositeExtract 71 1 63: 26(ivec2) CompositeConstruct 61 62
76: 48(float) SubgroupReadInvocationKHR 75 72 64: 17(int64_t) Bitcast 63
77: 67(fvec2) CompositeConstruct 74 76 65: 58(bool) IEqual 57 64
78: 68(ptr) AccessChain 55(data) 65 57 SelectionMerge 67 None
79: 49(fvec4) Load 78 BranchConditional 65 66 236
80: 49(fvec4) VectorShuffle 79 77 4 5 2 3 66: Label
Store 78 80 76: 6(int) Load 8(invocation)
81: 6(int) Load 8(invocation) 80: 79(ptr) AccessChain 75(data) 77 77 78
84: 68(ptr) AccessChain 55(data) 82 57 81: 68(float) Load 80
85: 49(fvec4) Load 84 82: 6(int) Load 8(invocation)
86: 83(fvec3) VectorShuffle 85 85 0 1 2 83: 68(float) SubgroupReadInvocationKHR 81 82
87: 6(int) Load 8(invocation) 84: 79(ptr) AccessChain 75(data) 76 77 78
88: 48(float) CompositeExtract 86 0 Store 84 83
89: 48(float) SubgroupReadInvocationKHR 88 87 85: 6(int) Load 8(invocation)
90: 48(float) CompositeExtract 86 1 89: 88(ptr) AccessChain 75(data) 86 77
91: 48(float) SubgroupReadInvocationKHR 90 87 90: 69(fvec4) Load 89
92: 48(float) CompositeExtract 86 2 91: 87(fvec2) VectorShuffle 90 90 0 1
93: 48(float) SubgroupReadInvocationKHR 92 87 92: 6(int) Load 8(invocation)
94: 83(fvec3) CompositeConstruct 89 91 93 93: 68(float) CompositeExtract 91 0
95: 68(ptr) AccessChain 55(data) 81 57 94: 68(float) SubgroupReadInvocationKHR 93 92
96: 49(fvec4) Load 95 95: 68(float) CompositeExtract 91 1
97: 49(fvec4) VectorShuffle 96 94 4 5 6 3 96: 68(float) SubgroupReadInvocationKHR 95 92
Store 95 97 97: 87(fvec2) CompositeConstruct 94 96
98: 6(int) Load 8(invocation) 98: 88(ptr) AccessChain 75(data) 85 77
100: 68(ptr) AccessChain 55(data) 99 57 99: 69(fvec4) Load 98
101: 49(fvec4) Load 100 100: 69(fvec4) VectorShuffle 99 97 4 5 2 3
102: 6(int) Load 8(invocation) Store 98 100
103: 48(float) CompositeExtract 101 0 101: 6(int) Load 8(invocation)
104: 48(float) SubgroupReadInvocationKHR 103 102 104: 88(ptr) AccessChain 75(data) 102 77
105: 48(float) CompositeExtract 101 1 105: 69(fvec4) Load 104
106: 48(float) SubgroupReadInvocationKHR 105 102 106: 103(fvec3) VectorShuffle 105 105 0 1 2
107: 48(float) CompositeExtract 101 2 107: 6(int) Load 8(invocation)
108: 48(float) SubgroupReadInvocationKHR 107 102 108: 68(float) CompositeExtract 106 0
109: 48(float) CompositeExtract 101 3 109: 68(float) SubgroupReadInvocationKHR 108 107
110: 48(float) SubgroupReadInvocationKHR 109 102 110: 68(float) CompositeExtract 106 1
111: 49(fvec4) CompositeConstruct 104 106 108 110 111: 68(float) SubgroupReadInvocationKHR 110 107
112: 68(ptr) AccessChain 55(data) 98 57 112: 68(float) CompositeExtract 106 2
Store 112 111 113: 68(float) SubgroupReadInvocationKHR 112 107
113: 6(int) Load 8(invocation) 114: 103(fvec3) CompositeConstruct 109 111 113
115: 114(ptr) AccessChain 55(data) 57 66 58 115: 88(ptr) AccessChain 75(data) 101 77
116: 50(int) Load 115 116: 69(fvec4) Load 115
117: 6(int) Load 8(invocation) 117: 69(fvec4) VectorShuffle 116 114 4 5 6 3
118: 50(int) SubgroupReadInvocationKHR 116 117 Store 115 117
119: 114(ptr) AccessChain 55(data) 113 66 58 118: 6(int) Load 8(invocation)
Store 119 118 120: 88(ptr) AccessChain 75(data) 119 77
120: 6(int) Load 8(invocation) 121: 69(fvec4) Load 120
123: 122(ptr) AccessChain 55(data) 66 66 122: 6(int) Load 8(invocation)
124: 51(ivec4) Load 123 123: 68(float) CompositeExtract 121 0
125: 121(ivec2) VectorShuffle 124 124 0 1 124: 68(float) SubgroupReadInvocationKHR 123 122
126: 6(int) Load 8(invocation) 125: 68(float) CompositeExtract 121 1
127: 50(int) CompositeExtract 125 0 126: 68(float) SubgroupReadInvocationKHR 125 122
128: 50(int) SubgroupReadInvocationKHR 127 126 127: 68(float) CompositeExtract 121 2
129: 50(int) CompositeExtract 125 1 128: 68(float) SubgroupReadInvocationKHR 127 122
130: 50(int) SubgroupReadInvocationKHR 129 126 129: 68(float) CompositeExtract 121 3
131: 121(ivec2) CompositeConstruct 128 130 130: 68(float) SubgroupReadInvocationKHR 129 122
132: 122(ptr) AccessChain 55(data) 120 66 131: 69(fvec4) CompositeConstruct 124 126 128 130
133: 51(ivec4) Load 132 132: 88(ptr) AccessChain 75(data) 118 77
134: 51(ivec4) VectorShuffle 133 131 4 5 2 3 Store 132 131
Store 132 134 133: 6(int) Load 8(invocation)
135: 6(int) Load 8(invocation) 135: 134(ptr) AccessChain 75(data) 77 86 78
137: 122(ptr) AccessChain 55(data) 82 66 136: 70(int) Load 135
138: 51(ivec4) Load 137 137: 6(int) Load 8(invocation)
139: 136(ivec3) VectorShuffle 138 138 0 1 2 138: 70(int) SubgroupReadInvocationKHR 136 137
139: 134(ptr) AccessChain 75(data) 133 86 78
Store 139 138
140: 6(int) Load 8(invocation) 140: 6(int) Load 8(invocation)
141: 50(int) CompositeExtract 139 0 143: 142(ptr) AccessChain 75(data) 86 86
142: 50(int) SubgroupReadInvocationKHR 141 140 144: 71(ivec4) Load 143
143: 50(int) CompositeExtract 139 1 145: 141(ivec2) VectorShuffle 144 144 0 1
144: 50(int) SubgroupReadInvocationKHR 143 140 146: 6(int) Load 8(invocation)
145: 50(int) CompositeExtract 139 2 147: 70(int) CompositeExtract 145 0
146: 50(int) SubgroupReadInvocationKHR 145 140 148: 70(int) SubgroupReadInvocationKHR 147 146
147: 136(ivec3) CompositeConstruct 142 144 146 149: 70(int) CompositeExtract 145 1
148: 122(ptr) AccessChain 55(data) 135 66 150: 70(int) SubgroupReadInvocationKHR 149 146
149: 51(ivec4) Load 148 151: 141(ivec2) CompositeConstruct 148 150
150: 51(ivec4) VectorShuffle 149 147 4 5 6 3 152: 142(ptr) AccessChain 75(data) 140 86
Store 148 150 153: 71(ivec4) Load 152
151: 6(int) Load 8(invocation) 154: 71(ivec4) VectorShuffle 153 151 4 5 2 3
152: 122(ptr) AccessChain 55(data) 99 66 Store 152 154
153: 51(ivec4) Load 152 155: 6(int) Load 8(invocation)
154: 6(int) Load 8(invocation) 157: 142(ptr) AccessChain 75(data) 102 86
155: 50(int) CompositeExtract 153 0 158: 71(ivec4) Load 157
156: 50(int) SubgroupReadInvocationKHR 155 154 159: 156(ivec3) VectorShuffle 158 158 0 1 2
157: 50(int) CompositeExtract 153 1 160: 6(int) Load 8(invocation)
158: 50(int) SubgroupReadInvocationKHR 157 154 161: 70(int) CompositeExtract 159 0
159: 50(int) CompositeExtract 153 2 162: 70(int) SubgroupReadInvocationKHR 161 160
160: 50(int) SubgroupReadInvocationKHR 159 154 163: 70(int) CompositeExtract 159 1
161: 50(int) CompositeExtract 153 3 164: 70(int) SubgroupReadInvocationKHR 163 160
162: 50(int) SubgroupReadInvocationKHR 161 154 165: 70(int) CompositeExtract 159 2
163: 51(ivec4) CompositeConstruct 156 158 160 162 166: 70(int) SubgroupReadInvocationKHR 165 160
164: 122(ptr) AccessChain 55(data) 151 66 167: 156(ivec3) CompositeConstruct 162 164 166
Store 164 163 168: 142(ptr) AccessChain 75(data) 155 86
165: 6(int) Load 8(invocation) 169: 71(ivec4) Load 168
167: 166(ptr) AccessChain 55(data) 57 82 58 170: 71(ivec4) VectorShuffle 169 167 4 5 6 3
168: 6(int) Load 167 Store 168 170
169: 6(int) Load 8(invocation) 171: 6(int) Load 8(invocation)
170: 6(int) SubgroupReadInvocationKHR 168 169 172: 142(ptr) AccessChain 75(data) 119 86
171: 166(ptr) AccessChain 55(data) 165 82 58 173: 71(ivec4) Load 172
Store 171 170 174: 6(int) Load 8(invocation)
172: 6(int) Load 8(invocation) 175: 70(int) CompositeExtract 173 0
174: 173(ptr) AccessChain 55(data) 66 82 176: 70(int) SubgroupReadInvocationKHR 175 174
175: 38(ivec4) Load 174 177: 70(int) CompositeExtract 173 1
176: 42(ivec2) VectorShuffle 175 175 0 1 178: 70(int) SubgroupReadInvocationKHR 177 174
177: 6(int) Load 8(invocation) 179: 70(int) CompositeExtract 173 2
178: 6(int) CompositeExtract 176 0 180: 70(int) SubgroupReadInvocationKHR 179 174
179: 6(int) SubgroupReadInvocationKHR 178 177 181: 70(int) CompositeExtract 173 3
180: 6(int) CompositeExtract 176 1 182: 70(int) SubgroupReadInvocationKHR 181 174
181: 6(int) SubgroupReadInvocationKHR 180 177 183: 71(ivec4) CompositeConstruct 176 178 180 182
182: 42(ivec2) CompositeConstruct 179 181 184: 142(ptr) AccessChain 75(data) 171 86
183: 173(ptr) AccessChain 55(data) 172 82 Store 184 183
184: 38(ivec4) Load 183 185: 6(int) Load 8(invocation)
185: 38(ivec4) VectorShuffle 184 182 4 5 2 3 187: 186(ptr) AccessChain 75(data) 77 102 78
Store 183 185 188: 6(int) Load 187
186: 6(int) Load 8(invocation) 189: 6(int) Load 8(invocation)
188: 173(ptr) AccessChain 55(data) 82 82 190: 6(int) SubgroupReadInvocationKHR 188 189
189: 38(ivec4) Load 188 191: 186(ptr) AccessChain 75(data) 185 102 78
190: 187(ivec3) VectorShuffle 189 189 0 1 2 Store 191 190
191: 6(int) Load 8(invocation) 192: 6(int) Load 8(invocation)
192: 6(int) CompositeExtract 190 0 194: 193(ptr) AccessChain 75(data) 86 102
193: 6(int) SubgroupReadInvocationKHR 192 191 195: 20(ivec4) Load 194
194: 6(int) CompositeExtract 190 1 196: 26(ivec2) VectorShuffle 195 195 0 1
195: 6(int) SubgroupReadInvocationKHR 194 191 197: 6(int) Load 8(invocation)
196: 6(int) CompositeExtract 190 2 198: 6(int) CompositeExtract 196 0
197: 6(int) SubgroupReadInvocationKHR 196 191 199: 6(int) SubgroupReadInvocationKHR 198 197
198: 187(ivec3) CompositeConstruct 193 195 197 200: 6(int) CompositeExtract 196 1
199: 173(ptr) AccessChain 55(data) 186 82 201: 6(int) SubgroupReadInvocationKHR 200 197
200: 38(ivec4) Load 199 202: 26(ivec2) CompositeConstruct 199 201
201: 38(ivec4) VectorShuffle 200 198 4 5 6 3 203: 193(ptr) AccessChain 75(data) 192 102
Store 199 201 204: 20(ivec4) Load 203
202: 6(int) Load 8(invocation) 205: 20(ivec4) VectorShuffle 204 202 4 5 2 3
203: 173(ptr) AccessChain 55(data) 99 82 Store 203 205
204: 38(ivec4) Load 203 206: 6(int) Load 8(invocation)
205: 6(int) Load 8(invocation) 208: 193(ptr) AccessChain 75(data) 102 102
206: 6(int) CompositeExtract 204 0 209: 20(ivec4) Load 208
207: 6(int) SubgroupReadInvocationKHR 206 205 210: 207(ivec3) VectorShuffle 209 209 0 1 2
208: 6(int) CompositeExtract 204 1 211: 6(int) Load 8(invocation)
209: 6(int) SubgroupReadInvocationKHR 208 205 212: 6(int) CompositeExtract 210 0
210: 6(int) CompositeExtract 204 2 213: 6(int) SubgroupReadInvocationKHR 212 211
211: 6(int) SubgroupReadInvocationKHR 210 205 214: 6(int) CompositeExtract 210 1
212: 6(int) CompositeExtract 204 3 215: 6(int) SubgroupReadInvocationKHR 214 211
213: 6(int) SubgroupReadInvocationKHR 212 205 216: 6(int) CompositeExtract 210 2
214: 38(ivec4) CompositeConstruct 207 209 211 213 217: 6(int) SubgroupReadInvocationKHR 216 211
215: 173(ptr) AccessChain 55(data) 202 82 218: 207(ivec3) CompositeConstruct 213 215 217
Store 215 214 219: 193(ptr) AccessChain 75(data) 206 102
Branch 47 220: 20(ivec4) Load 219
216: Label 221: 20(ivec4) VectorShuffle 220 218 4 5 6 3
217: 6(int) Load 8(invocation) Store 219 221
218: 59(ptr) AccessChain 55(data) 57 57 58
219: 48(float) Load 218
220: 48(float) SubgroupFirstInvocationKHR 219
221: 59(ptr) AccessChain 55(data) 217 57 58
Store 221 220
222: 6(int) Load 8(invocation) 222: 6(int) Load 8(invocation)
223: 68(ptr) AccessChain 55(data) 66 57 223: 193(ptr) AccessChain 75(data) 119 102
224: 49(fvec4) Load 223 224: 20(ivec4) Load 223
225: 67(fvec2) VectorShuffle 224 224 0 1 225: 6(int) Load 8(invocation)
226: 67(fvec2) SubgroupFirstInvocationKHR 225 226: 6(int) CompositeExtract 224 0
227: 68(ptr) AccessChain 55(data) 222 57 227: 6(int) SubgroupReadInvocationKHR 226 225
228: 49(fvec4) Load 227 228: 6(int) CompositeExtract 224 1
229: 49(fvec4) VectorShuffle 228 226 4 5 2 3 229: 6(int) SubgroupReadInvocationKHR 228 225
Store 227 229 230: 6(int) CompositeExtract 224 2
230: 6(int) Load 8(invocation) 231: 6(int) SubgroupReadInvocationKHR 230 225
231: 68(ptr) AccessChain 55(data) 82 57 232: 6(int) CompositeExtract 224 3
232: 49(fvec4) Load 231 233: 6(int) SubgroupReadInvocationKHR 232 225
233: 83(fvec3) VectorShuffle 232 232 0 1 2 234: 20(ivec4) CompositeConstruct 227 229 231 233
234: 83(fvec3) SubgroupFirstInvocationKHR 233 235: 193(ptr) AccessChain 75(data) 222 102
235: 68(ptr) AccessChain 55(data) 230 57 Store 235 234
236: 49(fvec4) Load 235 Branch 67
237: 49(fvec4) VectorShuffle 236 234 4 5 6 3 236: Label
Store 235 237 237: 6(int) Load 8(invocation)
238: 6(int) Load 8(invocation) 238: 79(ptr) AccessChain 75(data) 77 77 78
239: 68(ptr) AccessChain 55(data) 99 57 239: 68(float) Load 238
240: 49(fvec4) Load 239 240: 68(float) SubgroupFirstInvocationKHR 239
241: 49(fvec4) SubgroupFirstInvocationKHR 240 241: 79(ptr) AccessChain 75(data) 237 77 78
242: 68(ptr) AccessChain 55(data) 238 57 Store 241 240
Store 242 241 242: 6(int) Load 8(invocation)
243: 6(int) Load 8(invocation) 243: 88(ptr) AccessChain 75(data) 86 77
244: 114(ptr) AccessChain 55(data) 57 66 58 244: 69(fvec4) Load 243
245: 50(int) Load 244 245: 87(fvec2) VectorShuffle 244 244 0 1
246: 50(int) SubgroupFirstInvocationKHR 245 246: 87(fvec2) SubgroupFirstInvocationKHR 245
247: 114(ptr) AccessChain 55(data) 243 66 58 247: 88(ptr) AccessChain 75(data) 242 77
Store 247 246 248: 69(fvec4) Load 247
248: 6(int) Load 8(invocation) 249: 69(fvec4) VectorShuffle 248 246 4 5 2 3
249: 122(ptr) AccessChain 55(data) 66 66 Store 247 249
250: 51(ivec4) Load 249 250: 6(int) Load 8(invocation)
251: 121(ivec2) VectorShuffle 250 250 0 1 251: 88(ptr) AccessChain 75(data) 102 77
252: 121(ivec2) SubgroupFirstInvocationKHR 251 252: 69(fvec4) Load 251
253: 122(ptr) AccessChain 55(data) 248 66 253: 103(fvec3) VectorShuffle 252 252 0 1 2
254: 51(ivec4) Load 253 254: 103(fvec3) SubgroupFirstInvocationKHR 253
255: 51(ivec4) VectorShuffle 254 252 4 5 2 3 255: 88(ptr) AccessChain 75(data) 250 77
Store 253 255 256: 69(fvec4) Load 255
256: 6(int) Load 8(invocation) 257: 69(fvec4) VectorShuffle 256 254 4 5 6 3
257: 122(ptr) AccessChain 55(data) 82 66 Store 255 257
258: 51(ivec4) Load 257 258: 6(int) Load 8(invocation)
259: 136(ivec3) VectorShuffle 258 258 0 1 2 259: 88(ptr) AccessChain 75(data) 119 77
260: 136(ivec3) SubgroupFirstInvocationKHR 259 260: 69(fvec4) Load 259
261: 122(ptr) AccessChain 55(data) 256 66 261: 69(fvec4) SubgroupFirstInvocationKHR 260
262: 51(ivec4) Load 261 262: 88(ptr) AccessChain 75(data) 258 77
263: 51(ivec4) VectorShuffle 262 260 4 5 6 3 Store 262 261
Store 261 263 263: 6(int) Load 8(invocation)
264: 6(int) Load 8(invocation) 264: 134(ptr) AccessChain 75(data) 77 86 78
265: 122(ptr) AccessChain 55(data) 99 66 265: 70(int) Load 264
266: 51(ivec4) Load 265 266: 70(int) SubgroupFirstInvocationKHR 265
267: 51(ivec4) SubgroupFirstInvocationKHR 266 267: 134(ptr) AccessChain 75(data) 263 86 78
268: 122(ptr) AccessChain 55(data) 264 66 Store 267 266
Store 268 267 268: 6(int) Load 8(invocation)
269: 6(int) Load 8(invocation) 269: 142(ptr) AccessChain 75(data) 86 86
270: 166(ptr) AccessChain 55(data) 57 82 58 270: 71(ivec4) Load 269
271: 6(int) Load 270 271: 141(ivec2) VectorShuffle 270 270 0 1
272: 6(int) SubgroupFirstInvocationKHR 271 272: 141(ivec2) SubgroupFirstInvocationKHR 271
273: 166(ptr) AccessChain 55(data) 269 82 58 273: 142(ptr) AccessChain 75(data) 268 86
Store 273 272 274: 71(ivec4) Load 273
274: 6(int) Load 8(invocation) 275: 71(ivec4) VectorShuffle 274 272 4 5 2 3
275: 173(ptr) AccessChain 55(data) 66 82 Store 273 275
276: 38(ivec4) Load 275 276: 6(int) Load 8(invocation)
277: 42(ivec2) VectorShuffle 276 276 0 1 277: 142(ptr) AccessChain 75(data) 102 86
278: 42(ivec2) SubgroupFirstInvocationKHR 277 278: 71(ivec4) Load 277
279: 173(ptr) AccessChain 55(data) 274 82 279: 156(ivec3) VectorShuffle 278 278 0 1 2
280: 38(ivec4) Load 279 280: 156(ivec3) SubgroupFirstInvocationKHR 279
281: 38(ivec4) VectorShuffle 280 278 4 5 2 3 281: 142(ptr) AccessChain 75(data) 276 86
Store 279 281 282: 71(ivec4) Load 281
282: 6(int) Load 8(invocation) 283: 71(ivec4) VectorShuffle 282 280 4 5 6 3
283: 173(ptr) AccessChain 55(data) 82 82 Store 281 283
284: 38(ivec4) Load 283 284: 6(int) Load 8(invocation)
285: 187(ivec3) VectorShuffle 284 284 0 1 2 285: 142(ptr) AccessChain 75(data) 119 86
286: 187(ivec3) SubgroupFirstInvocationKHR 285 286: 71(ivec4) Load 285
287: 173(ptr) AccessChain 55(data) 282 82 287: 71(ivec4) SubgroupFirstInvocationKHR 286
288: 38(ivec4) Load 287 288: 142(ptr) AccessChain 75(data) 284 86
289: 38(ivec4) VectorShuffle 288 286 4 5 6 3 Store 288 287
Store 287 289 289: 6(int) Load 8(invocation)
290: 6(int) Load 8(invocation) 290: 186(ptr) AccessChain 75(data) 77 102 78
291: 173(ptr) AccessChain 55(data) 99 82 291: 6(int) Load 290
292: 38(ivec4) Load 291 292: 6(int) SubgroupFirstInvocationKHR 291
293: 38(ivec4) SubgroupFirstInvocationKHR 292 293: 186(ptr) AccessChain 75(data) 289 102 78
294: 173(ptr) AccessChain 55(data) 290 82 Store 293 292
Store 294 293 294: 6(int) Load 8(invocation)
Branch 47 295: 193(ptr) AccessChain 75(data) 86 102
47: Label 296: 20(ivec4) Load 295
297: 26(ivec2) VectorShuffle 296 296 0 1
298: 26(ivec2) SubgroupFirstInvocationKHR 297
299: 193(ptr) AccessChain 75(data) 294 102
300: 20(ivec4) Load 299
301: 20(ivec4) VectorShuffle 300 298 4 5 2 3
Store 299 301
302: 6(int) Load 8(invocation)
303: 193(ptr) AccessChain 75(data) 102 102
304: 20(ivec4) Load 303
305: 207(ivec3) VectorShuffle 304 304 0 1 2
306: 207(ivec3) SubgroupFirstInvocationKHR 305
307: 193(ptr) AccessChain 75(data) 302 102
308: 20(ivec4) Load 307
309: 20(ivec4) VectorShuffle 308 306 4 5 6 3
Store 307 309
310: 6(int) Load 8(invocation)
311: 193(ptr) AccessChain 75(data) 119 102
312: 20(ivec4) Load 311
313: 20(ivec4) SubgroupFirstInvocationKHR 312
314: 193(ptr) AccessChain 75(data) 310 102
Store 314 313
Branch 67
67: Label
Return Return
FunctionEnd FunctionEnd

View File

@ -1,3 +1,3 @@
// This header is generated by the make-revision script. // This header is generated by the make-revision script.
#define GLSLANG_PATCH_LEVEL 3274 #define GLSLANG_PATCH_LEVEL 3276