From 04d9b0812aba9a21aea876f2b49b3859293d4bc8 Mon Sep 17 00:00:00 2001 From: MaranBr Date: Fri, 27 Mar 2026 16:06:30 -0400 Subject: [PATCH] Fix IsScaled dynamic indexing reading wrong bit source --- src/shader_recompiler/backend/spirv/emit_spirv_image.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp index c4c898bec9..710efaf23f 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_image.cpp @@ -285,8 +285,11 @@ 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 bit_index{ctx.OpBitwiseAnd(ctx.U32[1], index_value, ctx.Const(31u))}; - bit = ctx.OpBitFieldUExtract(ctx.U32[1], index_value, bit_index, ctx.Const(1u)); + bit = ctx.OpBitFieldUExtract(ctx.U32[1], word, bit_index, ctx.Const(1u)); } return ctx.OpINotEqual(ctx.U1, bit, ctx.u32_zero_value); }