summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/backend
diff options
context:
space:
mode:
Diffstat (limited to 'src/shader_recompiler/backend')
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp17
1 files changed, 16 insertions, 1 deletions
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp
index c5db19d09..77ff8c573 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp
@@ -17,7 +17,22 @@ Id GetThreadId(EmitContext& ctx) {
17Id WarpExtract(EmitContext& ctx, Id value) { 17Id WarpExtract(EmitContext& ctx, Id value) {
18 const Id thread_id{GetThreadId(ctx)}; 18 const Id thread_id{GetThreadId(ctx)};
19 const Id local_index{ctx.OpShiftRightArithmetic(ctx.U32[1], thread_id, ctx.Const(5U))}; 19 const Id local_index{ctx.OpShiftRightArithmetic(ctx.U32[1], thread_id, ctx.Const(5U))};
20 return ctx.OpVectorExtractDynamic(ctx.U32[1], value, local_index); 20 if (ctx.profile.has_broken_spirv_subgroup_mask_vector_extract_dynamic) {
21 const Id c0_sel{ctx.OpSelect(ctx.U32[1], ctx.OpIEqual(ctx.U1, local_index, ctx.Const(0U)),
22 ctx.OpCompositeExtract(ctx.U32[1], value, 0U), ctx.Const(0U))};
23 const Id c1_sel{ctx.OpSelect(ctx.U32[1], ctx.OpIEqual(ctx.U1, local_index, ctx.Const(1U)),
24 ctx.OpCompositeExtract(ctx.U32[1], value, 1U), ctx.Const(0U))};
25 const Id c2_sel{ctx.OpSelect(ctx.U32[1], ctx.OpIEqual(ctx.U1, local_index, ctx.Const(2U)),
26 ctx.OpCompositeExtract(ctx.U32[1], value, 2U), ctx.Const(0U))};
27 const Id c3_sel{ctx.OpSelect(ctx.U32[1], ctx.OpIEqual(ctx.U1, local_index, ctx.Const(3U)),
28 ctx.OpCompositeExtract(ctx.U32[1], value, 3U), ctx.Const(0U))};
29 const Id c0_or_c1{ctx.OpBitwiseOr(ctx.U32[1], c0_sel, c1_sel)};
30 const Id c2_or_c3{ctx.OpBitwiseOr(ctx.U32[1], c2_sel, c3_sel)};
31 const Id c0_or_c1_or_c2_or_c3{ctx.OpBitwiseOr(ctx.U32[1], c0_or_c1, c2_or_c3)};
32 return c0_or_c1_or_c2_or_c3;
33 } else {
34 return ctx.OpVectorExtractDynamic(ctx.U32[1], value, local_index);
35 }
21} 36}
22 37
23Id LoadMask(EmitContext& ctx, Id mask) { 38Id LoadMask(EmitContext& ctx, Id mask) {