From f14a0dfe0773ef8c5a6cbe3d60755810b510db49 Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Sun, 18 May 2025 22:49:16 +0200 Subject: [PATCH] vkd3d-shader/msl: Implement support for indirect constant buffer addressing. --- libs/vkd3d-shader/msl.c | 26 +++++++++++++++++++++-- tests/hlsl/non-const-indexing.shader_test | 8 +++---- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/libs/vkd3d-shader/msl.c b/libs/vkd3d-shader/msl.c index f52c873e5..c92e29fa6 100644 --- a/libs/vkd3d-shader/msl.c +++ b/libs/vkd3d-shader/msl.c @@ -60,6 +60,9 @@ struct msl_resource_type_info const char *type_suffix; }; +static void msl_print_subscript(struct vkd3d_string_buffer *buffer, struct msl_generator *gen, + const struct vkd3d_shader_src_param *rel_addr, unsigned int offset); + static void VKD3D_PRINTF_FUNC(3, 4) msl_compiler_error(struct msl_generator *gen, enum vkd3d_shader_error error, const char *fmt, ...) { @@ -358,7 +361,7 @@ static enum msl_data_type msl_print_register_name(struct vkd3d_string_buffer *bu vkd3d_string_buffer_printf(buffer, "", reg->type); return MSL_DATA_UNION; } - if (reg->idx[0].rel_addr || reg->idx[1].rel_addr || reg->idx[2].rel_addr) + if (reg->idx[0].rel_addr || reg->idx[1].rel_addr) { msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL, "Internal compiler error: Unhandled constant buffer register indirect addressing."); @@ -375,7 +378,7 @@ static enum msl_data_type msl_print_register_name(struct vkd3d_string_buffer *bu return MSL_DATA_UNION; } msl_print_cbv_name(buffer, binding->binding); - vkd3d_string_buffer_printf(buffer, "[%u]", reg->idx[2].offset); + msl_print_subscript(buffer, gen, reg->idx[2].rel_addr, reg->idx[2].offset); return MSL_DATA_UNION; } @@ -543,6 +546,25 @@ static uint32_t msl_dst_init(struct msl_dst *msl_dst, struct msl_generator *gen, return write_mask; } +static void msl_print_subscript(struct vkd3d_string_buffer *buffer, struct msl_generator *gen, + const struct vkd3d_shader_src_param *rel_addr, unsigned int offset) +{ + struct msl_src r; + + if (!rel_addr) + { + vkd3d_string_buffer_printf(buffer, "[%u]", offset); + return; + } + + msl_src_init(&r, gen, rel_addr, VKD3DSP_WRITEMASK_0); + vkd3d_string_buffer_printf(buffer, "[%s", r.str->buffer); + if (offset) + vkd3d_string_buffer_printf(buffer, " + %u", offset); + vkd3d_string_buffer_printf(buffer, "]"); + msl_src_cleanup(&r, &gen->string_buffers); +} + static void VKD3D_PRINTF_FUNC(3, 4) msl_print_assignment( struct msl_generator *gen, struct msl_dst *dst, const char *format, ...) { diff --git a/tests/hlsl/non-const-indexing.shader_test b/tests/hlsl/non-const-indexing.shader_test index 39dae7919..4993f6928 100644 --- a/tests/hlsl/non-const-indexing.shader_test +++ b/tests/hlsl/non-const-indexing.shader_test @@ -12,16 +12,16 @@ uniform 0 float4 1.0 2.0 3.0 4.0 uniform 4 float4 5.0 6.0 7.0 8.0 uniform 8 float4 9.0 10.0 11.0 12.0 uniform 12 float4 0 0 0 0 -todo(msl) draw quad +draw quad probe (0, 0) rgba (1.0, 2.0, 3.0, 4.0) uniform 12 float4 1 0 0 0 -todo(msl) draw quad +draw quad probe (0, 0) rgba (5.0, 6.0, 7.0, 8.0) uniform 12 float4 0 1 0 0 -todo(msl) draw quad +draw quad probe (0, 0) rgba (5.0, 6.0, 7.0, 8.0) uniform 12 float4 1 1 0 0 -todo(msl) draw quad +draw quad probe (0, 0) rgba (9.0, 10.0, 11.0, 12.0)