From 102cfdab360fc33425ef722d1611b17bc6182316 Mon Sep 17 00:00:00 2001 From: Evan Tang Date: Fri, 4 Oct 2024 10:48:47 -0500 Subject: [PATCH] tests: Add a test for writing patch constants during tessellation. --- .../hlsl/tessellation-patch-vars.shader_test | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 tests/hlsl/tessellation-patch-vars.shader_test diff --git a/tests/hlsl/tessellation-patch-vars.shader_test b/tests/hlsl/tessellation-patch-vars.shader_test new file mode 100644 index 00000000..262c289f --- /dev/null +++ b/tests/hlsl/tessellation-patch-vars.shader_test @@ -0,0 +1,108 @@ +[require] +shader model >= 5.0 + +[vertex shader] +struct data +{ + float4 position : SV_Position; + float3 color : COLOR; + float3 zero : ZERO; +}; + +void main(uint id : SV_VertexID, out data output) +{ + float2 coords = float2((id << 1) & 2, id & 2); + output.position = float4(coords * float2(2, -2) + float2(-1, 1), 0, 1); + output.color = float3(0.0, 1.0, 0.5); + output.zero = float3(0.0, 0.0, 0.0); +} + +[hull shader todo] +struct vsdata +{ + float4 position : SV_Position; + float3 color : COLOR; + float3 zero : ZERO; +}; + +struct data +{ + float4 position : SV_Position; +}; + +struct patch_constant_data +{ + float edges[3] : SV_TessFactor; + float3 color : COLOR; // This will be placed in o0.yzw, with edges[0] in o0.x. + float inside : SV_InsideTessFactor; +}; + +void patch_constant(InputPatch input, out patch_constant_data output) +{ + output.edges[0] = output.edges[1] = output.edges[2] = 1.0f; + output.inside = 1.0f; + // dot(...) prevents the MS HLSL compiler from splitting this into three + // separate fork phases. We need one phase that writes to o0.yzw to verify + // that things still work when writing to an output that starts in + // component 1. + output.color = input[0].color + dot(input[0].zero, input[1].zero); +} + + [domain("tri")] + [outputcontrolpoints(3)] + [partitioning("integer")] + [outputtopology("triangle_cw")] + [patchconstantfunc("patch_constant")] +data main(InputPatch input, uint i : SV_OutputControlPointID) +{ + data o; + o.position = input[i].position; + return o; +} + +[domain shader todo] +struct hsdata +{ + float4 position : SV_Position; +}; + +struct data +{ + float4 position : SV_Position; + float3 color : COLOR; +}; + +struct patch_constant_data +{ + float edges[3] : SV_TessFactor; + float3 color : COLOR; + float inside : SV_InsideTessFactor; +}; + + [domain("tri")] +void main(patch_constant_data input, + float3 tess_coord : SV_DomainLocation, + const OutputPatch patch, + out data output) +{ + output.position = tess_coord.x * patch[0].position + + tess_coord.y * patch[1].position + + tess_coord.z * patch[2].position; + output.color = input.color; +} + +[pixel shader] +struct data +{ + float4 position : SV_Position; + float3 color : COLOR; +}; + +float4 main(data input) : sv_target +{ + return float4(input.color, 1.0); +} + +[test] +todo(sm<6) draw 3 control point patch list 3 +probe (0, 0, 640, 480) rgba (0.0, 1.0, 0.5, 1.0)