Support extension EXT_shader_quad_control
This commit is contained in:
parent
f6f9840eab
commit
725017a588
15 changed files with 232 additions and 3 deletions
|
|
@ -53,6 +53,7 @@ static const char* const E_SPV_KHR_terminate_invocation = "SPV_KHR_termi
|
|||
static const char* const E_SPV_KHR_workgroup_memory_explicit_layout = "SPV_KHR_workgroup_memory_explicit_layout";
|
||||
static const char* const E_SPV_KHR_subgroup_uniform_control_flow = "SPV_KHR_subgroup_uniform_control_flow";
|
||||
static const char* const E_SPV_KHR_fragment_shader_barycentric = "SPV_KHR_fragment_shader_barycentric";
|
||||
static const char* const E_SPV_KHR_quad_control = "SPV_KHR_quad_control";
|
||||
static const char* const E_SPV_AMD_shader_early_and_late_fragment_tests = "SPV_AMD_shader_early_and_late_fragment_tests";
|
||||
static const char* const E_SPV_KHR_ray_tracing_position_fetch = "SPV_KHR_ray_tracing_position_fetch";
|
||||
static const char* const E_SPV_KHR_cooperative_matrix = "SPV_KHR_cooperative_matrix";
|
||||
|
|
|
|||
|
|
@ -1640,6 +1640,20 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion,
|
|||
builder.addExecutionMode(shaderEntry, spv::ExecutionModeMaximallyReconvergesKHR);
|
||||
}
|
||||
|
||||
if (glslangIntermediate->getQuadDerivMode())
|
||||
{
|
||||
builder.addCapability(spv::CapabilityQuadControlKHR);
|
||||
builder.addExtension(spv::E_SPV_KHR_quad_control);
|
||||
builder.addExecutionMode(shaderEntry, spv::ExecutionModeQuadDerivativesKHR);
|
||||
}
|
||||
|
||||
if (glslangIntermediate->getReqFullQuadsMode())
|
||||
{
|
||||
builder.addCapability(spv::CapabilityQuadControlKHR);
|
||||
builder.addExtension(spv::E_SPV_KHR_quad_control);
|
||||
builder.addExecutionMode(shaderEntry, spv::ExecutionModeRequireFullQuadsKHR);
|
||||
}
|
||||
|
||||
unsigned int mode;
|
||||
switch (glslangIntermediate->getStage()) {
|
||||
case EShLangVertex:
|
||||
|
|
@ -7173,7 +7187,9 @@ spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, OpDe
|
|||
case glslang::EOpSubgroupExclusiveXor:
|
||||
case glslang::EOpSubgroupQuadSwapHorizontal:
|
||||
case glslang::EOpSubgroupQuadSwapVertical:
|
||||
case glslang::EOpSubgroupQuadSwapDiagonal: {
|
||||
case glslang::EOpSubgroupQuadSwapDiagonal:
|
||||
case glslang::EOpSubgroupQuadAll:
|
||||
case glslang::EOpSubgroupQuadAny: {
|
||||
std::vector<spv::Id> operands;
|
||||
operands.push_back(operand);
|
||||
return createSubgroupOperation(op, typeId, operands, typeProxy);
|
||||
|
|
@ -8278,6 +8294,11 @@ spv::Id TGlslangToSpvTraverser::createSubgroupOperation(glslang::TOperator op, s
|
|||
case glslang::EOpSubgroupElect:
|
||||
builder.addCapability(spv::CapabilityGroupNonUniform);
|
||||
break;
|
||||
case glslang::EOpSubgroupQuadAll:
|
||||
case glslang::EOpSubgroupQuadAny:
|
||||
builder.addExtension(spv::E_SPV_KHR_quad_control);
|
||||
builder.addCapability(spv::CapabilityQuadControlKHR);
|
||||
// pass through
|
||||
case glslang::EOpSubgroupAll:
|
||||
case glslang::EOpSubgroupAny:
|
||||
case glslang::EOpSubgroupAllEqual:
|
||||
|
|
@ -8385,7 +8406,9 @@ spv::Id TGlslangToSpvTraverser::createSubgroupOperation(glslang::TOperator op, s
|
|||
// Figure out which opcode to use.
|
||||
switch (op) {
|
||||
case glslang::EOpSubgroupElect: opCode = spv::OpGroupNonUniformElect; break;
|
||||
case glslang::EOpSubgroupQuadAll: opCode = spv::OpGroupNonUniformQuadAllKHR; break;
|
||||
case glslang::EOpSubgroupAll: opCode = spv::OpGroupNonUniformAll; break;
|
||||
case glslang::EOpSubgroupQuadAny: opCode = spv::OpGroupNonUniformQuadAnyKHR; break;
|
||||
case glslang::EOpSubgroupAny: opCode = spv::OpGroupNonUniformAny; break;
|
||||
case glslang::EOpSubgroupAllEqual: opCode = spv::OpGroupNonUniformAllEqual; break;
|
||||
case glslang::EOpSubgroupBroadcast: opCode = spv::OpGroupNonUniformBroadcast; break;
|
||||
|
|
@ -8582,7 +8605,10 @@ spv::Id TGlslangToSpvTraverser::createSubgroupOperation(glslang::TOperator op, s
|
|||
|
||||
// Every operation begins with the Execution Scope operand.
|
||||
spv::IdImmediate executionScope = { true, builder.makeUintConstant(spv::ScopeSubgroup) };
|
||||
spvGroupOperands.push_back(executionScope);
|
||||
// All other ops need the execution scope. Quad Control Ops don't need scope, it's always Quad.
|
||||
if (opCode != spv::OpGroupNonUniformQuadAllKHR && opCode != spv::OpGroupNonUniformQuadAnyKHR) {
|
||||
spvGroupOperands.push_back(executionScope);
|
||||
}
|
||||
|
||||
// Next, for all operations that use a Group Operation, push that as an operand.
|
||||
if (groupOperation != spv::GroupOperationMax) {
|
||||
|
|
|
|||
|
|
@ -218,6 +218,9 @@ const char* ExecutionModeString(int mode)
|
|||
case ExecutionModeNoGlobalOffsetINTEL: return "NoGlobalOffsetINTEL";
|
||||
case ExecutionModeNumSIMDWorkitemsINTEL: return "NumSIMDWorkitemsINTEL";
|
||||
|
||||
case ExecutionModeRequireFullQuadsKHR: return "RequireFullQuadsKHR";
|
||||
case ExecutionModeQuadDerivativesKHR: return "QuadDerivativesKHR";
|
||||
|
||||
case ExecutionModeNonCoherentColorAttachmentReadEXT: return "NonCoherentColorAttachmentReadEXT";
|
||||
case ExecutionModeNonCoherentDepthAttachmentReadEXT: return "NonCoherentDepthAttachmentReadEXT";
|
||||
case ExecutionModeNonCoherentStencilAttachmentReadEXT: return "NonCoherentStencilAttachmentReadEXT";
|
||||
|
|
@ -1033,6 +1036,7 @@ const char* CapabilityString(int info)
|
|||
|
||||
case CapabilityDemoteToHelperInvocationEXT: return "DemoteToHelperInvocationEXT";
|
||||
case CapabilityShaderClockKHR: return "ShaderClockKHR";
|
||||
case CapabilityQuadControlKHR: return "QuadControlKHR";
|
||||
case CapabilityInt64ImageEXT: return "Int64ImageEXT";
|
||||
|
||||
case CapabilityIntegerFunctions2INTEL: return "CapabilityIntegerFunctions2INTEL";
|
||||
|
|
@ -1433,6 +1437,9 @@ const char* OpcodeString(int op)
|
|||
case 4430: return "OpSubgroupAllEqualKHR";
|
||||
case 4432: return "OpSubgroupReadInvocationKHR";
|
||||
|
||||
case OpGroupNonUniformQuadAllKHR: return "OpGroupNonUniformQuadAllKHR";
|
||||
case OpGroupNonUniformQuadAnyKHR: return "OpGroupNonUniformQuadAnyKHR";
|
||||
|
||||
case OpAtomicFAddEXT: return "OpAtomicFAddEXT";
|
||||
case OpAtomicFMinEXT: return "OpAtomicFMinEXT";
|
||||
case OpAtomicFMaxEXT: return "OpAtomicFMaxEXT";
|
||||
|
|
@ -2940,6 +2947,8 @@ void Parameterize()
|
|||
|
||||
InstructionDesc[OpGroupNonUniformPartitionNV].operands.push(OperandId, "X");
|
||||
|
||||
InstructionDesc[OpGroupNonUniformQuadAllKHR].operands.push(OperandId, "'Predicate'");
|
||||
InstructionDesc[OpGroupNonUniformQuadAnyKHR].operands.push(OperandId, "'Predicate'");
|
||||
InstructionDesc[OpTypeAccelerationStructureKHR].setResultAndType(true, false);
|
||||
|
||||
InstructionDesc[OpTraceNV].operands.push(OperandId, "'Acceleration Structure'");
|
||||
|
|
|
|||
|
|
@ -174,6 +174,8 @@ enum ExecutionMode {
|
|||
ExecutionModeStencilRefUnchangedBackAMD = 5082,
|
||||
ExecutionModeStencilRefGreaterBackAMD = 5083,
|
||||
ExecutionModeStencilRefLessBackAMD = 5084,
|
||||
ExecutionModeQuadDerivativesKHR = 5088,
|
||||
ExecutionModeRequireFullQuadsKHR = 5089,
|
||||
ExecutionModeOutputLinesEXT = 5269,
|
||||
ExecutionModeOutputLinesNV = 5269,
|
||||
ExecutionModeOutputPrimitivesEXT = 5270,
|
||||
|
|
@ -1040,6 +1042,7 @@ enum Capability {
|
|||
CapabilityImageReadWriteLodAMD = 5015,
|
||||
CapabilityInt64ImageEXT = 5016,
|
||||
CapabilityShaderClockKHR = 5055,
|
||||
CapabilityQuadControlKHR = 5087,
|
||||
CapabilitySampleMaskOverrideCoverageNV = 5249,
|
||||
CapabilityGeometryShaderPassthroughNV = 5251,
|
||||
CapabilityShaderViewportIndexLayerEXT = 5254,
|
||||
|
|
@ -1705,6 +1708,8 @@ enum Op {
|
|||
OpFragmentMaskFetchAMD = 5011,
|
||||
OpFragmentFetchAMD = 5012,
|
||||
OpReadClockKHR = 5056,
|
||||
OpGroupNonUniformQuadAllKHR = 5110,
|
||||
OpGroupNonUniformQuadAnyKHR = 5111,
|
||||
OpHitObjectRecordHitMotionNV = 5249,
|
||||
OpHitObjectRecordHitWithIndexMotionNV = 5250,
|
||||
OpHitObjectRecordMissMotionNV = 5251,
|
||||
|
|
@ -2375,6 +2380,8 @@ inline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) {
|
|||
case OpGroupNonUniformLogicalXor: *hasResult = true; *hasResultType = true; break;
|
||||
case OpGroupNonUniformQuadBroadcast: *hasResult = true; *hasResultType = true; break;
|
||||
case OpGroupNonUniformQuadSwap: *hasResult = true; *hasResultType = true; break;
|
||||
case OpGroupNonUniformQuadAllKHR: *hasResult = true; *hasResultType = true; break;
|
||||
case OpGroupNonUniformQuadAnyKHR: *hasResult = true; *hasResultType = true; break;
|
||||
case OpCopyLogical: *hasResult = true; *hasResultType = true; break;
|
||||
case OpPtrEqual: *hasResult = true; *hasResultType = true; break;
|
||||
case OpPtrNotEqual: *hasResult = true; *hasResultType = true; break;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue