vkd3d-shader/msl: Implement support for VKD3DSPR_IMMCONSTBUFFER registers.

This commit is contained in:
Henri Verbeet
2025-10-12 14:36:06 +02:00
parent 51cce61770
commit f431cddc9f
Notes: Henri Verbeet 2025-11-04 15:55:42 +01:00
Approved-by: Giovanni Mascellani (@giomasce)
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1808
5 changed files with 100 additions and 47 deletions

View File

@@ -424,6 +424,11 @@ static enum msl_data_type msl_print_register_name(struct vkd3d_string_buffer *bu
msl_print_subscript(buffer, gen, reg->idx[2].rel_addr, reg->idx[2].offset);
return MSL_DATA_UNION;
case VKD3DSPR_IMMCONSTBUFFER:
vkd3d_string_buffer_printf(buffer, "icb%u", reg->idx[0].offset);
msl_print_subscript(buffer, gen, reg->idx[1].rel_addr, reg->idx[1].offset);
return MSL_DATA_UINT;
case VKD3DSPR_IDXTEMP:
vkd3d_string_buffer_printf(buffer, "x%u", reg->idx[0].offset);
msl_print_subscript(buffer, gen, reg->idx[1].rel_addr, reg->idx[1].offset);
@@ -1926,6 +1931,59 @@ static void msl_generate_output_struct_declarations(struct msl_generator *gen)
vkd3d_string_buffer_printf(buffer, "};\n\n");
}
static void msl_generate_immediate_constant_buffers(struct msl_generator *gen)
{
const struct vkd3d_shader_immediate_constant_buffer *icb;
size_t i, j;
for (i = 0; i < gen->program->icb_count; ++i)
{
icb = gen->program->icbs[i];
if (data_type_is_64_bit(icb->data_type))
msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL,
"Internal compiler error: Immediate constant buffer %zu has unhandled data type \"%s\" (%#x).",
i, vsir_data_type_get_name(icb->data_type, "<unknown>"), icb->data_type);
msl_print_indent(gen->buffer, gen->indent);
vkd3d_string_buffer_printf(gen->buffer, "constant %s icb%u[%u] =",
icb->component_count == 4 ? "uint4" : "uint", icb->register_idx, icb->element_count);
if (icb->is_null || data_type_is_64_bit(icb->data_type))
{
vkd3d_string_buffer_printf(gen->buffer, " {};\n\n");
continue;
}
vkd3d_string_buffer_printf(gen->buffer, "\n");
msl_print_indent(gen->buffer, gen->indent);
vkd3d_string_buffer_printf(gen->buffer, "{\n");
if (icb->component_count == 4)
{
for (j = 0; j < icb->element_count; ++j)
{
msl_print_indent(gen->buffer, gen->indent + 1);
vkd3d_string_buffer_printf(gen->buffer, "{0x%08x, 0x%08x, 0x%08x, 0x%08x},\n",
icb->data[4 * j + 0], icb->data[4 * j + 1], icb->data[4 * j + 2], icb->data[4 * j + 3]);
}
}
else
{
for (j = 0; j < icb->element_count; ++j)
{
if (!(j & 3))
msl_print_indent(gen->buffer, gen->indent + 1);
vkd3d_string_buffer_printf(gen->buffer, "0x%08x,%s", icb->data[j],
j == icb->element_count - 1 || (j & 3) == 3 ? "\n" : " ");
}
}
msl_print_indent(gen->buffer, gen->indent);
vkd3d_string_buffer_printf(gen->buffer, "};\n\n");
}
}
static void msl_generate_entrypoint_prologue(struct msl_generator *gen)
{
const struct shader_signature *signature = &gen->program->input_signature;
@@ -2212,6 +2270,7 @@ static int msl_generator_generate(struct msl_generator *gen, struct vkd3d_shader
msl_generate_input_struct_declarations(gen);
msl_generate_output_struct_declarations(gen);
msl_generate_immediate_constant_buffers(gen);
vkd3d_string_buffer_printf(gen->buffer,
"static void %s_main(thread vkd3d_vec4 *v, "

View File

@@ -27,7 +27,7 @@ float4 main(float4 pos : sv_position) : sv_target
}
[test]
todo(msl & sm>=6) draw quad
draw quad
if(sm>=4) probe(0, 0) f32(1, 1, 2, 1)
if(sm>=4) probe(1, 0) f32(2, 2, 3, 1)
if(sm>=4) probe(2, 0) f32(2, 2, 3, 2)
@@ -282,7 +282,7 @@ uint4 main(float4 pos : sv_position) : sv_target
}
[test]
todo(msl & sm>=6) draw quad
draw quad
probe(0, 0) u32(0, 1, 0, 2)
probe(1, 0) u32(0, 1, 0, 3)
probe(2, 0) u32(0, 1, 0, 2)
@@ -332,7 +332,7 @@ uint4 main(float4 pos : sv_position) : sv_target
}
[test]
todo(msl & sm>=6) draw quad
draw quad
probe(0, 0) u32(0, 1, 1, 2)
probe(1, 0) u32(2, 2, 2, 3)
probe(2, 0) u32(3, 3, 3, 3)

View File

