diff --git a/libs/vkd3d-shader/msl.c b/libs/vkd3d-shader/msl.c index 58f9dfcf4..32ae42d72 100644 --- a/libs/vkd3d-shader/msl.c +++ b/libs/vkd3d-shader/msl.c @@ -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, ""), 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, " diff --git a/tests/hlsl/bitwise.shader_test b/tests/hlsl/bitwise.shader_test index de7033efc..775b5568b 100644 --- a/tests/hlsl/bitwise.shader_test +++ b/tests/hlsl/bitwise.shader_test @@ -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) diff --git a/tests/hlsl/matrix-indexing.shader_test b/tests/hlsl/matrix-indexing.shader_test index a1c55c034..0b837f37e 100644 --- a/tests/hlsl/matrix-indexing.shader_test +++ b/tests/hlsl/matrix-indexing.shader_test @@ -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) diff --git a/tests/hlsl/non-const-indexing.shader_test b/tests/hlsl/non-const-indexing.shader_test index 360e50799..41bf350d8 100644 --- a/tests/hlsl/non-const-indexing.shader_test +++ b/tests/hlsl/non-const-indexing.shader_test @@ -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; diff --git a/tests/hlsl/vector-indexing-uniform.shader_test b/tests/hlsl/vector-indexing-uniform.shader_test index 69650007f..d5301c536 100644 --- a/tests/hlsl/vector-indexing-uniform.shader_test +++ b/tests/hlsl/vector-indexing-uniform.shader_test @@ -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)