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; | ||||
| } | ||||
|  | ||||
| % 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