Home | History | Annotate | Download | only in graw
      1 /* Display a huge triangle on a 8192x8192 canvas.
      2  * This demo has no dependencies on any utility code,
      3  * just the graw interface and gallium.
      4  */
      5 
      6 #include "graw_util.h"
      7 #include "util/u_debug.h"
      8 
      9 #include <stdio.h>
     10 
     11 static struct graw_info info;
     12 
     13 static const int WIDTH = 4*2048;
     14 static const int HEIGHT = 4*2048;
     15 
     16 
     17 struct vertex {
     18    float position[4];
     19    float color[4];
     20 };
     21 
     22 static boolean FlatShade = FALSE;
     23 
     24 
     25 static struct vertex vertices[3] =
     26 {
     27    {
     28       { -1.0f, -1.0f, 0.0f, 1.0f },
     29       { 1.0f, 0.0f, 0.0f, 1.0f }
     30    },
     31    {
     32       { -1.0f, 1.0f, 0.0f, 1.0f },
     33       { 0.0f, 1.0f, 0.0f, 1.0f }
     34    },
     35    {
     36       { 1.0f, 1.0f, 0.0f, 1.0f },
     37       { 0.0f, 0.0f, 1.0f, 1.0f }
     38    }
     39 };
     40 
     41 
     42 static void set_vertices( void )
     43 {
     44    struct pipe_vertex_element ve[2];
     45    struct pipe_vertex_buffer vbuf;
     46    void *handle;
     47 
     48    memset(ve, 0, sizeof ve);
     49 
     50    ve[0].src_offset = Offset(struct vertex, position);
     51    ve[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
     52    ve[1].src_offset = Offset(struct vertex, color);
     53    ve[1].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
     54 
     55    handle = info.ctx->create_vertex_elements_state(info.ctx, 2, ve);
     56    info.ctx->bind_vertex_elements_state(info.ctx, handle);
     57 
     58    memset(&vbuf, 0, sizeof vbuf);
     59 
     60    vbuf.stride = sizeof( struct vertex );
     61    vbuf.buffer_offset = 0;
     62    vbuf.buffer = pipe_buffer_create_with_data(info.ctx,
     63                                               PIPE_BIND_VERTEX_BUFFER,
     64                                               PIPE_USAGE_DEFAULT,
     65                                               sizeof(vertices),
     66                                               vertices);
     67 
     68    info.ctx->set_vertex_buffers(info.ctx, 0, 1, &vbuf);
     69 }
     70 
     71 
     72 static void set_vertex_shader( void )
     73 {
     74    void *handle;
     75    const char *text =
     76       "VERT\n"
     77       "DCL IN[0]\n"
     78       "DCL IN[1]\n"
     79       "DCL OUT[0], POSITION\n"
     80       "DCL OUT[1], COLOR\n"
     81       "  0: MOV OUT[1], IN[1]\n"
     82       "  1: MOV OUT[0], IN[0]\n"
     83       "  2: END\n";
     84 
     85    handle = graw_parse_vertex_shader(info.ctx, text);
     86    info.ctx->bind_vs_state(info.ctx, handle);
     87 }
     88 
     89 
     90 static void set_fragment_shader( void )
     91 {
     92    void *handle;
     93    const char *text =
     94       "FRAG\n"
     95       "DCL IN[0], COLOR, LINEAR\n"
     96       "DCL OUT[0], COLOR\n"
     97       "  0: MOV OUT[0], IN[0]\n"
     98       "  1: END\n";
     99 
    100    handle = graw_parse_fragment_shader(info.ctx, text);
    101    info.ctx->bind_fs_state(info.ctx, handle);
    102 }
    103 
    104 
    105 static void draw( void )
    106 {
    107    union pipe_color_union clear_color = { {1,0,1,1} };
    108 
    109    info.ctx->clear(info.ctx, PIPE_CLEAR_COLOR, &clear_color, 0, 0);
    110    util_draw_arrays(info.ctx, PIPE_PRIM_TRIANGLES, 0, 3);
    111    info.ctx->flush(info.ctx, NULL, 0);
    112 
    113    graw_save_surface_to_file(info.ctx, info.color_surf[0], NULL);
    114 
    115    graw_util_flush_front(&info);
    116 }
    117 
    118 
    119 static void init( void )
    120 {
    121    if (!graw_util_create_window(&info, WIDTH, HEIGHT, 1, FALSE))
    122       exit(1);
    123 
    124    graw_util_default_state(&info, FALSE);
    125 
    126    {
    127       struct pipe_rasterizer_state rasterizer;
    128       void *handle;
    129       memset(&rasterizer, 0, sizeof rasterizer);
    130       rasterizer.cull_face = PIPE_FACE_NONE;
    131       rasterizer.half_pixel_center = 1;
    132       rasterizer.bottom_edge_rule = 1;
    133       rasterizer.flatshade = FlatShade;
    134       rasterizer.depth_clip = 1;
    135       handle = info.ctx->create_rasterizer_state(info.ctx, &rasterizer);
    136       info.ctx->bind_rasterizer_state(info.ctx, handle);
    137    }
    138 
    139 
    140    graw_util_viewport(&info, 0, 0, WIDTH, HEIGHT, 30, 1000);
    141 
    142    set_vertices();
    143    set_vertex_shader();
    144    set_fragment_shader();
    145 }
    146 
    147 static void args(int argc, char *argv[])
    148 {
    149    int i;
    150 
    151    for (i = 1; i < argc; ) {
    152       if (graw_parse_args(&i, argc, argv)) {
    153          /* ok */
    154       }
    155       else if (strcmp(argv[i], "-f") == 0) {
    156          FlatShade = TRUE;
    157          i++;
    158       }
    159       else {
    160          printf("Invalid arg %s\n", argv[i]);
    161          exit(1);
    162       }
    163    }
    164 }
    165 
    166 int main( int argc, char *argv[] )
    167 {
    168    args(argc, argv);
    169    init();
    170 
    171    graw_set_display_func( draw );
    172    graw_main_loop();
    173    return 0;
    174 }
    175