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 "state_tracker/graw.h"
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_screen.h"
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_context.h"
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_shader_tokens.h"
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_state.h"
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_defines.h"
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdio.h>              /* for fread(), etc */
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h"
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h"      /* Offset() */
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_draw_quad.h"
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_box.h"
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char *filename = NULL;
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunsigned show_fps = 0;
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunsigned draw_strip = 0;
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void usage(char *name)
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fprintf(stderr, "usage: %s [ options ] shader_filename\n", name);
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef WIN32
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fprintf(stderr, "\n" );
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fprintf(stderr, "options:\n");
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fprintf(stderr, "    -fps  show frames per second\n");
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fprintf(stderr, "    -strip renders a triangle strip\n");
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum pipe_format formats[] = {
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PIPE_FORMAT_R8G8B8A8_UNORM,
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PIPE_FORMAT_B8G8R8A8_UNORM,
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PIPE_FORMAT_NONE
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const int WIDTH = 250;
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const int HEIGHT = 250;
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct pipe_screen *screen = NULL;
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct pipe_context *ctx = NULL;
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct pipe_resource *rttex = NULL;
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct pipe_resource *constbuf1 = NULL;
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct pipe_resource *constbuf2 = NULL;
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct pipe_surface *surf = NULL;
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct pipe_sampler_view *sv = NULL;
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *sampler = NULL;
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *window = NULL;
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct pipe_resource *samptex = NULL;
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct vertex {
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float position[4];
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float color[4];
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float texcoord[4];
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float generic[4];
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Vertex data matches progs/fp/fp-tri.c, but flipped in Y dimension
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * so that the final images are the same.
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct vertex vertices[] =
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { { 0.9, 0.9, 0.0, 1.0 },
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     { 0, 0, 1, 1 },
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     { 1, 1, 0, 1 },
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     { 1, 0, 1, 0 }
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   },
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { { 0.9,  -0.9, 0.0, 1.0 },
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     { 1, 0, 0, 1 },
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     { 1, -1, 0, 1 },
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     { 0, 1, 0, 1 }
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   },
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { {-0.9,  0.0, 0.0, 1.0 },
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     { 0, 1, 0, 1 },
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     { -1, 0, 0, 1 },
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     { 0, 0, 1, 1 }
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   },
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct vertex vertices_strip[] =
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { { 0.9, 0.9, 0.0, 1.0 },
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     { 0, 0, 1, 1 },
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     { 1, 1, 0, 1 },
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     { 1, 0, 0, 1 }
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   },
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { { 0.9,  -0.9, 0.0, 1.0 },
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     { 1, 0, 0, 1 },
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     { 1, -1, 0, 1 },
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     { 0, 1, 0, 1 }
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   },
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { {-0.9,  0.9, 0.0, 1.0 },
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     { 0, 1, 0, 1 },
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     { -1, 1, 0, 1 },
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     { 0, 0, 1, 1 }
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   },
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { {-0.9,  -0.9, 0.0, 1.0 },
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     { 1, 1, 0, 1 },
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     { -1, -1, 0, 1 },
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     { 1, 1, 0, 1 }
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   },
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic float constants1[] =
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{  0.4, 0, 0,  1,
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   1,   1, 1,  1,
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   2,   2, 2,  2,
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   4,   8, 16, 32,
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   3,  0, 0, 0,
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0, .5, 0, 0,
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,  0, 1, 0,
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,  0, 0, 1,
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   1, 0, 0, 0.5,
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0, 1, 0, 0.5,
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0, 0, 1, 0,
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0, 0, 0, 1,
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic float constants2[] =
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{  1, 0, 0,  1,
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0, 1, 0,  1,
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0, 0, 1,  1,
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0, 0, 0,  1,
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   1,  1, 0, 1,
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   1, .5, 0, 1,
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,  1, 1, 1,
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   1,  0, 1, 1,
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   1, 0, 0, 0.5,
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0, 1, 0, 0.5,
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0, 0, 1, 0,
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0, 0, 0, 1,
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void init_fs_constbuf( void )
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_resource templat;
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_box box;
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.target = PIPE_BUFFER;
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.format = PIPE_FORMAT_R8_UNORM;
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.width0 = sizeof(constants1);
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.height0 = 1;
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.depth0 = 1;
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.array_size = 1;
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.last_level = 0;
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.nr_samples = 1;
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.bind = PIPE_BIND_CONSTANT_BUFFER;
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   constbuf1 = screen->resource_create(screen, &templat);
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (constbuf1 == NULL)
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exit(4);
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   constbuf2 = screen->resource_create(screen, &templat);
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (constbuf2 == NULL)
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exit(4);
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      u_box_2d(0,0,sizeof(constants1),1, &box);
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->transfer_inline_write(ctx,
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 constbuf1,
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 0,
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 PIPE_TRANSFER_WRITE,
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 &box,
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 constants1,
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 sizeof constants1,
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 sizeof constants1);
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pipe_set_constant_buffer(ctx,
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               PIPE_SHADER_GEOMETRY, 0,
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               constbuf1);
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      u_box_2d(0,0,sizeof(constants2),1, &box);
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->transfer_inline_write(ctx,
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 constbuf2,
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 0,
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 PIPE_TRANSFER_WRITE,
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 &box,
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 constants2,
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 sizeof constants2,
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 sizeof constants2);
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pipe_set_constant_buffer(ctx,
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               PIPE_SHADER_GEOMETRY, 1,
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               constbuf2);
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void set_viewport( float x, float y,
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          float width, float height,
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          float near, float far)
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float z = far;
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float half_width = (float)width / 2.0f;
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float half_height = (float)height / 2.0f;
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   float half_depth = ((float)far - (float)near) / 2.0f;
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_viewport_state vp;
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vp.scale[0] = half_width;
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vp.scale[1] = half_height;
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vp.scale[2] = half_depth;
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vp.scale[3] = 1.0f;
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vp.translate[0] = half_width + x;
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vp.translate[1] = half_height + y;
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vp.translate[2] = half_depth + z;
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vp.translate[3] = 0.0f;
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->set_viewport_state( ctx, &vp );
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void set_vertices( void )
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_vertex_element ve[4];
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_vertex_buffer vbuf;
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void *handle;
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(ve, 0, sizeof ve);
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ve[0].src_offset = Offset(struct vertex, position);
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ve[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ve[1].src_offset = Offset(struct vertex, color);
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ve[1].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ve[2].src_offset = Offset(struct vertex, texcoord);
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ve[2].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ve[3].src_offset = Offset(struct vertex, generic);
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ve[3].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   handle = ctx->create_vertex_elements_state(ctx, 4, ve);
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->bind_vertex_elements_state(ctx, handle);
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbuf.stride = sizeof( struct vertex );
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vbuf.buffer_offset = 0;
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (draw_strip) {
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vbuf.buffer = pipe_buffer_create_with_data(ctx,
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 PIPE_BIND_VERTEX_BUFFER,
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 PIPE_USAGE_STATIC,
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 sizeof(vertices_strip),
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 vertices_strip);
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vbuf.buffer = pipe_buffer_create_with_data(ctx,
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 PIPE_BIND_VERTEX_BUFFER,
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 PIPE_USAGE_STATIC,
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 sizeof(vertices),
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                 vertices);
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->set_vertex_buffers(ctx, 1, &vbuf);
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void set_vertex_shader( void )
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void *handle;
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *text =
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "VERT\n"
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "DCL IN[0]\n"
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "DCL IN[1]\n"
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "DCL IN[2]\n"
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "DCL IN[3]\n"
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "DCL OUT[0], POSITION\n"
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "DCL OUT[1], COLOR[0]\n"
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "DCL OUT[2], GENERIC[0]\n"
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "DCL OUT[3], GENERIC[1]\n"
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "  MOV OUT[0], IN[0]\n"
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "  MOV OUT[1], IN[1]\n"
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "  MOV OUT[2], IN[2]\n"
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "  MOV OUT[3], IN[3]\n"
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "  END\n";
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   handle = graw_parse_vertex_shader(ctx, text);
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->bind_vs_state(ctx, handle);
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void set_fragment_shader( void )
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void *handle;
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *text =
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "FRAG\n"
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "DCL IN[0], COLOR, LINEAR\n"
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "DCL OUT[0], COLOR\n"
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "  0: MOV OUT[0], IN[0]\n"
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      "  1: END\n";
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   handle = graw_parse_fragment_shader(ctx, text);
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->bind_fs_state(ctx, handle);
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void set_geometry_shader( void )
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FILE *f;
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   char buf[50000];
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void *handle;
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int sz;
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ((f = fopen(filename, "r")) == NULL) {
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "Couldn't open %s\n", filename);
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exit(1);
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sz = fread(buf, 1, sizeof(buf), f);
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!feof(f)) {
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      printf("file too long\n");
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exit(1);
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   printf("%.*s\n", sz, buf);
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   buf[sz] = 0;
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   handle = graw_parse_geometry_shader(ctx, buf);
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->bind_gs_state(ctx, handle);
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fclose(f);
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void draw( void )
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   union pipe_color_union clear_color = { {.1,.3,.5,0} };
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->clear(ctx, PIPE_CLEAR_COLOR, &clear_color, 0, 0);
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (draw_strip)
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      util_draw_arrays(ctx, PIPE_PRIM_TRIANGLE_STRIP, 0, 4);
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      util_draw_arrays(ctx, PIPE_PRIM_TRIANGLES, 0, 3);
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->flush(ctx, NULL);
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   graw_save_surface_to_file(ctx, surf, NULL);
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   screen->flush_frontbuffer(screen, rttex, 0, 0, window);
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SIZE 16
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void init_tex( void )
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_sampler_view sv_template;
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_sampler_state sampler_desc;
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_resource templat;
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_box box;
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ubyte tex2d[SIZE][SIZE][4];
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int s, t;
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if (SIZE != 2)
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (s = 0; s < SIZE; s++) {
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (t = 0; t < SIZE; t++) {
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (0) {
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            int x = (s ^ t) & 1;
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    tex2d[t][s][0] = (x) ? 0 : 63;
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    tex2d[t][s][1] = (x) ? 0 : 128;
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    tex2d[t][s][2] = 0;
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    tex2d[t][s][3] = 0xff;
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else {
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            int x = ((s ^ t) >> 2) & 1;
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    tex2d[t][s][0] = s*255/(SIZE-1);
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    tex2d[t][s][1] = t*255/(SIZE-1);
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    tex2d[t][s][2] = (x) ? 0 : 128;
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    tex2d[t][s][3] = 0xff;
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tex2d[0][0][0] = 0;
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tex2d[0][0][1] = 255;
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tex2d[0][0][2] = 255;
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tex2d[0][0][3] = 0;
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tex2d[0][1][0] = 0;
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tex2d[0][1][1] = 0;
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tex2d[0][1][2] = 255;
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tex2d[0][1][3] = 255;
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tex2d[1][0][0] = 255;
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tex2d[1][0][1] = 255;
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tex2d[1][0][2] = 0;
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tex2d[1][0][3] = 255;
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tex2d[1][1][0] = 255;
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tex2d[1][1][1] = 0;
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tex2d[1][1][2] = 0;
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tex2d[1][1][3] = 255;
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.target = PIPE_TEXTURE_2D;
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.format = PIPE_FORMAT_B8G8R8A8_UNORM;
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.width0 = SIZE;
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.height0 = SIZE;
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.depth0 = 1;
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.array_size = 1;
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.last_level = 0;
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.nr_samples = 1;
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.bind = PIPE_BIND_SAMPLER_VIEW;
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   samptex = screen->resource_create(screen,
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 &templat);
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (samptex == NULL)
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exit(4);
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   u_box_2d(0,0,SIZE,SIZE, &box);
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->transfer_inline_write(ctx,
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              samptex,
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              0,
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              PIPE_TRANSFER_WRITE,
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              &box,
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              tex2d,
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              sizeof tex2d[0],
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              sizeof tex2d);
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Possibly read back & compare against original data:
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (0)
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_transfer *t;
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t *ptr;
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      t = pipe_get_transfer(ctx, samptex,
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            0, 0, /* level, layer */
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            PIPE_TRANSFER_READ,
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            0, 0, SIZE, SIZE); /* x, y, width, height */
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ptr = ctx->transfer_map(ctx, t);
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (memcmp(ptr, tex2d, sizeof tex2d) != 0) {
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(0);
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         exit(9);
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->transfer_unmap(ctx, t);
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->transfer_destroy(ctx, t);
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(&sv_template, 0, sizeof sv_template);
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sv_template.format = samptex->format;
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sv_template.texture = samptex;
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sv_template.swizzle_r = 0;
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sv_template.swizzle_g = 1;
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sv_template.swizzle_b = 2;
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sv_template.swizzle_a = 3;
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sv = ctx->create_sampler_view(ctx, samptex, &sv_template);
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (sv == NULL)
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exit(5);
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->set_fragment_sampler_views(ctx, 1, &sv);
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(&sampler_desc, 0, sizeof sampler_desc);
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sampler_desc.wrap_s = PIPE_TEX_WRAP_REPEAT;
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sampler_desc.wrap_t = PIPE_TEX_WRAP_REPEAT;
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sampler_desc.wrap_r = PIPE_TEX_WRAP_REPEAT;
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sampler_desc.min_img_filter = PIPE_TEX_FILTER_NEAREST;
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sampler_desc.min_mip_filter = PIPE_TEX_MIPFILTER_NONE;
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sampler_desc.mag_img_filter = PIPE_TEX_FILTER_NEAREST;
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sampler_desc.compare_mode = PIPE_TEX_COMPARE_NONE;
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sampler_desc.compare_func = 0;
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sampler_desc.normalized_coords = 1;
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sampler_desc.max_anisotropy = 0;
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sampler = ctx->create_sampler_state(ctx, &sampler_desc);
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (sampler == NULL)
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exit(6);
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->bind_fragment_sampler_states(ctx, 1, &sampler);
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void init( void )
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_framebuffer_state fb;
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_resource templat;
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_surface surf_tmpl;
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i;
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* It's hard to say whether window or screen should be created
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * first.  Different environments would prefer one or the other.
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Also, no easy way of querying supported formats if the screen
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * cannot be created first.
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; formats[i] != PIPE_FORMAT_NONE; i++) {
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      screen = graw_create_window_and_screen(0, 0, 300, 300,
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             formats[i],
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             &window);
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (window && screen)
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!screen || !window) {
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "Unable to create window\n");
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exit(1);
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx = screen->context_create(screen, NULL);
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx == NULL)
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exit(3);
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.target = PIPE_TEXTURE_2D;
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.format = formats[i];
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.width0 = WIDTH;
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.height0 = HEIGHT;
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.depth0 = 1;
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.array_size = 1;
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.last_level = 0;
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.nr_samples = 1;
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   templat.bind = (PIPE_BIND_RENDER_TARGET |
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   PIPE_BIND_DISPLAY_TARGET);
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rttex = screen->resource_create(screen,
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 &templat);
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (rttex == NULL)
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exit(4);
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf_tmpl.format = templat.format;
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf_tmpl.usage = PIPE_BIND_RENDER_TARGET;
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf_tmpl.u.tex.level = 0;
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf_tmpl.u.tex.first_layer = 0;
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf_tmpl.u.tex.last_layer = 0;
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   surf = ctx->create_surface(ctx, rttex, &surf_tmpl);
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (surf == NULL)
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exit(5);
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(&fb, 0, sizeof fb);
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fb.nr_cbufs = 1;
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fb.width = WIDTH;
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fb.height = HEIGHT;
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fb.cbufs[0] = surf;
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->set_framebuffer_state(ctx, &fb);
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_blend_state blend;
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      void *handle;
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memset(&blend, 0, sizeof blend);
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      blend.rt[0].colormask = PIPE_MASK_RGBA;
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      handle = ctx->create_blend_state(ctx, &blend);
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->bind_blend_state(ctx, handle);
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_depth_stencil_alpha_state depthstencil;
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      void *handle;
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memset(&depthstencil, 0, sizeof depthstencil);
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      handle = ctx->create_depth_stencil_alpha_state(ctx, &depthstencil);
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->bind_depth_stencil_alpha_state(ctx, handle);
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_rasterizer_state rasterizer;
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      void *handle;
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memset(&rasterizer, 0, sizeof rasterizer);
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rasterizer.cull_face = PIPE_FACE_NONE;
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rasterizer.gl_rasterization_rules = 1;
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rasterizer.depth_clip = 1;
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      handle = ctx->create_rasterizer_state(ctx, &rasterizer);
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->bind_rasterizer_state(ctx, handle);
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   set_viewport(0, 0, WIDTH, HEIGHT, 30, 1000);
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   init_tex();
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   init_fs_constbuf();
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   set_vertices();
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   set_vertex_shader();
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   set_fragment_shader();
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   set_geometry_shader();
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void args(int argc, char *argv[])
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i;
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 1; i < argc;) {
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (graw_parse_args(&i, argc, argv)) {
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         continue;
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (strcmp(argv[i], "-fps") == 0) {
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         show_fps = 1;
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         i++;
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (strcmp(argv[i], "-strip") == 0) {
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         draw_strip = 1;
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         i++;
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (i == argc - 1) {
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         filename = argv[i];
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         i++;
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         usage(argv[0]);
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         exit(1);
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!filename) {
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      usage(argv[0]);
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exit(1);
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint main( int argc, char *argv[] )
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   args(argc,argv);
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   init();
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   graw_set_display_func( draw );
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   graw_main_loop();
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 0;
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
629