Merge pull request #516 from amdrexu/feature3

SPV: Implement the extension SPV_KHR_shader_ballot
This commit is contained in:
John Kessenich 2016-09-22 10:54:18 -06:00 committed by GitHub
commit 02df206c9e
8 changed files with 480 additions and 341 deletions

View File

@ -13,6 +13,7 @@ set(SPVREMAP_SOURCES
set(HEADERS set(HEADERS
spirv.hpp spirv.hpp
GLSL.std.450.h GLSL.std.450.h
GLSL.ext.KHR.h
GlslangToSpv.h GlslangToSpv.h
Logger.h Logger.h
SpvBuilder.h SpvBuilder.h

51
SPIRV/GLSL.ext.KHR.h Normal file
View File

@ -0,0 +1,51 @@
/*
** Copyright (c) 2014-2016 The Khronos Group Inc.
**
** Permission is hereby granted, free of charge, to any person obtaining a copy
** of this software and/or associated documentation files (the "Materials"),
** to deal in the Materials without restriction, including without limitation
** the rights to use, copy, modify, merge, publish, distribute, sublicense,
** and/or sell copies of the Materials, and to permit persons to whom the
** Materials are furnished to do so, subject to the following conditions:
**
** The above copyright notice and this permission notice shall be included in
** all copies or substantial portions of the Materials.
**
** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS
** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND
** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/
**
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
** THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
** FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS
** IN THE MATERIALS.
*/
#ifndef GLSLextKHR_H
#define GLSLextKHR_H
enum BuiltIn;
enum Op;
enum Capability;
static const int GLSLextKHRVersion = 100;
static const int GLSLextKHRRevision = 1;
// SPV_KHR_shader_ballot
static const char* const E_SPV_KHR_shader_ballot = "SPV_KHR_shader_ballot";
static const BuiltIn BuiltInSubgroupEqMaskKHR = static_cast<BuiltIn>(4416);
static const BuiltIn BuiltInSubgroupGeMaskKHR = static_cast<BuiltIn>(4417);
static const BuiltIn BuiltInSubgroupGtMaskKHR = static_cast<BuiltIn>(4418);
static const BuiltIn BuiltInSubgroupLeMaskKHR = static_cast<BuiltIn>(4419);
static const BuiltIn BuiltInSubgroupLtMaskKHR = static_cast<BuiltIn>(4420);
static const Op OpSubgroupBallotKHR = static_cast<Op>(4421);
static const Op OpSubgroupFirstInvocationKHR = static_cast<Op>(4422);
static const Capability CapabilitySubgroupBallotKHR = static_cast<Capability>(4423);
#endif // #ifndef GLSLextKHR_H

View File

@ -43,6 +43,7 @@
#include "SpvBuilder.h" #include "SpvBuilder.h"
namespace spv { namespace spv {
#include "GLSL.std.450.h" #include "GLSL.std.450.h"
#include "GLSL.ext.KHR.h"
#ifdef AMD_EXTENSIONS #ifdef AMD_EXTENSIONS
#include "GLSL.ext.AMD.h" #include "GLSL.ext.AMD.h"
#endif #endif
@ -154,7 +155,7 @@ protected:
spv::Id createConversion(glslang::TOperator op, spv::Decoration precision, spv::Decoration noContraction, spv::Id destTypeId, spv::Id operand, glslang::TBasicType typeProxy); spv::Id createConversion(glslang::TOperator op, spv::Decoration precision, spv::Decoration noContraction, spv::Id destTypeId, spv::Id operand, glslang::TBasicType typeProxy);
spv::Id makeSmearedConstant(spv::Id constant, int vectorSize); spv::Id makeSmearedConstant(spv::Id constant, int vectorSize);
spv::Id createAtomicOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy); spv::Id createAtomicOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy);
spv::Id createInvocationsOperation(glslang::TOperator op, spv::Id typeId, spv::Id operand, glslang::TBasicType typeProxy); spv::Id createInvocationsOperation(glslang::TOperator op, spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy);
#ifdef AMD_EXTENSIONS #ifdef AMD_EXTENSIONS
spv::Id CreateInvocationsVectorOperation(spv::Op op, spv::Id typeId, spv::Id operand); spv::Id CreateInvocationsVectorOperation(spv::Op op, spv::Id typeId, spv::Id operand);
#endif #endif
@ -521,16 +522,40 @@ 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::EbvSubGroupSize:
builder.addCapability(spv::CapabilitySubgroupBallotKHR);
return spv::BuiltInSubgroupSize;
case glslang::EbvSubGroupInvocation: case glslang::EbvSubGroupInvocation:
builder.addCapability(spv::CapabilitySubgroupBallotKHR);
return spv::BuiltInSubgroupLocalInvocationId;
case glslang::EbvSubGroupEqMask: case glslang::EbvSubGroupEqMask:
builder.addExtension(spv::E_SPV_KHR_shader_ballot);
builder.addCapability(spv::CapabilitySubgroupBallotKHR);
return spv::BuiltInSubgroupEqMaskKHR;
case glslang::EbvSubGroupGeMask: case glslang::EbvSubGroupGeMask:
builder.addExtension(spv::E_SPV_KHR_shader_ballot);
builder.addCapability(spv::CapabilitySubgroupBallotKHR);
return spv::BuiltInSubgroupGeMaskKHR;
case glslang::EbvSubGroupGtMask: case glslang::EbvSubGroupGtMask:
builder.addExtension(spv::E_SPV_KHR_shader_ballot);
builder.addCapability(spv::CapabilitySubgroupBallotKHR);
return spv::BuiltInSubgroupGtMaskKHR;
case glslang::EbvSubGroupLeMask: case glslang::EbvSubGroupLeMask:
builder.addExtension(spv::E_SPV_KHR_shader_ballot);
builder.addCapability(spv::CapabilitySubgroupBallotKHR);
return spv::BuiltInSubgroupLeMaskKHR;
case glslang::EbvSubGroupLtMask: case glslang::EbvSubGroupLtMask:
// TODO: Add SPIR-V builtin ID. builder.addExtension(spv::E_SPV_KHR_shader_ballot);
logger->missingFunctionality("shader ballot"); builder.addCapability(spv::CapabilitySubgroupBallotKHR);
return spv::BuiltInMax; return spv::BuiltInSubgroupLtMaskKHR;
#ifdef AMD_EXTENSIONS #ifdef AMD_EXTENSIONS
case glslang::EbvBaryCoordNoPersp: return spv::BuiltInBaryCoordNoPerspAMD; case glslang::EbvBaryCoordNoPersp: return spv::BuiltInBaryCoordNoPerspAMD;
case glslang::EbvBaryCoordNoPerspCentroid: return spv::BuiltInBaryCoordNoPerspCentroidAMD; case glslang::EbvBaryCoordNoPerspCentroid: return spv::BuiltInBaryCoordNoPerspCentroidAMD;
@ -3610,10 +3635,6 @@ spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, spv:
case glslang::EOpBallot: case glslang::EOpBallot:
case glslang::EOpReadFirstInvocation: case glslang::EOpReadFirstInvocation:
logger->missingFunctionality("shader ballot");
libCall = spv::GLSLstd450Bad;
break;
case glslang::EOpAnyInvocation: case glslang::EOpAnyInvocation:
case glslang::EOpAllInvocations: case glslang::EOpAllInvocations:
case glslang::EOpAllInvocationsEqual: case glslang::EOpAllInvocationsEqual:
@ -3625,7 +3646,11 @@ spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, spv:
case glslang::EOpMaxInvocationsNonUniform: case glslang::EOpMaxInvocationsNonUniform:
case glslang::EOpAddInvocationsNonUniform: case glslang::EOpAddInvocationsNonUniform:
#endif #endif
return createInvocationsOperation(op, typeId, operand, typeProxy); {
std::vector<spv::Id> operands;
operands.push_back(operand);
return createInvocationsOperation(op, typeId, operands, typeProxy);
}
#ifdef AMD_EXTENSIONS #ifdef AMD_EXTENSIONS
case glslang::EOpMbcnt: case glslang::EOpMbcnt:
@ -3959,113 +3984,149 @@ spv::Id TGlslangToSpvTraverser::createAtomicOperation(glslang::TOperator op, spv
} }
// Create group invocation operations. // Create group invocation operations.
spv::Id TGlslangToSpvTraverser::createInvocationsOperation(glslang::TOperator op, spv::Id typeId, spv::Id operand, glslang::TBasicType typeProxy) spv::Id TGlslangToSpvTraverser::createInvocationsOperation(glslang::TOperator op, spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy)
{ {
bool isUnsigned = typeProxy == glslang::EbtUint || typeProxy == glslang::EbtUint64; bool isUnsigned = typeProxy == glslang::EbtUint || typeProxy == glslang::EbtUint64;
bool isFloat = typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble; bool isFloat = typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble;
spv::Op opCode = spv::OpNop;
std::vector<spv::Id> spvGroupOperands;
if (op == glslang::EOpBallot || op == glslang::EOpReadFirstInvocation) {
builder.addExtension(spv::E_SPV_KHR_shader_ballot);
builder.addCapability(spv::CapabilitySubgroupBallotKHR);
} else {
builder.addCapability(spv::CapabilityGroups); builder.addCapability(spv::CapabilityGroups);
std::vector<spv::Id> operands; spvGroupOperands.push_back(builder.makeUintConstant(spv::ScopeSubgroup));
operands.push_back(builder.makeUintConstant(spv::ScopeSubgroup));
#ifdef AMD_EXTENSIONS #ifdef AMD_EXTENSIONS
if (op == glslang::EOpMinInvocations || op == glslang::EOpMaxInvocations || op == glslang::EOpAddInvocations || if (op == glslang::EOpMinInvocations || op == glslang::EOpMaxInvocations || op == glslang::EOpAddInvocations ||
op == glslang::EOpMinInvocationsNonUniform || op == glslang::EOpMaxInvocationsNonUniform || op == glslang::EOpAddInvocationsNonUniform) op == glslang::EOpMinInvocationsNonUniform || op == glslang::EOpMaxInvocationsNonUniform || op == glslang::EOpAddInvocationsNonUniform)
operands.push_back(spv::GroupOperationReduce); spvGroupOperands.push_back(spv::GroupOperationReduce);
#endif #endif
operands.push_back(operand); }
for (auto opIt = operands.begin(); opIt != operands.end(); ++opIt)
spvGroupOperands.push_back(*opIt);
switch (op) { switch (op) {
case glslang::EOpAnyInvocation: case glslang::EOpAnyInvocation:
opCode = spv::OpGroupAny;
break;
case glslang::EOpAllInvocations: case glslang::EOpAllInvocations:
return builder.createOp(op == glslang::EOpAnyInvocation ? spv::OpGroupAny : spv::OpGroupAll, typeId, operands); opCode = spv::OpGroupAll;
break;
case glslang::EOpAllInvocationsEqual: case glslang::EOpAllInvocationsEqual:
{ {
spv::Id groupAll = builder.createOp(spv::OpGroupAll, typeId, operands); spv::Id groupAll = builder.createOp(spv::OpGroupAll, typeId, spvGroupOperands);
spv::Id groupAny = builder.createOp(spv::OpGroupAny, typeId, operands); spv::Id groupAny = builder.createOp(spv::OpGroupAny, typeId, spvGroupOperands);
return builder.createBinOp(spv::OpLogicalOr, typeId, groupAll, return builder.createBinOp(spv::OpLogicalOr, typeId, groupAll,
builder.createUnaryOp(spv::OpLogicalNot, typeId, groupAny)); builder.createUnaryOp(spv::OpLogicalNot, typeId, groupAny));
} }
case glslang::EOpReadInvocation:
opCode = spv::OpGroupBroadcast;
break;
case glslang::EOpReadFirstInvocation:
opCode = spv::OpSubgroupFirstInvocationKHR;
break;
case glslang::EOpBallot:
{
// NOTE: According to the spec, the result type of "OpSubgroupBallotKHR" must be a 4 component vector of 32
// bit integer types. The GLSL built-in function "ballotARB()" assumes the maximum number of invocations in
// a subgroup is 64. Thus, we have to convert uvec4.xy to uint64_t as follow:
//
// result = Bitcast(SubgroupBallotKHR(Predicate).xy)
//
spv::Id uintType = builder.makeUintType(32);
spv::Id uvec4Type = builder.makeVectorType(uintType, 4);
spv::Id result = builder.createOp(spv::OpSubgroupBallotKHR, uvec4Type, spvGroupOperands);
std::vector<spv::Id> components;
components.push_back(builder.createCompositeExtract(result, uintType, 0));
components.push_back(builder.createCompositeExtract(result, uintType, 1));
spv::Id uvec2Type = builder.makeVectorType(uintType, 2);
return builder.createUnaryOp(spv::OpBitcast, typeId,
builder.createCompositeConstruct(uvec2Type, components));
}
#ifdef AMD_EXTENSIONS #ifdef AMD_EXTENSIONS
case glslang::EOpMinInvocations: case glslang::EOpMinInvocations:
case glslang::EOpMaxInvocations: case glslang::EOpMaxInvocations:
case glslang::EOpAddInvocations: case glslang::EOpAddInvocations:
{
spv::Op spvOp = spv::OpNop;
if (op == glslang::EOpMinInvocations) { if (op == glslang::EOpMinInvocations) {
if (isFloat) if (isFloat)
spvOp = spv::OpGroupFMin; opCode = spv::OpGroupFMin;
else { else {
if (isUnsigned) if (isUnsigned)
spvOp = spv::OpGroupUMin; opCode = spv::OpGroupUMin;
else else
spvOp = spv::OpGroupSMin; opCode = spv::OpGroupSMin;
} }
} else if (op == glslang::EOpMaxInvocations) { } else if (op == glslang::EOpMaxInvocations) {
if (isFloat) if (isFloat)
spvOp = spv::OpGroupFMax; opCode = spv::OpGroupFMax;
else { else {
if (isUnsigned) if (isUnsigned)
spvOp = spv::OpGroupUMax; opCode = spv::OpGroupUMax;
else else
spvOp = spv::OpGroupSMax; opCode = spv::OpGroupSMax;
} }
} else { } else {
if (isFloat) if (isFloat)
spvOp = spv::OpGroupFAdd; opCode = spv::OpGroupFAdd;
else else
spvOp = spv::OpGroupIAdd; opCode = spv::OpGroupIAdd;
} }
if (builder.isVectorType(typeId)) if (builder.isVectorType(typeId))
return CreateInvocationsVectorOperation(spvOp, typeId, operand); return CreateInvocationsVectorOperation(opCode, typeId, operands[0]);
else
return builder.createOp(spvOp, typeId, operands); break;
}
case glslang::EOpMinInvocationsNonUniform: case glslang::EOpMinInvocationsNonUniform:
case glslang::EOpMaxInvocationsNonUniform: case glslang::EOpMaxInvocationsNonUniform:
case glslang::EOpAddInvocationsNonUniform: case glslang::EOpAddInvocationsNonUniform:
{
spv::Op spvOp = spv::OpNop;
if (op == glslang::EOpMinInvocationsNonUniform) { if (op == glslang::EOpMinInvocationsNonUniform) {
if (isFloat) if (isFloat)
spvOp = spv::OpGroupFMinNonUniformAMD; opCode = spv::OpGroupFMinNonUniformAMD;
else { else {
if (isUnsigned) if (isUnsigned)
spvOp = spv::OpGroupUMinNonUniformAMD; opCode = spv::OpGroupUMinNonUniformAMD;
else else
spvOp = spv::OpGroupSMinNonUniformAMD; opCode = spv::OpGroupSMinNonUniformAMD;
} }
} }
else if (op == glslang::EOpMaxInvocationsNonUniform) { else if (op == glslang::EOpMaxInvocationsNonUniform) {
if (isFloat) if (isFloat)
spvOp = spv::OpGroupFMaxNonUniformAMD; opCode = spv::OpGroupFMaxNonUniformAMD;
else { else {
if (isUnsigned) if (isUnsigned)
spvOp = spv::OpGroupUMaxNonUniformAMD; opCode = spv::OpGroupUMaxNonUniformAMD;
else else
spvOp = spv::OpGroupSMaxNonUniformAMD; opCode = spv::OpGroupSMaxNonUniformAMD;
} }
} }
else { else {
if (isFloat) if (isFloat)
spvOp = spv::OpGroupFAddNonUniformAMD; opCode = spv::OpGroupFAddNonUniformAMD;
else else
spvOp = spv::OpGroupIAddNonUniformAMD; opCode = spv::OpGroupIAddNonUniformAMD;
} }
if (builder.isVectorType(typeId)) if (builder.isVectorType(typeId))
return CreateInvocationsVectorOperation(spvOp, typeId, operand); return CreateInvocationsVectorOperation(opCode, typeId, operands[0]);
else
return builder.createOp(spvOp, typeId, operands); break;
}
#endif #endif
default: default:
logger->missingFunctionality("invocation operation"); logger->missingFunctionality("invocation operation");
return spv::NoResult; return spv::NoResult;
} }
assert(opCode != spv::OpNop);
return builder.createOp(opCode, typeId, spvGroupOperands);
} }
#ifdef AMD_EXTENSIONS #ifdef AMD_EXTENSIONS
@ -4256,9 +4317,7 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv::
break; break;
case glslang::EOpReadInvocation: case glslang::EOpReadInvocation:
logger->missingFunctionality("shader ballot"); return createInvocationsOperation(op, typeId, operands, typeProxy);
libCall = spv::GLSLstd450Bad;
break;
#ifdef AMD_EXTENSIONS #ifdef AMD_EXTENSIONS
case glslang::EOpSwizzleInvocations: case glslang::EOpSwizzleInvocations:
@ -4825,7 +4884,7 @@ spv::Id TGlslangToSpvTraverser::getExtBuiltins(const char* name)
if (extBuiltinMap.find(name) != extBuiltinMap.end()) if (extBuiltinMap.find(name) != extBuiltinMap.end())
return extBuiltinMap[name]; return extBuiltinMap[name];
else { else {
builder.addExtensions(name); builder.addExtension(name);
spv::Id extBuiltins = builder.import(name); spv::Id extBuiltins = builder.import(name);
extBuiltinMap[name] = extBuiltins; extBuiltinMap[name] = extBuiltins;
return extBuiltins; return extBuiltins;

View File

@ -2318,9 +2318,9 @@ void Builder::dump(std::vector<unsigned int>& out) const
capInst.dump(out); capInst.dump(out);
} }
for (int e = 0; e < (int)extensions.size(); ++e) { for (auto it = extensions.cbegin(); it != extensions.cend(); ++it) {
Instruction extInst(0, 0, OpExtension); Instruction extInst(0, 0, OpExtension);
extInst.addStringOperand(extensions[e]); extInst.addStringOperand(*it);
extInst.dump(out); extInst.dump(out);
} }

View File

@ -71,7 +71,7 @@ public:
sourceVersion = version; sourceVersion = version;
} }
void addSourceExtension(const char* ext) { sourceExtensions.push_back(ext); } void addSourceExtension(const char* ext) { sourceExtensions.push_back(ext); }
void addExtensions(const char* ext) { extensions.push_back(ext); } void addExtension(const char* ext) { extensions.insert(ext); }
Id import(const char*); Id import(const char*);
void setMemoryModel(spv::AddressingModel addr, spv::MemoryModel mem) void setMemoryModel(spv::AddressingModel addr, spv::MemoryModel mem)
{ {
@ -552,7 +552,7 @@ public:
SourceLanguage source; SourceLanguage source;
int sourceVersion; int sourceVersion;
std::vector<const char*> extensions; std::set<const char*> extensions;
std::vector<const char*> sourceExtensions; std::vector<const char*> sourceExtensions;
AddressingModel addressModel; AddressingModel addressModel;
MemoryModel memoryModel; MemoryModel memoryModel;

View File

@ -45,14 +45,15 @@
#include <cstring> #include <cstring>
#include <algorithm> #include <algorithm>
#ifdef AMD_EXTENSIONS
namespace spv { namespace spv {
extern "C" { extern "C" {
// Include C-based headers that don't have a namespace // Include C-based headers that don't have a namespace
#include "GLSL.ext.KHR.h"
#ifdef AMD_EXTENSIONS
#include "GLSL.ext.AMD.h" #include "GLSL.ext.AMD.h"
#endif
} }
} }
#endif
namespace spv { namespace spv {
@ -312,6 +313,12 @@ const char* BuiltInString(int builtIn)
case BuiltInCeiling: case BuiltInCeiling:
default: return "Bad"; default: return "Bad";
case 4416: return "SubgroupEqMaskKHR";
case 4417: return "SubgroupGeMaskKHR";
case 4418: return "SubgroupGtMaskKHR";
case 4419: return "SubgroupLeMaskKHR";
case 4420: return "SubgroupLtMaskKHR";
#ifdef AMD_EXTENSIONS #ifdef AMD_EXTENSIONS
case 4992: return "BaryCoordNoPerspAMD"; case 4992: return "BaryCoordNoPerspAMD";
case 4993: return "BaryCoordNoPerspCentroidAMD"; case 4993: return "BaryCoordNoPerspCentroidAMD";
@ -799,6 +806,8 @@ const char* CapabilityString(int info)
case CapabilityCeiling: case CapabilityCeiling:
default: return "Bad"; default: return "Bad";
case 4423: return "SubgroupBallotKHR";
} }
} }
@ -1131,6 +1140,9 @@ const char* OpcodeString(int op)
default: default:
return "Bad"; return "Bad";
case 4421: return "OpSubgroupBallotKHR";
case 4422: return "OpSubgroupFirstInvocationKHR";
#ifdef AMD_EXTENSIONS #ifdef AMD_EXTENSIONS
case 5000: return "OpGroupIAddNonUniformAMD"; case 5000: return "OpGroupIAddNonUniformAMD";
case 5001: return "OpGroupFAddNonUniformAMD"; case 5001: return "OpGroupFAddNonUniformAMD";
@ -1146,11 +1158,7 @@ const char* OpcodeString(int op)
// The set of objects that hold all the instruction/operand // The set of objects that hold all the instruction/operand
// parameterization information. // parameterization information.
#ifdef AMD_EXTENSIONS
InstructionParameters InstructionDesc[OpCodeMask + 1]; InstructionParameters InstructionDesc[OpCodeMask + 1];
#else
InstructionParameters InstructionDesc[OpcodeCeiling];
#endif
OperandParameters ExecutionModeOperands[ExecutionModeCeiling]; OperandParameters ExecutionModeOperands[ExecutionModeCeiling];
OperandParameters DecorationOperands[DecorationCeiling]; OperandParameters DecorationOperands[DecorationCeiling];
@ -2742,6 +2750,10 @@ void Parameterize()
InstructionDesc[OpEnqueueMarker].operands.push(OperandId, "'Wait Events'"); InstructionDesc[OpEnqueueMarker].operands.push(OperandId, "'Wait Events'");
InstructionDesc[OpEnqueueMarker].operands.push(OperandId, "'Ret Event'"); InstructionDesc[OpEnqueueMarker].operands.push(OperandId, "'Ret Event'");
InstructionDesc[OpSubgroupBallotKHR].operands.push(OperandId, "'Predicate'");
InstructionDesc[OpSubgroupFirstInvocationKHR].operands.push(OperandId, "'Value'");
#ifdef AMD_EXTENSIONS #ifdef AMD_EXTENSIONS
InstructionDesc[OpGroupIAddNonUniformAMD].capabilities.push_back(CapabilityGroups); InstructionDesc[OpGroupIAddNonUniformAMD].capabilities.push_back(CapabilityGroups);
InstructionDesc[OpGroupIAddNonUniformAMD].operands.push(OperandScope, "'Execution'"); InstructionDesc[OpGroupIAddNonUniformAMD].operands.push(OperandScope, "'Execution'");

