Path: blob/21.2-virgl/src/gallium/tests/graw/fs-fragcoord.c
4565 views
/* Test the TGSI_SEMANTIC_POSITION fragment shader input.1* Plus properties for upper-left vs. lower-left origin and2* center integer vs. half-integer;3*/45#include <stdio.h>67#include "graw_util.h"89#include "util/macros.h"101112static int width = 300;13static int height = 300;1415static struct graw_info info;1617struct vertex {18float position[4];19float color[4];20};2122/* Note: the upper-left vertex is pushed to the left a bit to23* make sure we can spot upside-down rendering.24*/25static struct vertex vertices[] =26{27{28{-0.95, -0.95, 0.5, 1.0 },29{ 0, 0, 0, 1 }30},3132{33{ 0.85, -0.95, 0.5, 1.0 },34{ 0, 0, 0, 1 }35},3637{38{ 0.95, 0.95, 0.5, 1.0 },39{ 0, 0, 0, 1 }40},4142{43{-0.95, 0.95, 0.5, 1.0 },44{ 0, 0, 0, 1 }45}46};4748#define NUM_VERTS ARRAY_SIZE(vertices)495051static void52set_vertices(void)53{54struct pipe_vertex_element ve[2];55struct pipe_vertex_buffer vbuf;56void *handle;5758memset(ve, 0, sizeof ve);5960ve[0].src_offset = Offset(struct vertex, position);61ve[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;62ve[1].src_offset = Offset(struct vertex, color);63ve[1].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;6465handle = info.ctx->create_vertex_elements_state(info.ctx, 2, ve);66info.ctx->bind_vertex_elements_state(info.ctx, handle);6768memset(&vbuf, 0, sizeof vbuf);6970vbuf.stride = sizeof(struct vertex);71vbuf.buffer_offset = 0;72vbuf.buffer.resource = pipe_buffer_create_with_data(info.ctx,73PIPE_BIND_VERTEX_BUFFER,74PIPE_USAGE_DEFAULT,75sizeof(vertices),76vertices);7778info.ctx->set_vertex_buffers(info.ctx, 0, 1, 0, false, &vbuf);79}808182static void83set_vertex_shader(void)84{85void *handle;86const char *text =87"VERT\n"88"DCL IN[0]\n"89"DCL IN[1]\n"90"DCL OUT[0], POSITION\n"91"DCL OUT[1], GENERIC[0]\n"92" 0: MOV OUT[0], IN[0]\n"93" 1: MOV OUT[1], IN[1]\n"94" 2: END\n";9596handle = graw_parse_vertex_shader(info.ctx, text);97info.ctx->bind_vs_state(info.ctx, handle);98}99100101static void102set_fragment_shader(int mode)103{104void *handle;105106const char *origin_upper_left_text =107"FRAG\n"108"PROPERTY FS_COORD_ORIGIN UPPER_LEFT\n" /* upper-left = black corner */109"DCL IN[0], POSITION, LINEAR\n"110"DCL OUT[0], COLOR\n"111"DCL TEMP[0]\n"112"IMM FLT32 { 0.003333, 0.003333, 1.0, 1.0 }\n"113"IMM FLT32 { 0.0, 300.0, 0.0, 0.0 }\n"114" 0: MOV TEMP[0], IN[0] \n"115" 1: MOV TEMP[0].zw, IMM[1].xxxx \n"116" 2: MUL OUT[0], TEMP[0], IMM[0] \n"117" 3: END\n";118119const char *origin_lower_left_text =120"FRAG\n"121"PROPERTY FS_COORD_ORIGIN LOWER_LEFT\n" /* lower-left = black corner */122"DCL IN[0], POSITION, LINEAR\n"123"DCL OUT[0], COLOR\n"124"DCL TEMP[0]\n"125"IMM FLT32 { 0.003333, 0.003333, 1.0, 1.0 }\n"126"IMM FLT32 { 0.0, 300.0, 0.0, 0.0 }\n"127" 0: MOV TEMP[0], IN[0] \n"128" 1: MOV TEMP[0].zw, IMM[1].xxxx \n"129" 2: MUL OUT[0], TEMP[0], IMM[0] \n"130" 3: END\n";131132/* Test fragcoord center integer vs. half integer */133const char *center_integer_text =134"FRAG\n"135"PROPERTY FS_COORD_PIXEL_CENTER INTEGER \n" /* pixels are black */136"DCL IN[0], POSITION, LINEAR \n"137"DCL OUT[0], COLOR \n"138"DCL TEMP[0] \n"139"IMM FLT32 { 0.003333, 0.003333, 1.0, 1.0 } \n"140"IMM FLT32 { 0.0, 300.0, 0.0, 0.0 } \n"141"0: FRC TEMP[0], IN[0] \n"142"1: MOV TEMP[0].zw, IMM[1].xxxx \n"143"2: MOV OUT[0], TEMP[0] \n"144"3: END \n";145146const char *center_half_integer_text =147"FRAG\n"148"PROPERTY FS_COORD_PIXEL_CENTER HALF_INTEGER \n" /* pixels are olive colored */149"DCL IN[0], POSITION, LINEAR \n"150"DCL OUT[0], COLOR \n"151"DCL TEMP[0] \n"152"IMM FLT32 { 0.003333, 0.003333, 1.0, 1.0 } \n"153"IMM FLT32 { 0.0, 300.0, 0.0, 0.0 } \n"154"0: FRC TEMP[0], IN[0] \n"155"1: MOV TEMP[0].zw, IMM[1].xxxx \n"156"2: MOV OUT[0], TEMP[0] \n"157"3: END \n";158159const char *text;160161if (mode == 0)162text = origin_upper_left_text;163else if (mode == 1)164text = origin_lower_left_text;165else if (mode == 2)166text = center_integer_text;167else168text = center_half_integer_text;169170handle = graw_parse_fragment_shader(info.ctx, text);171info.ctx->bind_fs_state(info.ctx, handle);172}173174175static void176draw(void)177{178union pipe_color_union clear_color;179180clear_color.f[0] = 0.25;181clear_color.f[1] = 0.25;182clear_color.f[2] = 0.25;183clear_color.f[3] = 1.0;184185info.ctx->clear(info.ctx,186PIPE_CLEAR_COLOR | PIPE_CLEAR_DEPTHSTENCIL,187NULL,188&clear_color, 1.0, 0);189util_draw_arrays(info.ctx, PIPE_PRIM_QUADS, 0, NUM_VERTS);190info.ctx->flush(info.ctx, NULL, 0);191192#if 0193/* At the moment, libgraw leaks out/makes available some of the194* symbols from gallium/auxiliary, including these debug helpers.195* Will eventually want to bless some of these paths, and lock the196* others down so they aren't accessible from test programs.197*198* This currently just happens to work on debug builds - a release199* build will probably fail to link here:200*/201debug_dump_surface_bmp(info.ctx, "result.bmp", surf);202#endif203204graw_util_flush_front(&info);205}206207208#if 0209static void210resize(int w, int h)211{212width = w;213height = h;214215set_viewport(0, 0, width, height, 30, 1000);216}217#endif218219220static void221init(int mode)222{223if (!graw_util_create_window(&info, width, height, 1, TRUE))224exit(1);225226graw_util_default_state(&info, TRUE);227228graw_util_viewport(&info, 0, 0, width, height, -1.0, 1.0);229230set_vertices();231set_vertex_shader();232set_fragment_shader(mode);233}234235236int237main(int argc, char *argv[])238{239int mode = argc > 1 ? atoi(argv[1]) : 0;240241switch (mode) {242default:243case 0:244printf("frag coord origin upper-left (lower-left = black)\n");245break;246case 1:247printf("frag coord origin lower-left (upper-left = black)\n");248break;249case 2:250printf("frag coord center integer (all pixels black)\n");251break;252case 3:253printf("frag coord center half-integer (all pixels olive color)\n");254break;255}256257init(mode);258259graw_set_display_func(draw);260/*graw_set_reshape_func(resize);*/261graw_main_loop();262return 0;263}264265266