1617a3babSopenharmony_ci#version 150 core
2617a3babSopenharmony_ci
3617a3babSopenharmony_ciin fromVertex {
4617a3babSopenharmony_ci    in vec3 color;
5617a3babSopenharmony_ci} fromV[];
6617a3babSopenharmony_ci
7617a3babSopenharmony_ciout toFragment {
8617a3babSopenharmony_ci    out vec3 color;
9617a3babSopenharmony_ci} toF;
10617a3babSopenharmony_ci
11617a3babSopenharmony_ciout fromVertex {  // okay to reuse a block name for another block name
12617a3babSopenharmony_ci    vec3 color;
13617a3babSopenharmony_ci};
14617a3babSopenharmony_ci
15617a3babSopenharmony_ciout fooB {
16617a3babSopenharmony_ci    vec2 color;
17617a3babSopenharmony_ci} fromVertex;     // ERROR, cannot reuse block name as block instance
18617a3babSopenharmony_ci
19617a3babSopenharmony_ciint fromVertex;   // ERROR, cannot reuse a block name for something else
20617a3babSopenharmony_ci
21617a3babSopenharmony_ciout fooC {
22617a3babSopenharmony_ci    vec2 color;
23617a3babSopenharmony_ci} fooC;           // ERROR, cannot have same name for block and instance name
24617a3babSopenharmony_ci
25617a3babSopenharmony_civoid main()
26617a3babSopenharmony_ci{
27617a3babSopenharmony_ci    EmitVertex();
28617a3babSopenharmony_ci    EndPrimitive();
29617a3babSopenharmony_ci    EmitStreamVertex(1);    // ERROR
30617a3babSopenharmony_ci    EndStreamPrimitive(0);  // ERROR
31617a3babSopenharmony_ci
32617a3babSopenharmony_ci    color = fromV[0].color;
33617a3babSopenharmony_ci    gl_ClipDistance[3] = gl_in[1].gl_ClipDistance[2];
34617a3babSopenharmony_ci    gl_Position = gl_in[0].gl_Position;
35617a3babSopenharmony_ci    gl_PointSize = gl_in[3].gl_PointSize;
36617a3babSopenharmony_ci    gl_PrimitiveID = gl_PrimitiveIDIn;
37617a3babSopenharmony_ci    gl_Layer = 2;
38617a3babSopenharmony_ci}
39617a3babSopenharmony_ci
40617a3babSopenharmony_ciout vec4 ov0;  // stream should be 0
41617a3babSopenharmony_cilayout(stream = 4) out vec4 ov4;
42617a3babSopenharmony_ciout vec4 o1v0;  // stream should be 0
43617a3babSopenharmony_ci
44617a3babSopenharmony_cilayout(stream = 3) uniform;        // ERROR
45617a3babSopenharmony_cilayout(stream = 3) in;             // ERROR
46617a3babSopenharmony_cilayout(stream = 3) uniform int ua; // ERROR
47617a3babSopenharmony_cilayout(stream = 3) uniform ubb { int ua; } ibb; // ERROR
48617a3babSopenharmony_ci
49617a3babSopenharmony_cilayout(line_strip, points, triangle_strip, stream = 3, points, triangle_strip) out;  // just means "stream = 3, triangle_strip"
50617a3babSopenharmony_cilayout(stream = 3, triangle_strip) out;
51617a3babSopenharmony_ciout vec4 ov3;  // stream should be 3
52617a3babSopenharmony_ci
53617a3babSopenharmony_cilayout(stream = 6) out ooutb { vec4 a; } ouuaa6;
54617a3babSopenharmony_ci
55617a3babSopenharmony_cilayout(stream = 6) out ooutb2 {
56617a3babSopenharmony_ci    layout(stream = 6) vec4 a;
57617a3babSopenharmony_ci} ouua6;
58617a3babSopenharmony_ci
59617a3babSopenharmony_cilayout(stream = 7) out ooutb3 {
60617a3babSopenharmony_ci    layout(stream = 6) vec4 a;  // ERROR
61617a3babSopenharmony_ci} ouua7;
62617a3babSopenharmony_ci
63617a3babSopenharmony_ciout vec4 ov2s3;  // stream should be 3
64617a3babSopenharmony_ci
65617a3babSopenharmony_cilayout(max_vertices = 200) out;
66617a3babSopenharmony_cilayout(max_vertices = 300) out;   // ERROR, too big
67617a3babSopenharmony_civoid foo(layout(max_vertices = 4) int a)  // ERROR
68617a3babSopenharmony_ci{
69617a3babSopenharmony_ci    ouuaa6.a = vec4(1.0);
70617a3babSopenharmony_ci}
71617a3babSopenharmony_ci
72617a3babSopenharmony_cilayout(line_strip, points, triangle_strip, stream = 3, points) out;  // ERROR, changing output primitive
73617a3babSopenharmony_cilayout(line_strip, points, stream = 3) out; // ERROR, changing output primitive
74617a3babSopenharmony_cilayout(triangle_strip) in; // ERROR, not an input primitive
75617a3babSopenharmony_cilayout(triangle_strip) uniform; // ERROR
76617a3babSopenharmony_cilayout(triangle_strip) out vec4 badv4;  // ERROR, not on a variable
77617a3babSopenharmony_cilayout(triangle_strip) in vec4 bad2v4[];  // ERROR, not on a variable or input
78617a3babSopenharmony_cilayout(invocations = 3) out outbn { int a; }; // 2 ERROR, not on a block, not until 4.0
79617a3babSopenharmony_ciout outbn2 {
80617a3babSopenharmony_ci    layout(invocations = 3)  int a; // 2 ERRORs, not on a block member, not until 4.0
81617a3babSopenharmony_ci    layout(max_vertices = 3) int b; // ERROR, not on a block member
82617a3babSopenharmony_ci    layout(triangle_strip)   int c; // ERROR, not on a block member
83617a3babSopenharmony_ci} outbi;
84617a3babSopenharmony_ci
85617a3babSopenharmony_cilayout(lines) out;  // ERROR, not on output
86617a3babSopenharmony_cilayout(lines_adjacency) in;
87617a3babSopenharmony_cilayout(triangles) in;             // ERROR, can't change it
88617a3babSopenharmony_cilayout(triangles_adjacency) in;   // ERROR, can't change it
89617a3babSopenharmony_cilayout(invocations = 4) in;       // ERROR, not until 4.0
90617a3babSopenharmony_ci
91617a3babSopenharmony_ciin inbn {
92617a3babSopenharmony_ci    layout(stream = 2) int a;     // ERROR, stream on input
93617a3babSopenharmony_ci} inbi[];
94617a3babSopenharmony_ci
95617a3babSopenharmony_ciin sameName {
96617a3babSopenharmony_ci    int a15;
97617a3babSopenharmony_ci} insn[];
98617a3babSopenharmony_ci
99617a3babSopenharmony_ciout sameName {
100617a3babSopenharmony_ci    float f15;
101617a3babSopenharmony_ci};
102617a3babSopenharmony_ci
103617a3babSopenharmony_ciuniform sameName {
104617a3babSopenharmony_ci    bool b15;
105617a3babSopenharmony_ci};
106617a3babSopenharmony_ci
107617a3babSopenharmony_cifloat summ = gl_MaxVertexAttribs +
108617a3babSopenharmony_ci             gl_MaxVertexUniformComponents +
109617a3babSopenharmony_ci             gl_MaxVaryingFloats +
110617a3babSopenharmony_ci             gl_MaxVaryingComponents +
111617a3babSopenharmony_ci             gl_MaxVertexOutputComponents  +
112617a3babSopenharmony_ci             gl_MaxGeometryInputComponents  +
113617a3babSopenharmony_ci             gl_MaxGeometryOutputComponents  +
114617a3babSopenharmony_ci             gl_MaxFragmentInputComponents  +
115617a3babSopenharmony_ci             gl_MaxVertexTextureImageUnits +
116617a3babSopenharmony_ci             gl_MaxCombinedTextureImageUnits +
117617a3babSopenharmony_ci             gl_MaxTextureImageUnits +
118617a3babSopenharmony_ci             gl_MaxFragmentUniformComponents +
119617a3babSopenharmony_ci             gl_MaxDrawBuffers +
120617a3babSopenharmony_ci             gl_MaxClipDistances  +
121617a3babSopenharmony_ci             gl_MaxGeometryTextureImageUnits +
122617a3babSopenharmony_ci             gl_MaxGeometryOutputVertices +
123617a3babSopenharmony_ci             gl_MaxGeometryTotalOutputComponents  +
124617a3babSopenharmony_ci             gl_MaxGeometryUniformComponents  +
125617a3babSopenharmony_ci             gl_MaxGeometryVaryingComponents;
126617a3babSopenharmony_ci
127617a3babSopenharmony_civoid fooe1()
128617a3babSopenharmony_ci{
129617a3babSopenharmony_ci    gl_ViewportIndex = gl_MaxViewports - 1;
130617a3babSopenharmony_ci}
131617a3babSopenharmony_ci
132617a3babSopenharmony_ci#extension GL_ARB_viewport_array : enable
133617a3babSopenharmony_ci
134617a3babSopenharmony_civoid fooe2()
135617a3babSopenharmony_ci{
136617a3babSopenharmony_ci    gl_ViewportIndex = gl_MaxViewports - 1;
137617a3babSopenharmony_ci}
138617a3babSopenharmony_ci
139617a3babSopenharmony_ciout int gl_ViewportIndex;
140