View File

@ -5,16 +5,18 @@ Warning, version 450 is not yet complete; most version-specific features are pre
Linked compute stage: Linked compute stage:
Missing functionality: shader ballot
// Module Version 10000 // Module Version 10000
// Generated by (magic number): 80001 // Generated by (magic number): 80001
// Id's are bound by 241 // Id's are bound by 245
Capability Shader Capability Shader
Capability Int64 Capability Int64
Capability Groups
Capability SubgroupBallotKHR
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 22 24 27 30 33 EntryPoint GLCompute 4 "main" 10 12 21 23 26 29 32
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"
@ -22,293 +24,304 @@ Missing functionality: shader ballot
Name 4 "main" Name 4 "main"
Name 8 "invocation" Name 8 "invocation"
Name 10 "gl_SubGroupInvocationARB" Name 10 "gl_SubGroupInvocationARB"
Name 13 "gl_SubGroupSizeARB" Name 12 "gl_SubGroupSizeARB"
Name 20 "relMask" Name 19 "relMask"
Name 22 "gl_SubGroupEqMaskARB" Name 21 "gl_SubGroupEqMaskARB"
Name 24 "gl_SubGroupGeMaskARB" Name 23 "gl_SubGroupGeMaskARB"
Name 27 "gl_SubGroupGtMaskARB" Name 26 "gl_SubGroupGtMaskARB"
Name 30 "gl_SubGroupLeMaskARB" Name 29 "gl_SubGroupLeMaskARB"
Name 33 "gl_SubGroupLtMaskARB" Name 32 "gl_SubGroupLtMaskARB"
Name 48 "Buffers" Name 52 "Buffers"
MemberName 48(Buffers) 0 "f4" MemberName 52(Buffers) 0 "f4"
MemberName 48(Buffers) 1 "i4" MemberName 52(Buffers) 1 "i4"
MemberName 48(Buffers) 2 "u4" MemberName 52(Buffers) 2 "u4"
Name 51 "data" Name 55 "data"
MemberDecorate 48(Buffers) 0 Offset 0 Decorate 10(gl_SubGroupInvocationARB) BuiltIn SubgroupLocalInvocationId
MemberDecorate 48(Buffers) 1 Offset 16 Decorate 12(gl_SubGroupSizeARB) BuiltIn SubgroupSize
MemberDecorate 48(Buffers) 2 Offset 32 Decorate 21(gl_SubGroupEqMaskARB) BuiltIn SubgroupEqMaskKHR
Decorate 48(Buffers) BufferBlock Decorate 23(gl_SubGroupGeMaskARB) BuiltIn SubgroupGeMaskKHR
Decorate 51(data) DescriptorSet 0 Decorate 26(gl_SubGroupGtMaskARB) BuiltIn SubgroupGtMaskKHR
Decorate 51(data) Binding 0 Decorate 29(gl_SubGroupLeMaskARB) BuiltIn SubgroupLeMaskKHR
Decorate 240 BuiltIn WorkgroupSize Decorate 32(gl_SubGroupLtMaskARB) BuiltIn SubgroupLtMaskKHR
MemberDecorate 52(Buffers) 0 Offset 0
MemberDecorate 52(Buffers) 1 Offset 16
MemberDecorate 52(Buffers) 2 Offset 32
Decorate 52(Buffers) BufferBlock
Decorate 55(data) DescriptorSet 0
Decorate 55(data) Binding 0
Decorate 244 BuiltIn WorkgroupSize
2: TypeVoid 2: TypeVoid
3: TypeFunction 2 3: TypeFunction 2
6: TypeInt 32 0 6: TypeInt 32 0
7: TypePointer Function 6(int) 7: TypePointer Function 6(int)
9: TypePointer Input 6(int) 9: TypePointer Input 6(int)
10(gl_SubGroupInvocationARB): 9(ptr) Variable Input 10(gl_SubGroupInvocationARB): 9(ptr) Variable Input
12: TypePointer UniformConstant 6(int) 12(gl_SubGroupSizeARB): 9(ptr) Variable Input
13(gl_SubGroupSizeARB): 12(ptr) Variable UniformConstant 15: 6(int) Constant 4
16: 6(int) Constant 4 17: TypeInt 64 0
18: TypeInt 64 0 18: TypePointer Function 17(int)
19: TypePointer Function 18(int) 20: TypePointer Input 17(int)
21: TypePointer Input 18(int) 21(gl_SubGroupEqMaskARB): 20(ptr) Variable Input
22(gl_SubGroupEqMaskARB): 21(ptr) Variable Input 23(gl_SubGroupGeMaskARB): 20(ptr) Variable Input
24(gl_SubGroupGeMaskARB): 21(ptr) Variable Input 26(gl_SubGroupGtMaskARB): 20(ptr) Variable Input
27(gl_SubGroupGtMaskARB): 21(ptr) Variable Input 29(gl_SubGroupLeMaskARB): 20(ptr) Variable Input
30(gl_SubGroupLeMaskARB): 21(ptr) Variable Input 32(gl_SubGroupLtMaskARB): 20(ptr) Variable Input
33(gl_SubGroupLtMaskARB): 21(ptr) Variable Input 36: TypeBool
37: TypeBool 37: 36(bool) ConstantTrue
38: 37(bool) ConstantTrue 38: TypeVector 6(int) 4
43: TypeFloat 32 42: TypeVector 6(int) 2
44: TypeVector 43(float) 4 48: TypeFloat 32
45: TypeInt 32 1 49: TypeVector 48(float) 4
46: TypeVector 45(int) 4 50: TypeInt 32 1
47: TypeVector 6(int) 4 51: TypeVector 50(int) 4
48(Buffers): TypeStruct 44(fvec4) 46(ivec4) 47(ivec4) 52(Buffers): TypeStruct 49(fvec4) 51(ivec4) 38(ivec4)
49: TypeArray 48(Buffers) 16 53: TypeArray 52(Buffers) 15
50: TypePointer Uniform 49 54: TypePointer Uniform 53
51(data): 50(ptr) Variable Uniform 55(data): 54(ptr) Variable Uniform
53: 45(int) Constant 0 57: 50(int) Constant 0
54: 6(int) Constant 0 58: 6(int) Constant 0
55: TypePointer Uniform 43(float) 59: TypePointer Uniform 48(float)
62: 45(int) Constant 1 63: 6(int) Constant 3
63: TypeVector 43(float) 2 67: 50(int) Constant 1
64: TypePointer Uniform 44(fvec4) 68: TypeVector 48(float) 2
74: 45(int) Constant 2 69: TypePointer Uniform 49(fvec4)
75: TypeVector 43(float) 3 79: 50(int) Constant 2
85: 45(int) Constant 3 80: TypeVector 48(float) 3
92: TypePointer Uniform 45(int) 90: 50(int) Constant 3
99: TypeVector 45(int) 2 97: TypePointer Uniform 50(int)
100: TypePointer Uniform 46(ivec4) 104: TypeVector 50(int) 2
110: TypeVector 45(int) 3 105: TypePointer Uniform 51(ivec4)
126: TypePointer Uniform 6(int) 115: TypeVector 50(int) 3
133: TypeVector 6(int) 2 131: TypePointer Uniform 6(int)
134: TypePointer Uniform 47(ivec4) 138: TypePointer Uniform 38(ivec4)
144: TypeVector 6(int) 3 148: TypeVector 6(int) 3
238: 6(int) Constant 8 242: 6(int) Constant 8
239: 6(int) Constant 1 243: 6(int) Constant 1
240: 144(ivec3) ConstantComposite 238 238 239 244: 148(ivec3) ConstantComposite 242 242 243
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
20(relMask): 19(ptr) Variable Function 19(relMask): 18(ptr) Variable Function
11: 6(int) Load 10(gl_SubGroupInvocationARB) 11: 6(int) Load 10(gl_SubGroupInvocationARB)
14: 6(int) Load 13(gl_SubGroupSizeARB) 13: 6(int) Load 12(gl_SubGroupSizeARB)
15: 6(int) IAdd 11 14 14: 6(int) IAdd 11 13
17: 6(int) UMod 15 16 16: 6(int) UMod 14 15
Store 8(invocation) 17 Store 8(invocation) 16
23: 18(int) Load 22(gl_SubGroupEqMaskARB) 22: 17(int) Load 21(gl_SubGroupEqMaskARB)
25: 18(int) Load 24(gl_SubGroupGeMaskARB) 24: 17(int) Load 23(gl_SubGroupGeMaskARB)
26: 18(int) IAdd 23 25 25: 17(int) IAdd 22 24
28: 18(int) Load 27(gl_SubGroupGtMaskARB) 27: 17(int) Load 26(gl_SubGroupGtMaskARB)
29: 18(int) IAdd 26 28 28: 17(int) IAdd 25 27
31: 18(int) Load 30(gl_SubGroupLeMaskARB) 30: 17(int) Load 29(gl_SubGroupLeMaskARB)
32: 18(int) IAdd 29 31 31: 17(int) IAdd 28 30
34: 18(int) Load 33(gl_SubGroupLtMaskARB) 33: 17(int) Load 32(gl_SubGroupLtMaskARB)
35: 18(int) IAdd 32 34 34: 17(int) IAdd 31 33
Store 20(relMask) 35 Store 19(relMask) 34
36: 18(int) Load 20(relMask) 35: 17(int) Load 19(relMask)
39: 18(int) ExtInst 1(GLSL.std.450) 0(Unknown) 38 39: 38(ivec4) SubgroupBallotKHR 37
40: 37(bool) IEqual 36 39 40: 6(int) CompositeExtract 39 0
SelectionMerge 42 None 41: 6(int) CompositeExtract 39 1
BranchConditional 40 41 159 43: 42(ivec2) CompositeConstruct 40 41
41: Label 44: 17(int) Bitcast 43
52: 6(int) Load 8(invocation) 45: 36(bool) IEqual 35 44
56: 55(ptr) AccessChain 51(data) 53 53 54 SelectionMerge 47 None
57: 43(float) Load 56 BranchConditional 45 46 163
58: 6(int) Load 8(invocation) 46: Label
59: 43(float) ExtInst 1(GLSL.std.450) 0(Unknown) 57 58 56: 6(int) Load 8(invocation)
60: 55(ptr) AccessChain 51(data) 52 53 54 60: 59(ptr) AccessChain 55(data) 57 57 58
Store 60 59 61: 48(float) Load 60
61: 6(int) Load 8(invocation) 62: 6(int) Load 8(invocation)
65: 64(ptr) AccessChain 51(data) 62 53 64: 48(float) GroupBroadcast 63 61 62
66: 44(fvec4) Load 65 65: 59(ptr) AccessChain 55(data) 56 57 58
67: 63(fvec2) VectorShuffle 66 66 0 1 Store 65 64
68: 6(int) Load 8(invocation) 66: 6(int) Load 8(invocation)
69: 63(fvec2) ExtInst 1(GLSL.std.450) 0(Unknown) 67 68 70: 69(ptr) AccessChain 55(data) 67 57
70: 64(ptr) AccessChain 51(data) 61 53 71: 49(fvec4) Load 70
71: 44(fvec4) Load 70 72: 68(fvec2) VectorShuffle 71 71 0 1
72: 44(fvec4) VectorShuffle 71 69 4 5 2 3
Store 70 72
73: 6(int) Load 8(invocation) 73: 6(int) Load 8(invocation)
76: 64(ptr) AccessChain 51(data) 74 53 74: 68(fvec2) GroupBroadcast 63 72 73
77: 44(fvec4) Load 76 75: 69(ptr) AccessChain 55(data) 66 57
78: 75(fvec3) VectorShuffle 77 77 0 1 2 76: 49(fvec4) Load 75
79: 6(int) Load 8(invocation) 77: 49(fvec4) VectorShuffle 76 74 4 5 2 3
80: 75(fvec3) ExtInst 1(GLSL.std.450) 0(Unknown) 78 79 Store 75 77
81: 64(ptr) AccessChain 51(data) 73 53 78: 6(int) Load 8(invocation)
82: 44(fvec4) Load 81 81: 69(ptr) AccessChain 55(data) 79 57
83: 44(fvec4) VectorShuffle 82 80 4 5 6 3 82: 49(fvec4) Load 81
Store 81 83 83: 80(fvec3) VectorShuffle 82 82 0 1 2
84: 6(int) Load 8(invocation) 84: 6(int) Load 8(invocation)
86: 64(ptr) AccessChain 51(data) 85 53 85: 80(fvec3) GroupBroadcast 63 83 84
87: 44(fvec4) Load 86 86: 69(ptr) AccessChain 55(data) 78 57
88: 6(int) Load 8(invocation) 87: 49(fvec4) Load 86
89: 44(fvec4) ExtInst 1(GLSL.std.450) 0(Unknown) 87 88 88: 49(fvec4) VectorShuffle 87 85 4 5 6 3
90: 64(ptr) AccessChain 51(data) 84 53 Store 86 88
Store 90 89 89: 6(int) Load 8(invocation)
91: 6(int) Load 8(invocation) 91: 69(ptr) AccessChain 55(data) 90 57
93: 92(ptr) AccessChain 51(data) 53 62 54 92: 49(fvec4) Load 91
94: 45(int) Load 93 93: 6(int) Load 8(invocation)
95: 6(int) Load 8(invocation) 94: 49(fvec4) GroupBroadcast 63 92 93
96: 45(int) ExtInst 1(GLSL.std.450) 0(Unknown) 94 95 95: 69(ptr) AccessChain 55(data) 89 57
97: 92(ptr) AccessChain 51(data) 91 62 54 Store 95 94
Store 97 96 96: 6(int) Load 8(invocation)
98: 6(int) Load 8(invocation) 98: 97(ptr) AccessChain 55(data) 57 67 58
101: 100(ptr) AccessChain 51(data) 62 62 99: 50(int) Load 98
102: 46(ivec4) Load 101 100: 6(int) Load 8(invocation)
103: 99(ivec2) VectorShuffle 102 102 0 1 101: 50(int) GroupBroadcast 63 99 100
104: 6(int) Load 8(invocation) 102: 97(ptr) AccessChain 55(data) 96 67 58
105: 99(ivec2) ExtInst 1(GLSL.std.450) 0(Unknown) 103 104 Store 102 101
106: 100(ptr) AccessChain 51(data) 98 62 103: 6(int) Load 8(invocation)
107: 46(ivec4) Load 106 106: 105(ptr) AccessChain 55(data) 67 67
108: 46(ivec4) VectorShuffle 107 105 4 5 2 3 107: 51(ivec4) Load 106
Store 106 108 108: 104(ivec2) VectorShuffle 107 107 0 1
109: 6(int) Load 8(invocation) 109: 6(int) Load 8(invocation)
111: 100(ptr) AccessChain 51(data) 74 62 110: 104(ivec2) GroupBroadcast 63 108 109
112: 46(ivec4) Load 111 111: 105(ptr) AccessChain 55(data) 103 67
113: 110(ivec3) VectorShuffle 112 112 0 1 2 112: 51(ivec4) Load 111
113: 51(ivec4) VectorShuffle 112 110 4 5 2 3
Store 111 113
114: 6(int) Load 8(invocation) 114: 6(int) Load 8(invocation)
115: 110(ivec3) ExtInst 1(GLSL.std.450) 0(Unknown) 113 114 116: 105(ptr) AccessChain 55(data) 79 67
116: 100(ptr) AccessChain 51(data) 109 62 117: 51(ivec4) Load 116
117: 46(ivec4) Load 116 118: 115(ivec3) VectorShuffle 117 117 0 1 2
118: 46(ivec4) VectorShuffle 117 115 4 5 6 3
Store 116 118
119: 6(int) Load 8(invocation) 119: 6(int) Load 8(invocation)
120: 100(ptr) AccessChain 51(data) 85 62 120: 115(ivec3) GroupBroadcast 63 118 119
121: 46(ivec4) Load 120 121: 105(ptr) AccessChain 55(data) 114 67
122: 6(int) Load 8(invocation) 122: 51(ivec4) Load 121
123: 46(ivec4) ExtInst 1(GLSL.std.450) 0(Unknown) 121 122 123: 51(ivec4) VectorShuffle 122 120 4 5 6 3
124: 100(ptr) AccessChain 51(data) 119 62 Store 121 123
Store 124 123 124: 6(int) Load 8(invocation)
125: 6(int) Load 8(invocation) 125: 105(ptr) AccessChain 55(data) 90 67
127: 126(ptr) AccessChain 51(data) 53 74 54 126: 51(ivec4) Load 125
128: 6(int) Load 127 127: 6(int) Load 8(invocation)
129: 6(int) Load 8(invocation) 128: 51(ivec4) GroupBroadcast 63 126 127
130: 6(int) ExtInst 1(GLSL.std.450) 0(Unknown) 128 129 129: 105(ptr) AccessChain 55(data) 124 67
131: 126(ptr) AccessChain 51(data) 125 74 54 Store 129 128
Store 131 130 130: 6(int) Load 8(invocation)
132: 6(int) Load 8(invocation) 132: 131(ptr) AccessChain 55(data) 57 79 58
135: 134(ptr) AccessChain 51(data) 62 74 133: 6(int) Load 132
136: 47(ivec4) Load 135 134: 6(int) Load 8(invocation)
137: 133(ivec2) VectorShuffle 136 136 0 1 135: 6(int) GroupBroadcast 63 133 134
138: 6(int) Load 8(invocation) 136: 131(ptr) AccessChain 55(data) 130 79 58
139: 133(ivec2) ExtInst 1(GLSL.std.450) 0(Unknown) 137 138 Store 136 135
140: 134(ptr) AccessChain 51(data) 132 74 137: 6(int) Load 8(invocation)
141: 47(ivec4) Load 140 139: 138(ptr) AccessChain 55(data) 67 79
142: 47(ivec4) VectorShuffle 141 139 4 5 2 3 140: 38(ivec4) Load 139
Store 140 142 141: 42(ivec2) VectorShuffle 140 140 0 1
143: 6(int) Load 8(invocation) 142: 6(int) Load 8(invocation)
145: 134(ptr) AccessChain 51(data) 74 74 143: 42(ivec2) GroupBroadcast 63 141 142
146: 47(ivec4) Load 145 144: 138(ptr) AccessChain 55(data) 137 79
147: 144(ivec3) VectorShuffle 146 146 0 1 2 145: 38(ivec4) Load 144
148: 6(int) Load 8(invocation) 146: 38(ivec4) VectorShuffle 145 143 4 5 2 3
149: 144(ivec3) ExtInst 1(GLSL.std.450) 0(Unknown) 147 148 Store 144 146
150: 134(ptr) AccessChain 51(data) 143 74 147: 6(int) Load 8(invocation)
151: 47(ivec4) Load 150 149: 138(ptr) AccessChain 55(data) 79 79
152: 47(ivec4) VectorShuffle 151 149 4 5 6 3 150: 38(ivec4) Load 149
Store 150 152 151: 148(ivec3) VectorShuffle 150 150 0 1 2
153: 6(int) Load 8(invocation) 152: 6(int) Load 8(invocation)
154: 134(ptr) AccessChain 51(data) 85 74 153: 148(ivec3) GroupBroadcast 63 151 152
155: 47(ivec4) Load 154 154: 138(ptr) AccessChain 55(data) 147 79
156: 6(int) Load 8(invocation) 155: 38(ivec4) Load 154
157: 47(ivec4) ExtInst 1(GLSL.std.450) 0(Unknown) 155 156 156: 38(ivec4) VectorShuffle 155 153 4 5 6 3
158: 134(ptr) AccessChain 51(data) 153 74 Store 154 156
Store 158 157 157: 6(int) Load 8(invocation)
Branch 42 158: 138(ptr) AccessChain 55(data) 90 79
159: Label 159: 38(ivec4) Load 158
160: 6(int) Load 8(invocation) 160: 6(int) Load 8(invocation)
161: 55(ptr) AccessChain 51(data) 53 53 54 161: 38(ivec4) GroupBroadcast 63 159 160
162: 43(float) Load 161 162: 138(ptr) AccessChain 55(data) 157 79
163: 43(float) ExtInst 1(GLSL.std.450) 0(Unknown) 162 Store 162 161
164: 55(ptr) AccessChain 51(data) 160 53 54 Branch 47
Store 164 163 163: Label
165: 6(int) Load 8(invocation) 164: 6(int) Load 8(invocation)
166: 64(ptr) AccessChain 51(data) 62 53 165: 59(ptr) AccessChain 55(data) 57 57 58
167: 44(fvec4) Load 166 166: 48(float) Load 165
168: 63(fvec2) VectorShuffle 167 167 0 1 167: 48(float) SubgroupFirstInvocationKHR 166
169: 63(fvec2) ExtInst 1(GLSL.std.450) 0(Unknown) 168 168: 59(ptr) AccessChain 55(data) 164 57 58
170: 64(ptr) AccessChain 51(data) 165 53 Store 168 167
171: 44(fvec4) Load 170 169: 6(int) Load 8(invocation)
172: 44(fvec4) VectorShuffle 171 169 4 5 2 3 170: 69(ptr) AccessChain 55(data) 67 57
Store 170 172 171: 49(fvec4) Load 170
173: 6(int) Load 8(invocation) 172: 68(fvec2) VectorShuffle 171 171 0 1
174: 64(ptr) AccessChain 51(data) 74 53 173: 68(fvec2) SubgroupFirstInvocationKHR 172
175: 44(fvec4) Load 174 174: 69(ptr) AccessChain 55(data) 169 57
176: 75(fvec3) VectorShuffle 175 175 0 1 2 175: 49(fvec4) Load 174
177: 75(fvec3) ExtInst 1(GLSL.std.450) 0(Unknown) 176 176: 49(fvec4) VectorShuffle 175 173 4 5 2 3
178: 64(ptr) AccessChain 51(data) 173 53 Store 174 176
179: 44(fvec4) Load 178 177: 6(int) Load 8(invocation)
180: 44(fvec4) VectorShuffle 179 177 4 5 6 3 178: 69(ptr) AccessChain 55(data) 79 57
Store 178 180 179: 49(fvec4) Load 178
181: 6(int) Load 8(invocation) 180: 80(fvec3) VectorShuffle 179 179 0 1 2
182: 64(ptr) AccessChain 51(data) 85 53 181: 80(fvec3) SubgroupFirstInvocationKHR 180
183: 44(fvec4) Load 182 182: 69(ptr) AccessChain 55(data) 177 57
184: 44(fvec4) ExtInst 1(GLSL.std.450) 0(Unknown) 183 183: 49(fvec4) Load 182
185: 64(ptr) AccessChain 51(data) 181 53 184: 49(fvec4) VectorShuffle 183 181 4 5 6 3
Store 185 184 Store 182 184
186: 6(int) Load 8(invocation) 185: 6(int) Load 8(invocation)
187: 92(ptr) AccessChain 51(data) 53 62 54 186: 69(ptr) AccessChain 55(data) 90 57
188: 45(int) Load 187 187: 49(fvec4) Load 186
189: 45(int) ExtInst 1(GLSL.std.450) 0(Unknown) 188 188: 49(fvec4) SubgroupFirstInvocationKHR 187
190: 92(ptr) AccessChain 51(data) 186 62 54 189: 69(ptr) AccessChain 55(data) 185 57
Store 190 189 Store 189 188
191: 6(int) Load 8(invocation) 190: 6(int) Load 8(invocation)
192: 100(ptr) AccessChain 51(data) 62 62 191: 97(ptr) AccessChain 55(data) 57 67 58
193: 46(ivec4) Load 192 192: 50(int) Load 191
194: 99(ivec2) VectorShuffle 193 193 0 1 193: 50(int) SubgroupFirstInvocationKHR 192
195: 99(ivec2) ExtInst 1(GLSL.std.450) 0(Unknown) 194 194: 97(ptr) AccessChain 55(data) 190 67 58
196: 100(ptr) AccessChain 51(data) 191 62 Store 194 193
197: 46(ivec4) Load 196 195: 6(int) Load 8(invocation)
198: 46(ivec4) VectorShuffle 197 195 4 5 2 3 196: 105(ptr) AccessChain 55(data) 67 67
Store 196 198 197: 51(ivec4) Load 196
199: 6(int) Load 8(invocation) 198: 104(ivec2) VectorShuffle 197 197 0 1
200: 100(ptr) AccessChain 51(data) 74 62 199: 104(ivec2) SubgroupFirstInvocationKHR 198
201: 46(ivec4) Load 200 200: 105(ptr) AccessChain 55(data) 195 67
202: 110(ivec3) VectorShuffle 201 201 0 1 2 201: 51(ivec4) Load 200
203: 110(ivec3) ExtInst 1(GLSL.std.450) 0(Unknown) 202 202: 51(ivec4) VectorShuffle 201 199 4 5 2 3
204: 100(ptr) AccessChain 51(data) 199 62 Store 200 202
205: 46(ivec4) Load 204 203: 6(int) Load 8(invocation)
206: 46(ivec4) VectorShuffle 205 203 4 5 6 3 204: 105(ptr) AccessChain 55(data) 79 67
Store 204 206 205: 51(ivec4) Load 204
207: 6(int) Load 8(invocation) 206: 115(ivec3) VectorShuffle 205 205 0 1 2
208: 100(ptr) AccessChain 51(data) 85 62 207: 115(ivec3) SubgroupFirstInvocationKHR 206
209: 46(ivec4) Load 208 208: 105(ptr) AccessChain 55(data) 203 67
210: 46(ivec4) ExtInst 1(GLSL.std.450) 0(Unknown) 209 209: 51(ivec4) Load 208
211: 100(ptr) AccessChain 51(data) 207 62 210: 51(ivec4) VectorShuffle 209 207 4 5 6 3
Store 211 210 Store 208 210
212: 6(int) Load 8(invocation) 211: 6(int) Load 8(invocation)
213: 126(ptr) AccessChain 51(data) 53 74 54 212: 105(ptr) AccessChain 55(data) 90 67
214: 6(int) Load 213 213: 51(ivec4) Load 212
215: 6(int) ExtInst 1(GLSL.std.450) 0(Unknown) 214 214: 51(ivec4) SubgroupFirstInvocationKHR 213
216: 126(ptr) AccessChain 51(data) 212 74 54 215: 105(ptr) AccessChain 55(data) 211 67
Store 216 215 Store 215 214
217: 6(int) Load 8(invocation) 216: 6(int) Load 8(invocation)
218: 134(ptr) AccessChain 51(data) 62 74 217: 131(ptr) AccessChain 55(data) 57 79 58
219: 47(ivec4) Load 218 218: 6(int) Load 217
220: 133(ivec2) VectorShuffle 219 219 0 1 219: 6(int) SubgroupFirstInvocationKHR 218
221: 133(ivec2) ExtInst 1(GLSL.std.450) 0(Unknown) 220 220: 131(ptr) AccessChain 55(data) 216 79 58
222: 134(ptr) AccessChain 51(data) 217 74 Store 220 219
223: 47(ivec4) Load 222 221: 6(int) Load 8(invocation)
224: 47(ivec4) VectorShuffle 223 221 4 5 2 3 222: 138(ptr) AccessChain 55(data) 67 79
Store 222 224 223: 38(ivec4) Load 222
225: 6(int) Load 8(invocation) 224: 42(ivec2) VectorShuffle 223 223 0 1
226: 134(ptr) AccessChain 51(data) 74 74 225: 42(ivec2) SubgroupFirstInvocationKHR 224
227: 47(ivec4) Load 226 226: 138(ptr) AccessChain 55(data) 221 79
228: 144(ivec3) VectorShuffle 227 227 0 1 2 227: 38(ivec4) Load 226
229: 144(ivec3) ExtInst 1(GLSL.std.450) 0(Unknown) 228 228: 38(ivec4) VectorShuffle 227 225 4 5 2 3
230: 134(ptr) AccessChain 51(data) 225 74 Store 226 228
231: 47(ivec4) Load 230 229: 6(int) Load 8(invocation)
232: 47(ivec4) VectorShuffle 231 229 4 5 6 3 230: 138(ptr) AccessChain 55(data) 79 79
Store 230 232 231: 38(ivec4) Load 230
233: 6(int) Load 8(invocation) 232: 148(ivec3) VectorShuffle 231 231 0 1 2
234: 134(ptr) AccessChain 51(data) 85 74 233: 148(ivec3) SubgroupFirstInvocationKHR 232
235: 47(ivec4) Load 234 234: 138(ptr) AccessChain 55(data) 229 79
236: 47(ivec4) ExtInst 1(GLSL.std.450) 0(Unknown) 235 235: 38(ivec4) Load 234
237: 134(ptr) AccessChain 51(data) 233 74 236: 38(ivec4) VectorShuffle 235 233 4 5 6 3
Store 237 236 Store 234 236
Branch 42 237: 6(int) Load 8(invocation)
42: Label 238: 138(ptr) AccessChain 55(data) 90 79
239: 38(ivec4) Load 238
240: 38(ivec4) SubgroupFirstInvocationKHR 239
241: 138(ptr) AccessChain 55(data) 237 79
Store 241 240
Branch 47
47: Label
Return Return
FunctionEnd FunctionEnd

