gallium: change set_constant_buffer to be UBO-friendly
[mesa.git] / src / gallium / tests / graw / fs-frontface.c
1 /* Test the TGSI_SEMANTIC_FACE fragment shader input.
2 */
3
4 #include <stdio.h>
5
6 #include "graw_util.h"
7
8
9 static int width = 300;
10 static int height = 300;
11
12 static struct graw_info info;
13
14 struct vertex {
15 float position[4];
16 float color[4];
17 };
18
19 #define z0 0.2
20 #define z01 0.5
21 #define z1 0.4
22
23 static struct vertex vertices[] =
24 {
25 /* left quad: clock-wise, front-facing, red */
26 {
27 {-0.8, -0.9, z0, 1.0 },
28 { 0, 0, 0, 1 }
29 },
30
31 {
32 { -0.2, -0.9, z0, 1.0 },
33 { 0, 0, 0, 1 }
34 },
35
36 {
37 { 0.2, 0.9, z01, 1.0 },
38 { 0, 0, 0, 1 }
39 },
40
41 {
42 {-0.9, 0.9, z01, 1.0 },
43 { 0, 0, 0, 1 }
44 },
45
46 /* right quad : counter-clock-wise, back-facing, green */
47 {
48 { 0.2, -0.9, z1, 1.0 },
49 { 1, 1, 1, -1 }
50 },
51
52 {
53 { -0.2, 0.8, z1, 1.0 },
54 { 1, 1, 1, -1 }
55 },
56
57 {
58 { 0.9, 0.8, z1, 1.0 },
59 { 1, 1, 1, -1 }
60 },
61
62 {
63 { 0.8, -0.9, z1, 1.0 },
64 { 1, 1, 1, -1 }
65 },
66 };
67
68 #define NUM_VERTS (sizeof(vertices) / sizeof(vertices[0]))
69
70
71
72 static void
73 set_vertices(void)
74 {
75 struct pipe_vertex_element ve[2];
76 struct pipe_vertex_buffer vbuf;
77 void *handle;
78
79 memset(ve, 0, sizeof ve);
80
81 ve[0].src_offset = Offset(struct vertex, position);
82 ve[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
83 ve[1].src_offset = Offset(struct vertex, color);
84 ve[1].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
85
86 handle = info.ctx->create_vertex_elements_state(info.ctx, 2, ve);
87 info.ctx->bind_vertex_elements_state(info.ctx, handle);
88
89
90 vbuf.stride = sizeof(struct vertex);
91 vbuf.buffer_offset = 0;
92 vbuf.buffer = info.screen->user_buffer_create(info.screen,
93 vertices,
94 sizeof(vertices),
95 PIPE_BIND_VERTEX_BUFFER);
96
97 info.ctx->set_vertex_buffers(info.ctx, 1, &vbuf);
98 }
99
100
101 static void
102 set_vertex_shader(void)
103 {
104 void *handle;
105 const char *text =
106 "VERT\n"
107 "DCL IN[0]\n"
108 "DCL IN[1]\n"
109 "DCL OUT[0], POSITION\n"
110 "DCL OUT[1], GENERIC[0]\n"
111 " 0: MOV OUT[0], IN[0]\n"
112 " 1: MOV OUT[1], IN[1]\n"
113 " 2: END\n";
114
115 handle = graw_parse_vertex_shader(info.ctx, text);
116 info.ctx->bind_vs_state(info.ctx, handle);
117 }
118
119
120 static void
121 set_fragment_shader(void)
122 {
123 void *handle;
124 const char *text =
125 "FRAG\n"
126 "DCL IN[0], FACE, CONSTANT\n"
127 "DCL IN[1], GENERIC, CONSTANT\n"
128 "DCL OUT[0], COLOR\n"
129 "DCL TEMP[0]\n"
130 "IMM FLT32 { 1.0, 0.0, 0.0, 0.0 }\n"
131 "IMM FLT32 { 0.0, 1.0, 0.0, 0.0 }\n"
132 "IMM FLT32 { 0.5, 0.6, 0.0, 0.0 }\n"
133 " 0: SGT TEMP[0].x, IN[0].xxxx, IMM[1].xxxx\n" /* TMP[0].x = IN[0].x > 0.0 */
134 " 1: IF TEMP[0].xxxx :4\n"
135 " 2: MOV OUT[0], IMM[0]\n" /* front-facing: red */
136 " 3: ELSE :5\n"
137 " 4: MOV OUT[0], IMM[1]\n" /* back-facing: green */
138 " 5: ENDIF\n"
139 " 6: END\n";
140
141 handle = graw_parse_fragment_shader(info.ctx, text);
142 info.ctx->bind_fs_state(info.ctx, handle);
143 }
144
145
146 static void
147 draw(void)
148 {
149 union pipe_color_union clear_color;
150
151 clear_color.f[0] = 0.25;
152 clear_color.f[1] = 0.25;
153 clear_color.f[2] = 0.25;
154 clear_color.f[3] = 1.00;
155
156 info.ctx->clear(info.ctx,
157 PIPE_CLEAR_COLOR | PIPE_CLEAR_DEPTHSTENCIL,
158 &clear_color, 1.0, 0);
159 util_draw_arrays(info.ctx, PIPE_PRIM_QUADS, 0, NUM_VERTS);
160 info.ctx->flush(info.ctx, NULL);
161
162 graw_util_flush_front(&info);
163 }
164
165
166 #if 0
167 static void
168 resize(int w, int h)
169 {
170 width = w;
171 height = h;
172
173 set_viewport(0, 0, width, height, 30, 1000);
174 }
175 #endif
176
177
178 static void
179 init(void)
180 {
181 if (!graw_util_create_window(&info, width, height, 1, TRUE))
182 exit(1);
183
184 graw_util_default_state(&info, TRUE);
185
186 graw_util_viewport(&info, 0, 0, width, height, -1.0, 1.0);
187
188 set_vertices();
189 set_vertex_shader();
190 set_fragment_shader();
191 }
192
193
194 int
195 main(int argc, char *argv[])
196 {
197 init();
198
199 printf("Left quad: clock-wise, front-facing, red\n");
200 printf("Right quad: counter clock-wise, back-facing, green\n");
201
202 graw_set_display_func(draw);
203 /*graw_set_reshape_func(resize);*/
204 graw_main_loop();
205 return 0;
206 }