aboutsummaryrefslogtreecommitdiff
path: root/src/shader_recompiler/backend/spirv/emit_spirv.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/shader_recompiler/backend/spirv/emit_spirv.cpp')
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv.cpp11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv.cpp b/src/shader_recompiler/backend/spirv/emit_spirv.cpp
index 67329eea0d..c221888c09 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv.cpp
@@ -322,6 +322,11 @@ void DefineEntryPoint(const IR::Program& program, EmitContext& ctx, Id main) {
if (ctx.runtime_info.force_early_z) {
ctx.AddExecutionMode(main, spv::ExecutionMode::EarlyFragmentTests);
}
+ if (ctx.profile.support_shader_quad_control && program.info.uses_quad_shuffles) {
+ ctx.AddExtension("SPV_KHR_quad_control");
+ ctx.AddCapability(spv::Capability::QuadControlKHR);
+ ctx.AddExecutionMode(main, spv::ExecutionMode::RequireFullQuadsKHR);
+ }
break;
default:
throw NotImplementedException("Stage {}", program.stage);
@@ -443,6 +448,12 @@ void SetupCapabilities(const Profile& profile, const Info& info, EmitContext& ct
ctx.AddCapability(spv::Capability::GroupNonUniformVote);
}
}
+ if (info.uses_quad_shuffles) {
+ if (profile.support_quad_shuffles) {
+ ctx.AddCapability(spv::Capability::GroupNonUniformQuad);
+ }
+ ctx.AddCapability(spv::Capability::GroupNonUniformShuffle);
+ }
if (info.uses_int64_bit_atomics && profile.support_int64_atomics) {
ctx.AddCapability(spv::Capability::Int64Atomics);
}