vkd3d-shader/msl: Handle SV_POSITION inputs.

This commit is contained in:
Henri Verbeet
2025-05-19 00:19:02 +02:00
parent f14a0dfe07
commit e948098ae3
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
5 changed files with 48 additions and 28 deletions

View File

@@ -1046,21 +1046,31 @@ static void msl_generate_input_struct_declarations(struct msl_generator *gen)
if (e->target_location == SIGNATURE_TARGET_LOCATION_UNUSED) if (e->target_location == SIGNATURE_TARGET_LOCATION_UNUSED)
continue; continue;
if (e->sysval_semantic) switch (e->sysval_semantic)
{ {
if (e->sysval_semantic == VKD3D_SHADER_SV_IS_FRONT_FACE) case VKD3D_SHADER_SV_NONE:
{ break;
case VKD3D_SHADER_SV_POSITION:
if (type != VKD3D_SHADER_TYPE_PIXEL)
msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL,
"Internal compiler error: Unhandled SV_POSITION in shader type #%x.", type);
msl_print_indent(gen->buffer, 1);
vkd3d_string_buffer_printf(buffer, "float4 position [[position]];\n");
continue;
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,
"Internal compiler error: Unhandled SV_IS_FRONT_FACE in shader type #%x.", type); "Internal compiler error: Unhandled SV_IS_FRONT_FACE in shader type #%x.", type);
msl_print_indent(gen->buffer, 1); msl_print_indent(gen->buffer, 1);
vkd3d_string_buffer_printf(buffer, "bool is_front_face [[front_facing]];\n"); vkd3d_string_buffer_printf(buffer, "bool is_front_face [[front_facing]];\n");
continue; continue;
}
msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL, default:
"Internal compiler error: Unhandled system value %#x.", e->sysval_semantic); msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL,
continue; "Internal compiler error: Unhandled system value %#x.", e->sysval_semantic);
continue;
} }
if (e->min_precision != VKD3D_SHADER_MINIMUM_PRECISION_NONE) if (e->min_precision != VKD3D_SHADER_MINIMUM_PRECISION_NONE)
@@ -1265,23 +1275,33 @@ static void msl_generate_entrypoint_prologue(struct msl_generator *gen)
continue; continue;
vkd3d_string_buffer_printf(buffer, " %s_in[%u]", gen->prefix, e->register_index); vkd3d_string_buffer_printf(buffer, " %s_in[%u]", gen->prefix, e->register_index);
if (e->sysval_semantic == VKD3D_SHADER_SV_NONE) switch (e->sysval_semantic)
{ {
msl_print_register_datatype(buffer, gen, vkd3d_data_type_from_component_type(e->component_type)); case VKD3D_SHADER_SV_NONE:
msl_print_write_mask(buffer, e->mask); msl_print_register_datatype(buffer, gen, vkd3d_data_type_from_component_type(e->component_type));
vkd3d_string_buffer_printf(buffer, " = input.shader_in_%u", i); msl_print_write_mask(buffer, e->mask);
msl_print_write_mask(buffer, e->mask); vkd3d_string_buffer_printf(buffer, " = input.shader_in_%u", i);
} break;
else if (e->sysval_semantic == VKD3D_SHADER_SV_IS_FRONT_FACE)
{ case VKD3D_SHADER_SV_POSITION:
vkd3d_string_buffer_printf(buffer, ".u = uint4(input.is_front_face ? 0xffffffffu : 0u, 0, 0, 0)"); msl_print_register_datatype(buffer, gen, VKD3D_DATA_FLOAT);
} msl_print_write_mask(buffer, e->mask);
else vkd3d_string_buffer_printf(buffer, " = float4(input.position.xyz, 1.0f / input.position.w)");
{ break;
vkd3d_string_buffer_printf(buffer, " = <unhandled sysval %#x>", e->sysval_semantic);
msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL, case VKD3D_SHADER_SV_IS_FRONT_FACE:
"Internal compiler error: Unhandled system value %#x input.", e->sysval_semantic); msl_print_register_datatype(buffer, gen, VKD3D_DATA_UINT);
msl_print_write_mask(buffer, e->mask);
vkd3d_string_buffer_printf(buffer, " = uint4(input.is_front_face ? 0xffffffffu : 0u, 0, 0, 0)");
break;
default:
vkd3d_string_buffer_printf(buffer, " = <unhandled sysval %#x>", e->sysval_semantic);
msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL,
"Internal compiler error: Unhandled system value %#x input.", e->sysval_semantic);
break;
} }
msl_print_write_mask(buffer, e->mask);
vkd3d_string_buffer_printf(buffer, ";\n"); vkd3d_string_buffer_printf(buffer, ";\n");
} }
} }

