vkd3d-shader/msl: Handle SV_VERTEX_ID inputs.

This commit is contained in:
Henri Verbeet
2025-05-19 00:40:37 +02:00
parent e948098ae3
commit cf312e14a9
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
4 changed files with 41 additions and 11 deletions

View File

@@ -48,6 +48,7 @@ struct msl_generator
const char *prefix; const char *prefix;
bool failed; bool failed;
bool read_vertex_id;
bool write_depth; bool write_depth;
const struct vkd3d_shader_interface_info *interface_info; const struct vkd3d_shader_interface_info *interface_info;
@@ -1059,6 +1060,13 @@ static void msl_generate_input_struct_declarations(struct msl_generator *gen)
vkd3d_string_buffer_printf(buffer, "float4 position [[position]];\n"); vkd3d_string_buffer_printf(buffer, "float4 position [[position]];\n");
continue; continue;
case VKD3D_SHADER_SV_VERTEX_ID:
if (type != VKD3D_SHADER_TYPE_VERTEX)
msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL,
"Internal compiler error: Unhandled SV_VERTEX_ID in shader type #%x.", type);
gen->read_vertex_id = true;
continue;
case VKD3D_SHADER_SV_IS_FRONT_FACE: case VKD3D_SHADER_SV_IS_FRONT_FACE:
if (type != VKD3D_SHADER_TYPE_PIXEL) if (type != VKD3D_SHADER_TYPE_PIXEL)
msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL, msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL,
@@ -1107,15 +1115,15 @@ static void msl_generate_input_struct_declarations(struct msl_generator *gen)
break; break;
} }
vkd3d_string_buffer_printf(buffer, "shader_in_%u ", i); vkd3d_string_buffer_printf(buffer, "shader_in_%u [[", i);
switch (type) switch (type)
{ {
case VKD3D_SHADER_TYPE_VERTEX: case VKD3D_SHADER_TYPE_VERTEX:
vkd3d_string_buffer_printf(gen->buffer, "[[attribute(%u)]]", e->target_location); vkd3d_string_buffer_printf(gen->buffer, "attribute(%u)", e->target_location);
break; break;
case VKD3D_SHADER_TYPE_PIXEL: case VKD3D_SHADER_TYPE_PIXEL:
vkd3d_string_buffer_printf(gen->buffer, "[[user(locn%u)]]", e->target_location); vkd3d_string_buffer_printf(gen->buffer, "user(locn%u)", e->target_location);
break; break;
default: default:
msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL, msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL,
@@ -1129,13 +1137,16 @@ static void msl_generate_input_struct_declarations(struct msl_generator *gen)
case VKD3DSIM_LINEAR: case VKD3DSIM_LINEAR:
case VKD3DSIM_NONE: case VKD3DSIM_NONE:
break; break;
case VKD3DSIM_CONSTANT:
vkd3d_string_buffer_printf(gen->buffer, ", flat");
break;
default: default:
msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL, msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL,
"Internal compiler error: Unhandled interpolation mode %#x.", e->interpolation_mode); "Internal compiler error: Unhandled interpolation mode %#x.", e->interpolation_mode);
break; break;
} }
vkd3d_string_buffer_printf(buffer, ";\n"); vkd3d_string_buffer_printf(buffer, "]];\n");
} }
vkd3d_string_buffer_printf(buffer, "};\n\n"); vkd3d_string_buffer_printf(buffer, "};\n\n");
@@ -1289,6 +1300,12 @@ static void msl_generate_entrypoint_prologue(struct msl_generator *gen)
vkd3d_string_buffer_printf(buffer, " = float4(input.position.xyz, 1.0f / input.position.w)"); vkd3d_string_buffer_printf(buffer, " = float4(input.position.xyz, 1.0f / input.position.w)");
break; break;
case VKD3D_SHADER_SV_VERTEX_ID:
msl_print_register_datatype(buffer, gen, VKD3D_DATA_UINT);
msl_print_write_mask(buffer, e->mask);
vkd3d_string_buffer_printf(buffer, " = uint4(vertex_id, 0u, 0u, 0u)");
break;
case VKD3D_SHADER_SV_IS_FRONT_FACE: case VKD3D_SHADER_SV_IS_FRONT_FACE:
msl_print_register_datatype(buffer, gen, VKD3D_DATA_UINT); msl_print_register_datatype(buffer, gen, VKD3D_DATA_UINT);
msl_print_write_mask(buffer, e->mask); msl_print_write_mask(buffer, e->mask);
@@ -1374,6 +1391,12 @@ static void msl_generate_entrypoint(struct msl_generator *gen)
"constant descriptor *descriptors [[buffer(0)]],\n"); "constant descriptor *descriptors [[buffer(0)]],\n");
} }
if (gen->read_vertex_id)
{
msl_print_indent(gen->buffer, 2);
vkd3d_string_buffer_printf(gen->buffer, "uint vertex_id [[vertex_id]],\n");
}
msl_print_indent(gen->buffer, 2); msl_print_indent(gen->buffer, 2);
vkd3d_string_buffer_printf(gen->buffer, "vkd3d_%s_in input [[stage_in]])\n{\n", gen->prefix); vkd3d_string_buffer_printf(gen->buffer, "vkd3d_%s_in input [[stage_in]])\n{\n", gen->prefix);
@@ -1388,6 +1411,8 @@ static void msl_generate_entrypoint(struct msl_generator *gen)
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)
vkd3d_string_buffer_printf(gen->buffer, ", vertex_id");
if (gen->write_depth) if (gen->write_depth)
vkd3d_string_buffer_printf(gen->buffer, ", shader_out_depth"); vkd3d_string_buffer_printf(gen->buffer, ", shader_out_depth");
if (gen->program->descriptors.descriptor_count) if (gen->program->descriptors.descriptor_count)
@@ -1449,6 +1474,9 @@ static int msl_generator_generate(struct msl_generator *gen, struct vkd3d_shader
"static void %s_main(thread vkd3d_vec4 *v, " "static void %s_main(thread vkd3d_vec4 *v, "
"thread vkd3d_vec4 *o", "thread vkd3d_vec4 *o",
gen->prefix); gen->prefix);
if (gen->read_vertex_id)
vkd3d_string_buffer_printf(gen->buffer, ", uint vertex_id");
if (gen->write_depth) if (gen->write_depth)
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)

