vkd3d-shader/hlsl: Support indirect addressing of uniforms in sm4_generate_vsir_reg_from_deref().

This commit is contained in:
Shaun Ren
2025-02-26 21:05:21 -05:00
committed by Henri Verbeet
parent f6c35144e4
commit c6f18c9394
Notes: Henri Verbeet 2025-03-12 22:20:19 +01:00
Approved-by: Francisco Casas (@fcasas)
Approved-by: Elizabeth Figura (@zfigura)
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1388

View File

@@ -7207,7 +7207,7 @@ static bool sm4_generate_vsir_reg_from_deref(struct hlsl_ctx *ctx, struct vsir_p
} }
else 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); VKD3D_ASSERT(data_type->class <= HLSL_CLASS_VECTOR);
reg->type = VKD3DSPR_CONSTBUFFER; 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[1].offset = offset / 4;
reg->idx_count = 2; 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); *writemask = ((1u << data_type->e.numeric.dimx) - 1) << (offset & 3);
} }
} }