gallium: add start_slot parameter to set_vertex_buffers
[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 memset(&vbuf, 0, sizeof vbuf);
90
91 vbuf.stride = sizeof(struct vertex);
92 vbuf.buffer_offset = 0;
93 vbuf.buffer = pipe_buffer_create_with_data(info.ctx,
94 PIPE_BIND_VERTEX_BUFFER,
95 PIPE_USAGE_STATIC,
96 sizeof(vertices),
97 vertices);
98
99 info.ctx->set_vertex_buffers(info.ctx, 0, 1, &vbuf);
100 }
101
102
103 static void
104 set_vertex_shader(void)
105 {
106 void *handle;
107 const char *text =
108 "VERT\n"
109 "DCL IN[0]\n"
110 "DCL IN[1]\n"
111 "DCL OUT[0], POSITION\n"
112 "DCL OUT[1], GENERIC[0]\n"
113 " 0: MOV OUT[0], IN[0]\n"
114 " 1: MOV OUT[1], IN[1]\n"
115 " 2: END\n";
116
117 handle = graw_parse_vertex_shader(info.ctx, text);
118 info.ctx->bind_vs_state(info.ctx, handle);
119 }
120
121
122 static void
123 set_fragment_shader(void)
124 {
125 void *handle;
126 const char *text =
127 "FRAG\n"
128 "DCL IN[0], FACE, CONSTANT\n"
129 "DCL IN[1], GENERIC, CONSTANT\n"
130 "DCL OUT[0], COLOR\n"
131 "DCL TEMP[0]\n"
132 "IMM FLT32 { 1.0, 0.0, 0.0, 0.0 }\n"
133 "IMM FLT32 { 0.0, 1.0, 0.0, 0.0 }\n"
134 "IMM FLT32 { 0.5, 0.6, 0.0, 0.0 }\n"
135 " 0: SGT TEMP[0].x, IN[0].xxxx, IMM[1].xxxx\n" /* TMP[0].x = IN[0].x > 0.0 */
136 " 1: IF TEMP[0].xxxx :4\n"
137 " 2: MOV OUT[0], IMM[0]\n" /* front-facing: red */
138 " 3: ELSE :5\n"
139 " 4: MOV OUT[0], IMM[1]\n" /* back-facing: green */
140 " 5: ENDIF\n"
141 " 6: END\n";
142
143 handle = graw_parse_fragment_shader(info.ctx, text);
144 info.ctx->bind_fs_state(info.ctx, handle);
145 }
146
147
148 static void
149 draw(void)
150 {
151 union pipe_color_union clear_color;
152
153 clear_color.f[0] = 0.25;
154 clear_color.f[1] = 0.25;
155 clear_color.f[2] = 0.25;
156 clear_color.f[3] = 1.00;
157
158 info.ctx->clear(info.ctx,
159 PIPE_CLEAR_COLOR | PIPE_CLEAR_DEPTHSTENCIL,
160 &clear_color, 1.0, 0);
161 util_draw_arrays(info.ctx, PIPE_PRIM_QUADS, 0, NUM_VERTS);
162 info.ctx->flush(info.ctx, NULL);
163
164 graw_util_flush_front(&info);
165 }
166
167
168 #if 0
169 static void
170 resize(int w, int h)
171 {
172 width = w;
173 height = h;
174
175 set_viewport(0, 0, width, height, 30, 1000);
176 }
177 #endif
178
179
180 static void
181 init(void)
182 {
183 if (!graw_util_create_window(&info, width, height, 1, TRUE))
184 exit(1);
185
186 graw_util_default_state(&info, TRUE);
187
188 graw_util_viewport(&info, 0, 0, width, height, -1.0, 1.0);
189
190 set_vertices();
191 set_vertex_shader();
192 set_fragment_shader();
193 }
194
195
196 int
197 main(int argc, char *argv[])
198 {
199 init();
200
201 printf("Left quad: clock-wise, front-facing, red\n");
202 printf("Right quad: counter clock-wise, back-facing, green\n");
203
204 graw_set_display_func(draw);
205 /*graw_set_reshape_func(resize);*/
206 graw_main_loop();
207 return 0;
208 }