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.
7 #include "util/u_debug.h"
11 static struct graw_info info
;
13 static const int WIDTH
= 4*2048;
14 static const int HEIGHT
= 4*2048;
22 static boolean FlatShade
= FALSE
;
25 static struct vertex vertices
[3] =
28 { -1.0f
, -1.0f
, 0.0f
, 1.0f
},
29 { 1.0f
, 0.0f
, 0.0f
, 1.0f
}
32 { -1.0f
, 1.0f
, 0.0f
, 1.0f
},
33 { 0.0f
, 1.0f
, 0.0f
, 1.0f
}
36 { 1.0f
, 1.0f
, 0.0f
, 1.0f
},
37 { 0.0f
, 0.0f
, 1.0f
, 1.0f
}
42 static void set_vertices( void )
44 struct pipe_vertex_element ve
[2];
45 struct pipe_vertex_buffer vbuf
;
48 memset(ve
, 0, sizeof ve
);
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
;
55 handle
= info
.ctx
->create_vertex_elements_state(info
.ctx
, 2, ve
);
56 info
.ctx
->bind_vertex_elements_state(info
.ctx
, handle
);
58 memset(&vbuf
, 0, sizeof vbuf
);
60 vbuf
.stride
= sizeof( struct vertex
);
61 vbuf
.buffer_offset
= 0;
62 vbuf
.buffer
.resource
= pipe_buffer_create_with_data(info
.ctx
,
63 PIPE_BIND_VERTEX_BUFFER
,
68 info
.ctx
->set_vertex_buffers(info
.ctx
, 0, 1, &vbuf
);
72 static void set_vertex_shader( void )
79 "DCL OUT[0], POSITION\n"
81 " 0: MOV OUT[1], IN[1]\n"
82 " 1: MOV OUT[0], IN[0]\n"
85 handle
= graw_parse_vertex_shader(info
.ctx
, text
);
86 info
.ctx
->bind_vs_state(info
.ctx
, handle
);
90 static void set_fragment_shader( void )
95 "DCL IN[0], COLOR, LINEAR\n"
97 " 0: MOV OUT[0], IN[0]\n"
100 handle
= graw_parse_fragment_shader(info
.ctx
, text
);
101 info
.ctx
->bind_fs_state(info
.ctx
, handle
);
105 static void draw( void )
107 union pipe_color_union clear_color
= { {1,0,1,1} };
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);
113 graw_save_surface_to_file(info
.ctx
, info
.color_surf
[0], NULL
);
115 graw_util_flush_front(&info
);
119 static void init( void )
121 if (!graw_util_create_window(&info
, WIDTH
, HEIGHT
, 1, FALSE
))
124 graw_util_default_state(&info
, FALSE
);
127 struct pipe_rasterizer_state rasterizer
;
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
);
140 graw_util_viewport(&info
, 0, 0, WIDTH
, HEIGHT
, 30, 1000);
144 set_fragment_shader();
147 static void args(int argc
, char *argv
[])
151 for (i
= 1; i
< argc
; ) {
152 if (graw_parse_args(&i
, argc
, argv
)) {
155 else if (strcmp(argv
[i
], "-f") == 0) {
160 printf("Invalid arg %s\n", argv
[i
]);
166 int main( int argc
, char *argv
[] )
171 graw_set_display_func( draw
);