View File

@ -3862,7 +3862,6 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
symbolTable.setFunctionExtensions("readInvocationARB", 1, &E_GL_ARB_shader_ballot); symbolTable.setFunctionExtensions("readInvocationARB", 1, &E_GL_ARB_shader_ballot);
symbolTable.setFunctionExtensions("readFirstInvocationARB", 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_SubGroupInvocationARB", EbvSubGroupInvocation, symbolTable);
BuiltInVariable("gl_SubGroupEqMaskARB", EbvSubGroupEqMask, symbolTable); BuiltInVariable("gl_SubGroupEqMaskARB", EbvSubGroupEqMask, symbolTable);
BuiltInVariable("gl_SubGroupGeMaskARB", EbvSubGroupGeMask, symbolTable); BuiltInVariable("gl_SubGroupGeMaskARB", EbvSubGroupGeMask, symbolTable);
@ -3870,6 +3869,10 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
BuiltInVariable("gl_SubGroupLeMaskARB", EbvSubGroupLeMask, symbolTable); BuiltInVariable("gl_SubGroupLeMaskARB", EbvSubGroupLeMask, symbolTable);
BuiltInVariable("gl_SubGroupLtMaskARB", EbvSubGroupLtMask, symbolTable); BuiltInVariable("gl_SubGroupLtMaskARB", EbvSubGroupLtMask, symbolTable);
if (spvVersion.vulkan >= 100)
// Treat "gl_SubGroupSizeARB" as shader input instead of uniform for Vulkan
SpecialQualifier("gl_SubGroupSizeARB", EvqVaryingIn, EbvSubGroupSize, symbolTable);
symbolTable.setFunctionExtensions("anyInvocationARB", 1, &E_GL_ARB_shader_group_vote); symbolTable.setFunctionExtensions("anyInvocationARB", 1, &E_GL_ARB_shader_group_vote);
symbolTable.setFunctionExtensions("allInvocationsARB", 1, &E_GL_ARB_shader_group_vote); symbolTable.setFunctionExtensions("allInvocationsARB", 1, &E_GL_ARB_shader_group_vote);
symbolTable.setFunctionExtensions("allInvocationsEqualARB", 1, &E_GL_ARB_shader_group_vote); symbolTable.setFunctionExtensions("allInvocationsEqualARB", 1, &E_GL_ARB_shader_group_vote);