vkd3d-shader/msl: Implement support for VKD3DSPR_UNDEF registers.

MSL doesn't seem to have any special handling for undefined values,
differently from SPIR-V. Thus we just emit zeros.

UNDEF registers are sometimes created by the DXIL parser,
for example in sm6_parser_emit_composite_construct().
This commit is contained in:
Giovanni Mascellani
2025-10-20 22:04:46 +02:00
committed by Henri Verbeet
parent eaabd2ffd7
commit cc1db404b0
Notes: Henri Verbeet 2025-10-30 20:00:07 +01:00
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1757
10 changed files with 125 additions and 135 deletions

View File

@@ -24,11 +24,10 @@ float4 main() : sv_target
}
[test]
todo(sm<6 | msl) draw quad
todo(sm<6) draw quad
% sm6 seems to ignore profile qualifiers entirely.
if(sm>=6) probe (0,0) rgba (1, 1, 1, 99)
if(sm<6) probe (0,0) rgba (0, 0, 0, 99)
if(sm>=6) probe (0,0) f32(1, 1, 1, 99)
if(sm<6) probe (0,0) f32(0, 0, 0, 99)
[pixel shader todo]
Texture2D tex1 : register(cs, t1);
@@ -39,10 +38,9 @@ float4 main() : sv_target
}
[test]
todo(sm<6 | msl) draw quad
if(sm>=6) probe (0,0) rgba (1, 1, 1, 99)
if(sm<6) probe (0,0) rgba (0, 0, 0, 99)
todo(sm<6) draw quad
if(sm>=6) probe (0,0) f32(1, 1, 1, 99)
if(sm<6) probe (0,0) f32(0, 0, 0, 99)
[pixel shader todo]
Texture2D tex1 : register(ps, t1);
@@ -53,9 +51,8 @@ float4 main() : sv_target
}
[test]
todo(sm<6 | msl) draw quad
probe (0, 0) rgba (1, 1, 1, 99)
todo(sm<6) draw quad
probe (0, 0) f32(1, 1, 1, 99)
[pixel shader fail todo]
Texture2D tex1 : register(PS, t1);
@@ -93,9 +90,8 @@ float4 main() : sv_target
}
[test]
todo(msl & sm>=6) draw quad
probe (0, 0) rgba (1, 1, 1, 99)
draw quad
probe (0, 0) f32(1, 1, 1, 99)
[pixel shader todo]
Texture2D tex1 : register(ps_4_0, t1);
@@ -106,9 +102,8 @@ float4 main() : sv_target
}
[test]
todo(sm<6 | msl) draw quad
probe (0, 0) rgba (1, 1, 1, 99)
todo(sm<6) draw quad
probe (0, 0) f32(1, 1, 1, 99)
[pixel shader fail]
Texture2D tex1 : register(ps.4.0, t1);
@@ -128,10 +123,9 @@ float4 main() : sv_target
}
[test]
todo(sm<6 | msl) draw quad
if(sm>=6) probe (0,0) rgba (1, 1, 1, 99)
if(sm<6) probe (0,0) rgba (0, 0, 0, 99)
todo(sm<6) draw quad
if(sm>=6) probe (0,0) f32(1, 1, 1, 99)
if(sm<6) probe (0,0) f32(0, 0, 0, 99)
[pixel shader todo]
Texture2D tex1 : register(ps_4_1, t1) : register(ps_4_0, t2);
@@ -142,8 +136,8 @@ float4 main() : sv_target
}
[test]
todo(sm<6 | msl) draw quad
probe (0, 0) rgba (2, 2, 2, 99)
todo(sm<6) draw quad
probe (0, 0) f32(2, 2, 2, 99)
% The documentation explicitly gives this case as an example, implying that a
% more specific profile takes precedence over a less specific one. It doesn't.
@@ -163,10 +157,9 @@ float4 main() : sv_target
}
[test]
todo(sm<6 | msl) draw quad
if(sm>=6) probe (0,0) rgba (2, 2, 2, 99)
if(sm<6) probe (0,0) rgba (1, 1, 1, 99)
todo(sm<6) draw quad
if(sm>=6) probe (0,0) f32(2, 2, 2, 99)
if(sm<6) probe (0,0) f32(1, 1, 1, 99)
[pixel shader fail(sm<4.1) todo]
Texture2D tex1 : register(ps, t1) : register(ps_4_0, t2);
@@ -177,9 +170,8 @@ float4 main() : sv_target
}
[test]
todo(msl & sm>=6) draw quad
probe (0, 0) rgba (2, 2, 2, 99)
draw quad
probe (0, 0) f32(2, 2, 2, 99)
[pixel shader fail(sm<4.1) todo]
Texture2D tex1 : register(ps_4_0, t1) : register(ps, t2);
@@ -190,9 +182,8 @@ float4 main() : sv_target
}
[test]
todo(msl & sm>=6) draw quad
probe (0, 0) rgba (2, 2, 2, 99)
draw quad
probe (0, 0) f32(2, 2, 2, 99)
[pixel shader fail(sm<6) todo]
Texture2D tex1 : register(ps_6_0, t1) : register(ps, t2);
@@ -203,9 +194,8 @@ float4 main() : sv_target
}
[test]
todo(msl & sm>=6) draw quad
probe (0, 0) rgba (2, 2, 2, 99)
draw quad
probe (0, 0) f32(2, 2, 2, 99)
[pixel shader fail(sm<4.1 | sm>=6) todo]
Texture2D tex1 : register(ps_4_0, t1) : register(t2);
@@ -257,8 +247,8 @@ float4 main() : sv_target
}
[test]
todo(sm<6 | msl) draw quad
probe (0, 0) rgba (1, 1, 1, 99)
todo(sm<6) draw quad
probe (0, 0) f32(1, 1, 1, 99)
% Bracket exprs should still parse correctly.
@@ -271,9 +261,9 @@ float4 main() : sv_target
}
[test]
todo(sm<6 | msl) draw quad
if(sm>=6) probe (0, 0) rgba(0, 0, 0, 99)
if(sm<6) probe (0, 0) rgba(1, 1, 1, 99)
todo(sm<6) draw quad
if(sm>=6) probe (0, 0) f32(0, 0, 0, 99)
if(sm<6) probe (0, 0) f32(1, 1, 1, 99)
% This works, though the bind point is ignored.