ext_gpu_shader4: add compiler tests for everything
[piglit.git] / tests / spec / arb_tessellation_shader / execution / quads.shader_test
blobd2ba7839e2cccc8d630ce595c76a666d7485cc14
1 # What it covers:
2 # * tessellation of quads
3 # * different number of input (pre-TCS) and output (post-TCS) control points
4 # * all inputs are read in each shader
5 # * gl_PatchVerticesIn in TCS and TES
7 # How it works:
8 # * There is a patch with 4 control points on the input (quad).
9 # * The TCS subdivides the patch into 9 control points (4 tiles in a 2x2 pattern).
10 # * A color is assigned to each tile, which is held in the upper-left corner
11 #   of the tile.
12 # * The 2x2 pattern is still a single quad from the tessellator point of view.
13 # * The tessellator should create 21*21 quads (21*21*2 triangles).
14 # * The quad should be tessellated such that you can clearly see 4 tiles that
15 #   have different colors. The triangles in the middle should smoothly blend
16 #   colors from both tiles (caused by interpolation of varyings).
19 [require]
20 GLSL >= 1.50
21 GL_ARB_tessellation_shader
23 [vertex shader]
24 #version 150
25 in vec4 vertex;
27 void main()
29         gl_Position = vec4(vertex.xy, 0, 1);
32 [tessellation control shader]
33 #version 150
34 #extension GL_ARB_tessellation_shader : require
36 layout(vertices = 9) out;
38 out vec4 color[];
39 out vec4 pos[];
41 void main()
43         float t = 21;
44         gl_TessLevelInner[0] = t;
45         gl_TessLevelInner[1] = t;
47         gl_TessLevelOuter[0] = t;
48         gl_TessLevelOuter[1] = t;
49         gl_TessLevelOuter[2] = t;
50         gl_TessLevelOuter[3] = t;
52         float x = float(gl_InvocationID % 3) / 2;
53         float y = float(gl_InvocationID / 3) / 2;
55         vec4 x1 = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, x);
56         vec4 x2 = mix(gl_in[2].gl_Position, gl_in[3].gl_Position, x);
58         pos[gl_InvocationID] = mix(x1, x2, y);
59         color[gl_InvocationID] = gl_PatchVerticesIn == 4 ? vec4(x, y, 0, 1) : vec4(0);
62 [tessellation evaluation shader]
63 #version 150
64 #extension GL_ARB_tessellation_shader : require
66 layout(quads, equal_spacing) in;
68 in vec4 pos[];
69 in vec4 color[];
70 out vec4 fs_color;
72 void main()
74         float x = gl_TessCoord.x;
75         float y = gl_TessCoord.y;
76         vec4 vx[3], cx[3], v, c;
78         for (int i = 0; i < 3; i++) {
79                 if (x <= 0.5) {
80                     vx[i] = mix(pos[i*3], pos[i*3+1], x*2);
81                     cx[i] = color[i*3];
82                 } else {
83                     vx[i] = mix(pos[i*3+1], pos[i*3+2], (x-0.5)*2);
84                     cx[i] = color[i*3+1];
85                 }
86         }
88         if (y <= 0.5) {
89                 v = mix(vx[0], vx[1], y*2);
90                 c = cx[0];
91         } else {
92                 v = mix(vx[1], vx[2], (y-0.5)*2);
93                 c = cx[1];
94         }
96         gl_Position = v;
97         fs_color = gl_PatchVerticesIn == 9 ? c : vec4(0);
100 [fragment shader]
101 #version 150
103 in vec4 fs_color;
105 void main()
107         gl_FragColor = fs_color;
110 [vertex data]
111 vertex/float/2
112 -1.0 -1.0
113  1.0 -1.0
114 -1.0  1.0
115  1.0  1.0
117 [test]
118 clear color 0.1 0.1 0.1 0.1
119 clear
120 patch parameter vertices 4
121 draw arrays GL_PATCHES 0 4
122 relative probe rect rgb (0.0  , 0.0  , 0.476, 0.476) (0.0, 0.0, 0.0)
123 relative probe rect rgb (0.524, 0.0  , 0.476, 0.476) (0.5, 0.0, 0.0)
124 relative probe rect rgb (0.0  , 0.524, 0.476, 0.476) (0.0, 0.5, 0.0)
125 relative probe rect rgb (0.524, 0.524, 0.476, 0.476) (0.5, 0.5, 0.0)