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
);
67 memset(&vbuf
, 0, sizeof vbuf
);
69 vbuf
.stride
= sizeof(struct vertex
);
70 vbuf
.buffer_offset
= 0;
71 vbuf
.buffer
= pipe_buffer_create_with_data(info
.ctx
,
72 PIPE_BIND_VERTEX_BUFFER
,
77 info
.ctx
->set_vertex_buffers(info
.ctx
, 0, 1, &vbuf
);
82 set_vertex_shader(void)
89 "DCL OUT[0], POSITION\n"
90 "DCL OUT[1], GENERIC[0]\n"
91 " 0: MOV OUT[0], IN[0]\n"
92 " 1: MOV OUT[1], IN[1]\n"
95 handle
= graw_parse_vertex_shader(info
.ctx
, text
);
96 info
.ctx
->bind_vs_state(info
.ctx
, handle
);
101 set_fragment_shader(int mode
)
105 const char *origin_upper_left_text
=
107 "PROPERTY FS_COORD_ORIGIN UPPER_LEFT\n" /* upper-left = black corner */
108 "DCL IN[0], POSITION, LINEAR\n"
109 "DCL OUT[0], COLOR\n"
111 "IMM FLT32 { 0.003333, 0.003333, 1.0, 1.0 }\n"
112 "IMM FLT32 { 0.0, 300.0, 0.0, 0.0 }\n"
113 " 0: MOV TEMP[0], IN[0] \n"
114 " 1: MOV TEMP[0].zw, IMM[1].xxxx \n"
115 " 2: MUL OUT[0], TEMP[0], IMM[0] \n"
118 const char *origin_lower_left_text
=
120 "PROPERTY FS_COORD_ORIGIN LOWER_LEFT\n" /* lower-left = black corner */
121 "DCL IN[0], POSITION, LINEAR\n"
122 "DCL OUT[0], COLOR\n"
124 "IMM FLT32 { 0.003333, 0.003333, 1.0, 1.0 }\n"
125 "IMM FLT32 { 0.0, 300.0, 0.0, 0.0 }\n"
126 " 0: MOV TEMP[0], IN[0] \n"
127 " 1: MOV TEMP[0].zw, IMM[1].xxxx \n"
128 " 2: MUL OUT[0], TEMP[0], IMM[0] \n"
131 /* Test fragcoord center integer vs. half integer */
132 const char *center_integer_text
=
134 "PROPERTY FS_COORD_PIXEL_CENTER INTEGER \n" /* pixels are black */
135 "DCL IN[0], POSITION, LINEAR \n"
136 "DCL OUT[0], COLOR \n"
138 "IMM FLT32 { 0.003333, 0.003333, 1.0, 1.0 } \n"
139 "IMM FLT32 { 0.0, 300.0, 0.0, 0.0 } \n"
140 "0: FRC TEMP[0], IN[0] \n"
141 "1: MOV TEMP[0].zw, IMM[1].xxxx \n"
142 "2: MOV OUT[0], TEMP[0] \n"
145 const char *center_half_integer_text
=
147 "PROPERTY FS_COORD_PIXEL_CENTER HALF_INTEGER \n" /* pixels are olive colored */
148 "DCL IN[0], POSITION, LINEAR \n"
149 "DCL OUT[0], COLOR \n"
151 "IMM FLT32 { 0.003333, 0.003333, 1.0, 1.0 } \n"
152 "IMM FLT32 { 0.0, 300.0, 0.0, 0.0 } \n"
153 "0: FRC TEMP[0], IN[0] \n"
154 "1: MOV TEMP[0].zw, IMM[1].xxxx \n"
155 "2: MOV OUT[0], TEMP[0] \n"
161 text
= origin_upper_left_text
;
163 text
= origin_lower_left_text
;
165 text
= center_integer_text
;
167 text
= center_half_integer_text
;
169 handle
= graw_parse_fragment_shader(info
.ctx
, text
);
170 info
.ctx
->bind_fs_state(info
.ctx
, handle
);
177 union pipe_color_union clear_color
;
179 clear_color
.f
[0] = 0.25;
180 clear_color
.f
[1] = 0.25;
181 clear_color
.f
[2] = 0.25;
182 clear_color
.f
[3] = 1.0;
184 info
.ctx
->clear(info
.ctx
,
185 PIPE_CLEAR_COLOR
| PIPE_CLEAR_DEPTHSTENCIL
,
186 &clear_color
, 1.0, 0);
187 util_draw_arrays(info
.ctx
, PIPE_PRIM_QUADS
, 0, NUM_VERTS
);
188 info
.ctx
->flush(info
.ctx
, NULL
, 0);
191 /* At the moment, libgraw leaks out/makes available some of the
192 * symbols from gallium/auxiliary, including these debug helpers.
193 * Will eventually want to bless some of these paths, and lock the
194 * others down so they aren't accessible from test programs.
196 * This currently just happens to work on debug builds - a release
197 * build will probably fail to link here:
199 debug_dump_surface_bmp(info
.ctx
, "result.bmp", surf
);
202 graw_util_flush_front(&info
);
213 set_viewport(0, 0, width
, height
, 30, 1000);
221 if (!graw_util_create_window(&info
, width
, height
, 1, TRUE
))
224 graw_util_default_state(&info
, TRUE
);
226 graw_util_viewport(&info
, 0, 0, width
, height
, -1.0, 1.0);
230 set_fragment_shader(mode
);
235 main(int argc
, char *argv
[])
237 int mode
= argc
> 1 ? atoi(argv
[1]) : 0;
242 printf("frag coord origin upper-left (lower-left = black)\n");
245 printf("frag coord origin lower-left (upper-left = black)\n");
248 printf("frag coord center integer (all pixels black)\n");
251 printf("frag coord center half-integer (all pixels olive color)\n");
257 graw_set_display_func(draw
);
258 /*graw_set_reshape_func(resize);*/