Path: blob/21.2-virgl/src/gallium/tests/graw/quad-tex.c
4565 views
/* Display a cleared blue window. This demo has no dependencies on1* any utility code, just the graw interface and gallium.2*/34#include "graw_util.h"56static const int WIDTH = 300;7static const int HEIGHT = 300;89static struct graw_info info;101112static struct pipe_resource *texture = NULL;13static struct pipe_sampler_view *sv = NULL;14static void *sampler = NULL;1516struct vertex {17float position[4];18float color[4];19};2021static struct vertex vertices[] =22{23{ { 0.9, -0.9, 0.0, 1.0 },24{ 1, 0, 0, 1 } },2526{ { 0.9, 0.9, 0.0, 1.0 },27{ 1, 1, 0, 1 } },2829{ {-0.9, 0.9, 0.0, 1.0 },30{ 0, 1, 0, 1 } },3132{ {-0.9, -0.9, 0.0, 1.0 },33{ 0, 0, 0, 1 } },34};3536373839static void set_vertices( void )40{41struct pipe_vertex_element ve[2];42struct pipe_vertex_buffer vbuf;43void *handle;4445memset(ve, 0, sizeof ve);4647ve[0].src_offset = Offset(struct vertex, position);48ve[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;49ve[1].src_offset = Offset(struct vertex, color);50ve[1].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;5152handle = info.ctx->create_vertex_elements_state(info.ctx, 2, ve);53info.ctx->bind_vertex_elements_state(info.ctx, handle);5455memset(&vbuf, 0, sizeof vbuf);5657vbuf.stride = sizeof( struct vertex );58vbuf.buffer_offset = 0;59vbuf.buffer.resource = pipe_buffer_create_with_data(info.ctx,60PIPE_BIND_VERTEX_BUFFER,61PIPE_USAGE_DEFAULT,62sizeof(vertices),63vertices);6465info.ctx->set_vertex_buffers(info.ctx, 0, 1, 0, false, &vbuf);66}6768static void set_vertex_shader( void )69{70void *handle;71const char *text =72"VERT\n"73"DCL IN[0]\n"74"DCL IN[1]\n"75"DCL OUT[0], POSITION\n"76"DCL OUT[1], GENERIC[0]\n"77" 0: MOV OUT[1], IN[1]\n"78" 1: MOV OUT[0], IN[0]\n"79" 2: END\n";8081handle = graw_parse_vertex_shader(info.ctx, text);82info.ctx->bind_vs_state(info.ctx, handle);83}8485static void set_fragment_shader( void )86{87void *handle;88const char *text =89"FRAG\n"90"DCL IN[0], GENERIC[0], PERSPECTIVE\n"91"DCL OUT[0], COLOR\n"92"DCL TEMP[0]\n"93"DCL SAMP[0]\n"94"DCL SVIEW[0], 2D, FLOAT\n"95" 0: TXP TEMP[0], IN[0], SAMP[0], 2D\n"96" 1: MOV OUT[0], TEMP[0]\n"97" 2: END\n";9899handle = graw_parse_fragment_shader(info.ctx, text);100info.ctx->bind_fs_state(info.ctx, handle);101}102103104static void draw( void )105{106union pipe_color_union clear_color = { {.5,.5,.5,1} };107108info.ctx->clear(info.ctx, PIPE_CLEAR_COLOR, NULL, &clear_color, 0, 0);109util_draw_arrays(info.ctx, PIPE_PRIM_QUADS, 0, 4);110info.ctx->flush(info.ctx, NULL, 0);111112graw_save_surface_to_file(info.ctx, info.color_surf[0], NULL);113114graw_util_flush_front(&info);115}116117118#define SIZE 16119120static void init_tex( void )121{122ubyte tex2d[SIZE][SIZE][4];123int s, t;124125#if (SIZE != 2)126for (s = 0; s < SIZE; s++) {127for (t = 0; t < SIZE; t++) {128if (0) {129int x = (s ^ t) & 1;130tex2d[t][s][0] = (x) ? 0 : 63;131tex2d[t][s][1] = (x) ? 0 : 128;132tex2d[t][s][2] = 0;133tex2d[t][s][3] = 0xff;134}135else {136int x = ((s ^ t) >> 2) & 1;137tex2d[t][s][0] = s*255/(SIZE-1);138tex2d[t][s][1] = t*255/(SIZE-1);139tex2d[t][s][2] = (x) ? 0 : 128;140tex2d[t][s][3] = 0xff;141}142}143}144#else145tex2d[0][0][0] = 0;146tex2d[0][0][1] = 255;147tex2d[0][0][2] = 255;148tex2d[0][0][3] = 0;149150tex2d[0][1][0] = 0;151tex2d[0][1][1] = 0;152tex2d[0][1][2] = 255;153tex2d[0][1][3] = 255;154155tex2d[1][0][0] = 255;156tex2d[1][0][1] = 255;157tex2d[1][0][2] = 0;158tex2d[1][0][3] = 255;159160tex2d[1][1][0] = 255;161tex2d[1][1][1] = 0;162tex2d[1][1][2] = 0;163tex2d[1][1][3] = 255;164#endif165166texture = graw_util_create_tex2d(&info, SIZE, SIZE,167PIPE_FORMAT_B8G8R8A8_UNORM, tex2d);168169sv = graw_util_create_simple_sampler_view(&info, texture);170info.ctx->set_sampler_views(info.ctx, PIPE_SHADER_FRAGMENT, 0, 1, 0, &sv);171172sampler = graw_util_create_simple_sampler(&info,173PIPE_TEX_WRAP_REPEAT,174PIPE_TEX_FILTER_NEAREST);175info.ctx->bind_sampler_states(info.ctx, PIPE_SHADER_FRAGMENT,1760, 1, &sampler);177}178179180static void init( void )181{182if (!graw_util_create_window(&info, WIDTH, HEIGHT, 1, FALSE))183exit(1);184185graw_util_default_state(&info, FALSE);186187{188struct pipe_rasterizer_state rasterizer;189void *handle;190memset(&rasterizer, 0, sizeof rasterizer);191rasterizer.cull_face = PIPE_FACE_NONE;192rasterizer.half_pixel_center = 1;193rasterizer.bottom_edge_rule = 1;194rasterizer.depth_clip_near = 1;195rasterizer.depth_clip_far = 1;196handle = info.ctx->create_rasterizer_state(info.ctx, &rasterizer);197info.ctx->bind_rasterizer_state(info.ctx, handle);198}199200graw_util_viewport(&info, 0, 0, WIDTH, HEIGHT, 30, 1000);201202init_tex();203204set_vertices();205set_vertex_shader();206set_fragment_shader();207}208209210static void args(int argc, char *argv[])211{212int i;213214for (i = 1; i < argc;) {215if (graw_parse_args(&i, argc, argv)) {216continue;217}218exit(1);219}220}221222int main( int argc, char *argv[] )223{224args(argc, argv);225init();226227graw_set_display_func( draw );228graw_main_loop();229return 0;230}231232233