1848b8605Smrg/* Test the TGSI_SEMANTIC_POSITION fragment shader input. 2848b8605Smrg * Plus properties for upper-left vs. lower-left origin and 3848b8605Smrg * center integer vs. half-integer; 4848b8605Smrg */ 5848b8605Smrg 6848b8605Smrg#include <stdio.h> 7848b8605Smrg 8848b8605Smrg#include "graw_util.h" 9848b8605Smrg 10b8e80941Smrg#include "util/macros.h" 11b8e80941Smrg 12848b8605Smrg 13848b8605Smrgstatic int width = 300; 14848b8605Smrgstatic int height = 300; 15848b8605Smrg 16848b8605Smrgstatic struct graw_info info; 17848b8605Smrg 18848b8605Smrgstruct vertex { 19848b8605Smrg float position[4]; 20848b8605Smrg float color[4]; 21848b8605Smrg}; 22848b8605Smrg 23848b8605Smrg/* Note: the upper-left vertex is pushed to the left a bit to 24848b8605Smrg * make sure we can spot upside-down rendering. 25848b8605Smrg */ 26848b8605Smrgstatic struct vertex vertices[] = 27848b8605Smrg{ 28848b8605Smrg { 29848b8605Smrg {-0.95, -0.95, 0.5, 1.0 }, 30848b8605Smrg { 0, 0, 0, 1 } 31848b8605Smrg }, 32848b8605Smrg 33848b8605Smrg { 34848b8605Smrg { 0.85, -0.95, 0.5, 1.0 }, 35848b8605Smrg { 0, 0, 0, 1 } 36848b8605Smrg }, 37848b8605Smrg 38848b8605Smrg { 39848b8605Smrg { 0.95, 0.95, 0.5, 1.0 }, 40848b8605Smrg { 0, 0, 0, 1 } 41848b8605Smrg }, 42848b8605Smrg 43848b8605Smrg { 44848b8605Smrg {-0.95, 0.95, 0.5, 1.0 }, 45848b8605Smrg { 0, 0, 0, 1 } 46848b8605Smrg } 47848b8605Smrg}; 48848b8605Smrg 49b8e80941Smrg#define NUM_VERTS ARRAY_SIZE(vertices) 50848b8605Smrg 51848b8605Smrg 52848b8605Smrgstatic void 53848b8605Smrgset_vertices(void) 54848b8605Smrg{ 55848b8605Smrg struct pipe_vertex_element ve[2]; 56848b8605Smrg struct pipe_vertex_buffer vbuf; 57848b8605Smrg void *handle; 58848b8605Smrg 59848b8605Smrg memset(ve, 0, sizeof ve); 60848b8605Smrg 61848b8605Smrg ve[0].src_offset = Offset(struct vertex, position); 62848b8605Smrg ve[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 63848b8605Smrg ve[1].src_offset = Offset(struct vertex, color); 64848b8605Smrg ve[1].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 65848b8605Smrg 66848b8605Smrg handle = info.ctx->create_vertex_elements_state(info.ctx, 2, ve); 67848b8605Smrg info.ctx->bind_vertex_elements_state(info.ctx, handle); 68848b8605Smrg 69848b8605Smrg memset(&vbuf, 0, sizeof vbuf); 70848b8605Smrg 71848b8605Smrg vbuf.stride = sizeof(struct vertex); 72848b8605Smrg vbuf.buffer_offset = 0; 73b8e80941Smrg vbuf.buffer.resource = pipe_buffer_create_with_data(info.ctx, 74848b8605Smrg PIPE_BIND_VERTEX_BUFFER, 75848b8605Smrg PIPE_USAGE_DEFAULT, 76848b8605Smrg sizeof(vertices), 77848b8605Smrg vertices); 78848b8605Smrg 79848b8605Smrg info.ctx->set_vertex_buffers(info.ctx, 0, 1, &vbuf); 80848b8605Smrg} 81848b8605Smrg 82848b8605Smrg 83848b8605Smrgstatic void 84848b8605Smrgset_vertex_shader(void) 85848b8605Smrg{ 86848b8605Smrg void *handle; 87848b8605Smrg const char *text = 88848b8605Smrg "VERT\n" 89848b8605Smrg "DCL IN[0]\n" 90848b8605Smrg "DCL IN[1]\n" 91848b8605Smrg "DCL OUT[0], POSITION\n" 92848b8605Smrg "DCL OUT[1], GENERIC[0]\n" 93848b8605Smrg " 0: MOV OUT[0], IN[0]\n" 94848b8605Smrg " 1: MOV OUT[1], IN[1]\n" 95848b8605Smrg " 2: END\n"; 96848b8605Smrg 97848b8605Smrg handle = graw_parse_vertex_shader(info.ctx, text); 98848b8605Smrg info.ctx->bind_vs_state(info.ctx, handle); 99848b8605Smrg} 100848b8605Smrg 101848b8605Smrg 102848b8605Smrgstatic void 103848b8605Smrgset_fragment_shader(int mode) 104848b8605Smrg{ 105848b8605Smrg void *handle; 106848b8605Smrg 107848b8605Smrg const char *origin_upper_left_text = 108848b8605Smrg "FRAG\n" 109848b8605Smrg "PROPERTY FS_COORD_ORIGIN UPPER_LEFT\n" /* upper-left = black corner */ 110848b8605Smrg "DCL IN[0], POSITION, LINEAR\n" 111848b8605Smrg "DCL OUT[0], COLOR\n" 112848b8605Smrg "DCL TEMP[0]\n" 113848b8605Smrg "IMM FLT32 { 0.003333, 0.003333, 1.0, 1.0 }\n" 114848b8605Smrg "IMM FLT32 { 0.0, 300.0, 0.0, 0.0 }\n" 115848b8605Smrg " 0: MOV TEMP[0], IN[0] \n" 116848b8605Smrg " 1: MOV TEMP[0].zw, IMM[1].xxxx \n" 117848b8605Smrg " 2: MUL OUT[0], TEMP[0], IMM[0] \n" 118848b8605Smrg " 3: END\n"; 119848b8605Smrg 120848b8605Smrg const char *origin_lower_left_text = 121848b8605Smrg "FRAG\n" 122848b8605Smrg "PROPERTY FS_COORD_ORIGIN LOWER_LEFT\n" /* lower-left = black corner */ 123848b8605Smrg "DCL IN[0], POSITION, LINEAR\n" 124848b8605Smrg "DCL OUT[0], COLOR\n" 125848b8605Smrg "DCL TEMP[0]\n" 126848b8605Smrg "IMM FLT32 { 0.003333, 0.003333, 1.0, 1.0 }\n" 127848b8605Smrg "IMM FLT32 { 0.0, 300.0, 0.0, 0.0 }\n" 128848b8605Smrg " 0: MOV TEMP[0], IN[0] \n" 129848b8605Smrg " 1: MOV TEMP[0].zw, IMM[1].xxxx \n" 130848b8605Smrg " 2: MUL OUT[0], TEMP[0], IMM[0] \n" 131848b8605Smrg " 3: END\n"; 132848b8605Smrg 133848b8605Smrg /* Test fragcoord center integer vs. half integer */ 134848b8605Smrg const char *center_integer_text = 135848b8605Smrg "FRAG\n" 136848b8605Smrg "PROPERTY FS_COORD_PIXEL_CENTER INTEGER \n" /* pixels are black */ 137848b8605Smrg "DCL IN[0], POSITION, LINEAR \n" 138848b8605Smrg "DCL OUT[0], COLOR \n" 139848b8605Smrg "DCL TEMP[0] \n" 140848b8605Smrg "IMM FLT32 { 0.003333, 0.003333, 1.0, 1.0 } \n" 141848b8605Smrg "IMM FLT32 { 0.0, 300.0, 0.0, 0.0 } \n" 142848b8605Smrg "0: FRC TEMP[0], IN[0] \n" 143848b8605Smrg "1: MOV TEMP[0].zw, IMM[1].xxxx \n" 144848b8605Smrg "2: MOV OUT[0], TEMP[0] \n" 145848b8605Smrg "3: END \n"; 146848b8605Smrg 147848b8605Smrg const char *center_half_integer_text = 148848b8605Smrg "FRAG\n" 149848b8605Smrg "PROPERTY FS_COORD_PIXEL_CENTER HALF_INTEGER \n" /* pixels are olive colored */ 150848b8605Smrg "DCL IN[0], POSITION, LINEAR \n" 151848b8605Smrg "DCL OUT[0], COLOR \n" 152848b8605Smrg "DCL TEMP[0] \n" 153848b8605Smrg "IMM FLT32 { 0.003333, 0.003333, 1.0, 1.0 } \n" 154848b8605Smrg "IMM FLT32 { 0.0, 300.0, 0.0, 0.0 } \n" 155848b8605Smrg "0: FRC TEMP[0], IN[0] \n" 156848b8605Smrg "1: MOV TEMP[0].zw, IMM[1].xxxx \n" 157848b8605Smrg "2: MOV OUT[0], TEMP[0] \n" 158848b8605Smrg "3: END \n"; 159848b8605Smrg 160848b8605Smrg const char *text; 161848b8605Smrg 162848b8605Smrg if (mode == 0) 163848b8605Smrg text = origin_upper_left_text; 164848b8605Smrg else if (mode == 1) 165848b8605Smrg text = origin_lower_left_text; 166848b8605Smrg else if (mode == 2) 167848b8605Smrg text = center_integer_text; 168848b8605Smrg else 169848b8605Smrg text = center_half_integer_text; 170848b8605Smrg 171848b8605Smrg handle = graw_parse_fragment_shader(info.ctx, text); 172848b8605Smrg info.ctx->bind_fs_state(info.ctx, handle); 173848b8605Smrg} 174848b8605Smrg 175848b8605Smrg 176848b8605Smrgstatic void 177848b8605Smrgdraw(void) 178848b8605Smrg{ 179848b8605Smrg union pipe_color_union clear_color; 180848b8605Smrg 181848b8605Smrg clear_color.f[0] = 0.25; 182848b8605Smrg clear_color.f[1] = 0.25; 183848b8605Smrg clear_color.f[2] = 0.25; 184848b8605Smrg clear_color.f[3] = 1.0; 185848b8605Smrg 186848b8605Smrg info.ctx->clear(info.ctx, 187848b8605Smrg PIPE_CLEAR_COLOR | PIPE_CLEAR_DEPTHSTENCIL, 188848b8605Smrg &clear_color, 1.0, 0); 189848b8605Smrg util_draw_arrays(info.ctx, PIPE_PRIM_QUADS, 0, NUM_VERTS); 190848b8605Smrg info.ctx->flush(info.ctx, NULL, 0); 191848b8605Smrg 192848b8605Smrg#if 0 193848b8605Smrg /* At the moment, libgraw leaks out/makes available some of the 194848b8605Smrg * symbols from gallium/auxiliary, including these debug helpers. 195848b8605Smrg * Will eventually want to bless some of these paths, and lock the 196848b8605Smrg * others down so they aren't accessible from test programs. 197848b8605Smrg * 198848b8605Smrg * This currently just happens to work on debug builds - a release 199848b8605Smrg * build will probably fail to link here: 200848b8605Smrg */ 201848b8605Smrg debug_dump_surface_bmp(info.ctx, "result.bmp", surf); 202848b8605Smrg#endif 203848b8605Smrg 204848b8605Smrg graw_util_flush_front(&info); 205848b8605Smrg} 206848b8605Smrg 207848b8605Smrg 208848b8605Smrg#if 0 209848b8605Smrgstatic void 210848b8605Smrgresize(int w, int h) 211848b8605Smrg{ 212848b8605Smrg width = w; 213848b8605Smrg height = h; 214848b8605Smrg 215848b8605Smrg set_viewport(0, 0, width, height, 30, 1000); 216848b8605Smrg} 217848b8605Smrg#endif 218848b8605Smrg 219848b8605Smrg 220848b8605Smrgstatic void 221848b8605Smrginit(int mode) 222848b8605Smrg{ 223848b8605Smrg if (!graw_util_create_window(&info, width, height, 1, TRUE)) 224848b8605Smrg exit(1); 225848b8605Smrg 226848b8605Smrg graw_util_default_state(&info, TRUE); 227848b8605Smrg 228848b8605Smrg graw_util_viewport(&info, 0, 0, width, height, -1.0, 1.0); 229848b8605Smrg 230848b8605Smrg set_vertices(); 231848b8605Smrg set_vertex_shader(); 232848b8605Smrg set_fragment_shader(mode); 233848b8605Smrg} 234848b8605Smrg 235848b8605Smrg 236848b8605Smrgint 237848b8605Smrgmain(int argc, char *argv[]) 238848b8605Smrg{ 239848b8605Smrg int mode = argc > 1 ? atoi(argv[1]) : 0; 240848b8605Smrg 241848b8605Smrg switch (mode) { 242848b8605Smrg default: 243848b8605Smrg case 0: 244848b8605Smrg printf("frag coord origin upper-left (lower-left = black)\n"); 245848b8605Smrg break; 246848b8605Smrg case 1: 247848b8605Smrg printf("frag coord origin lower-left (upper-left = black)\n"); 248848b8605Smrg break; 249848b8605Smrg case 2: 250848b8605Smrg printf("frag coord center integer (all pixels black)\n"); 251848b8605Smrg break; 252848b8605Smrg case 3: 253848b8605Smrg printf("frag coord center half-integer (all pixels olive color)\n"); 254848b8605Smrg break; 255848b8605Smrg } 256848b8605Smrg 257848b8605Smrg init(mode); 258848b8605Smrg 259848b8605Smrg graw_set_display_func(draw); 260848b8605Smrg /*graw_set_reshape_func(resize);*/ 261848b8605Smrg graw_main_loop(); 262848b8605Smrg return 0; 263848b8605Smrg} 264