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 "state_tracker/graw.h"
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_screen.h"
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_context.h"
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_state.h"
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_defines.h"
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h"      /* Offset() */
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_draw_quad.h"
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h"
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum pipe_format formats[] = {
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PIPE_FORMAT_R8G8B8A8_UNORM,
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PIPE_FORMAT_B8G8R8A8_UNORM,
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PIPE_FORMAT_NONE
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const int WIDTH = 300;
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const int HEIGHT = 300;
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct pipe_screen *screen = NULL;
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct pipe_context *ctx = NULL;
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct pipe_surface *surf = NULL;
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct pipe_resource *tex = NULL;
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *window = NULL;
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct vertex {
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float position[4];
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float color[4];
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct vertex vertices[4] =
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { { 0.0f, -0.9f, 0.0f, 1.0f },
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     { 1.0f, 0.0f, 0.0f, 1.0f }
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   },
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { { -0.9f, 0.9f, 0.0f, 1.0f },
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     { 0.0f, 1.0f, 0.0f, 1.0f }
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   },
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { { 0.9f, 0.9f, 0.0f, 1.0f },
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     { 0.0f, 0.0f, 1.0f, 1.0f }
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void set_viewport( float x, float y,
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          float width, float height,
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          float near, float far)
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float z = far;
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float half_width = (float)width / 2.0f;
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float half_height = (float)height / 2.0f;
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float half_depth = ((float)far - (float)near) / 2.0f;
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_viewport_state vp;
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vp.scale[0] = half_width;
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vp.scale[1] = half_height;
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vp.scale[2] = half_depth;
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vp.scale[3] = 1.0f;
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vp.translate[0] = half_width + x;
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vp.translate[1] = half_height + y;
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vp.translate[2] = half_depth + z;
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vp.translate[3] = 0.0f;
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->set_viewport_state( ctx, &vp );
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void set_vertices( void )
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_vertex_element ve[2];
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_vertex_buffer vbuf;
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void *handle;
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(ve, 0, sizeof ve);
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ve[0].src_offset = Offset(struct vertex, position);
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ve[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ve[1].src_offset = Offset(struct vertex, color);
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ve[1].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   handle = ctx->create_vertex_elements_state(ctx, 2, ve);
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->bind_vertex_elements_state(ctx, handle);
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbuf.stride = sizeof( struct vertex );
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbuf.buffer_offset = 0;
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbuf.buffer = pipe_buffer_create_with_data(ctx,
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                              PIPE_BIND_VERTEX_BUFFER,
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                              PIPE_USAGE_STATIC,
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                              sizeof(vertices),
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                              vertices);
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->set_vertex_buffers(ctx, 1, &vbuf);
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void set_vertex_shader( void )
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void *handle;
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *text =
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "VERT\n"
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "DCL IN[0]\n"
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "DCL IN[1]\n"
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "DCL OUT[0], POSITION\n"
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "DCL OUT[1], COLOR\n"
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "  0: MOV OUT[1], IN[1]\n"
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "  1: MOV OUT[0], IN[0]\n"
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "  2: END\n";
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   handle = graw_parse_vertex_shader(ctx, text);
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->bind_vs_state(ctx, handle);
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void set_fragment_shader( void )
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void *handle;
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *text =
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "FRAG\n"
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "DCL IN[0], COLOR, LINEAR\n"
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "DCL OUT[0], COLOR\n"
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "  0: MOV OUT[0], IN[0]\n"
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "  1: END\n";
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   handle = graw_parse_fragment_shader(ctx, text);
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->bind_fs_state(ctx, handle);
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void set_geometry_shader( void )
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void *handle;
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *text =
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "GEOM\n"
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "PROPERTY GS_INPUT_PRIMITIVE TRIANGLES\n"
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "PROPERTY GS_OUTPUT_PRIMITIVE TRIANGLE_STRIP\n"
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "DCL IN[][0], POSITION, CONSTANT\n"
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "DCL IN[][1], COLOR, CONSTANT\n"
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "DCL OUT[0], POSITION, CONSTANT\n"
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "DCL OUT[1], COLOR, CONSTANT\n"
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "0:MOV OUT[0], IN[0][0]\n"
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "1:MOV OUT[1], IN[0][1]\n"
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "2:EMIT\n"
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "3:MOV OUT[0], IN[1][0]\n"
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "4:MOV OUT[1], IN[0][1]\n" /* copy color from input vertex 0 */
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "5:EMIT\n"
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "6:MOV OUT[0], IN[2][0]\n"
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "7:MOV OUT[1], IN[2][1]\n"
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "8:EMIT\n"
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "9:ENDPRIM\n"
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "10:END\n";
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   handle = graw_parse_geometry_shader(ctx, text);
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->bind_gs_state(ctx, handle);
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void draw( void )
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   union pipe_color_union clear_color = { {1,0,1,1} };
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->clear(ctx, PIPE_CLEAR_COLOR, &clear_color, 0, 0);
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   util_draw_arrays(ctx, PIPE_PRIM_TRIANGLES, 0, 3);
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->flush(ctx, NULL);
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   screen->flush_frontbuffer(screen, tex, 0, 0, window);
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void init( void )
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_framebuffer_state fb;
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_resource templat;
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_surface surf_tmpl;
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i;
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* It's hard to say whether window or screen should be created
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * first.  Different environments would prefer one or the other.
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Also, no easy way of querying supported formats if the screen
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * cannot be created first.
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; formats[i] != PIPE_FORMAT_NONE; i++) {
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      screen = graw_create_window_and_screen(0, 0, 300, 300,
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             formats[i],
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             &window);
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (window && screen)
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!screen || !window) {
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "Unable to create window\n");
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exit(1);
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx = screen->context_create(screen, NULL);
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx == NULL)
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exit(3);
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.target = PIPE_TEXTURE_2D;
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.format = formats[i];
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.width0 = WIDTH;
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.height0 = HEIGHT;
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.depth0 = 1;
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.array_size = 1;
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.last_level = 0;
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.nr_samples = 1;
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.bind = (PIPE_BIND_RENDER_TARGET |
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   PIPE_BIND_DISPLAY_TARGET);
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tex = screen->resource_create(screen,
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 &templat);
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (tex == NULL)
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exit(4);
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf_tmpl.format = templat.format;
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf_tmpl.usage = PIPE_BIND_RENDER_TARGET;
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf_tmpl.u.tex.level = 0;
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf_tmpl.u.tex.first_layer = 0;
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf_tmpl.u.tex.last_layer = 0;
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf = ctx->create_surface(ctx, tex, &surf_tmpl);
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (surf == NULL)
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exit(5);
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(&fb, 0, sizeof fb);
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fb.nr_cbufs = 1;
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fb.width = WIDTH;
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fb.height = HEIGHT;
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fb.cbufs[0] = surf;
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->set_framebuffer_state(ctx, &fb);
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_blend_state blend;
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      void *handle;
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memset(&blend, 0, sizeof blend);
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      blend.rt[0].colormask = PIPE_MASK_RGBA;
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      handle = ctx->create_blend_state(ctx, &blend);
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->bind_blend_state(ctx, handle);
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_depth_stencil_alpha_state depthstencil;
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      void *handle;
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memset(&depthstencil, 0, sizeof depthstencil);
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      handle = ctx->create_depth_stencil_alpha_state(ctx, &depthstencil);
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->bind_depth_stencil_alpha_state(ctx, handle);
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_rasterizer_state rasterizer;
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      void *handle;
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memset(&rasterizer, 0, sizeof rasterizer);
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rasterizer.cull_face = PIPE_FACE_NONE;
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rasterizer.gl_rasterization_rules = 1;
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rasterizer.depth_clip = 1;
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      handle = ctx->create_rasterizer_state(ctx, &rasterizer);
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->bind_rasterizer_state(ctx, handle);
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   set_viewport(0, 0, WIDTH, HEIGHT, 30, 1000);
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   set_vertices();
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   set_vertex_shader();
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   set_fragment_shader();
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   set_geometry_shader();
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint main( int argc, char *argv[] )
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   init();
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   graw_set_display_func( draw );
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   graw_main_loop();
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 0;
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
280