From c6f18c9394cbdda56c42a7104454738be6a17c40 Mon Sep 17 00:00:00 2001 From: Shaun Ren Date: Wed, 26 Feb 2025 21:05:21 -0500 Subject: [PATCH] vkd3d-shader/hlsl: Support indirect addressing of uniforms in sm4_generate_vsir_reg_from_deref(). --- libs/vkd3d-shader/hlsl_codegen.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c index 59d9f722..68045748 100644 --- a/libs/vkd3d-shader/hlsl_codegen.c +++ b/libs/vkd3d-shader/hlsl_codegen.c @@ -7207,7 +7207,7 @@ static bool sm4_generate_vsir_reg_from_deref(struct hlsl_ctx *ctx, struct vsir_p } else { - unsigned int offset = hlsl_offset_from_deref_safe(ctx, deref) + var->buffer_offset; + unsigned int offset = deref->const_offset + var->buffer_offset; VKD3D_ASSERT(data_type->class <= HLSL_CLASS_VECTOR); reg->type = VKD3DSPR_CONSTBUFFER; @@ -7225,6 +7225,14 @@ static bool sm4_generate_vsir_reg_from_deref(struct hlsl_ctx *ctx, struct vsir_p reg->idx[1].offset = offset / 4; reg->idx_count = 2; } + + if (deref->rel_offset.node) + { + if (!(reg->idx[reg->idx_count - 1].rel_addr = sm4_generate_vsir_new_idx_src(ctx, + program, deref->rel_offset.node))) + return false; + } + *writemask = ((1u << data_type->e.numeric.dimx) - 1) << (offset & 3); } }