1848b8605Smrg/* Display a huge triangle on a 8192x8192 canvas. 2848b8605Smrg * This demo has no dependencies on any utility code, 3848b8605Smrg * just the graw interface and gallium. 4848b8605Smrg */ 5848b8605Smrg 6848b8605Smrg#include "graw_util.h" 7848b8605Smrg#include "util/u_debug.h" 8848b8605Smrg 9848b8605Smrg#include <stdio.h> 10848b8605Smrg 11848b8605Smrgstatic struct graw_info info; 12848b8605Smrg 13848b8605Smrgstatic const int WIDTH = 4*2048; 14848b8605Smrgstatic const int HEIGHT = 4*2048; 15848b8605Smrg 16848b8605Smrg 17848b8605Smrgstruct vertex { 18848b8605Smrg float position[4]; 19848b8605Smrg float color[4]; 20848b8605Smrg}; 21848b8605Smrg 22848b8605Smrgstatic boolean FlatShade = FALSE; 23848b8605Smrg 24848b8605Smrg 25848b8605Smrgstatic struct vertex vertices[3] = 26848b8605Smrg{ 27848b8605Smrg { 28848b8605Smrg { -1.0f, -1.0f, 0.0f, 1.0f }, 29848b8605Smrg { 1.0f, 0.0f, 0.0f, 1.0f } 30848b8605Smrg }, 31848b8605Smrg { 32848b8605Smrg { -1.0f, 1.0f, 0.0f, 1.0f }, 33848b8605Smrg { 0.0f, 1.0f, 0.0f, 1.0f } 34848b8605Smrg }, 35848b8605Smrg { 36848b8605Smrg { 1.0f, 1.0f, 0.0f, 1.0f }, 37848b8605Smrg { 0.0f, 0.0f, 1.0f, 1.0f } 38848b8605Smrg } 39848b8605Smrg}; 40848b8605Smrg 41848b8605Smrg 42848b8605Smrgstatic void set_vertices( void ) 43848b8605Smrg{ 44848b8605Smrg struct pipe_vertex_element ve[2]; 45848b8605Smrg struct pipe_vertex_buffer vbuf; 46848b8605Smrg void *handle; 47848b8605Smrg 48848b8605Smrg memset(ve, 0, sizeof ve); 49848b8605Smrg 50848b8605Smrg ve[0].src_offset = Offset(struct vertex, position); 51848b8605Smrg ve[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 52848b8605Smrg ve[1].src_offset = Offset(struct vertex, color); 53848b8605Smrg ve[1].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 54848b8605Smrg 55848b8605Smrg handle = info.ctx->create_vertex_elements_state(info.ctx, 2, ve); 56848b8605Smrg info.ctx->bind_vertex_elements_state(info.ctx, handle); 57848b8605Smrg 58848b8605Smrg memset(&vbuf, 0, sizeof vbuf); 59848b8605Smrg 60848b8605Smrg vbuf.stride = sizeof( struct vertex ); 61848b8605Smrg vbuf.buffer_offset = 0; 62b8e80941Smrg vbuf.buffer.resource = pipe_buffer_create_with_data(info.ctx, 63848b8605Smrg PIPE_BIND_VERTEX_BUFFER, 64848b8605Smrg PIPE_USAGE_DEFAULT, 65848b8605Smrg sizeof(vertices), 66848b8605Smrg vertices); 67848b8605Smrg 68848b8605Smrg info.ctx->set_vertex_buffers(info.ctx, 0, 1, &vbuf); 69848b8605Smrg} 70848b8605Smrg 71848b8605Smrg 72848b8605Smrgstatic void set_vertex_shader( void ) 73848b8605Smrg{ 74848b8605Smrg void *handle; 75848b8605Smrg const char *text = 76848b8605Smrg "VERT\n" 77848b8605Smrg "DCL IN[0]\n" 78848b8605Smrg "DCL IN[1]\n" 79848b8605Smrg "DCL OUT[0], POSITION\n" 80848b8605Smrg "DCL OUT[1], COLOR\n" 81848b8605Smrg " 0: MOV OUT[1], IN[1]\n" 82848b8605Smrg " 1: MOV OUT[0], IN[0]\n" 83848b8605Smrg " 2: END\n"; 84848b8605Smrg 85848b8605Smrg handle = graw_parse_vertex_shader(info.ctx, text); 86848b8605Smrg info.ctx->bind_vs_state(info.ctx, handle); 87848b8605Smrg} 88848b8605Smrg 89848b8605Smrg 90848b8605Smrgstatic void set_fragment_shader( void ) 91848b8605Smrg{ 92848b8605Smrg void *handle; 93848b8605Smrg const char *text = 94848b8605Smrg "FRAG\n" 95848b8605Smrg "DCL IN[0], COLOR, LINEAR\n" 96848b8605Smrg "DCL OUT[0], COLOR\n" 97848b8605Smrg " 0: MOV OUT[0], IN[0]\n" 98848b8605Smrg " 1: END\n"; 99848b8605Smrg 100848b8605Smrg handle = graw_parse_fragment_shader(info.ctx, text); 101848b8605Smrg info.ctx->bind_fs_state(info.ctx, handle); 102848b8605Smrg} 103848b8605Smrg 104848b8605Smrg 105848b8605Smrgstatic void draw( void ) 106848b8605Smrg{ 107848b8605Smrg union pipe_color_union clear_color = { {1,0,1,1} }; 108848b8605Smrg 109848b8605Smrg info.ctx->clear(info.ctx, PIPE_CLEAR_COLOR, &clear_color, 0, 0); 110848b8605Smrg util_draw_arrays(info.ctx, PIPE_PRIM_TRIANGLES, 0, 3); 111848b8605Smrg info.ctx->flush(info.ctx, NULL, 0); 112848b8605Smrg 113848b8605Smrg graw_save_surface_to_file(info.ctx, info.color_surf[0], NULL); 114848b8605Smrg 115848b8605Smrg graw_util_flush_front(&info); 116848b8605Smrg} 117848b8605Smrg 118848b8605Smrg 119848b8605Smrgstatic void init( void ) 120848b8605Smrg{ 121848b8605Smrg if (!graw_util_create_window(&info, WIDTH, HEIGHT, 1, FALSE)) 122848b8605Smrg exit(1); 123848b8605Smrg 124848b8605Smrg graw_util_default_state(&info, FALSE); 125848b8605Smrg 126848b8605Smrg { 127848b8605Smrg struct pipe_rasterizer_state rasterizer; 128848b8605Smrg void *handle; 129848b8605Smrg memset(&rasterizer, 0, sizeof rasterizer); 130848b8605Smrg rasterizer.cull_face = PIPE_FACE_NONE; 131848b8605Smrg rasterizer.half_pixel_center = 1; 132848b8605Smrg rasterizer.bottom_edge_rule = 1; 133848b8605Smrg rasterizer.flatshade = FlatShade; 134b8e80941Smrg rasterizer.depth_clip_near = 1; 135b8e80941Smrg rasterizer.depth_clip_far = 1; 136848b8605Smrg handle = info.ctx->create_rasterizer_state(info.ctx, &rasterizer); 137848b8605Smrg info.ctx->bind_rasterizer_state(info.ctx, handle); 138848b8605Smrg } 139848b8605Smrg 140848b8605Smrg 141848b8605Smrg graw_util_viewport(&info, 0, 0, WIDTH, HEIGHT, 30, 1000); 142848b8605Smrg 143848b8605Smrg set_vertices(); 144848b8605Smrg set_vertex_shader(); 145848b8605Smrg set_fragment_shader(); 146848b8605Smrg} 147848b8605Smrg 148848b8605Smrgstatic void args(int argc, char *argv[]) 149848b8605Smrg{ 150848b8605Smrg int i; 151848b8605Smrg 152848b8605Smrg for (i = 1; i < argc; ) { 153848b8605Smrg if (graw_parse_args(&i, argc, argv)) { 154848b8605Smrg /* ok */ 155848b8605Smrg } 156848b8605Smrg else if (strcmp(argv[i], "-f") == 0) { 157848b8605Smrg FlatShade = TRUE; 158848b8605Smrg i++; 159848b8605Smrg } 160848b8605Smrg else { 161848b8605Smrg printf("Invalid arg %s\n", argv[i]); 162848b8605Smrg exit(1); 163848b8605Smrg } 164848b8605Smrg } 165848b8605Smrg} 166848b8605Smrg 167848b8605Smrgint main( int argc, char *argv[] ) 168848b8605Smrg{ 169848b8605Smrg args(argc, argv); 170848b8605Smrg init(); 171848b8605Smrg 172848b8605Smrg graw_set_display_func( draw ); 173848b8605Smrg graw_main_loop(); 174848b8605Smrg return 0; 175848b8605Smrg} 176