vkd3d-shader/msl: Simplify SV_DEPTH handling.

This commit is contained in:
Henri Verbeet
2025-05-21 23:38:16 +02:00
parent cf312e14a9
commit 1cdfed919a
Notes: Henri Verbeet 2025-06-05 16:18:57 +02:00
Approved-by: Giovanni Mascellani (@giomasce)
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1537

View File

@@ -49,7 +49,6 @@ struct msl_generator
bool failed; bool failed;
bool read_vertex_id; bool read_vertex_id;
bool write_depth;
const struct vkd3d_shader_interface_info *interface_info; const struct vkd3d_shader_interface_info *interface_info;
}; };
@@ -1197,15 +1196,8 @@ static void msl_generate_output_struct_declarations(struct msl_generator *gen)
{ {
e = &signature->elements[i]; e = &signature->elements[i];
if (e->sysval_semantic == VKD3D_SHADER_SV_DEPTH) if (e->target_location == SIGNATURE_TARGET_LOCATION_UNUSED
{ || 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; continue;
if (e->min_precision != VKD3D_SHADER_MINIMUM_PRECISION_NONE) if (e->min_precision != VKD3D_SHADER_MINIMUM_PRECISION_NONE)
@@ -1268,6 +1260,12 @@ static void msl_generate_output_struct_declarations(struct msl_generator *gen)
vkd3d_string_buffer_printf(buffer, ";\n"); vkd3d_string_buffer_printf(buffer, ";\n");
} }
if (bitmap_is_set(gen->program->io_dcls, VKD3DSPR_DEPTHOUT))
{
msl_print_indent(gen->buffer, 1);
vkd3d_string_buffer_printf(buffer, "float shader_out_depth [[depth(any)]];\n");
}
vkd3d_string_buffer_printf(buffer, "};\n\n"); vkd3d_string_buffer_printf(buffer, "};\n\n");
} }
@@ -1334,12 +1332,6 @@ static void msl_generate_entrypoint_epilogue(struct msl_generator *gen)
{ {
e = &signature->elements[i]; 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) if (e->target_location == SIGNATURE_TARGET_LOCATION_UNUSED)
continue; continue;
@@ -1354,6 +1346,8 @@ static void msl_generate_entrypoint_epilogue(struct msl_generator *gen)
msl_print_register_datatype(buffer, gen, vkd3d_data_type_from_component_type(e->component_type)); msl_print_register_datatype(buffer, gen, vkd3d_data_type_from_component_type(e->component_type));
msl_print_write_mask(buffer, e->mask); msl_print_write_mask(buffer, e->mask);
break; break;
case VKD3D_SHADER_SV_DEPTH:
continue;
default: default:
vkd3d_string_buffer_printf(buffer, " <unhandled sysval %#x>", e->sysval_semantic); vkd3d_string_buffer_printf(buffer, " <unhandled sysval %#x>", e->sysval_semantic);
msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL, msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL,
@@ -1405,16 +1399,13 @@ 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_vec4 %s_out[%u];\n", gen->prefix, 32);
vkd3d_string_buffer_printf(gen->buffer, " vkd3d_%s_out output;\n", gen->prefix); 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); msl_generate_entrypoint_prologue(gen);
vkd3d_string_buffer_printf(gen->buffer, " %s_main(%s_in, %s_out", gen->prefix, gen->prefix, gen->prefix); vkd3d_string_buffer_printf(gen->buffer, " %s_main(%s_in, %s_out", gen->prefix, gen->prefix, gen->prefix);
if (gen->read_vertex_id) if (gen->read_vertex_id)
vkd3d_string_buffer_printf(gen->buffer, ", vertex_id"); vkd3d_string_buffer_printf(gen->buffer, ", vertex_id");
if (gen->write_depth) if (bitmap_is_set(gen->program->io_dcls, VKD3DSPR_DEPTHOUT))
vkd3d_string_buffer_printf(gen->buffer, ", shader_out_depth"); vkd3d_string_buffer_printf(gen->buffer, ", output.shader_out_depth");
if (gen->program->descriptors.descriptor_count) if (gen->program->descriptors.descriptor_count)
vkd3d_string_buffer_printf(gen->buffer, ", descriptors"); vkd3d_string_buffer_printf(gen->buffer, ", descriptors");
vkd3d_string_buffer_printf(gen->buffer, ");\n"); vkd3d_string_buffer_printf(gen->buffer, ");\n");
@@ -1477,8 +1468,8 @@ static int msl_generator_generate(struct msl_generator *gen, struct vkd3d_shader
if (gen->read_vertex_id) if (gen->read_vertex_id)
vkd3d_string_buffer_printf(gen->buffer, ", uint vertex_id"); vkd3d_string_buffer_printf(gen->buffer, ", uint vertex_id");
if (gen->write_depth) if (bitmap_is_set(gen->program->io_dcls, VKD3DSPR_DEPTHOUT))
vkd3d_string_buffer_printf(gen->buffer, ", thread float& o_depth"); vkd3d_string_buffer_printf(gen->buffer, ", thread float &o_depth");
if (gen->program->descriptors.descriptor_count) if (gen->program->descriptors.descriptor_count)
vkd3d_string_buffer_printf(gen->buffer, ", constant descriptor *descriptors"); vkd3d_string_buffer_printf(gen->buffer, ", constant descriptor *descriptors");
vkd3d_string_buffer_printf(gen->buffer, ")\n{\n"); vkd3d_string_buffer_printf(gen->buffer, ")\n{\n");