mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-09-12 18:50:22 -07:00
vkd3d-shader/msl: Implement support for VKD3DSPR_SAMPLEMASK registers.
This commit is contained in:
Notes:
Henri Verbeet
2025-06-09 16:31:45 +02:00
Approved-by: Giovanni Mascellani (@giomasce) Approved-by: Henri Verbeet (@hverbeet) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1547
@@ -387,6 +387,14 @@ static enum msl_data_type msl_print_register_name(struct vkd3d_string_buffer *bu
|
||||
msl_print_subscript(buffer, gen, reg->idx[1].rel_addr, reg->idx[1].offset);
|
||||
return MSL_DATA_UNION;
|
||||
|
||||
case VKD3DSPR_SAMPLEMASK:
|
||||
if (gen->program->shader_version.type != VKD3D_SHADER_TYPE_PIXEL)
|
||||
msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL,
|
||||
"Internal compiler error: Unhandled sample coverage mask in shader type #%x.",
|
||||
gen->program->shader_version.type);
|
||||
vkd3d_string_buffer_printf(buffer, "o_mask");
|
||||
return MSL_DATA_FLOAT;
|
||||
|
||||
default:
|
||||
msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL,
|
||||
"Internal compiler error: Unhandled register type %#x.", reg->type);
|
||||
@@ -1292,6 +1300,12 @@ static void msl_generate_output_struct_declarations(struct msl_generator *gen)
|
||||
vkd3d_string_buffer_printf(buffer, "float shader_out_depth [[depth(any)]];\n");
|
||||
}
|
||||
|
||||
if (bitmap_is_set(gen->program->io_dcls, VKD3DSPR_SAMPLEMASK))
|
||||
{
|
||||
msl_print_indent(gen->buffer, 1);
|
||||
vkd3d_string_buffer_printf(buffer, "uint shader_out_mask [[sample_mask]];\n");
|
||||
}
|
||||
|
||||
vkd3d_string_buffer_printf(buffer, "};\n\n");
|
||||
}
|
||||
|
||||
@@ -1387,6 +1401,9 @@ static void msl_generate_entrypoint_epilogue(struct msl_generator *gen)
|
||||
}
|
||||
vkd3d_string_buffer_printf(buffer, ";\n");
|
||||
}
|
||||
|
||||
if (bitmap_is_set(gen->program->io_dcls, VKD3DSPR_SAMPLEMASK))
|
||||
vkd3d_string_buffer_printf(gen->buffer, " output.shader_out_mask = as_type<uint>(o_mask);\n");
|
||||
}
|
||||
|
||||
static void msl_generate_entrypoint(struct msl_generator *gen)
|
||||
@@ -1430,6 +1447,9 @@ static void msl_generate_entrypoint(struct msl_generator *gen)
|
||||
vkd3d_string_buffer_printf(gen->buffer, " vkd3d_vec4 %s_in[%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);
|
||||
if (bitmap_is_set(gen->program->io_dcls, VKD3DSPR_SAMPLEMASK))
|
||||
vkd3d_string_buffer_printf(gen->buffer, " float o_mask;\n");
|
||||
vkd3d_string_buffer_printf(gen->buffer, "\n");
|
||||
|
||||
msl_generate_entrypoint_prologue(gen);
|
||||
|
||||
@@ -1438,9 +1458,11 @@ static void msl_generate_entrypoint(struct msl_generator *gen)
|
||||
vkd3d_string_buffer_printf(gen->buffer, ", vertex_id");
|
||||
if (bitmap_is_set(gen->program->io_dcls, VKD3DSPR_DEPTHOUT))
|
||||
vkd3d_string_buffer_printf(gen->buffer, ", output.shader_out_depth");
|
||||
if (bitmap_is_set(gen->program->io_dcls, VKD3DSPR_SAMPLEMASK))
|
||||
vkd3d_string_buffer_printf(gen->buffer, ", o_mask");
|
||||
if (gen->program->descriptors.descriptor_count)
|
||||
vkd3d_string_buffer_printf(gen->buffer, ", descriptors");
|
||||
vkd3d_string_buffer_printf(gen->buffer, ");\n");
|
||||
vkd3d_string_buffer_printf(gen->buffer, ");\n\n");
|
||||
|
||||
msl_generate_entrypoint_epilogue(gen);
|
||||
|
||||
@@ -1502,6 +1524,8 @@ static int msl_generator_generate(struct msl_generator *gen, struct vkd3d_shader
|
||||
vkd3d_string_buffer_printf(gen->buffer, ", uint vertex_id");
|
||||
if (bitmap_is_set(gen->program->io_dcls, VKD3DSPR_DEPTHOUT))
|
||||
vkd3d_string_buffer_printf(gen->buffer, ", thread float &o_depth");
|
||||
if (bitmap_is_set(gen->program->io_dcls, VKD3DSPR_SAMPLEMASK))
|
||||
vkd3d_string_buffer_printf(gen->buffer, ", thread float &o_mask");
|
||||
if (gen->program->descriptors.descriptor_count)
|
||||
vkd3d_string_buffer_printf(gen->buffer, ", constant descriptor *descriptors");
|
||||
vkd3d_string_buffer_printf(gen->buffer, ")\n{\n");
|
||||
|
Reference in New Issue
Block a user