vkd3d-shader/msl: Implement support for indirect constant buffer addressing.

This commit is contained in:
Henri Verbeet
2025-05-18 22:49:16 +02:00
parent 0b829db149
commit f14a0dfe07
Notes: Henri Verbeet 2025-06-05 16:18:45 +02:00
Approved-by: Giovanni Mascellani (@giomasce)
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1536
2 changed files with 28 additions and 6 deletions

View File

@@ -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, "<unhandled register %#x>", 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, ...)
{

View File

@@ -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)