67d49b07bb06f40335809f8694314502b012bca8
[mesa.git] / src / gallium / tests / graw / tri-large.c
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_STATIC,
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 }