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