xorg_composite.c revision 57d0934bc562c7a0de0c79fb0263ab3569eed002
1#include "xorg_composite.h"
2
3#include "xorg_exa_tgsi.h"
4
5#include "cso_cache/cso_context.h"
6#include "util/u_draw_quad.h"
7
8#include "pipe/p_inlines.h"
9
10struct xorg_composite_blend {
11   int op:8;
12
13   unsigned rgb_src_factor:5;    /**< PIPE_BLENDFACTOR_x */
14   unsigned rgb_dst_factor:5;    /**< PIPE_BLENDFACTOR_x */
15
16   unsigned alpha_src_factor:5;  /**< PIPE_BLENDFACTOR_x */
17   unsigned alpha_dst_factor:5;  /**< PIPE_BLENDFACTOR_x */
18};
19
20#define BLEND_OP_OVER 3
21static const struct xorg_composite_blend xorg_blends[] = {
22   { PictOpClear,
23     PIPE_BLENDFACTOR_CONST_COLOR, PIPE_BLENDFACTOR_CONST_ALPHA,
24     PIPE_BLENDFACTOR_ZERO, PIPE_BLENDFACTOR_ZERO },
25
26   { PictOpSrc,
27     PIPE_BLENDFACTOR_ONE, PIPE_BLENDFACTOR_ONE,
28     PIPE_BLENDFACTOR_ZERO, PIPE_BLENDFACTOR_ZERO },
29
30   { PictOpDst,
31     PIPE_BLENDFACTOR_ZERO, PIPE_BLENDFACTOR_ZERO,
32     PIPE_BLENDFACTOR_ONE, PIPE_BLENDFACTOR_ONE },
33
34   { PictOpOver,
35     PIPE_BLENDFACTOR_SRC_ALPHA, PIPE_BLENDFACTOR_ONE,
36     PIPE_BLENDFACTOR_INV_SRC_ALPHA, PIPE_BLENDFACTOR_INV_SRC_ALPHA },
37
38   { PictOpOverReverse,
39     PIPE_BLENDFACTOR_SRC_ALPHA, PIPE_BLENDFACTOR_ONE,
40     PIPE_BLENDFACTOR_INV_SRC_ALPHA, PIPE_BLENDFACTOR_INV_SRC_ALPHA },
41};
42
43
44static INLINE void
45pixel_to_float4(Pixel pixel, float *color)
46{
47   CARD32	    r, g, b, a;
48
49   a = (pixel >> 24) & 0xff;
50   r = (pixel >> 16) & 0xff;
51   g = (pixel >>  8) & 0xff;
52   b = (pixel >>  0) & 0xff;
53   color[0] = ((float)r) / 255.;
54   color[1] = ((float)g) / 255.;
55   color[2] = ((float)b) / 255.;
56   color[3] = ((float)a) / 255.;
57}
58
59static INLINE void
60render_pixel_to_float4(PictFormatPtr format,
61                       CARD32 pixel, float *color)
62{
63   CARD32	    r, g, b, a;
64
65   debug_assert(format->type == PictTypeDirect);
66
67   r = (pixel >> format->direct.red) & format->direct.redMask;
68   g = (pixel >> format->direct.green) & format->direct.greenMask;
69   b = (pixel >> format->direct.blue) & format->direct.blueMask;
70   a = (pixel >> format->direct.alpha) & format->direct.alphaMask;
71   color[0] = ((float)r) / ((float)format->direct.redMask);
72   color[1] = ((float)g) / ((float)format->direct.greenMask);
73   color[2] = ((float)b) / ((float)format->direct.blueMask);
74   color[3] = ((float)a) / ((float)format->direct.alphaMask);
75}
76
77struct acceleration_info {
78   int op : 16;
79   int with_mask : 1;
80   int component_alpha : 1;
81};
82static const struct acceleration_info accelerated_ops[] = {
83   {PictOpClear,       1, 0},
84   {PictOpSrc,         1, 0},
85   {PictOpDst,         1, 0},
86   {PictOpOver,        1, 0},
87   {PictOpOverReverse, 1, 0},
88   {PictOpIn,          1, 0},
89   {PictOpInReverse,   1, 0},
90   {PictOpOut,         1, 0},
91   {PictOpOutReverse,  1, 0},
92   {PictOpAtop,        1, 0},
93   {PictOpAtopReverse, 1, 0},
94   {PictOpXor,         1, 0},
95   {PictOpAdd,         1, 0},
96   {PictOpSaturate,    1, 0},
97};
98
99static struct xorg_composite_blend
100blend_for_op(int op)
101{
102   const int num_blends =
103      sizeof(xorg_blends)/sizeof(struct xorg_composite_blend);
104   int i;
105
106   for (i = 0; i < num_blends; ++i) {
107      if (xorg_blends[i].op == op)
108         return xorg_blends[i];
109   }
110   return xorg_blends[BLEND_OP_OVER];
111}
112
113static INLINE int
114render_repeat_to_gallium(int mode)
115{
116   switch(mode) {
117   case RepeatNone:
118      return PIPE_TEX_WRAP_CLAMP;
119   case RepeatNormal:
120      return PIPE_TEX_WRAP_REPEAT;
121   case RepeatReflect:
122      return PIPE_TEX_WRAP_MIRROR_REPEAT;
123   case RepeatPad:
124      return PIPE_TEX_WRAP_CLAMP_TO_EDGE;
125   default:
126      debug_printf("Unsupported repeat mode\n");
127   }
128   return PIPE_TEX_WRAP_REPEAT;
129}
130
131
132static INLINE void
133setup_vertex0(float vertex[2][4], float x, float y,
134              float color[4])
135{
136   vertex[0][0] = x;
137   vertex[0][1] = y;
138   vertex[0][2] = 0.f; /*z*/
139   vertex[0][3] = 1.f; /*w*/
140
141   vertex[1][0] = color[0]; /*r*/
142   vertex[1][1] = color[1]; /*g*/
143   vertex[1][2] = color[2]; /*b*/
144   vertex[1][3] = color[3]; /*a*/
145}
146
147static struct pipe_buffer *
148setup_vertex_data0(struct exa_context *ctx,
149                   int srcX, int srcY, int maskX, int maskY,
150                   int dstX, int dstY, int width, int height)
151{
152   float vertices[4][2][4];
153
154   /* 1st vertex */
155   setup_vertex0(vertices[0], dstX, dstY,
156                 ctx->solid_color);
157   /* 2nd vertex */
158   setup_vertex0(vertices[1], dstX + width, dstY,
159                 ctx->solid_color);
160   /* 3rd vertex */
161   setup_vertex0(vertices[2], dstX + width, dstY + height,
162                 ctx->solid_color);
163   /* 4th vertex */
164   setup_vertex0(vertices[3], dstX, dstY + height,
165                 ctx->solid_color);
166
167   return pipe_user_buffer_create(ctx->ctx->screen,
168                                  vertices,
169                                  sizeof(vertices));
170}
171
172static INLINE void
173setup_vertex1(float vertex[2][4], float x, float y, float s, float t)
174{
175   vertex[0][0] = x;
176   vertex[0][1] = y;
177   vertex[0][2] = 0.f; /*z*/
178   vertex[0][3] = 1.f; /*w*/
179
180   vertex[1][0] = s;   /*s*/
181   vertex[1][1] = t;   /*t*/
182   vertex[1][2] = 0.f; /*r*/
183   vertex[1][3] = 1.f; /*q*/
184}
185
186static struct pipe_buffer *
187setup_vertex_data1(struct exa_context *ctx,
188                   int srcX, int srcY, int maskX, int maskY,
189                   int dstX, int dstY, int width, int height)
190{
191   float vertices[4][2][4];
192   float s0, t0, s1, t1;
193   struct pipe_texture *src = ctx->bound_textures[0];
194
195   s0 = srcX / src->width[0];
196   s1 = srcX + width / src->width[0];
197   t0 = srcY / src->height[0];
198   t1 = srcY + height / src->height[0];
199
200   /* 1st vertex */
201   setup_vertex1(vertices[0], dstX, dstY,
202                 s0, t0);
203   /* 2nd vertex */
204   setup_vertex1(vertices[1], dstX + width, dstY,
205                 s1, t0);
206   /* 3rd vertex */
207   setup_vertex1(vertices[2], dstX + width, dstY + height,
208                 s1, t1);
209   /* 4th vertex */
210   setup_vertex1(vertices[3], dstX, dstY + height,
211                 s0, t1);
212
213   return pipe_user_buffer_create(ctx->ctx->screen,
214                                  vertices,
215                                  sizeof(vertices));
216}
217
218
219static INLINE void
220setup_vertex2(float vertex[3][4], float x, float y,
221              float s0, float t0, float s1, float t1)
222{
223   vertex[0][0] = x;
224   vertex[0][1] = y;
225   vertex[0][2] = 0.f; /*z*/
226   vertex[0][3] = 1.f; /*w*/
227
228   vertex[1][0] = s0;  /*s*/
229   vertex[1][1] = t0;  /*t*/
230   vertex[1][2] = 0.f; /*r*/
231   vertex[1][3] = 1.f; /*q*/
232
233   vertex[2][0] = s1;  /*s*/
234   vertex[2][1] = t1;  /*t*/
235   vertex[2][2] = 0.f; /*r*/
236   vertex[2][3] = 1.f; /*q*/
237}
238
239static struct pipe_buffer *
240setup_vertex_data2(struct exa_context *ctx,
241                   int srcX, int srcY, int maskX, int maskY,
242                   int dstX, int dstY, int width, int height)
243{
244   float vertices[4][3][4];
245   float st0[4], st1[4];
246   struct pipe_texture *src = ctx->bound_textures[0];
247   struct pipe_texture *mask = ctx->bound_textures[0];
248
249   st0[0] = srcX / src->width[0];
250   st0[1] = srcY / src->height[0];
251   st0[2] = srcX + width / src->width[0];
252   st0[3] = srcY + height / src->height[0];
253
254   st1[0] = maskX / mask->width[0];
255   st1[1] = maskY / mask->height[0];
256   st1[2] = maskX + width / mask->width[0];
257   st1[3] = maskY + height / mask->height[0];
258
259   /* 1st vertex */
260   setup_vertex2(vertices[0], dstX, dstY,
261                 st0[0], st0[1], st1[0], st1[1]);
262   /* 2nd vertex */
263   setup_vertex2(vertices[1], dstX + width, dstY,
264                 st0[2], st0[1], st1[2], st1[1]);
265   /* 3rd vertex */
266   setup_vertex2(vertices[2], dstX + width, dstY + height,
267                 st0[2], st0[3], st1[2], st1[3]);
268   /* 4th vertex */
269   setup_vertex2(vertices[3], dstX, dstY + height,
270                 st0[0], st0[3], st1[0], st1[3]);
271
272   return pipe_user_buffer_create(ctx->ctx->screen,
273                                  vertices,
274                                  sizeof(vertices));
275}
276
277boolean xorg_composite_accelerated(int op,
278                                   PicturePtr pSrcPicture,
279                                   PicturePtr pMaskPicture,
280                                   PicturePtr pDstPicture)
281{
282   unsigned i;
283   unsigned accel_ops_count =
284      sizeof(accelerated_ops)/sizeof(struct acceleration_info);
285
286
287   /*FIXME: currently accel is disabled */
288   return FALSE;
289
290   if (pSrcPicture) {
291      /* component alpha not supported */
292      if (pSrcPicture->componentAlpha)
293         return FALSE;
294      /* fills not supported */
295      if (pSrcPicture->pSourcePict)
296         return FALSE;
297   }
298
299   for (i = 0; i < accel_ops_count; ++i) {
300      if (op == accelerated_ops[i].op) {
301         if (pMaskPicture && !accelerated_ops[i].with_mask)
302            return FALSE;
303         return TRUE;
304      }
305   }
306   return FALSE;
307}
308
309static void
310bind_clip_state(struct exa_context *exa)
311{
312   struct pipe_depth_stencil_alpha_state dsa;
313
314   memset(&dsa, 0, sizeof(struct pipe_depth_stencil_alpha_state));
315   cso_set_depth_stencil_alpha(exa->cso, &dsa);
316}
317
318static void
319bind_framebuffer_state(struct exa_context *exa, struct exa_pixmap_priv *pDst)
320{
321   unsigned i;
322   struct pipe_framebuffer_state state;
323   struct pipe_surface *surface = exa_gpu_surface(exa, pDst);
324   memset(&state, 0, sizeof(struct pipe_framebuffer_state));
325
326   state.width  = pDst->tex->width[0];
327   state.height = pDst->tex->height[0];
328
329   state.nr_cbufs = 1;
330   state.cbufs[0] = surface;
331   for (i = 1; i < PIPE_MAX_COLOR_BUFS; ++i)
332      state.cbufs[i] = 0;
333
334   /* currently we don't use depth/stencil */
335   state.zsbuf = 0;
336
337   cso_set_framebuffer(exa->cso, &state);
338}
339
340enum AxisOrientation {
341   Y0_BOTTOM,
342   Y0_TOP
343};
344
345static void
346set_viewport(struct exa_context *exa, int width, int height,
347             enum AxisOrientation orientation)
348{
349   struct pipe_viewport_state viewport;
350   float y_scale = (orientation == Y0_BOTTOM) ? -2.f : 2.f;
351
352   viewport.scale[0] =  width / 2.f;
353   viewport.scale[1] =  height / y_scale;
354   viewport.scale[2] =  1.0;
355   viewport.scale[3] =  1.0;
356   viewport.translate[0] = width / 2.f;
357   viewport.translate[1] = height / 2.f;
358   viewport.translate[2] = 0.0;
359   viewport.translate[3] = 0.0;
360
361   cso_set_viewport(exa->cso, &viewport);
362}
363
364static void
365bind_viewport_state(struct exa_context *exa, struct exa_pixmap_priv *pDst)
366{
367   int width = pDst->tex->width[0];
368   int height = pDst->tex->height[0];
369
370   debug_printf("Bind viewport (%d, %d)\n", width, height);
371
372   set_viewport(exa, width, height, Y0_TOP);
373}
374
375static void
376bind_blend_state(struct exa_context *exa, int op,
377                 PicturePtr pSrcPicture, PicturePtr pMaskPicture)
378{
379   boolean component_alpha = (pSrcPicture) ?
380                             pSrcPicture->componentAlpha : FALSE;
381   struct xorg_composite_blend blend_opt;
382   struct pipe_blend_state blend;
383
384   if (component_alpha) {
385      op = PictOpOver;
386   }
387   blend_opt = blend_for_op(op);
388
389   memset(&blend, 0, sizeof(struct pipe_blend_state));
390   blend.blend_enable = 1;
391   blend.colormask |= PIPE_MASK_R;
392   blend.colormask |= PIPE_MASK_G;
393   blend.colormask |= PIPE_MASK_B;
394   blend.colormask |= PIPE_MASK_A;
395
396   blend.rgb_src_factor   = blend_opt.rgb_src_factor;
397   blend.alpha_src_factor = blend_opt.alpha_src_factor;
398   blend.rgb_dst_factor   = blend_opt.rgb_dst_factor;
399   blend.alpha_dst_factor = blend_opt.alpha_dst_factor;
400
401   cso_set_blend(exa->cso, &blend);
402}
403
404static void
405bind_rasterizer_state(struct exa_context *exa)
406{
407   struct pipe_rasterizer_state raster;
408   memset(&raster, 0, sizeof(struct pipe_rasterizer_state));
409   raster.gl_rasterization_rules = 1;
410   cso_set_rasterizer(exa->cso, &raster);
411}
412
413static void
414bind_shaders(struct exa_context *exa, int op,
415             PicturePtr pSrcPicture, PicturePtr pMaskPicture)
416{
417   unsigned vs_traits = 0, fs_traits = 0;
418   struct xorg_shader shader;
419
420   exa->has_solid_color = FALSE;
421
422   if (pSrcPicture) {
423      if (pSrcPicture->pSourcePict) {
424         if (pSrcPicture->pSourcePict->type == SourcePictTypeSolidFill) {
425            fs_traits |= FS_SOLID_FILL;
426            vs_traits |= VS_SOLID_FILL;
427            render_pixel_to_float4(pSrcPicture->pFormat,
428                                   pSrcPicture->pSourcePict->solidFill.color,
429                                   exa->solid_color);
430            exa->has_solid_color = TRUE;
431         } else {
432            debug_assert("!gradients not supported");
433         }
434      } else {
435         fs_traits |= FS_COMPOSITE;
436         vs_traits |= VS_COMPOSITE;
437      }
438   }
439
440   if (pMaskPicture) {
441      vs_traits |= VS_MASK;
442      fs_traits |= FS_MASK;
443   }
444
445   shader = xorg_shaders_get(exa->shaders, vs_traits, fs_traits);
446   cso_set_vertex_shader_handle(exa->cso, shader.vs);
447   cso_set_fragment_shader_handle(exa->cso, shader.fs);
448}
449
450
451static void
452bind_samplers(struct exa_context *exa, int op,
453              PicturePtr pSrcPicture, PicturePtr pMaskPicture,
454              PicturePtr pDstPicture,
455              struct exa_pixmap_priv *pSrc,
456              struct exa_pixmap_priv *pMask,
457              struct exa_pixmap_priv *pDst)
458{
459   struct pipe_sampler_state *samplers[PIPE_MAX_SAMPLERS];
460   struct pipe_sampler_state src_sampler, mask_sampler;
461
462   exa->num_bound_samplers = 0;
463
464   memset(&src_sampler, 0, sizeof(struct pipe_sampler_state));
465   memset(&mask_sampler, 0, sizeof(struct pipe_sampler_state));
466
467   if (pSrcPicture && pSrc) {
468      unsigned src_wrap = render_repeat_to_gallium(
469         pSrcPicture->repeatType);
470      src_sampler.wrap_s = src_wrap;
471      src_sampler.wrap_t = src_wrap;
472      src_sampler.min_img_filter = PIPE_TEX_MIPFILTER_NEAREST;
473      src_sampler.mag_img_filter = PIPE_TEX_MIPFILTER_NEAREST;
474      src_sampler.normalized_coords = 1;
475      samplers[0] = &src_sampler;
476      exa->bound_textures[0] = pSrc->tex;
477      ++exa->num_bound_samplers;
478   }
479
480   if (pMaskPicture && pMask) {
481      unsigned mask_wrap = render_repeat_to_gallium(
482         pMaskPicture->repeatType);
483      mask_sampler.wrap_s = mask_wrap;
484      mask_sampler.wrap_t = mask_wrap;
485      mask_sampler.min_img_filter = PIPE_TEX_MIPFILTER_NEAREST;
486      mask_sampler.mag_img_filter = PIPE_TEX_MIPFILTER_NEAREST;
487      mask_sampler.normalized_coords = 1;
488      samplers[1] = &mask_sampler;
489      exa->bound_textures[1] = pMask->tex;
490      ++exa->num_bound_samplers;
491   }
492
493   cso_set_samplers(exa->cso, exa->num_bound_samplers,
494                    (const struct pipe_sampler_state **)samplers);
495   cso_set_sampler_textures(exa->cso, exa->num_bound_samplers,
496                            exa->bound_textures);
497}
498
499static void
500setup_vs_constant_buffer(struct exa_context *exa,
501                         int width, int height)
502{
503   const int param_bytes = 8 * sizeof(float);
504   float vs_consts[8] = {
505      2.f/width, 2.f/height, 1, 1,
506      -1, -1, 0, 0
507   };
508   struct pipe_constant_buffer *cbuf = &exa->vs_const_buffer;
509
510   pipe_buffer_reference(&cbuf->buffer, NULL);
511   cbuf->buffer = pipe_buffer_create(exa->ctx->screen, 16,
512                                     PIPE_BUFFER_USAGE_CONSTANT,
513                                     param_bytes);
514
515   if (cbuf->buffer) {
516      pipe_buffer_write(exa->ctx->screen, cbuf->buffer,
517                        0, param_bytes, vs_consts);
518   }
519   exa->ctx->set_constant_buffer(exa->ctx, PIPE_SHADER_VERTEX, 0, cbuf);
520}
521
522
523static void
524setup_fs_constant_buffer(struct exa_context *exa)
525{
526   const int param_bytes = 4 * sizeof(float);
527   float fs_consts[8] = {
528      0, 0, 0, 1,
529   };
530   struct pipe_constant_buffer *cbuf = &exa->fs_const_buffer;
531
532   pipe_buffer_reference(&cbuf->buffer, NULL);
533   cbuf->buffer = pipe_buffer_create(exa->ctx->screen, 16,
534                                     PIPE_BUFFER_USAGE_CONSTANT,
535                                     param_bytes);
536
537   if (cbuf->buffer) {
538      pipe_buffer_write(exa->ctx->screen, cbuf->buffer,
539                        0, param_bytes, fs_consts);
540   }
541   exa->ctx->set_constant_buffer(exa->ctx, PIPE_SHADER_FRAGMENT, 0, cbuf);
542}
543
544static void
545setup_constant_buffers(struct exa_context *exa, struct exa_pixmap_priv *pDst)
546{
547   int width = pDst->tex->width[0];
548   int height = pDst->tex->height[0];
549
550   setup_vs_constant_buffer(exa, width, height);
551   setup_fs_constant_buffer(exa);
552}
553
554boolean xorg_composite_bind_state(struct exa_context *exa,
555                                  int op,
556                                  PicturePtr pSrcPicture,
557                                  PicturePtr pMaskPicture,
558                                  PicturePtr pDstPicture,
559                                  struct exa_pixmap_priv *pSrc,
560                                  struct exa_pixmap_priv *pMask,
561                                  struct exa_pixmap_priv *pDst)
562{
563   bind_framebuffer_state(exa, pDst);
564   bind_viewport_state(exa, pDst);
565   bind_blend_state(exa, op, pSrcPicture, pMaskPicture);
566   bind_rasterizer_state(exa);
567   bind_shaders(exa, op, pSrcPicture, pMaskPicture);
568   bind_samplers(exa, op, pSrcPicture, pMaskPicture,
569                 pDstPicture, pSrc, pMask, pDst);
570   bind_clip_state(exa);
571   setup_constant_buffers(exa, pDst);
572
573   return FALSE;
574}
575
576void xorg_composite(struct exa_context *exa,
577                    struct exa_pixmap_priv *dst,
578                    int srcX, int srcY, int maskX, int maskY,
579                    int dstX, int dstY, int width, int height)
580{
581   struct pipe_context *pipe = exa->ctx;
582   struct pipe_buffer *buf = 0;
583
584   if (exa->num_bound_samplers == 0 ) { /* solid fill */
585      buf = setup_vertex_data0(exa,
586                               srcX, srcY, maskX, maskY,
587                               dstX, dstY, width, height);
588   } else if (exa->num_bound_samplers == 1 ) /* src */
589      buf = setup_vertex_data1(exa,
590                               srcX, srcY, maskX, maskY,
591                               dstX, dstY, width, height);
592   else if (exa->num_bound_samplers == 2) /* src + mask */
593      buf = setup_vertex_data2(exa,
594                               srcX, srcY, maskX, maskY,
595                               dstX, dstY, width, height);
596   else if (exa->num_bound_samplers == 3) { /* src + mask + dst */
597      debug_assert(!"src/mask/dst not handled right now");
598#if 0
599      buf = setup_vertex_data2(exa,
600                               srcX, srcY, maskX, maskY,
601                               dstX, dstY, width, height);
602#endif
603   }
604
605   if (buf) {
606      int num_attribs = 1; /*pos*/
607      num_attribs += exa->num_bound_samplers;
608      if (exa->has_solid_color)
609         ++num_attribs;
610
611      util_draw_vertex_buffer(pipe, buf, 0,
612                              PIPE_PRIM_TRIANGLE_FAN,
613                              4,  /* verts */
614                              num_attribs); /* attribs/vert */
615
616      pipe_buffer_reference(&buf, NULL);
617   }
618}
619
620boolean xorg_solid_bind_state(struct exa_context *exa,
621                              struct exa_pixmap_priv *pixmap,
622                              Pixel fg)
623{
624   unsigned vs_traits, fs_traits;
625   struct xorg_shader shader;
626
627   pixel_to_float4(fg, exa->solid_color);
628   exa->has_solid_color = TRUE;
629
630   exa->solid_color[3] = 1.f;
631
632   debug_printf("Color Pixel=(%d, %d, %d, %d), RGBA=(%f, %f, %f, %f)\n",
633                (fg >> 24) & 0xff, (fg >> 16) & 0xff,
634                (fg >> 8) & 0xff,  (fg >> 0) & 0xff,
635                exa->solid_color[0], exa->solid_color[1],
636                exa->solid_color[2], exa->solid_color[3]);
637
638#if 0
639   exa->solid_color[0] = 1.f;
640   exa->solid_color[1] = 0.f;
641   exa->solid_color[2] = 0.f;
642   exa->solid_color[3] = 1.f;
643#endif
644
645   vs_traits = VS_SOLID_FILL;
646   fs_traits = FS_SOLID_FILL;
647
648   bind_framebuffer_state(exa, pixmap);
649   bind_viewport_state(exa, pixmap);
650   bind_rasterizer_state(exa);
651   bind_blend_state(exa, PictOpSrc, NULL, NULL);
652   setup_constant_buffers(exa, pixmap);
653   bind_clip_state(exa);
654
655   shader = xorg_shaders_get(exa->shaders, vs_traits, fs_traits);
656   cso_set_vertex_shader_handle(exa->cso, shader.vs);
657   cso_set_fragment_shader_handle(exa->cso, shader.fs);
658
659   return FALSE;
660}
661
662void xorg_solid(struct exa_context *exa,
663                struct exa_pixmap_priv *pixmap,
664                int x0, int y0, int x1, int y1)
665{
666   struct pipe_context *pipe = exa->ctx;
667   struct pipe_buffer *buf = 0;
668   float vertices[4][2][4];
669
670   x0 = 10; y0 = 10;
671   x1 = 300; y1 = 300;
672
673   /* 1st vertex */
674   setup_vertex0(vertices[0], x0, y0,
675                 exa->solid_color);
676   /* 2nd vertex */
677   setup_vertex0(vertices[1], x1, y0,
678                 exa->solid_color);
679   /* 3rd vertex */
680   setup_vertex0(vertices[2], x1, y1,
681                 exa->solid_color);
682   /* 4th vertex */
683   setup_vertex0(vertices[3], x0, y1,
684                 exa->solid_color);
685
686   buf = pipe_user_buffer_create(exa->ctx->screen,
687                                 vertices,
688                                 sizeof(vertices));
689
690
691   if (buf) {
692      debug_printf("Drawing buf is %p\n", buf);
693      util_draw_vertex_buffer(pipe, buf, 0,
694                              PIPE_PRIM_TRIANGLE_FAN,
695                              4,  /* verts */
696                              2); /* attribs/vert */
697
698      pipe_buffer_reference(&buf, NULL);
699   }
700}
701
702void xorg_copy_pixmap(struct exa_context *ctx,
703                      struct exa_pixmap_priv *dst, int dx, int dy,
704                      struct exa_pixmap_priv *src, int sx, int sy,
705                      int width, int height)
706{
707
708}
709
710