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;
10 #include "util/macros.h"
13 static int width
= 300;
14 static int height
= 300;
16 static struct graw_info info
;
23 /* Note: the upper-left vertex is pushed to the left a bit to
24 * make sure we can spot upside-down rendering.
26 static struct vertex vertices
[] =
29 {-0.95, -0.95, 0.5, 1.0 },
34 { 0.85, -0.95, 0.5, 1.0 },
39 { 0.95, 0.95, 0.5, 1.0 },
44 {-0.95, 0.95, 0.5, 1.0 },
49 #define NUM_VERTS ARRAY_SIZE(vertices)
55 struct pipe_vertex_element ve
[2];
56 struct pipe_vertex_buffer vbuf
;
59 memset(ve
, 0, sizeof ve
);
61 ve
[0].src_offset
= Offset(struct vertex
, position
);
62 ve
[0].src_format
= PIPE_FORMAT_R32G32B32A32_FLOAT
;
63 ve
[1].src_offset
= Offset(struct vertex
, color
);
64 ve
[1].src_format
= PIPE_FORMAT_R32G32B32A32_FLOAT
;
66 handle
= info
.ctx
->create_vertex_elements_state(info
.ctx
, 2, ve
);
67 info
.ctx
->bind_vertex_elements_state(info
.ctx
, handle
);
69 memset(&vbuf
, 0, sizeof vbuf
);
71 vbuf
.stride
= sizeof(struct vertex
);
72 vbuf
.buffer_offset
= 0;
73 vbuf
.buffer
.resource
= pipe_buffer_create_with_data(info
.ctx
,
74 PIPE_BIND_VERTEX_BUFFER
,
79 info
.ctx
->set_vertex_buffers(info
.ctx
, 0, 1, &vbuf
);
84 set_vertex_shader(void)
91 "DCL OUT[0], POSITION\n"
92 "DCL OUT[1], GENERIC[0]\n"
93 " 0: MOV OUT[0], IN[0]\n"
94 " 1: MOV OUT[1], IN[1]\n"
97 handle
= graw_parse_vertex_shader(info
.ctx
, text
);
98 info
.ctx
->bind_vs_state(info
.ctx
, handle
);
103 set_fragment_shader(int mode
)
107 const char *origin_upper_left_text
=
109 "PROPERTY FS_COORD_ORIGIN UPPER_LEFT\n" /* upper-left = black corner */
110 "DCL IN[0], POSITION, LINEAR\n"
111 "DCL OUT[0], COLOR\n"
113 "IMM FLT32 { 0.003333, 0.003333, 1.0, 1.0 }\n"
114 "IMM FLT32 { 0.0, 300.0, 0.0, 0.0 }\n"
115 " 0: MOV TEMP[0], IN[0] \n"
116 " 1: MOV TEMP[0].zw, IMM[1].xxxx \n"
117 " 2: MUL OUT[0], TEMP[0], IMM[0] \n"
120 const char *origin_lower_left_text
=
122 "PROPERTY FS_COORD_ORIGIN LOWER_LEFT\n" /* lower-left = black corner */
123 "DCL IN[0], POSITION, LINEAR\n"
124 "DCL OUT[0], COLOR\n"
126 "IMM FLT32 { 0.003333, 0.003333, 1.0, 1.0 }\n"
127 "IMM FLT32 { 0.0, 300.0, 0.0, 0.0 }\n"
128 " 0: MOV TEMP[0], IN[0] \n"
129 " 1: MOV TEMP[0].zw, IMM[1].xxxx \n"
130 " 2: MUL OUT[0], TEMP[0], IMM[0] \n"
133 /* Test fragcoord center integer vs. half integer */
134 const char *center_integer_text
=
136 "PROPERTY FS_COORD_PIXEL_CENTER INTEGER \n" /* pixels are black */
137 "DCL IN[0], POSITION, LINEAR \n"
138 "DCL OUT[0], COLOR \n"
140 "IMM FLT32 { 0.003333, 0.003333, 1.0, 1.0 } \n"
141 "IMM FLT32 { 0.0, 300.0, 0.0, 0.0 } \n"
142 "0: FRC TEMP[0], IN[0] \n"
143 "1: MOV TEMP[0].zw, IMM[1].xxxx \n"
144 "2: MOV OUT[0], TEMP[0] \n"
147 const char *center_half_integer_text
=
149 "PROPERTY FS_COORD_PIXEL_CENTER HALF_INTEGER \n" /* pixels are olive colored */
150 "DCL IN[0], POSITION, LINEAR \n"
151 "DCL OUT[0], COLOR \n"
153 "IMM FLT32 { 0.003333, 0.003333, 1.0, 1.0 } \n"
154 "IMM FLT32 { 0.0, 300.0, 0.0, 0.0 } \n"
155 "0: FRC TEMP[0], IN[0] \n"
156 "1: MOV TEMP[0].zw, IMM[1].xxxx \n"
157 "2: MOV OUT[0], TEMP[0] \n"
163 text
= origin_upper_left_text
;
165 text
= origin_lower_left_text
;
167 text
= center_integer_text
;
169 text
= center_half_integer_text
;
171 handle
= graw_parse_fragment_shader(info
.ctx
, text
);
172 info
.ctx
->bind_fs_state(info
.ctx
, handle
);
179 union pipe_color_union clear_color
;
181 clear_color
.f
[0] = 0.25;
182 clear_color
.f
[1] = 0.25;
183 clear_color
.f
[2] = 0.25;
184 clear_color
.f
[3] = 1.0;
186 info
.ctx
->clear(info
.ctx
,
187 PIPE_CLEAR_COLOR
| PIPE_CLEAR_DEPTHSTENCIL
,
188 &clear_color
, 1.0, 0);
189 util_draw_arrays(info
.ctx
, PIPE_PRIM_QUADS
, 0, NUM_VERTS
);
190 info
.ctx
->flush(info
.ctx
, NULL
, 0);
193 /* At the moment, libgraw leaks out/makes available some of the
194 * symbols from gallium/auxiliary, including these debug helpers.
195 * Will eventually want to bless some of these paths, and lock the
196 * others down so they aren't accessible from test programs.
198 * This currently just happens to work on debug builds - a release
199 * build will probably fail to link here:
201 debug_dump_surface_bmp(info
.ctx
, "result.bmp", surf
);
204 graw_util_flush_front(&info
);
215 set_viewport(0, 0, width
, height
, 30, 1000);
223 if (!graw_util_create_window(&info
, width
, height
, 1, TRUE
))
226 graw_util_default_state(&info
, TRUE
);
228 graw_util_viewport(&info
, 0, 0, width
, height
, -1.0, 1.0);
232 set_fragment_shader(mode
);
237 main(int argc
, char *argv
[])
239 int mode
= argc
> 1 ? atoi(argv
[1]) : 0;
244 printf("frag coord origin upper-left (lower-left = black)\n");
247 printf("frag coord origin lower-left (upper-left = black)\n");
250 printf("frag coord center integer (all pixels black)\n");
253 printf("frag coord center half-integer (all pixels olive color)\n");
259 graw_set_display_func(draw
);
260 /*graw_set_reshape_func(resize);*/