diff options
Diffstat (limited to 'src/shader_recompiler/backend/spirv')
| -rw-r--r-- | src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp | 17 |
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) { | |||
| 17 | Id WarpExtract(EmitContext& ctx, Id value) { | 17 | Id 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 | ||
| 23 | Id LoadMask(EmitContext& ctx, Id mask) { | 38 | Id LoadMask(EmitContext& ctx, Id mask) { |