From 7d2819249b121c0c027116f650930e9280549030 Mon Sep 17 00:00:00 2001 From: Feifan He Date: Fri, 22 Nov 2024 15:45:54 +0800 Subject: [PATCH] vkd3d-shader/msl: Implement support for the VKD3DSPR_DEPTHOUT register. --- libs/vkd3d-shader/msl.c | 34 +++++++++++++++++++++++++++++++- tests/hlsl/depth-out.shader_test | 8 ++++---- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/libs/vkd3d-shader/msl.c b/libs/vkd3d-shader/msl.c index 29f51088..9a3c3ed8 100644 --- a/libs/vkd3d-shader/msl.c +++ b/libs/vkd3d-shader/msl.c @@ -41,6 +41,8 @@ struct msl_generator const char *prefix; bool failed; + bool write_depth; + const struct vkd3d_shader_interface_info *interface_info; const struct vkd3d_shader_scan_descriptor_info1 *descriptor_info; }; @@ -153,6 +155,14 @@ static void msl_print_register_name(struct vkd3d_string_buffer *buffer, msl_print_register_datatype(buffer, gen, reg->data_type); break; + case VKD3DSPR_DEPTHOUT: + if (gen->program->shader_version.type != VKD3D_SHADER_TYPE_PIXEL) + msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL, + "Internal compiler error: Unhandled depth output in shader type #%x.", + gen->program->shader_version.type); + vkd3d_string_buffer_printf(buffer, "o_depth"); + break; + case VKD3DSPR_IMMCONST: switch (reg->dimension) { @@ -335,7 +345,8 @@ static uint32_t msl_dst_init(struct msl_dst *msl_dst, struct msl_generator *gen, msl_dst->mask = vkd3d_string_buffer_get(&gen->string_buffers); msl_print_register_name(msl_dst->register_name, gen, &vsir_dst->reg); - msl_print_write_mask(msl_dst->mask, write_mask); + if (vsir_dst->reg.dimension == VSIR_DIMENSION_VEC4) + msl_print_write_mask(msl_dst->mask, write_mask); return write_mask; } @@ -827,6 +838,14 @@ static void msl_generate_output_struct_declarations(struct msl_generator *gen) { e = &signature->elements[i]; + if (e->sysval_semantic == VKD3D_SHADER_SV_DEPTH) + { + gen->write_depth = true; + msl_print_indent(gen->buffer, 1); + vkd3d_string_buffer_printf(buffer, "float shader_out_depth [[depth(any)]];\n"); + continue; + } + if (e->target_location == SIGNATURE_TARGET_LOCATION_UNUSED) continue; @@ -936,6 +955,12 @@ static void msl_generate_entrypoint_epilogue(struct msl_generator *gen) { e = &signature->elements[i]; + if (e->sysval_semantic == VKD3D_SHADER_SV_DEPTH) + { + vkd3d_string_buffer_printf(buffer, " output.shader_out_depth = shader_out_depth;\n"); + continue; + } + if (e->target_location == SIGNATURE_TARGET_LOCATION_UNUSED) continue; @@ -995,9 +1020,14 @@ static void msl_generate_entrypoint(struct msl_generator *gen) vkd3d_string_buffer_printf(gen->buffer, " vkd3d_vec4 %s_out[%u];\n", gen->prefix, 32); vkd3d_string_buffer_printf(gen->buffer, " vkd3d_%s_out output;\n", gen->prefix); + if (gen->write_depth) + vkd3d_string_buffer_printf(gen->buffer, " float shader_out_depth;\n"); + msl_generate_entrypoint_prologue(gen); vkd3d_string_buffer_printf(gen->buffer, " %s_main(%s_in, %s_out", gen->prefix, gen->prefix, gen->prefix); + if (gen->write_depth) + vkd3d_string_buffer_printf(gen->buffer, ", shader_out_depth"); if (gen->descriptor_info->descriptor_count) vkd3d_string_buffer_printf(gen->buffer, ", descriptors"); vkd3d_string_buffer_printf(gen->buffer, ");\n"); @@ -1035,6 +1065,8 @@ static int msl_generator_generate(struct msl_generator *gen, struct vkd3d_shader "void %s_main(thread vkd3d_vec4 *v, " "thread vkd3d_vec4 *o", gen->prefix); + if (gen->write_depth) + vkd3d_string_buffer_printf(gen->buffer, ", thread float& o_depth"); if (gen->descriptor_info->descriptor_count) vkd3d_string_buffer_printf(gen->buffer, ", constant vkd3d_%s_descriptors& descriptors", gen->prefix); vkd3d_string_buffer_printf(gen->buffer, ")\n{\n"); diff --git a/tests/hlsl/depth-out.shader_test b/tests/hlsl/depth-out.shader_test index 9f3d1b2c..9f99ff78 100644 --- a/tests/hlsl/depth-out.shader_test +++ b/tests/hlsl/depth-out.shader_test @@ -16,22 +16,22 @@ float main() : SV_Depth uniform 0 float 0.0 clear dsv 1.0 depth less -todo(msl) draw quad +draw quad probe dsv (0,0) r (0.0) uniform 0 float 0.75 clear dsv 1.0 -todo(msl) draw quad +draw quad probe dsv (0,0) r (0.75) clear dsv 0.5 depth greater -todo(msl) draw quad +draw quad probe dsv (0,0) r (0.75) depth less clear dsv 0.5 -todo(msl) draw quad +draw quad probe dsv (0,0) r (0.5)