mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-01-28 13:05:02 -08:00
vkd3d-shader/msl: Implement support for the VKD3DSPR_DEPTHOUT register.
This commit is contained in:
parent
b7203b0bbe
commit
7d2819249b
Notes:
Henri Verbeet
2024-11-30 14:35:45 +01:00
Approved-by: Henri Verbeet (@hverbeet) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1286
@ -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");
|
||||
|
@ -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)
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user