Commit f200da86 by chaoc

Modify shader ballot extension by adding OpSubgroupReadInvocationKHR

parent 0ad6a4e6
...@@ -4131,7 +4131,8 @@ spv::Id TGlslangToSpvTraverser::createInvocationsOperation(glslang::TOperator op ...@@ -4131,7 +4131,8 @@ spv::Id TGlslangToSpvTraverser::createInvocationsOperation(glslang::TOperator op
spv::Op opCode = spv::OpNop; spv::Op opCode = spv::OpNop;
std::vector<spv::Id> spvGroupOperands; std::vector<spv::Id> spvGroupOperands;
if (op == glslang::EOpBallot || op == glslang::EOpReadFirstInvocation) { if (op == glslang::EOpBallot || op == glslang::EOpReadFirstInvocation ||
op == glslang::EOpReadInvocation) {
builder.addExtension(spv::E_SPV_KHR_shader_ballot); builder.addExtension(spv::E_SPV_KHR_shader_ballot);
builder.addCapability(spv::CapabilitySubgroupBallotKHR); builder.addCapability(spv::CapabilitySubgroupBallotKHR);
} else { } else {
...@@ -4171,7 +4172,7 @@ spv::Id TGlslangToSpvTraverser::createInvocationsOperation(glslang::TOperator op ...@@ -4171,7 +4172,7 @@ spv::Id TGlslangToSpvTraverser::createInvocationsOperation(glslang::TOperator op
} }
case glslang::EOpReadInvocation: case glslang::EOpReadInvocation:
opCode = spv::OpGroupBroadcast; opCode = spv::OpSubgroupReadInvocationKHR;
if (builder.isVectorType(typeId)) if (builder.isVectorType(typeId))
return CreateInvocationsVectorOperation(opCode, typeId, operands); return CreateInvocationsVectorOperation(opCode, typeId, operands);
break; break;
...@@ -4283,13 +4284,15 @@ spv::Id TGlslangToSpvTraverser::CreateInvocationsVectorOperation(spv::Op op, spv ...@@ -4283,13 +4284,15 @@ spv::Id TGlslangToSpvTraverser::CreateInvocationsVectorOperation(spv::Op op, spv
assert(op == spv::OpGroupFMin || op == spv::OpGroupUMin || op == spv::OpGroupSMin || assert(op == spv::OpGroupFMin || op == spv::OpGroupUMin || op == spv::OpGroupSMin ||
op == spv::OpGroupFMax || op == spv::OpGroupUMax || op == spv::OpGroupSMax || op == spv::OpGroupFMax || op == spv::OpGroupUMax || op == spv::OpGroupSMax ||
op == spv::OpGroupFAdd || op == spv::OpGroupIAdd || op == spv::OpGroupBroadcast || op == spv::OpGroupFAdd || op == spv::OpGroupIAdd || op == spv::OpGroupBroadcast ||
op == spv::OpSubgroupReadInvocationKHR ||
op == spv::OpGroupFMinNonUniformAMD || op == spv::OpGroupUMinNonUniformAMD || op == spv::OpGroupSMinNonUniformAMD || op == spv::OpGroupFMinNonUniformAMD || op == spv::OpGroupUMinNonUniformAMD || op == spv::OpGroupSMinNonUniformAMD ||
op == spv::OpGroupFMaxNonUniformAMD || op == spv::OpGroupUMaxNonUniformAMD || op == spv::OpGroupSMaxNonUniformAMD || op == spv::OpGroupFMaxNonUniformAMD || op == spv::OpGroupUMaxNonUniformAMD || op == spv::OpGroupSMaxNonUniformAMD ||
op == spv::OpGroupFAddNonUniformAMD || op == spv::OpGroupIAddNonUniformAMD); op == spv::OpGroupFAddNonUniformAMD || op == spv::OpGroupIAddNonUniformAMD);
#else #else
assert(op == spv::OpGroupFMin || op == spv::OpGroupUMin || op == spv::OpGroupSMin || assert(op == spv::OpGroupFMin || op == spv::OpGroupUMin || op == spv::OpGroupSMin ||
op == spv::OpGroupFMax || op == spv::OpGroupUMax || op == spv::OpGroupSMax || op == spv::OpGroupFMax || op == spv::OpGroupUMax || op == spv::OpGroupSMax ||
op == spv::OpGroupFAdd || op == spv::OpGroupIAdd || op == spv::OpGroupBroadcast); op == spv::OpGroupFAdd || op == spv::OpGroupIAdd || op == spv::OpGroupBroadcast ||
op == spv::OpSubgroupReadInvocationKHR);
#endif #endif
// Handle group invocation operations scalar by scalar. // Handle group invocation operations scalar by scalar.
...@@ -4309,13 +4312,16 @@ spv::Id TGlslangToSpvTraverser::CreateInvocationsVectorOperation(spv::Op op, spv ...@@ -4309,13 +4312,16 @@ spv::Id TGlslangToSpvTraverser::CreateInvocationsVectorOperation(spv::Op op, spv
std::vector<unsigned int> indexes; std::vector<unsigned int> indexes;
indexes.push_back(comp); indexes.push_back(comp);
spv::Id scalar = builder.createCompositeExtract(operands[0], scalarType, indexes); spv::Id scalar = builder.createCompositeExtract(operands[0], scalarType, indexes);
std::vector<spv::Id> spvGroupOperands; std::vector<spv::Id> spvGroupOperands;
if (op == spv::OpSubgroupReadInvocationKHR) {
spvGroupOperands.push_back(scalar);
spvGroupOperands.push_back(operands[1]);
} else if (op == spv::OpGroupBroadcast) {
spvGroupOperands.push_back(builder.makeUintConstant(spv::ScopeSubgroup)); spvGroupOperands.push_back(builder.makeUintConstant(spv::ScopeSubgroup));
if (op == spv::OpGroupBroadcast) {
spvGroupOperands.push_back(scalar); spvGroupOperands.push_back(scalar);
spvGroupOperands.push_back(operands[1]); spvGroupOperands.push_back(operands[1]);
} else { } else {
spvGroupOperands.push_back(builder.makeUintConstant(spv::ScopeSubgroup));
spvGroupOperands.push_back(spv::GroupOperationReduce); spvGroupOperands.push_back(spv::GroupOperationReduce);
spvGroupOperands.push_back(scalar); spvGroupOperands.push_back(scalar);
} }
......
...@@ -1152,6 +1152,7 @@ const char* OpcodeString(int op) ...@@ -1152,6 +1152,7 @@ const char* OpcodeString(int op)
case 4421: return "OpSubgroupBallotKHR"; case 4421: return "OpSubgroupBallotKHR";
case 4422: return "OpSubgroupFirstInvocationKHR"; case 4422: return "OpSubgroupFirstInvocationKHR";
case 4432: return "OpSubgroupReadInvocationKHR";
#ifdef AMD_EXTENSIONS #ifdef AMD_EXTENSIONS
case 5000: return "OpGroupIAddNonUniformAMD"; case 5000: return "OpGroupIAddNonUniformAMD";
...@@ -2764,6 +2765,10 @@ void Parameterize() ...@@ -2764,6 +2765,10 @@ void Parameterize()
InstructionDesc[OpSubgroupFirstInvocationKHR].operands.push(OperandId, "'Value'"); InstructionDesc[OpSubgroupFirstInvocationKHR].operands.push(OperandId, "'Value'");
InstructionDesc[OpSubgroupReadInvocationKHR].capabilities.push_back(CapabilityGroups);
InstructionDesc[OpSubgroupReadInvocationKHR].operands.push(OperandId, "'Value'");
InstructionDesc[OpSubgroupReadInvocationKHR].operands.push(OperandId, "'Index'");
#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'");
......
...@@ -905,6 +905,7 @@ enum Op { ...@@ -905,6 +905,7 @@ enum Op {
OpImageSparseRead = 320, OpImageSparseRead = 320,
OpSubgroupBallotKHR = 4421, OpSubgroupBallotKHR = 4421,
OpSubgroupFirstInvocationKHR = 4422, OpSubgroupFirstInvocationKHR = 4422,
OpSubgroupReadInvocationKHR = 4432,
OpMax = 0x7fffffff, OpMax = 0x7fffffff,
}; };
......
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