mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-09-12 18:50:22 -07:00
tests/hlsl: Add geometry shader stream output syntax tests.
This commit is contained in:
Notes:
Henri Verbeet
2025-04-23 18:18:33 +02:00
Approved-by: Elizabeth Figura (@zfigura) Approved-by: Henri Verbeet (@hverbeet) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1458
@@ -539,3 +539,196 @@ gs_data main(point gs_data vin[1], inout TriangleStream<gs_data> vout)
|
|||||||
{
|
{
|
||||||
return (gs_data)0;
|
return (gs_data)0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
% Output streams with nonzero stream indices are only allowed with point streams, and with SM >= 5.
|
||||||
|
[geometry shader fail(sm<5) todo(sm>=5)]
|
||||||
|
struct gs_data
|
||||||
|
{
|
||||||
|
float4 pos : SV_POSITION;
|
||||||
|
};
|
||||||
|
struct gs_data2
|
||||||
|
{
|
||||||
|
float4 apple : APPLE;
|
||||||
|
};
|
||||||
|
|
||||||
|
[maxvertexcount(4)]
|
||||||
|
void main(point gs_data vin[1], inout PointStream<gs_data> vout1, inout PointStream<gs_data2> vout2)
|
||||||
|
{
|
||||||
|
vout1.RestartStrip();
|
||||||
|
vout2.RestartStrip();
|
||||||
|
}
|
||||||
|
|
||||||
|
[geometry shader fail]
|
||||||
|
struct gs_data
|
||||||
|
{
|
||||||
|
float4 pos : SV_POSITION;
|
||||||
|
};
|
||||||
|
|
||||||
|
[maxvertexcount(4)]
|
||||||
|
void main(point gs_data vin[1], inout LineStream<gs_data> vout1, inout LineStream<gs_data> vout2)
|
||||||
|
{
|
||||||
|
vout1.RestartStrip();
|
||||||
|
vout2.RestartStrip();
|
||||||
|
}
|
||||||
|
|
||||||
|
[geometry shader fail]
|
||||||
|
struct gs_data
|
||||||
|
{
|
||||||
|
float4 pos : SV_POSITION;
|
||||||
|
};
|
||||||
|
|
||||||
|
[maxvertexcount(4)]
|
||||||
|
void main(point gs_data vin[1], inout TriangleStream<gs_data> vout1, inout TriangleStream<gs_data> vout2)
|
||||||
|
{
|
||||||
|
vout1.RestartStrip();
|
||||||
|
vout2.RestartStrip();
|
||||||
|
}
|
||||||
|
|
||||||
|
[geometry shader fail]
|
||||||
|
struct gs_data
|
||||||
|
{
|
||||||
|
float4 pos : SV_POSITION;
|
||||||
|
};
|
||||||
|
|
||||||
|
[maxvertexcount(4)]
|
||||||
|
void main(point gs_data vin[1], inout TriangleStream<gs_data> vout1, inout TriangleStream<gs_data> vout2)
|
||||||
|
{
|
||||||
|
vout1.RestartStrip();
|
||||||
|
vout2.RestartStrip();
|
||||||
|
}
|
||||||
|
|
||||||
|
% An output stream is only validated when it is used.
|
||||||
|
[geometry shader todo]
|
||||||
|
struct gs_data
|
||||||
|
{
|
||||||
|
float4 pos : SV_POSITION;
|
||||||
|
};
|
||||||
|
|
||||||
|
[maxvertexcount(4)]
|
||||||
|
void main(point gs_data vin[1], inout PointStream<gs_data> vout1, inout TriangleStream<gs_data> vout2)
|
||||||
|
{
|
||||||
|
vout1.RestartStrip();
|
||||||
|
}
|
||||||
|
|
||||||
|
[geometry shader fail(sm<5) todo(sm>=5)]
|
||||||
|
struct gs_data
|
||||||
|
{
|
||||||
|
float4 pos : SV_POSITION;
|
||||||
|
};
|
||||||
|
|
||||||
|
[maxvertexcount(4)]
|
||||||
|
void main(point gs_data vin[1], inout PointStream<gs_data> vout1, inout TriangleStream<gs_data> vout2)
|
||||||
|
{
|
||||||
|
vout2.RestartStrip();
|
||||||
|
}
|
||||||
|
|
||||||
|
% A maximum of 4 streams are allowed.
|
||||||
|
[geometry shader fail(sm<5) todo(sm>=5)]
|
||||||
|
struct gs_data
|
||||||
|
{
|
||||||
|
float4 pos : SV_POSITION;
|
||||||
|
};
|
||||||
|
|
||||||
|
[maxvertexcount(4)]
|
||||||
|
void main(point gs_data vin[1], inout PointStream<gs_data> vout1, inout PointStream<gs_data> vout2,
|
||||||
|
inout PointStream<gs_data> vout3, inout PointStream<gs_data> vout4, inout PointStream<gs_data> vout5)
|
||||||
|
{
|
||||||
|
vout4.RestartStrip();
|
||||||
|
}
|
||||||
|
|
||||||
|
[geometry shader fail]
|
||||||
|
struct gs_data
|
||||||
|
{
|
||||||
|
float4 pos : SV_POSITION;
|
||||||
|
};
|
||||||
|
|
||||||
|
[maxvertexcount(4)]
|
||||||
|
void main(point gs_data vin[1], inout PointStream<gs_data> vout1, inout PointStream<gs_data> vout2,
|
||||||
|
inout PointStream<gs_data> vout3, inout PointStream<gs_data> vout4, inout PointStream<gs_data> vout5)
|
||||||
|
{
|
||||||
|
vout5.RestartStrip();
|
||||||
|
}
|
||||||
|
|
||||||
|
% Max vertex count * output data component count must be less than or equal to 1024.
|
||||||
|
[geometry shader todo]
|
||||||
|
struct gs_data
|
||||||
|
{
|
||||||
|
float2 x : X;
|
||||||
|
};
|
||||||
|
|
||||||
|
[maxvertexcount(512)] // 512 * 2 = 1024.
|
||||||
|
void main(point gs_data vin[1], inout PointStream<gs_data> vout)
|
||||||
|
{
|
||||||
|
vout.Append(vin[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
[geometry shader fail todo]
|
||||||
|
struct gs_data
|
||||||
|
{
|
||||||
|
float2 x : X;
|
||||||
|
};
|
||||||
|
|
||||||
|
[maxvertexcount(513)]
|
||||||
|
void main(point gs_data vin[1], inout PointStream<gs_data> vout)
|
||||||
|
{
|
||||||
|
vout.Append(vin[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
% The component count of the output is used, not its allocated register size.
|
||||||
|
[geometry shader todo]
|
||||||
|
struct gs_data
|
||||||
|
{
|
||||||
|
float2 x : X; // Allocates to o0.xy
|
||||||
|
float3 y : Y; // Allocates to o1.xyz
|
||||||
|
float z : Z; // Allocates to o0.z
|
||||||
|
};
|
||||||
|
|
||||||
|
[maxvertexcount(170)] // 170 * 6 = 1020 < 1024.
|
||||||
|
void main(point gs_data vin[1], inout PointStream<gs_data> vout)
|
||||||
|
{
|
||||||
|
vout.Append(vin[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
% The total component count of all outputs are used. If the allocated registers overlap,
|
||||||
|
% the largest allocation size is used for the calculation.
|
||||||
|
[geometry shader fail(sm<5) todo(sm>=5)]
|
||||||
|
struct gs_data
|
||||||
|
{
|
||||||
|
float2 x : X; // Allocates to o0.xy
|
||||||
|
float3 y : Y; // Allocates to o1.xyz
|
||||||
|
float z : Z; // Allocates to o0.z
|
||||||
|
};
|
||||||
|
|
||||||
|
struct gs_data2
|
||||||
|
{
|
||||||
|
float2 x : X; // Allocates to o0.xy
|
||||||
|
float4 y : Y; // Allocates to o1.xyzw
|
||||||
|
};
|
||||||
|
|
||||||
|
[maxvertexcount(146)] // 146 * 7 = 1022 < 1024.
|
||||||
|
void main(point gs_data vin[1], inout PointStream<gs_data> vout1, inout PointStream<gs_data2> vout2)
|
||||||
|
{
|
||||||
|
vout1.Append(vin[0]);
|
||||||
|
vout2.Append((gs_data2)0);
|
||||||
|
}
|
||||||
|
|
||||||
|
[geometry shader fail todo(sm>=5)]
|
||||||
|
struct gs_data
|
||||||
|
{
|
||||||
|
float2 x : X; // Allocates to o0.xy
|
||||||
|
float3 y : Y; // Allocates to o1.xyz
|
||||||
|
float z : Z; // Allocates to o0.z
|
||||||
|
};
|
||||||
|
|
||||||
|
struct gs_data2
|
||||||
|
{
|
||||||
|
float2 x : X; // Allocates to o0.xy
|
||||||
|
float4 y : Y; // Allocates to o1.xyzw
|
||||||
|
};
|
||||||
|
|
||||||
|
[maxvertexcount(147)] // 147 * 7 = 1029 > 1024.
|
||||||
|
void main(point gs_data vin[1], inout PointStream<gs_data> vout1, inout PointStream<gs_data2> vout2)
|
||||||
|
{
|
||||||
|
vout1.Append(vin[0]);
|
||||||
|
vout2.Append((gs_data2)0);
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user