View File

@@ -158,5 +158,5 @@ float4 main(float4 pos : SV_Position, float4 color : COLOR) : SV_Target
} }
[test] [test]
todo(msl) draw triangle list 3 draw triangle list 3
probe (0, 0) rgba(1.0, 10.0, 11.0, 4.0) probe (0, 0) rgba(1.0, 10.0, 11.0, 4.0)

View File

@@ -73,7 +73,7 @@ float4 main(float4 pos : sv_position) : sv_target
} }
[test] [test]
todo(msl) draw quad draw quad
probe (0, 0) rgba (0.1, 0.2, 0.3, 0.4) probe (0, 0) rgba (0.1, 0.2, 0.3, 0.4)
probe (1, 0) rgba (0.5, 0.7, 0.6, 0.8) probe (1, 0) rgba (0.5, 0.7, 0.6, 0.8)
probe (0, 1) rgba (0.6, 0.5, 0.2, 0.1) probe (0, 1) rgba (0.6, 0.5, 0.2, 0.1)

View File

@@ -21,7 +21,7 @@ float4 main(float4 pos : sv_position) : sv_target
[test] [test]
clear rtv 0 0.0 0.0 0.0 0.0 clear rtv 0 0.0 0.0 0.0 0.0
todo(msl) draw triangle strip 4 draw triangle strip 4
probe ( 80, 140) rgba( 0.0, 0.0, 0.0, 0.0) probe ( 80, 140) rgba( 0.0, 0.0, 0.0, 0.0)
probe ( 80, 420) rgba( 80.5, 420.5, 0.100678146, 1.229981) 192 probe ( 80, 420) rgba( 80.5, 420.5, 0.100678146, 1.229981) 192
probe (180, 140) rgba(180.5, 140.5, 0.077760354, 1.918082) 192 probe (180, 140) rgba(180.5, 140.5, 0.077760354, 1.918082) 192

View File

@@ -15,7 +15,7 @@ float4 main(float4 pos : sv_position) : sv_target
} }
[test] [test]
todo(msl) draw quad draw quad
probe (0, 0) rgba (0.1, 0.2, 0.3, 0.4) probe (0, 0) rgba (0.1, 0.2, 0.3, 0.4)
probe (1, 0) rgba (0.5, 0.7, 0.6, 0.8) probe (1, 0) rgba (0.5, 0.7, 0.6, 0.8)
probe (0, 1) rgba (0.6, 0.5, 0.2, 0.1) probe (0, 1) rgba (0.6, 0.5, 0.2, 0.1)
@@ -30,7 +30,7 @@ float4 main(float4 pos : sv_position) : sv_target
} }
[test] [test]
todo(msl) draw quad draw quad
probe (0, 0) rgba (0.1, 0.2, 0.3, 0.4) probe (0, 0) rgba (0.1, 0.2, 0.3, 0.4)
probe (1, 0) rgba (0.6, 0.5, 0.2, 0.1) probe (1, 0) rgba (0.6, 0.5, 0.2, 0.1)
probe (0, 1) rgba (0.5, 0.7, 0.6, 0.8) probe (0, 1) rgba (0.5, 0.7, 0.6, 0.8)