1 /* Test the TGSI_SEMANTIC_POSITION fragment shader input.
2 * Plus properties for upper-left vs. lower-left origin and
3 * center integer vs. half-integer;
11 static int width
= 300;
12 static int height
= 300;
14 static struct graw_info info
;
21 /* Note: the upper-left vertex is pushed to the left a bit to
22 * make sure we can spot upside-down rendering.
24 static struct vertex vertices
[] =
27 {-0.95, -0.95, 0.5, 1.0 },
32 { 0.85, -0.95, 0.5, 1.0 },
37 { 0.95, 0.95, 0.5, 1.0 },
42 {-0.95, 0.95, 0.5, 1.0 },
47 #define NUM_VERTS (sizeof(vertices) / sizeof(vertices[0]))
53 struct pipe_vertex_element ve
[2];
54 struct pipe_vertex_buffer vbuf
;
57 memset(ve
, 0, sizeof ve
);
59 ve
[0].src_offset
= Offset(struct vertex
, position
);
60 ve
[0].src_format
= PIPE_FORMAT_R32G32B32A32_FLOAT
;
61 ve
[1].src_offset
= Offset(struct vertex
, color
);
62 ve
[1].src_format
= PIPE_FORMAT_R32G32B32A32_FLOAT
;
64 handle
= info
.ctx
->create_vertex_elements_state(info
.ctx
, 2, ve
);
65 info
.ctx
->bind_vertex_elements_state(info
.ctx
, handle
);
68 vbuf
.stride
= sizeof(struct vertex
);
69 vbuf
.buffer_offset
= 0;
70 vbuf
.buffer
= info
.screen
->user_buffer_create(info
.screen
,
73 PIPE_BIND_VERTEX_BUFFER
);
75 info
.ctx
->set_vertex_buffers(info
.ctx
, 1, &vbuf
);
80 set_vertex_shader(void)
87 "DCL OUT[0], POSITION\n"
88 "DCL OUT[1], GENERIC[0]\n"
89 " 0: MOV OUT[0], IN[0]\n"
90 " 1: MOV OUT[1], IN[1]\n"
93 handle
= graw_parse_vertex_shader(info
.ctx
, text
);
94 info
.ctx
->bind_vs_state(info
.ctx
, handle
);
99 set_fragment_shader(int mode
)
103 const char *origin_upper_left_text
=
105 "PROPERTY FS_COORD_ORIGIN UPPER_LEFT\n" /* upper-left = black corner */
106 "DCL IN[0], POSITION, LINEAR\n"
107 "DCL OUT[0], COLOR\n"
109 "IMM FLT32 { 0.003333, 0.003333, 1.0, 1.0 }\n"
110 "IMM FLT32 { 0.0, 300.0, 0.0, 0.0 }\n"
111 " 0: MOV TEMP[0], IN[0] \n"
112 " 1: MOV TEMP[0].zw, IMM[1].xxxx \n"
113 " 2: MUL OUT[0], TEMP[0], IMM[0] \n"
116 const char *origin_lower_left_text
=
118 "PROPERTY FS_COORD_ORIGIN LOWER_LEFT\n" /* lower-left = black corner */
119 "DCL IN[0], POSITION, LINEAR\n"
120 "DCL OUT[0], COLOR\n"
122 "IMM FLT32 { 0.003333, 0.003333, 1.0, 1.0 }\n"
123 "IMM FLT32 { 0.0, 300.0, 0.0, 0.0 }\n"
124 " 0: MOV TEMP[0], IN[0] \n"
125 " 1: MOV TEMP[0].zw, IMM[1].xxxx \n"
126 " 2: MUL OUT[0], TEMP[0], IMM[0] \n"
129 /* Test fragcoord center integer vs. half integer */
130 const char *center_integer_text
=
132 "PROPERTY FS_COORD_PIXEL_CENTER INTEGER \n" /* pixels are black */
133 "DCL IN[0], POSITION, LINEAR \n"
134 "DCL OUT[0], COLOR \n"
136 "IMM FLT32 { 0.003333, 0.003333, 1.0, 1.0 } \n"
137 "IMM FLT32 { 0.0, 300.0, 0.0, 0.0 } \n"
138 "0: FRC TEMP[0], IN[0] \n"
139 "1: MOV TEMP[0].zw, IMM[1].xxxx \n"
140 "2: MOV OUT[0], TEMP[0] \n"
143 const char *center_half_integer_text
=
145 "PROPERTY FS_COORD_PIXEL_CENTER HALF_INTEGER \n" /* pixels are olive colored */
146 "DCL IN[0], POSITION, LINEAR \n"
147 "DCL OUT[0], COLOR \n"
149 "IMM FLT32 { 0.003333, 0.003333, 1.0, 1.0 } \n"
150 "IMM FLT32 { 0.0, 300.0, 0.0, 0.0 } \n"
151 "0: FRC TEMP[0], IN[0] \n"
152 "1: MOV TEMP[0].zw, IMM[1].xxxx \n"
153 "2: MOV OUT[0], TEMP[0] \n"
159 text
= origin_upper_left_text
;
161 text
= origin_lower_left_text
;
163 text
= center_integer_text
;
165 text
= center_half_integer_text
;
167 handle
= graw_parse_fragment_shader(info
.ctx
, text
);
168 info
.ctx
->bind_fs_state(info
.ctx
, handle
);
175 union pipe_color_union clear_color
;
177 clear_color
.f
[0] = 0.25;
178 clear_color
.f
[1] = 0.25;
179 clear_color
.f
[2] = 0.25;
180 clear_color
.f
[3] = 1.0;
182 info
.ctx
->clear(info
.ctx
,
183 PIPE_CLEAR_COLOR
| PIPE_CLEAR_DEPTHSTENCIL
,
184 &clear_color
, 1.0, 0);
185 util_draw_arrays(info
.ctx
, PIPE_PRIM_QUADS
, 0, NUM_VERTS
);
186 info
.ctx
->flush(info
.ctx
, NULL
);
189 /* At the moment, libgraw leaks out/makes available some of the
190 * symbols from gallium/auxiliary, including these debug helpers.
191 * Will eventually want to bless some of these paths, and lock the
192 * others down so they aren't accessible from test programs.
194 * This currently just happens to work on debug builds - a release
195 * build will probably fail to link here:
197 debug_dump_surface_bmp(info
.ctx
, "result.bmp", surf
);
200 graw_util_flush_front(&info
);
211 set_viewport(0, 0, width
, height
, 30, 1000);
219 if (!graw_util_create_window(&info
, width
, height
, 1, TRUE
))
222 graw_util_default_state(&info
, TRUE
);
224 graw_util_viewport(&info
, 0, 0, width
, height
, -1.0, 1.0);
228 set_fragment_shader(mode
);
233 main(int argc
, char *argv
[])
235 int mode
= argc
> 1 ? atoi(argv
[1]) : 0;
240 printf("frag coord origin upper-left (lower-left = black)\n");
243 printf("frag coord origin lower-left (upper-left = black)\n");
246 printf("frag coord center integer (all pixels black)\n");
249 printf("frag coord center half-integer (all pixels olive color)\n");
255 graw_set_display_func(draw
);
256 /*graw_set_reshape_func(resize);*/