mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-12-15 08:03:30 -08:00
vkd3d-shader/msl: Implement support for VKD3DSPR_IMMCONSTBUFFER registers.
This commit is contained in:
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
@@ -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, "
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user