1/* Test sRGB texturing.
2 */
3
4#include "graw_util.h"
5
6
7static const int WIDTH = 600;
8static const int HEIGHT = 300;
9
10static struct graw_info info;
11
12static struct pipe_resource *texture;
13static struct pipe_sampler_view *linear_sv, *srgb_sv;
14
15
16struct vertex {
17   float position[4];
18   float color[4];
19};
20
21static struct vertex vertices1[] =
22{
23   { { -0.1, -0.9, 0.0, 1.0 },
24     { 1, 1, 0, 1 } },
25
26   { { -0.1,  0.9, 0.0, 1.0 },
27     { 1, 0, 0, 1 } },
28
29   { {-0.9,  0.9, 0.0, 1.0 },
30     { 0, 0, 0, 1 } },
31
32   { {-0.9,  -0.9, 0.0, 1.0 },
33     { 0, 1, 0, 1 } },
34};
35
36
37static struct vertex vertices2[] =
38{
39   { { 0.9, -0.9, 0.0, 1.0 },
40     { 1, 1, 0, 1 } },
41
42   { { 0.9,  0.9, 0.0, 1.0 },
43     { 1, 0, 0, 1 } },
44
45   { { 0.1,  0.9, 0.0, 1.0 },
46     { 0, 0, 0, 1 } },
47
48   { { 0.1,  -0.9, 0.0, 1.0 },
49     { 0, 1, 0, 1 } },
50};
51
52
53
54
55static void
56set_vertices(struct vertex *verts, unsigned num_verts)
57{
58   struct pipe_vertex_element ve[2];
59   struct pipe_vertex_buffer vbuf;
60   void *handle;
61
62   memset(ve, 0, sizeof ve);
63
64   ve[0].src_offset = Offset(struct vertex, position);
65   ve[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
66   ve[1].src_offset = Offset(struct vertex, color);
67   ve[1].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
68
69   handle = info.ctx->create_vertex_elements_state(info.ctx, 2, ve);
70   info.ctx->bind_vertex_elements_state(info.ctx, handle);
71
72   memset(&vbuf, 0, sizeof vbuf);
73
74   vbuf.stride = sizeof(struct vertex);
75   vbuf.buffer_offset = 0;
76   vbuf.buffer.resource = pipe_buffer_create_with_data(info.ctx,
77                                              PIPE_BIND_VERTEX_BUFFER,
78                                              PIPE_USAGE_DEFAULT,
79                                              num_verts * sizeof(struct vertex),
80                                              verts);
81
82   info.ctx->set_vertex_buffers(info.ctx, 0, 1, 0, false, &vbuf);
83}
84
85static void set_vertex_shader( void )
86{
87   void *handle;
88   const char *text =
89      "VERT\n"
90      "DCL IN[0]\n"
91      "DCL IN[1]\n"
92      "DCL OUT[0], POSITION\n"
93      "DCL OUT[1], GENERIC[0]\n"
94      "  0: MOV OUT[1], IN[1]\n"
95      "  1: MOV OUT[0], IN[0]\n"
96      "  2: END\n";
97
98   handle = graw_parse_vertex_shader(info.ctx, text);
99   info.ctx->bind_vs_state(info.ctx, handle);
100}
101
102static void set_fragment_shader( void )
103{
104   void *handle;
105   const char *text =
106      "FRAG\n"
107      "DCL IN[0], GENERIC[0], PERSPECTIVE\n"
108      "DCL OUT[0], COLOR\n"
109      "DCL TEMP[0]\n"
110      "DCL SAMP[0]\n"
111      "DCL SVIEW[0], 2D, FLOAT\n"
112      "  0: TXP TEMP[0], IN[0], SAMP[0], 2D\n"
113      "  1: MOV OUT[0], TEMP[0]\n"
114      "  2: END\n";
115
116   handle = graw_parse_fragment_shader(info.ctx, text);
117   info.ctx->bind_fs_state(info.ctx, handle);
118}
119
120
121static void draw( void )
122{
123   union pipe_color_union clear_color;
124
125   clear_color.f[0] = 0.5;
126   clear_color.f[1] = 0.5;
127   clear_color.f[2] = 0.5;
128   clear_color.f[3] = 1.0;
129
130   info.ctx->clear(info.ctx, PIPE_CLEAR_COLOR, NULL, &clear_color, 0, 0);
131
132   info.ctx->set_sampler_views(info.ctx, PIPE_SHADER_FRAGMENT, 0, 1, 0, false, &linear_sv);
133   set_vertices(vertices1, 4);
134   util_draw_arrays(info.ctx, PIPE_PRIM_QUADS, 0, 4);
135
136   info.ctx->set_sampler_views(info.ctx, PIPE_SHADER_FRAGMENT, 0, 1, 0, false, &srgb_sv);
137   set_vertices(vertices2, 4);
138   util_draw_arrays(info.ctx, PIPE_PRIM_QUADS, 0, 4);
139
140   info.ctx->flush(info.ctx, NULL, 0);
141
142   graw_util_flush_front(&info);
143}
144
145
146static void init_tex( void )
147{
148#define SIZE 64
149   ubyte tex2d[SIZE][SIZE][4];
150   int s, t;
151
152   for (s = 0; s < SIZE; s++) {
153      for (t = 0; t < SIZE; t++) {
154         tex2d[t][s][0] = 0;
155         tex2d[t][s][1] = s * 255 / SIZE;
156         tex2d[t][s][2] = t * 255 / SIZE;
157         tex2d[t][s][3] = 255;
158      }
159   }
160
161   texture = graw_util_create_tex2d(&info, SIZE, SIZE,
162                                    PIPE_FORMAT_B8G8R8A8_UNORM, tex2d);
163
164   {
165      void *sampler;
166      sampler = graw_util_create_simple_sampler(&info,
167                                                PIPE_TEX_WRAP_REPEAT,
168                                                PIPE_TEX_FILTER_NEAREST);
169      info.ctx->bind_sampler_states(info.ctx, PIPE_SHADER_FRAGMENT,
170                                    0, 1, &sampler);
171   }
172
173   /* linear sampler view */
174   {
175      struct pipe_sampler_view sv_temp;
176      memset(&sv_temp, 0, sizeof sv_temp);
177      sv_temp.format = PIPE_FORMAT_B8G8R8A8_UNORM;
178      sv_temp.texture = texture;
179      sv_temp.swizzle_r = PIPE_SWIZZLE_X;
180      sv_temp.swizzle_g = PIPE_SWIZZLE_Y;
181      sv_temp.swizzle_b = PIPE_SWIZZLE_Z;
182      sv_temp.swizzle_a = PIPE_SWIZZLE_W;
183      linear_sv = info.ctx->create_sampler_view(info.ctx, texture, &sv_temp);
184      if (linear_sv == NULL)
185         exit(0);
186   }
187
188   /* srgb sampler view */
189   {
190      struct pipe_sampler_view sv_temp;
191      memset(&sv_temp, 0, sizeof sv_temp);
192      sv_temp.format = PIPE_FORMAT_B8G8R8A8_SRGB;
193      sv_temp.texture = texture;
194      sv_temp.swizzle_r = PIPE_SWIZZLE_X;
195      sv_temp.swizzle_g = PIPE_SWIZZLE_Y;
196      sv_temp.swizzle_b = PIPE_SWIZZLE_Z;
197      sv_temp.swizzle_a = PIPE_SWIZZLE_W;
198      srgb_sv = info.ctx->create_sampler_view(info.ctx, texture, &sv_temp);
199      if (srgb_sv == NULL)
200         exit(0);
201   }
202#undef SIZE
203}
204
205static void init( void )
206{
207   if (!graw_util_create_window(&info, WIDTH, HEIGHT, 1, FALSE))
208      exit(1);
209
210   graw_util_default_state(&info, FALSE);
211
212   graw_util_viewport(&info, 0, 0, WIDTH, HEIGHT, 30, 10000);
213
214   init_tex();
215
216   set_vertex_shader();
217   set_fragment_shader();
218}
219
220
221int main( int argc, char *argv[] )
222{
223   init();
224
225   graw_set_display_func( draw );
226   graw_main_loop();
227   return 0;
228}
229