1case per_patch_array_of_structs
2	version 310 es
3	desc "per-patch variable type is array of structs"
4	expect compile_or_link_fail
5	require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
6	vertex ""
7		#version 310 es
8		${VERTEX_DECLARATIONS}
9		void main()
10		{
11			${VERTEX_OUTPUT}
12		}
13	""
14	tessellation_control ""
15		#version 310 es
16		${TESSELLATION_CONTROL_DECLARATIONS}
17		struct S
18		{
19			highp float a;
20			highp vec2 b;
21		};
22		patch out S patchVariable[2]; // array of structures is illegal
23		void main()
24		{
25			patchVariable[0].a = gl_in[0].gl_Position.x;
26			patchVariable[0].b = gl_in[0].gl_Position.yz;
27			patchVariable[1].a = gl_in[0].gl_Position.z;
28			patchVariable[1].b = gl_in[0].gl_Position.wx;
29			${TESSELLATION_CONTROL_OUTPUT}
30		}
31	""
32	tessellation_evaluation ""
33		#version 310 es
34		${TESSELLATION_EVALUATION_DECLARATIONS}
35		struct S
36		{
37			highp float a;
38			highp vec2 b;
39		};
40		patch in S patchVariable[2]; // array of structures is illegal
41		out mediump float te_out;
42		void main()
43		{
44			te_out = patchVariable[0].a + patchVariable[1].b.y;
45			${TESSELLATION_EVALUATION_OUTPUT}
46		}
47	""
48	fragment ""
49		#version 310 es
50		precision mediump float;
51		${FRAGMENT_DECLARATIONS}
52		in mediump float te_out;
53		void main()
54		{
55			${FRAG_COLOR} = vec4(te_out);
56		}
57	""
58end
59
60case per_patch_structs_containing_arrays
61	version 310 es
62	desc "per-patch variable type is struct containing array"
63	expect compile_or_link_fail
64	require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation }
65	vertex ""
66		#version 310 es
67		${VERTEX_DECLARATIONS}
68		void main()
69		{
70			${VERTEX_OUTPUT}
71		}
72	""
73	tessellation_control ""
74		#version 310 es
75		${TESSELLATION_CONTROL_DECLARATIONS}
76		struct S
77		{
78			highp float a;
79			highp float b[2];
80		};
81		patch out S patchVariable; // output structure containing array is illegal
82		void main()
83		{
84			patchVariable.a = gl_in[0].gl_Position.x;
85			patchVariable.b[0] = gl_in[0].gl_Position.y;
86			patchVariable.b[1] = gl_in[0].gl_Position.w;
87			${TESSELLATION_CONTROL_OUTPUT}
88		}
89	""
90	tessellation_evaluation ""
91		#version 310 es
92		${TESSELLATION_EVALUATION_DECLARATIONS}
93		struct S
94		{
95			highp float a;
96			highp float b[2];
97		};
98		patch in S patchVariable; // output structure containing array is illegal
99		out mediump float te_out;
100		void main()
101		{
102			te_out = patchVariable.a + patchVariable.b[1];
103			${TESSELLATION_EVALUATION_OUTPUT}
104		}
105	""
106	fragment ""
107		#version 310 es
108		precision mediump float;
109		${FRAGMENT_DECLARATIONS}
110		in mediump float te_out;
111		void main()
112		{
113			${FRAG_COLOR} = vec4(te_out);
114		}
115	""
116end
117