@@ -120,9 +120,8 @@ float4 main() : sv_target
[test]
uniform 0 float 2
todo(msl & sm>=6) draw quad
probe (0, 0) rgba (8, 9, 10, 11)
draw quad
probe (0, 0) f32(8, 9, 10, 11)
[pixel shader]
uniform float i;
@@ -136,5 +135,5 @@ float4 main() : sv_target
[test]
uniform 0 float 3
todo(msl & sm>=6) draw quad
probe (0, 0) rgba (12, 13, 14, 15)
draw quad
probe (0, 0) f32(12, 13, 14, 15)

View File

@@ -36,24 +36,23 @@ float4 main() : SV_TARGET
[test]
uniform 0 float 0
todo(msl & sm>=6) draw quad
probe (0, 0) rgba (11.0, 11.0, 11.0, 11.0)
draw quad
probe (0, 0) f32(11.0, 11.0, 11.0, 11.0)
uniform 0 float 1
todo(msl & sm>=6) draw quad
probe (0, 0) rgba (12.0, 12.0, 12.0, 12.0)
draw quad
probe (0, 0) f32(12.0, 12.0, 12.0, 12.0)
uniform 0 float 1.6
todo(msl & sm>=6) draw quad
probe (0, 0) rgba (12.0, 12.0, 12.0, 12.0)
draw quad
probe (0, 0) f32(12.0, 12.0, 12.0, 12.0)
uniform 0 float 2
todo(msl & sm>=6) draw quad
probe (0, 0) rgba (13.0, 13.0, 13.0, 13.0)
draw quad
probe (0, 0) f32(13.0, 13.0, 13.0, 13.0)
uniform 0 float 2.6
todo(msl & sm>=6) draw quad
probe (0, 0) rgba (13.0, 13.0, 13.0, 13.0)
draw quad
probe (0, 0) f32(13.0, 13.0, 13.0, 13.0)
uniform 0 float 3
todo(msl & sm>=6) draw quad
probe (0, 0) rgba (14.0, 14.0, 14.0, 14.0)
draw quad
probe (0, 0) f32(14.0, 14.0, 14.0, 14.0)
[pixel shader]
float i;
@@ -67,9 +66,8 @@ float4 main() : sv_target
[test]
uniform 0 float 2.3
todo(msl & sm>=6) draw quad
probe (0, 0) rgba (3, 3, 3, 3)
draw quad
probe (0, 0) f32(3, 3, 3, 3)
[pixel shader]
uniform float i;
@@ -83,18 +81,17 @@ float4 main() : SV_TARGET
[test]
uniform 0 float 0
todo(msl & sm>=6) draw quad
probe (0, 0) rgba (21.0, 1.0, 24.0, 0.0)
draw quad
probe (0, 0) f32(21.0, 1.0, 24.0, 0.0)
uniform 0 float 1
todo(msl & sm>=6) draw quad
probe (0, 0) rgba (22.0, 0.0, 23.0, 1.0)
draw quad
probe (0, 0) f32(22.0, 0.0, 23.0, 1.0)
uniform 0 float 2
todo(msl & sm>=6) draw quad
probe (0, 0) rgba (23.0, 1.0, 22.0, 0.0)
draw quad
probe (0, 0) f32(23.0, 1.0, 22.0, 0.0)
uniform 0 float 3
todo(msl & sm>=6) draw quad
probe (0, 0) rgba (24.0, 0.0, 21.0, 1.0)
draw quad
probe (0, 0) f32(24.0, 0.0, 21.0, 1.0)
[pixel shader]
uniform float2 i;
@@ -108,18 +105,17 @@ float4 main() : sv_target
[test]
uniform 0 float4 0 0 0 0
todo(msl & sm>=6) draw quad
probe (0, 0) rgba (1.0, 2.0, 3.0, 4.0)
draw quad
probe (0, 0) f32(1.0, 2.0, 3.0, 4.0)
uniform 0 float4 1 0 0 0
todo(msl & sm>=6) draw quad
probe (0, 0) rgba (5.0, 6.0, 7.0, 8.0)
draw quad
probe (0, 0) f32(5.0, 6.0, 7.0, 8.0)
uniform 0 float4 0 1 0 0
todo(msl & sm>=6) draw quad
probe (0, 0) rgba (5.0, 6.0, 7.0, 8.0)
draw quad
probe (0, 0) f32(5.0, 6.0, 7.0, 8.0)
uniform 0 float4 1 1 0 0
todo(msl & sm>=6) draw quad
probe (0, 0) rgba (9.0, 10.0, 11.0, 12.0)
draw quad
probe (0, 0) f32(9.0, 10.0, 11.0, 12.0)
[pixel shader]
float4 a;
@@ -136,9 +132,8 @@ float4 main() : sv_target
[test]
uniform 0 float4 0 0 2.4 0
todo(msl & sm>=6) draw quad
probe (0, 0) rgba (1.0, 120.0, 90.0, 4.0)
draw quad
probe (0, 0) f32(1.0, 120.0, 90.0, 4.0)
[pixel shader]
float i, j;

View File

@@ -12,5 +12,5 @@ float4 main() : SV_TARGET
[test]
uniform 0 float 2
todo(msl & sm>=6) draw quad
probe (0, 0) rgba (0.5, 0.3, 0.8, 0.2)
draw quad
probe (0, 0) f32(0.5, 0.3, 0.8, 0.2)