mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-09-12 18:50:22 -07:00
vkd3d-shader/msl: Implement support for indirect constant buffer addressing.
This commit is contained in:
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
@@ -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, ...)
|
||||
{
|
||||
|
@@ -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)
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user