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;
|
const char *prefix;
|
||||||
bool failed;
|
bool failed;
|
||||||
|
|
||||||
|
bool write_depth;
|
||||||
|
|
||||||
const struct vkd3d_shader_interface_info *interface_info;
|
const struct vkd3d_shader_interface_info *interface_info;
|
||||||
const struct vkd3d_shader_scan_descriptor_info1 *descriptor_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);
|
msl_print_register_datatype(buffer, gen, reg->data_type);
|
||||||
break;
|
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:
|
case VKD3DSPR_IMMCONST:
|
||||||
switch (reg->dimension)
|
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_dst->mask = vkd3d_string_buffer_get(&gen->string_buffers);
|
||||||
|
|
||||||
msl_print_register_name(msl_dst->register_name, gen, &vsir_dst->reg);
|
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;
|
return write_mask;
|
||||||
}
|
}
|
||||||
@ -827,6 +838,14 @@ 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)
|
||||||
|
{
|
||||||
|
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)
|
if (e->target_location == SIGNATURE_TARGET_LOCATION_UNUSED)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -936,6 +955,12 @@ 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;
|
||||||
|
|
||||||
@ -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_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->write_depth)
|
||||||
|
vkd3d_string_buffer_printf(gen->buffer, ", shader_out_depth");
|
||||||
if (gen->descriptor_info->descriptor_count)
|
if (gen->descriptor_info->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");
|
||||||
@ -1035,6 +1065,8 @@ static int msl_generator_generate(struct msl_generator *gen, struct vkd3d_shader
|
|||||||
"void %s_main(thread vkd3d_vec4 *v, "
|
"void %s_main(thread vkd3d_vec4 *v, "
|
||||||
"thread vkd3d_vec4 *o",
|
"thread vkd3d_vec4 *o",
|
||||||
gen->prefix);
|
gen->prefix);
|
||||||
|
if (gen->write_depth)
|
||||||
|
vkd3d_string_buffer_printf(gen->buffer, ", thread float& o_depth");
|
||||||
if (gen->descriptor_info->descriptor_count)
|
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, ", constant vkd3d_%s_descriptors& descriptors", gen->prefix);
|
||||||
vkd3d_string_buffer_printf(gen->buffer, ")\n{\n");
|
vkd3d_string_buffer_printf(gen->buffer, ")\n{\n");
|
||||||
|
@ -16,22 +16,22 @@ float main() : SV_Depth
|
|||||||
uniform 0 float 0.0
|
uniform 0 float 0.0
|
||||||
clear dsv 1.0
|
clear dsv 1.0
|
||||||
depth less
|
depth less
|
||||||
todo(msl) draw quad
|
draw quad
|
||||||
probe dsv (0,0) r (0.0)
|
probe dsv (0,0) r (0.0)
|
||||||
|
|
||||||
uniform 0 float 0.75
|
uniform 0 float 0.75
|
||||||
clear dsv 1.0
|
clear dsv 1.0
|
||||||
todo(msl) draw quad
|
draw quad
|
||||||
probe dsv (0,0) r (0.75)
|
probe dsv (0,0) r (0.75)
|
||||||
|
|
||||||
clear dsv 0.5
|
clear dsv 0.5
|
||||||
depth greater
|
depth greater
|
||||||
todo(msl) draw quad
|
draw quad
|
||||||
probe dsv (0,0) r (0.75)
|
probe dsv (0,0) r (0.75)
|
||||||
|
|
||||||
depth less
|
depth less
|
||||||
clear dsv 0.5
|
clear dsv 0.5
|
||||||
todo(msl) draw quad
|
draw quad
|
||||||
probe dsv (0,0) r (0.5)
|
probe dsv (0,0) r (0.5)
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user