Merge pull request #2976 from jeremy-lunarg/hayes-fix-2975
[platform/upstream/glslang.git] / Test / hlsl.gs-hs-mix.tesc
1 cbuffer UniformBlock0 : register(b0)\r
2 {\r
3   float4x4 model_view_matrix;\r
4   float4x4 proj_matrix;\r
5   float4x4 model_view_proj_matrix;\r
6   float3x3 normal_matrix;\r
7   float3   color;\r
8   float3   view_dir;\r
9   float3   tess_factor;\r
10 };\r
11 \r
12 // =============================================================================\r
13 // Hull Shader\r
14 // =============================================================================\r
15 struct HSInput {\r
16   float3 PositionWS : POSITION;\r
17   float3 NormalWS   : NORMAL;\r
18 };\r
19 \r
20 struct HSOutput {\r
21   float3 PositionWS : POSITION;\r
22 };\r
23 \r
24 struct HSTrianglePatchConstant {\r
25   float  EdgeTessFactor[3] : SV_TessFactor;\r
26   float  InsideTessFactor  : SV_InsideTessFactor;\r
27   float3 NormalWS[3]       : NORMAL;\r
28 };\r
29 \r
30 HSTrianglePatchConstant HSPatchConstant(InputPatch<HSInput, 3> patch)\r
31 {\r
32   float3 roundedEdgeTessFactor = tess_factor;\r
33   float  roundedInsideTessFactor = 3;\r
34   float  insideTessFactor = 1;\r
35 \r
36   HSTrianglePatchConstant result;\r
37 \r
38   // Edge and inside tessellation factors\r
39   result.EdgeTessFactor[0] = roundedEdgeTessFactor.x;\r
40   result.EdgeTessFactor[1] = roundedEdgeTessFactor.y;\r
41   result.EdgeTessFactor[2] = roundedEdgeTessFactor.z;\r
42   result.InsideTessFactor  = roundedInsideTessFactor;\r
43 \r
44   // Constant data\r
45   result.NormalWS[0] = patch[0].NormalWS;\r
46   result.NormalWS[1] = patch[1].NormalWS;\r
47   result.NormalWS[2] = patch[2].NormalWS;\r
48 \r
49   return result;\r
50 }\r
51 \r
52 [domain("tri")]\r
53 [partitioning("fractional_odd")]\r
54 [outputtopology("triangle_ccw")]\r
55 [outputcontrolpoints(3)]\r
56 [patchconstantfunc("HSPatchConstant")]\r
57 HSOutput HSMain(\r
58   InputPatch<HSInput, 3>  patch,\r
59   uint                    id : SV_OutputControlPointID\r
60 )\r
61 {\r
62   HSOutput output;\r
63   output.PositionWS = patch[id].PositionWS;\r
64   return output;\r
65 }\r
66 \r
67 // =============================================================================\r
68 // Geometry Shader\r
69 // =============================================================================\r
70 struct GSVertexInput {\r
71   float3 PositionWS : POSITION;\r
72   float3 NormalWS   : NORMAL;\r
73 };\r
74 \r
75 struct GSVertexOutput {\r
76   float4 PositionCS : SV_POSITION;\r
77 };\r
78 \r
79 [maxvertexcount(6)]\r
80 void GSMain(\r
81   triangle GSVertexInput            input[3],\r
82   inout LineStream<GSVertexOutput>  output\r
83 )\r
84 {\r
85 \r
86   float3 P0 = input[0].PositionWS.xyz;\r
87   float3 P1 = input[1].PositionWS.xyz;\r
88   float3 P2 = input[2].PositionWS.xyz;\r
89 \r
90   GSVertexOutput vertex;\r
91   // Totally hacky...\r
92   P0.z += 0.001;\r
93   P1.z += 0.001;\r
94   P2.z += 0.001;\r
95   float4 Q0 = mul(proj_matrix, float4(P0, 1.0));\r
96   float4 Q1 = mul(proj_matrix, float4(P1, 1.0));\r
97   float4 Q2 = mul(proj_matrix, float4(P2, 1.0));\r
98 \r
99   // Edge 0\r
100   vertex.PositionCS = Q0;\r
101   output.Append(vertex);\r
102   vertex.PositionCS = Q1;\r
103   output.Append(vertex);\r
104   output.RestartStrip();\r
105 \r
106   // Edge 1\r
107   vertex.PositionCS = Q1;\r
108   output.Append(vertex);\r
109   vertex.PositionCS = Q2;\r
110   output.Append(vertex);\r
111   output.RestartStrip();\r
112 \r
113   // Edge 2\r
114   vertex.PositionCS = Q2;\r
115   output.Append(vertex);\r
116   vertex.PositionCS = Q0;\r
117   output.Append(vertex);\r
118   output.RestartStrip();\r
119 }\r