tests/hlsl: Add some tests for special semantic name suffixes.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
This commit is contained in:
Nikolay Sivov
2025-01-18 22:39:08 +01:00
committed by Henri Verbeet
parent cc53965ea9
commit de2653e3d3
Notes: Henri Verbeet 2025-10-06 19:48:17 +02:00
Approved-by: Elizabeth Figura (@zfigura)
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1721

View File

@@ -1,6 +1,14 @@
[require]
shader model >= 5.0
[input layout]
0 r32g32-float attr_centroid
[vb 0]
1.0 2.0
1.0 2.0
1.0 2.0
[rtv 0]
format r32g32b32a32-float
size (2dms, 4, 640, 480)
@@ -14,7 +22,9 @@ static const float2 vertices[3] =
{ 3.0f, 1.0f},
{-1.0f + epsilon, -3.0f},
};
void main(uint id : SV_VertexID, out float4 position : SV_Position, out float2 attr : ATTR)
void main(uint id : SV_VertexID, out float4 position : SV_Position, out float2 attr : ATTR,
inout float2 attr2 : ATTR_centroid0)
{
position = float4(vertices[id], 0.0f, 1.0f);
attr = float2(position.x * 320.0f + 320.0f, -position.y * 240.0f + 240.0f);
@@ -52,6 +62,25 @@ todo(vulkan | opengl & llvmpipe | d3d12) probe (639, 479) f32(0.0, 0.0, 0.0, 0.0
% The WARP driver seems to have problems with some corner pixels, which we
% avoid.
[pixel shader fail]
static const float2 positions[4] =
{
{-0.125f, -0.375f},
{ 0.375f, -0.125f},
{-0.375f, 0.125f},
{ 0.125f, 0.375f},
};
float4 main(float4 pos : SV_Position_centroid, uint sample_idx : SV_SampleIndex) : SV_Target
{
bool first_col = floor(pos.x) == 0.0f;
float2 ref = floor(pos.xy) + float2(0.5f, 0.5f);
float2 diff = pos.xy - ref;
float2 expected = first_col ? positions[0] : 0.0f;
float2 err = abs(diff - expected) * (sample_idx + 1);
return floor(1000.0f * float4(err, 0.0f, 0.0f));
}
[pixel shader]
static const float2 positions[4] =
{
@@ -141,6 +170,7 @@ static const float2 positions[4] =
{-0.375f, 0.125f},
{ 0.125f, 0.375f},
};
float4 main(float4 pos : SV_Position, centroid float2 attr : ATTR,
uint sample_idx : SV_SampleIndex) : SV_Target
{
@@ -160,6 +190,149 @@ probe (638, 0) rgba(0.0, 0.0, 0.0, 0.0)
probe (0, 478) rgba(0.25, 0.25, 0.25, 0.25)
todo(llvmpipe) probe (639, 479) rgba(0.0, 0.0, 0.0, 0.0)
[pixel shader]
static const float2 positions[4] =
{
{-0.125f, -0.375f},
{ 0.375f, -0.125f},
{-0.375f, 0.125f},
{ 0.125f, 0.375f},
};
float4 main(float4 pos : SV_Position, float2 attr : ATTR_centRoid,
uint sample_idx : SV_SampleIndex) : SV_Target
{
bool first_col = floor(pos.x) == 0.0f;
float2 ref = floor(pos.xy) + float2(0.5f, 0.5f);
float2 diff = attr.xy - ref;
float2 expected = first_col ? positions[0] : 0.0f;
float2 err = abs(diff - expected) * (sample_idx + 1);
return floor(1000.0f * float4(err, 0.0f, 0.0f));
}
% Tests are skipped for sm6, since it doesn't consider semantic suffixes
% leaving names unchanged.
[test]
clear rtv 0 1.0 1.0 1.0 1.0
if(sm<6) draw triangle list 3
if(sm<6) todo probe (0, 0) f32(0.25, 0.25, 0.25, 0.25)
if(sm<6) probe (638, 0) f32(0.0, 0.0, 0.0, 0.0)
if(sm<6) todo probe (0, 478) f32(0.25, 0.25, 0.25, 0.25)
if(sm<6) probe (639, 479) f32(0.0, 0.0, 0.0, 0.0)
% The "_centroid" semantic modifier can be specified together with the "centroid" prefix attribute.
[pixel shader]
static const float2 positions[4] =
{
{-0.125f, -0.375f},
{ 0.375f, -0.125f},
{-0.375f, 0.125f},
{ 0.125f, 0.375f},
};
float4 main(float4 pos : SV_Position, centroid float2 attr : ATTR_centRoid,
uint sample_idx : SV_SampleIndex) : SV_Target
{
bool first_col = floor(pos.x) == 0.0f;
float2 ref = floor(pos.xy) + float2(0.5f, 0.5f);
float2 diff = attr.xy - ref;
float2 expected = first_col ? positions[0] : 0.0f;
float2 err = abs(diff - expected) * (sample_idx + 1);
return floor(1000.0f * float4(err, 0.0f, 0.0f));
}
% Tests are skipped for sm6, since it doesn't consider semantic suffixes
% leaving names unchanged.
[test]
clear rtv 0 1.0 1.0 1.0 1.0
if(sm<6) todo(msl | glsl) draw triangle list 3
if(sm<6) todo(llvmpipe) probe (0, 0) f32(0.25, 0.25, 0.25, 0.25)
if(sm<6) probe (638, 0) f32(0.0, 0.0, 0.0, 0.0)
if(sm<6) probe (0, 478) f32(0.25, 0.25, 0.25, 0.25)
if(sm<6) todo(llvmpipe) probe (639, 479) f32(0.0, 0.0, 0.0, 0.0)
[pixel shader]
static const float2 positions[4] =
{
{-0.125f, -0.375f},
{ 0.375f, -0.125f},
{-0.375f, 0.125f},
{ 0.125f, 0.375f},
};
struct ps_in
{
float4 pos : SV_Position;
float2 attr : ATTR_centRoid;
uint sample_idx : SV_SampleIndex;
};
float4 main(ps_in data) : SV_Target
{
bool first_col = floor(data.pos.x) == 0.0f;
float2 ref = floor(data.pos.xy) + float2(0.5f, 0.5f);
float2 diff = data.attr.xy - ref;
float2 expected = first_col ? positions[0] : 0.0f;
float2 err = abs(diff - expected) * (data.sample_idx + 1);
return floor(1000.0f * float4(err, 0.0f, 0.0f));
}
% Tests are skipped for sm6, since it doesn't consider semantic suffixes
% leaving names unchanged.
[test]
clear rtv 0 1.0 1.0 1.0 1.0
if(sm<6) draw triangle list 3
if(sm<6) todo probe (0, 0) f32(0.25, 0.25, 0.25, 0.25)
if(sm<6) probe (638, 0) f32(0.0, 0.0, 0.0, 0.0)
if(sm<6) todo probe (0, 478) f32(0.25, 0.25, 0.25, 0.25)
if(sm<6) probe (639, 479) f32(0.0, 0.0, 0.0, 0.0)
[pixel shader]
static const float2 positions[4] =
{
{-0.125f, -0.375f},
{ 0.375f, -0.125f},
{-0.375f, 0.125f},
{ 0.125f, 0.375f},
};
float4 main(float4 pos : SV_Position, float2 attr : ATTR, float2 attr2 : ATTR_centroid0,
uint sample_idx : SV_SampleIndex) : SV_Target
{
bool first_col = floor(pos.x) == 0.0f;
float2 ref = floor(pos.xy) + float2(0.5f, 0.5f);
float2 diff = attr.xy - ref;
float2 expected = first_col ? positions[0] : 0.0f;
float2 err = abs(diff - expected) * (sample_idx + 1);
return floor(1000.0f * float4(err, attr2.x, attr2.y));
}
[test]
clear rtv 0 1.0 1.0 1.0 1.0
todo(msl & sm>=6) draw triangle list 3
todo probe (0, 0) f32(219.0, 656.5, 750.25, 1500.25)
probe (638, 0) f32(0.0, 0.0, 1000.0, 2000.0)
todo probe (0, 478) f32(219.0, 656.5, 750.25, 1500.25)
probe (639, 479) f32(0.0, 0.0, 1000.0, 2000.0)
[pixel shader]
float4 main(float4 pos : SV_Position, float2 attr : ATTR, float2 attr2 : ATTR_centroid_centroid,
uint sample_idx : SV_SampleIndex) : SV_Target
{
return float4(attr2, 0.0f, 0.0f);
}
[test]
clear rtv 0 1.0 1.0 1.0 1.0
% This test causes the GPU to hang with MVK.
if(sm<6 & !mvk) draw triangle list 3
if(sm<6 & !mvk) probe (0, 0) f32(1.0, 1.75, 0.25, 0.25)
if(sm<6 & !mvk) probe (638, 0) f32(1.0, 2.0, 0.0, 0.0)
% Sample interpolation.
[pixel shader todo]
@@ -257,3 +430,38 @@ probe ( 0, 0) rgba(0.25, 0.25, 0.25, 0.25)
probe (639, 0) rgba(0.0, 0.0, 0.0, 0.0)
probe ( 0, 479) rgba(0.25, 0.25, 0.25, 0.25)
probe (639, 479) rgba(0.0, 0.0, 0.0, 0.0)
[require]
shader model >= 6.0
% SM6 appears to require all vertex outputs to be declared in
% pixel shader, meaning that both ATTR and ATTR_centroid must be present.
% That is not going to work for <SM6, so it's tested separately.
[pixel shader]
static const float2 positions[4] =
{
{-0.125f, -0.375f},
{ 0.375f, -0.125f},
{-0.375f, 0.125f},
{ 0.125f, 0.375f},
};
float4 main(float4 pos : SV_Position, float2 attr : ATTR,
float2 attr2 : ATTR_centroid, uint sample_idx : SV_SampleIndex) : SV_Target
{
bool first_col = floor(pos.x) == 0.0f;
float2 ref = floor(pos.xy) + float2(0.5f, 0.5f);
float2 diff = attr.xy - ref;
float2 expected = first_col ? positions[0] : 0.0f;
float2 err = abs(diff - expected) * (sample_idx + 1);
return floor(1000.0f * float4(err, attr2.x, attr2.y));
}
[test]
clear rtv 0 1.0 1.0 1.0 1.0
todo(glsl | msl) draw triangle list 3
todo probe (0, 0) f32(219.0, 656.5, 750.25, 1500.25)
probe (638, 0) f32(0.0, 0.0, 1000.0, 2000.0)
todo probe (0, 478) f32(219.0, 656.5, 750.25, 1500.25)
probe (639, 479) f32(0.0, 0.0, 1000.0, 2000.0)