From fc689d413086c4fbac4687648379e89e50aa31de Mon Sep 17 00:00:00 2001 From: MaranBr Date: Thu, 2 Apr 2026 14:53:58 +0200 Subject: [PATCH] Use shift operations for dynamic bit extraction for better performance --- .../backend/spirv/emit_spirv_image.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp index 710efaf23f..ec89f9bf04 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp @@ -285,11 +285,13 @@ Id IsScaled(EmitContext& ctx, const IR::Value& index, Id member_index, u32 base_ if (base_index != 0) { index_value = ctx.OpIAdd(ctx.U32[1], index_value, ctx.Const(base_index)); } - const Id word_index{ctx.OpUDiv(ctx.U32[1], index_value, ctx.Const(32u))}; - const Id pointer{ctx.OpAccessChain(push_constant_u32, ctx.rescaling_push_constants, member_index, word_index)}; - const Id word{ctx.OpLoad(ctx.U32[1], pointer)}; + const Id word_index{ctx.OpShiftRightLogical(ctx.U32[1], index_value, ctx.Const(5u))}; const Id bit_index{ctx.OpBitwiseAnd(ctx.U32[1], index_value, ctx.Const(31u))}; - bit = ctx.OpBitFieldUExtract(ctx.U32[1], word, bit_index, ctx.Const(1u)); + const Id pointer{ctx.OpAccessChain(push_constant_u32, ctx.rescaling_push_constants, + member_index, word_index)}; + const Id word{ctx.OpLoad(ctx.U32[1], pointer)}; + const Id bit_index_mask{ctx.OpShiftLeft(ctx.U32[1], ctx.Const(1u), bit_index)}; + bit = ctx.OpBitwiseAnd(ctx.U32[1], word, bit_index_mask); } return ctx.OpINotEqual(ctx.U1, bit, ctx.u32_zero_value); }