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); msl_print_subscript(buffer, gen, reg->idx[2].rel_addr, reg->idx[2].offset);
return MSL_DATA_UNION; 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: case VKD3DSPR_IDXTEMP:
vkd3d_string_buffer_printf(buffer, "x%u", reg->idx[0].offset); 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); 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"); 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) static void msl_generate_entrypoint_prologue(struct msl_generator *gen)
{ {
const struct shader_signature *signature = &gen->program->input_signature; 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_input_struct_declarations(gen);
msl_generate_output_struct_declarations(gen); msl_generate_output_struct_declarations(gen);
msl_generate_immediate_constant_buffers(gen);
vkd3d_string_buffer_printf(gen->buffer, vkd3d_string_buffer_printf(gen->buffer,
"static void %s_main(thread vkd3d_vec4 *v, " "static void %s_main(thread vkd3d_vec4 *v, "

View File

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

View File

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

View File

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

View File

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