View File

@@ -23,7 +23,7 @@ float4 main(nointerpolation float4 t : texcoord) : sv_target
} }
[test] [test]
todo(msl) draw triangle list 3 draw triangle list 3
probe (0, 0, 640, 480) rgba (0.0, 1.0, 0.0, 1.0) probe (0, 0, 640, 480) rgba (0.0, 1.0, 0.0, 1.0)
[vertex shader] [vertex shader]
@@ -50,7 +50,7 @@ float4 main(ps_input input) : sv_target
} }
[test] [test]
todo(msl) draw triangle list 3 draw triangle list 3
probe (0, 0, 640, 480) rgba (0.0, 1.0, 0.0, 1.0) probe (0, 0, 640, 480) rgba (0.0, 1.0, 0.0, 1.0)
[vertex shader] [vertex shader]
@@ -77,7 +77,7 @@ float4 main(nointerpolation ps_input input) : sv_target
} }
[test] [test]
todo(msl) draw triangle list 3 draw triangle list 3
probe (0, 0, 640, 480) rgba (0.0, 1.0, 0.0, 1.0) probe (0, 0, 640, 480) rgba (0.0, 1.0, 0.0, 1.0)
[vertex shader] [vertex shader]
@@ -104,7 +104,7 @@ float4 main(centroid ps_input input) : sv_target
} }
[test] [test]
todo(msl) draw triangle list 3 draw triangle list 3
probe (0, 0, 640, 480) rgba (0.0, 1.0, 0.0, 1.0) probe (0, 0, 640, 480) rgba (0.0, 1.0, 0.0, 1.0)
[vertex shader] [vertex shader]
@@ -135,7 +135,7 @@ shader model >= 4.0
shader model < 6.0 shader model < 6.0
[test] [test]
todo(msl) draw triangle list 3 draw triangle list 3
probe (0, 0, 640, 480) rgba (0.0, 1.0, 0.0, 1.0) probe (0, 0, 640, 480) rgba (0.0, 1.0, 0.0, 1.0)
% Centroid for SM 6. % Centroid for SM 6.

View File

@@ -192,7 +192,7 @@ format r32g32b32a32-sint
size (2d, 640, 480) size (2d, 640, 480)
[test] [test]
todo(msl) draw triangle strip 4 draw triangle strip 4
todo(opengl) probe (0, 0) rgbai(-7000, -2, 0, 0) todo(opengl) probe (0, 0) rgbai(-7000, -2, 0, 0)
[pixel shader] [pixel shader]
@@ -206,7 +206,7 @@ format r32g32b32a32-uint
size (2d, 640, 480) size (2d, 640, 480)
[test] [test]
todo(msl) draw triangle strip 4 draw triangle strip 4
probe (0, 0) rgbai(-7000, -2, 0, 0) probe (0, 0) rgbai(-7000, -2, 0, 0)
[require] [require]

View File

@@ -89,6 +89,8 @@ static MTLVertexFormat get_metal_attribute_format(DXGI_FORMAT format)
return MTLVertexFormatFloat4; return MTLVertexFormatFloat4;
case DXGI_FORMAT_R32G32_FLOAT: case DXGI_FORMAT_R32G32_FLOAT:
return MTLVertexFormatFloat2; return MTLVertexFormatFloat2;
case DXGI_FORMAT_R32G32_SINT:
return MTLVertexFormatInt2;
default: default:
return MTLVertexFormatInvalid; return MTLVertexFormatInvalid;
} }