xorg_composite.c revision a6d527d7b82579feae9db20657d47a3f86115bb4
121cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin#include "xorg_composite.h"
221cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin
3319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin#include "xorg_renderer.h"
48bdce0c3a7b3e3798de736ef4ce72431d777901cZack Rusin#include "xorg_exa_tgsi.h"
58bdce0c3a7b3e3798de736ef4ce72431d777901cZack Rusin
6f315c0128b5f6317f910f6c54119fea97256254cZack Rusin#include "cso_cache/cso_context.h"
7f315c0128b5f6317f910f6c54119fea97256254cZack Rusin#include "util/u_draw_quad.h"
8feb74e7753f56c0fa3ec943a45bbf48f2183e04cZack Rusin#include "util/u_math.h"
9f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin
10f315c0128b5f6317f910f6c54119fea97256254cZack Rusin#include "pipe/p_inlines.h"
11f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin
12a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin/*XXX also in Xrender.h but the including it here breaks compilition */
13a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin#define XFixedToDouble(f)    (((double) (f)) / 65536.)
14a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin
1517076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusinstruct xorg_composite_blend {
16c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin   int op : 8;
1717076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin
18c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin   unsigned alpha_dst : 4;
19c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin   unsigned alpha_src : 4;
208adcad0c703a9d339b6630ceaba5f96981c524d9Zack Rusin
21c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin   unsigned rgb_src : 8;    /**< PIPE_BLENDFACTOR_x */
22c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin   unsigned rgb_dst : 8;    /**< PIPE_BLENDFACTOR_x */
2317076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin};
2417076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin
252048182e868a759c3198b3cbaf2dd1d366fe0a21Zack Rusin#define BLEND_OP_OVER 3
2617076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusinstatic const struct xorg_composite_blend xorg_blends[] = {
2717076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin   { PictOpClear,
28c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin     0, 0, PIPE_BLENDFACTOR_ZERO, PIPE_BLENDFACTOR_ZERO},
2917076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin   { PictOpSrc,
30c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin     0, 0, PIPE_BLENDFACTOR_ONE, PIPE_BLENDFACTOR_ZERO},
3117076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin   { PictOpDst,
32c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin     0, 0, PIPE_BLENDFACTOR_ZERO, PIPE_BLENDFACTOR_ONE},
3317076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin   { PictOpOver,
34c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin     0, 1, PIPE_BLENDFACTOR_ONE, PIPE_BLENDFACTOR_INV_SRC_ALPHA},
3517076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin   { PictOpOverReverse,
36c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin     1, 0, PIPE_BLENDFACTOR_INV_DST_ALPHA, PIPE_BLENDFACTOR_ONE},
37074e069910c7082620be4211fe5496365f828886Zack Rusin   { PictOpIn,
38c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin     1, 0, PIPE_BLENDFACTOR_DST_ALPHA, PIPE_BLENDFACTOR_ZERO},
39074e069910c7082620be4211fe5496365f828886Zack Rusin   { PictOpInReverse,
40c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin     0, 1, PIPE_BLENDFACTOR_ZERO, PIPE_BLENDFACTOR_SRC_ALPHA},
41074e069910c7082620be4211fe5496365f828886Zack Rusin   { PictOpOut,
42c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin     1, 0, PIPE_BLENDFACTOR_INV_DST_ALPHA, PIPE_BLENDFACTOR_ZERO},
4359cf40059a7c451b1d1bc0c90f674e8e4baa5ab8Zack Rusin   { PictOpOutReverse,
44c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin     0, 1, PIPE_BLENDFACTOR_ZERO, PIPE_BLENDFACTOR_INV_SRC_ALPHA},
45074e069910c7082620be4211fe5496365f828886Zack Rusin   { PictOpAtop,
46c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin     1, 1, PIPE_BLENDFACTOR_DST_ALPHA, PIPE_BLENDFACTOR_INV_SRC_ALPHA},
47074e069910c7082620be4211fe5496365f828886Zack Rusin   { PictOpAtopReverse,
48c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin     1, 1, PIPE_BLENDFACTOR_INV_DST_ALPHA, PIPE_BLENDFACTOR_SRC_ALPHA},
49074e069910c7082620be4211fe5496365f828886Zack Rusin   { PictOpXor,
50c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin     1, 1, PIPE_BLENDFACTOR_INV_DST_ALPHA, PIPE_BLENDFACTOR_INV_SRC_ALPHA},
51074e069910c7082620be4211fe5496365f828886Zack Rusin   { PictOpAdd,
52c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin     0, 0, PIPE_BLENDFACTOR_ONE, PIPE_BLENDFACTOR_ONE},
5317076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin};
5421cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin
556be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin
566be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusinstatic INLINE void
576be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusinpixel_to_float4(Pixel pixel, float *color)
586be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin{
596be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin   CARD32	    r, g, b, a;
606be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin
616be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin   a = (pixel >> 24) & 0xff;
626be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin   r = (pixel >> 16) & 0xff;
636be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin   g = (pixel >>  8) & 0xff;
646be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin   b = (pixel >>  0) & 0xff;
656be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin   color[0] = ((float)r) / 255.;
666be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin   color[1] = ((float)g) / 255.;
676be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin   color[2] = ((float)b) / 255.;
686be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin   color[3] = ((float)a) / 255.;
696be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin}
706be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin
711f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusinstatic boolean
721f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusinblend_for_op(struct xorg_composite_blend *blend,
731f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin             int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture,
74c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin             PicturePtr pDstPicture)
752048182e868a759c3198b3cbaf2dd1d366fe0a21Zack Rusin{
762048182e868a759c3198b3cbaf2dd1d366fe0a21Zack Rusin   const int num_blends =
772048182e868a759c3198b3cbaf2dd1d366fe0a21Zack Rusin      sizeof(xorg_blends)/sizeof(struct xorg_composite_blend);
782048182e868a759c3198b3cbaf2dd1d366fe0a21Zack Rusin   int i;
791f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin   boolean supported = FALSE;
801f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin
811f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin   /* our default in case something goes wrong */
821f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin   *blend = xorg_blends[BLEND_OP_OVER];
832048182e868a759c3198b3cbaf2dd1d366fe0a21Zack Rusin
842048182e868a759c3198b3cbaf2dd1d366fe0a21Zack Rusin   for (i = 0; i < num_blends; ++i) {
851f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin      if (xorg_blends[i].op == op) {
861f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin         *blend = xorg_blends[i];
871f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin         supported = TRUE;
881f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin      }
892048182e868a759c3198b3cbaf2dd1d366fe0a21Zack Rusin   }
90c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin
91c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin   /* If there's no dst alpha channel, adjust the blend op so that we'll treat
921f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin    * it as always 1. */
93c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin   if (pDstPicture &&
941f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin       PICT_FORMAT_A(pDstPicture->format) == 0 && blend->alpha_dst) {
951f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin      if (blend->rgb_src == PIPE_BLENDFACTOR_DST_ALPHA)
961f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin         blend->rgb_src = PIPE_BLENDFACTOR_ONE;
971f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin      else if (blend->rgb_src == PIPE_BLENDFACTOR_INV_DST_ALPHA)
981f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin         blend->rgb_src = PIPE_BLENDFACTOR_ZERO;
99c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin   }
100c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin
101c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin   /* If the source alpha is being used, then we should only be in a case where
102c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin    * the source blend factor is 0, and the source blend value is the mask
1031f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin    * channels multiplied by the source picture's alpha. */
104c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin   if (pMaskPicture && pMaskPicture->componentAlpha &&
1051f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin       PICT_FORMAT_RGB(pMaskPicture->format) && blend->alpha_src) {
1061f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin      if (blend->rgb_dst == PIPE_BLENDFACTOR_SRC_ALPHA) {
1071f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin         blend->rgb_dst = PIPE_BLENDFACTOR_SRC_COLOR;
1081f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin      } else if (blend->rgb_dst == PIPE_BLENDFACTOR_INV_SRC_ALPHA) {
1091f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin         blend->rgb_dst = PIPE_BLENDFACTOR_INV_SRC_COLOR;
110c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin      }
111c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin   }
112b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin
1131f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin   return supported;
1142048182e868a759c3198b3cbaf2dd1d366fe0a21Zack Rusin}
1152048182e868a759c3198b3cbaf2dd1d366fe0a21Zack Rusin
116d6b58a97c2f94ca54852414103c4ac2832279f2fZack Rusinstatic INLINE int
117d6b58a97c2f94ca54852414103c4ac2832279f2fZack Rusinrender_repeat_to_gallium(int mode)
118d6b58a97c2f94ca54852414103c4ac2832279f2fZack Rusin{
119d6b58a97c2f94ca54852414103c4ac2832279f2fZack Rusin   switch(mode) {
120d6b58a97c2f94ca54852414103c4ac2832279f2fZack Rusin   case RepeatNone:
121d6b58a97c2f94ca54852414103c4ac2832279f2fZack Rusin      return PIPE_TEX_WRAP_CLAMP;
122d6b58a97c2f94ca54852414103c4ac2832279f2fZack Rusin   case RepeatNormal:
123d6b58a97c2f94ca54852414103c4ac2832279f2fZack Rusin      return PIPE_TEX_WRAP_REPEAT;
124d6b58a97c2f94ca54852414103c4ac2832279f2fZack Rusin   case RepeatReflect:
125d6b58a97c2f94ca54852414103c4ac2832279f2fZack Rusin      return PIPE_TEX_WRAP_MIRROR_REPEAT;
126d6b58a97c2f94ca54852414103c4ac2832279f2fZack Rusin   case RepeatPad:
127d6b58a97c2f94ca54852414103c4ac2832279f2fZack Rusin      return PIPE_TEX_WRAP_CLAMP_TO_EDGE;
128d6b58a97c2f94ca54852414103c4ac2832279f2fZack Rusin   default:
129d6b58a97c2f94ca54852414103c4ac2832279f2fZack Rusin      debug_printf("Unsupported repeat mode\n");
130d6b58a97c2f94ca54852414103c4ac2832279f2fZack Rusin   }
131d6b58a97c2f94ca54852414103c4ac2832279f2fZack Rusin   return PIPE_TEX_WRAP_REPEAT;
132d6b58a97c2f94ca54852414103c4ac2832279f2fZack Rusin}
133d6b58a97c2f94ca54852414103c4ac2832279f2fZack Rusin
134a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusinstatic INLINE boolean
135a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusinrender_filter_to_gallium(int xrender_filter, int *out_filter)
136a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin{
137a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin
138a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   switch (xrender_filter) {
139a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   case PictFilterNearest:
140a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      *out_filter = PIPE_TEX_FILTER_NEAREST;
141a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      break;
142a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   case PictFilterBilinear:
143a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      *out_filter = PIPE_TEX_FILTER_LINEAR;
144a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      break;
145a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   case PictFilterFast:
146a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      *out_filter = PIPE_TEX_FILTER_NEAREST;
147a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      break;
148a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   case PictFilterGood:
149a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      *out_filter = PIPE_TEX_FILTER_LINEAR;
150a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      break;
151a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   case PictFilterBest:
152a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      *out_filter = PIPE_TEX_FILTER_LINEAR;
153a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      break;
154a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   default:
155a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      debug_printf("Unkown xrender filter");
156a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      *out_filter = PIPE_TEX_FILTER_NEAREST;
157a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      return FALSE;
158a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   }
159a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin
160a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   return TRUE;
161a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin}
162a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin
163a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusinstatic boolean is_filter_accelerated(PicturePtr pic)
164a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin{
165a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   int filter;
166a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   if (pic && !render_filter_to_gallium(pic->filter, &filter))
167a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin       return FALSE;
168a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   return TRUE;
169a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin}
170a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin
17121cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusinboolean xorg_composite_accelerated(int op,
17221cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin                                   PicturePtr pSrcPicture,
17321cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin                                   PicturePtr pMaskPicture,
17421cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin                                   PicturePtr pDstPicture)
17521cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin{
1766d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz   ScreenPtr pScreen = pDstPicture->pDrawable->pScreen;
1776d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz   ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
1786d629d4aa211d098fe9541d0b644cf67ee1d7019Jakob Bornecrantz   modesettingPtr ms = modesettingPTR(pScrn);
1791f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin   struct xorg_composite_blend blend;
180c7653a83330e5ea63ad3a566da15155e216c6cb4Zack Rusin
181a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   if (!is_filter_accelerated(pSrcPicture) ||
182a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin       !is_filter_accelerated(pMaskPicture)) {
183a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      XORG_FALLBACK("Unsupported Xrender filter");
184a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   }
185a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin
186626553f327394b835cecaf4795692028c2378efaMichel Dänzer   if (pSrcPicture->pSourcePict) {
187626553f327394b835cecaf4795692028c2378efaMichel Dänzer      if (pSrcPicture->pSourcePict->type != SourcePictTypeSolidFill)
188c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin         XORG_FALLBACK("Gradients not enabled (haven't been well tested)");
189626553f327394b835cecaf4795692028c2378efaMichel Dänzer   }
190626553f327394b835cecaf4795692028c2378efaMichel Dänzer
1911f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin   if (blend_for_op(&blend, op,
1921f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin                    pSrcPicture, pMaskPicture, pDstPicture)) {
1931f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin      /* Check for component alpha */
1941f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin      if (pMaskPicture && pMaskPicture->componentAlpha &&
1951f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin          PICT_FORMAT_RGB(pMaskPicture->format)) {
1961f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin         if (blend.alpha_src && blend.rgb_src != PIPE_BLENDFACTOR_ZERO) {
1971f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin            XORG_FALLBACK("Component alpha not supported with source "
1981f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin                          "alpha and source value blending. (op=%d)",
1991f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin                          op);
200c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin         }
201c7653a83330e5ea63ad3a566da15155e216c6cb4Zack Rusin      }
2021f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin      return TRUE;
203c7653a83330e5ea63ad3a566da15155e216c6cb4Zack Rusin   }
204c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin   XORG_FALLBACK("Unsupported composition operation = %d", op);
20521cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin}
20621cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin
207f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusinstatic void
2082048182e868a759c3198b3cbaf2dd1d366fe0a21Zack Rusinbind_blend_state(struct exa_context *exa, int op,
209c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin                 PicturePtr pSrcPicture,
210c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin                 PicturePtr pMaskPicture,
211c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin                 PicturePtr pDstPicture)
212f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin{
2132048182e868a759c3198b3cbaf2dd1d366fe0a21Zack Rusin   struct xorg_composite_blend blend_opt;
2142048182e868a759c3198b3cbaf2dd1d366fe0a21Zack Rusin   struct pipe_blend_state blend;
2152048182e868a759c3198b3cbaf2dd1d366fe0a21Zack Rusin
2161f5b568fbeda9e48f0ea6473cf8193e9502bb21aZack Rusin   blend_for_op(&blend_opt, op, pSrcPicture, pMaskPicture, pDstPicture);
2172048182e868a759c3198b3cbaf2dd1d366fe0a21Zack Rusin
218c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin   memset(&blend, 0, sizeof(struct pipe_blend_state));
2192048182e868a759c3198b3cbaf2dd1d366fe0a21Zack Rusin   blend.blend_enable = 1;
22059cf40059a7c451b1d1bc0c90f674e8e4baa5ab8Zack Rusin   blend.colormask |= PIPE_MASK_RGBA;
2212048182e868a759c3198b3cbaf2dd1d366fe0a21Zack Rusin
222c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin   blend.rgb_src_factor   = blend_opt.rgb_src;
223c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin   blend.alpha_src_factor = blend_opt.rgb_src;
224c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin   blend.rgb_dst_factor   = blend_opt.rgb_dst;
225c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin   blend.alpha_dst_factor = blend_opt.rgb_dst;
2262048182e868a759c3198b3cbaf2dd1d366fe0a21Zack Rusin
227319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cso_set_blend(exa->renderer->cso, &blend);
228f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin}
229f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin
230f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin
231f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusinstatic void
2328bdce0c3a7b3e3798de736ef4ce72431d777901cZack Rusinbind_shaders(struct exa_context *exa, int op,
2338bdce0c3a7b3e3798de736ef4ce72431d777901cZack Rusin             PicturePtr pSrcPicture, PicturePtr pMaskPicture)
234f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin{
2358bdce0c3a7b3e3798de736ef4ce72431d777901cZack Rusin   unsigned vs_traits = 0, fs_traits = 0;
2368bdce0c3a7b3e3798de736ef4ce72431d777901cZack Rusin   struct xorg_shader shader;
2378bdce0c3a7b3e3798de736ef4ce72431d777901cZack Rusin
2386be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin   exa->has_solid_color = FALSE;
2396be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin
2408bdce0c3a7b3e3798de736ef4ce72431d777901cZack Rusin   if (pSrcPicture) {
241a8cbb1563213086f58d3b82b6d0755a59eb43c79Zack Rusin      if (pSrcPicture->pSourcePict) {
242a8cbb1563213086f58d3b82b6d0755a59eb43c79Zack Rusin         if (pSrcPicture->pSourcePict->type == SourcePictTypeSolidFill) {
24307f9ad5c322ce409fdd4b86e3913f7cc085520b5Zack Rusin            fs_traits |= FS_SOLID_FILL;
24407f9ad5c322ce409fdd4b86e3913f7cc085520b5Zack Rusin            vs_traits |= VS_SOLID_FILL;
2457edda9350acbf84b63ad67af8053fb07785637cbMichel Dänzer            debug_assert(pSrcPicture->format == PICT_a8r8g8b8);
2467edda9350acbf84b63ad67af8053fb07785637cbMichel Dänzer            pixel_to_float4(pSrcPicture->pSourcePict->solidFill.color,
2477edda9350acbf84b63ad67af8053fb07785637cbMichel Dänzer                            exa->solid_color);
2486be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin            exa->has_solid_color = TRUE;
249a8cbb1563213086f58d3b82b6d0755a59eb43c79Zack Rusin         } else {
250a8cbb1563213086f58d3b82b6d0755a59eb43c79Zack Rusin            debug_assert("!gradients not supported");
251a8cbb1563213086f58d3b82b6d0755a59eb43c79Zack Rusin         }
252a8cbb1563213086f58d3b82b6d0755a59eb43c79Zack Rusin      } else {
253a8cbb1563213086f58d3b82b6d0755a59eb43c79Zack Rusin         fs_traits |= FS_COMPOSITE;
254a8cbb1563213086f58d3b82b6d0755a59eb43c79Zack Rusin         vs_traits |= VS_COMPOSITE;
255a8cbb1563213086f58d3b82b6d0755a59eb43c79Zack Rusin      }
2568bdce0c3a7b3e3798de736ef4ce72431d777901cZack Rusin   }
2578bdce0c3a7b3e3798de736ef4ce72431d777901cZack Rusin
2588bdce0c3a7b3e3798de736ef4ce72431d777901cZack Rusin   if (pMaskPicture) {
2598bdce0c3a7b3e3798de736ef4ce72431d777901cZack Rusin      vs_traits |= VS_MASK;
2608bdce0c3a7b3e3798de736ef4ce72431d777901cZack Rusin      fs_traits |= FS_MASK;
261b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin      if (pMaskPicture->componentAlpha) {
262b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin         struct xorg_composite_blend blend;
263b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin         blend_for_op(&blend, op,
264b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin                      pSrcPicture, pMaskPicture, NULL);
265b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin         if (blend.alpha_src) {
266b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin            fs_traits |= FS_CA_SRCALPHA;
267b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin         } else
268b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin            fs_traits |= FS_CA_FULL;
269b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin      }
2708bdce0c3a7b3e3798de736ef4ce72431d777901cZack Rusin   }
2718bdce0c3a7b3e3798de736ef4ce72431d777901cZack Rusin
272319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   shader = xorg_shaders_get(exa->renderer->shaders, vs_traits, fs_traits);
273319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cso_set_vertex_shader_handle(exa->renderer->cso, shader.vs);
274319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cso_set_fragment_shader_handle(exa->renderer->cso, shader.fs);
275f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin}
276f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin
277f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusinstatic void
278f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusinbind_samplers(struct exa_context *exa, int op,
279f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin              PicturePtr pSrcPicture, PicturePtr pMaskPicture,
2800a2681128622b0c0a22b68c95309cc70a237cc5cZack Rusin              PicturePtr pDstPicture,
2810a2681128622b0c0a22b68c95309cc70a237cc5cZack Rusin              struct exa_pixmap_priv *pSrc,
2820a2681128622b0c0a22b68c95309cc70a237cc5cZack Rusin              struct exa_pixmap_priv *pMask,
2830a2681128622b0c0a22b68c95309cc70a237cc5cZack Rusin              struct exa_pixmap_priv *pDst)
284f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin{
2850a2681128622b0c0a22b68c95309cc70a237cc5cZack Rusin   struct pipe_sampler_state *samplers[PIPE_MAX_SAMPLERS];
2860a2681128622b0c0a22b68c95309cc70a237cc5cZack Rusin   struct pipe_sampler_state src_sampler, mask_sampler;
2870a2681128622b0c0a22b68c95309cc70a237cc5cZack Rusin
28891c366359ce0bf5f450fd1d774b771c95ed2f651Zack Rusin   exa->num_bound_samplers = 0;
28991c366359ce0bf5f450fd1d774b771c95ed2f651Zack Rusin
290a6d527d7b82579feae9db20657d47a3f86115bb4Zack Rusin#if 0
291a6d527d7b82579feae9db20657d47a3f86115bb4Zack Rusin   if ((pSrc && (exa->pipe->is_texture_referenced(exa->pipe, pSrc->tex, 0, 0) &
292a6d527d7b82579feae9db20657d47a3f86115bb4Zack Rusin                 PIPE_REFERENCED_FOR_WRITE)) ||
293a6d527d7b82579feae9db20657d47a3f86115bb4Zack Rusin       (pMask && (exa->pipe->is_texture_referenced(exa->pipe, pMask->tex, 0, 0) &
294a6d527d7b82579feae9db20657d47a3f86115bb4Zack Rusin        PIPE_REFERENCED_FOR_WRITE)))
295a6d527d7b82579feae9db20657d47a3f86115bb4Zack Rusin      xorg_exa_flush(exa, PIPE_FLUSH_RENDER_CACHE, NULL);
296a6d527d7b82579feae9db20657d47a3f86115bb4Zack Rusin#endif
297a6d527d7b82579feae9db20657d47a3f86115bb4Zack Rusin
2980a2681128622b0c0a22b68c95309cc70a237cc5cZack Rusin   memset(&src_sampler, 0, sizeof(struct pipe_sampler_state));
2990a2681128622b0c0a22b68c95309cc70a237cc5cZack Rusin   memset(&mask_sampler, 0, sizeof(struct pipe_sampler_state));
3000a2681128622b0c0a22b68c95309cc70a237cc5cZack Rusin
3010a2681128622b0c0a22b68c95309cc70a237cc5cZack Rusin   if (pSrcPicture && pSrc) {
302b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin      if (exa->has_solid_color) {
303b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin         debug_assert(!"solid color with textures");
304b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin         samplers[0] = NULL;
305b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin         exa->bound_textures[0] = NULL;
306b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin      } else {
307b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin         unsigned src_wrap = render_repeat_to_gallium(
308b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin            pSrcPicture->repeatType);
309b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin         int filter;
310b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin
311b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin         render_filter_to_gallium(pSrcPicture->filter, &filter);
312b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin
313b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin         src_sampler.wrap_s = src_wrap;
314b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin         src_sampler.wrap_t = src_wrap;
315b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin         src_sampler.min_img_filter = filter;
316b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin         src_sampler.mag_img_filter = filter;
317b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin         src_sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NEAREST;
318b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin         src_sampler.normalized_coords = 1;
319b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin         samplers[0] = &src_sampler;
320b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin         exa->bound_textures[0] = pSrc->tex;
321b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin         exa->num_bound_samplers = 1;
322b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin      }
3230a2681128622b0c0a22b68c95309cc70a237cc5cZack Rusin   }
3240a2681128622b0c0a22b68c95309cc70a237cc5cZack Rusin
3250a2681128622b0c0a22b68c95309cc70a237cc5cZack Rusin   if (pMaskPicture && pMask) {
326d6b58a97c2f94ca54852414103c4ac2832279f2fZack Rusin      unsigned mask_wrap = render_repeat_to_gallium(
327d6b58a97c2f94ca54852414103c4ac2832279f2fZack Rusin         pMaskPicture->repeatType);
328a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      int filter;
329a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin
330a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      render_filter_to_gallium(pMaskPicture->filter, &filter);
331a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin
332d6b58a97c2f94ca54852414103c4ac2832279f2fZack Rusin      mask_sampler.wrap_s = mask_wrap;
333d6b58a97c2f94ca54852414103c4ac2832279f2fZack Rusin      mask_sampler.wrap_t = mask_wrap;
334a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      mask_sampler.min_img_filter = filter;
335a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      mask_sampler.mag_img_filter = filter;
336a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      src_sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NEAREST;
3370a2681128622b0c0a22b68c95309cc70a237cc5cZack Rusin      mask_sampler.normalized_coords = 1;
3380a2681128622b0c0a22b68c95309cc70a237cc5cZack Rusin      samplers[1] = &mask_sampler;
33991c366359ce0bf5f450fd1d774b771c95ed2f651Zack Rusin      exa->bound_textures[1] = pMask->tex;
340b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin      exa->num_bound_samplers = 2;
3410a2681128622b0c0a22b68c95309cc70a237cc5cZack Rusin   }
342f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin
343319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cso_set_samplers(exa->renderer->cso, exa->num_bound_samplers,
3440a2681128622b0c0a22b68c95309cc70a237cc5cZack Rusin                    (const struct pipe_sampler_state **)samplers);
345319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cso_set_sampler_textures(exa->renderer->cso, exa->num_bound_samplers,
34691c366359ce0bf5f450fd1d774b771c95ed2f651Zack Rusin                            exa->bound_textures);
347f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin}
348f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin
3499ccbadb22d74c649a634c515cd1123fe96781357Zack Rusinstatic void
3509ccbadb22d74c649a634c515cd1123fe96781357Zack Rusinsetup_vs_constant_buffer(struct exa_context *exa,
3519ccbadb22d74c649a634c515cd1123fe96781357Zack Rusin                         int width, int height)
3529ccbadb22d74c649a634c515cd1123fe96781357Zack Rusin{
3539ccbadb22d74c649a634c515cd1123fe96781357Zack Rusin   const int param_bytes = 8 * sizeof(float);
3549ccbadb22d74c649a634c515cd1123fe96781357Zack Rusin   float vs_consts[8] = {
3559ccbadb22d74c649a634c515cd1123fe96781357Zack Rusin      2.f/width, 2.f/height, 1, 1,
3569ccbadb22d74c649a634c515cd1123fe96781357Zack Rusin      -1, -1, 0, 0
3579ccbadb22d74c649a634c515cd1123fe96781357Zack Rusin   };
358319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   renderer_set_constants(exa->renderer, PIPE_SHADER_VERTEX,
359319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                          vs_consts, param_bytes);
3609ccbadb22d74c649a634c515cd1123fe96781357Zack Rusin}
3619ccbadb22d74c649a634c515cd1123fe96781357Zack Rusin
3629ccbadb22d74c649a634c515cd1123fe96781357Zack Rusin
3639ccbadb22d74c649a634c515cd1123fe96781357Zack Rusinstatic void
3649ccbadb22d74c649a634c515cd1123fe96781357Zack Rusinsetup_fs_constant_buffer(struct exa_context *exa)
3659ccbadb22d74c649a634c515cd1123fe96781357Zack Rusin{
3669ccbadb22d74c649a634c515cd1123fe96781357Zack Rusin   const int param_bytes = 4 * sizeof(float);
367319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   const float fs_consts[8] = {
3689ccbadb22d74c649a634c515cd1123fe96781357Zack Rusin      0, 0, 0, 1,
3699ccbadb22d74c649a634c515cd1123fe96781357Zack Rusin   };
370319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   renderer_set_constants(exa->renderer, PIPE_SHADER_FRAGMENT,
371319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                          fs_consts, param_bytes);
3729ccbadb22d74c649a634c515cd1123fe96781357Zack Rusin}
3739ccbadb22d74c649a634c515cd1123fe96781357Zack Rusin
3749ccbadb22d74c649a634c515cd1123fe96781357Zack Rusinstatic void
3756be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusinsetup_constant_buffers(struct exa_context *exa, struct exa_pixmap_priv *pDst)
3769ccbadb22d74c649a634c515cd1123fe96781357Zack Rusin{
3776be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin   int width = pDst->tex->width[0];
3786be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin   int height = pDst->tex->height[0];
3799ccbadb22d74c649a634c515cd1123fe96781357Zack Rusin
3809ccbadb22d74c649a634c515cd1123fe96781357Zack Rusin   setup_vs_constant_buffer(exa, width, height);
3819ccbadb22d74c649a634c515cd1123fe96781357Zack Rusin   setup_fs_constant_buffer(exa);
3829ccbadb22d74c649a634c515cd1123fe96781357Zack Rusin}
3839ccbadb22d74c649a634c515cd1123fe96781357Zack Rusin
384a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusinstatic INLINE boolean matrix_from_pict_transform(PictTransform *trans, float *matrix)
385a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin{
386a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   if (!trans)
387a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      return FALSE;
388a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin
389a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   matrix[0] = XFixedToDouble(trans->matrix[0][0]);
390bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   matrix[3] = XFixedToDouble(trans->matrix[0][1]);
391bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   matrix[6] = XFixedToDouble(trans->matrix[0][2]);
392a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin
393bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   matrix[1] = XFixedToDouble(trans->matrix[1][0]);
394a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   matrix[4] = XFixedToDouble(trans->matrix[1][1]);
395bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   matrix[7] = XFixedToDouble(trans->matrix[1][2]);
396a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin
397bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   matrix[2] = XFixedToDouble(trans->matrix[2][0]);
398bec5230a1ff3998d0f184fc2b7437b51082c329fZack Rusin   matrix[5] = XFixedToDouble(trans->matrix[2][1]);
399a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   matrix[8] = XFixedToDouble(trans->matrix[2][2]);
400a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin
401a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   return TRUE;
402a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin}
403a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin
404a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusinstatic void
405a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusinsetup_transforms(struct  exa_context *exa,
406a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin                 PicturePtr pSrcPicture, PicturePtr pMaskPicture)
407a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin{
408a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   PictTransform *src_t = NULL;
409a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   PictTransform *mask_t = NULL;
410a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin
411a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   if (pSrcPicture)
412a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      src_t = pSrcPicture->transform;
413a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   if (pMaskPicture)
414a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      mask_t = pMaskPicture->transform;
415a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin
416a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   exa->transform.has_src  =
417a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      matrix_from_pict_transform(src_t, exa->transform.src);
418a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   exa->transform.has_mask =
419a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      matrix_from_pict_transform(mask_t, exa->transform.mask);
420a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin}
421a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin
42221cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusinboolean xorg_composite_bind_state(struct exa_context *exa,
42321cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin                                  int op,
42421cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin                                  PicturePtr pSrcPicture,
42521cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin                                  PicturePtr pMaskPicture,
426f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin                                  PicturePtr pDstPicture,
427f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin                                  struct exa_pixmap_priv *pSrc,
428f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin                                  struct exa_pixmap_priv *pMask,
429f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin                                  struct exa_pixmap_priv *pDst)
43021cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin{
431319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   renderer_bind_framebuffer(exa->renderer, pDst);
432319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   renderer_bind_viewport(exa->renderer, pDst);
433c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin   bind_blend_state(exa, op, pSrcPicture, pMaskPicture, pDstPicture);
434319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   renderer_bind_rasterizer(exa->renderer);
4358bdce0c3a7b3e3798de736ef4ce72431d777901cZack Rusin   bind_shaders(exa, op, pSrcPicture, pMaskPicture);
43691c366359ce0bf5f450fd1d774b771c95ed2f651Zack Rusin   bind_samplers(exa, op, pSrcPicture, pMaskPicture,
43791c366359ce0bf5f450fd1d774b771c95ed2f651Zack Rusin                 pDstPicture, pSrc, pMask, pDst);
4386be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin   setup_constant_buffers(exa, pDst);
4399ccbadb22d74c649a634c515cd1123fe96781357Zack Rusin
440a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin   setup_transforms(exa, pSrcPicture, pMaskPicture);
441a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin
442e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   if (exa->num_bound_samplers == 0 ) { /* solid fill */
443e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      renderer_begin_solid(exa->renderer);
444e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   } else {
445e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      renderer_begin_textures(exa->renderer,
446e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                              exa->bound_textures,
447e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                              exa->num_bound_samplers);
448e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin   }
449e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin
45089bb33fb20e69d9fa5325da10abf31d61d51d371Zack Rusin   return TRUE;
45121cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin}
45221cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin
45321cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusinvoid xorg_composite(struct exa_context *exa,
45421cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin                    struct exa_pixmap_priv *dst,
45521cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin                    int srcX, int srcY, int maskX, int maskY,
45621cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin                    int dstX, int dstY, int width, int height)
45721cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin{
458811aa02c7a0f4804189a8978395f07d27fb726ecZack Rusin   if (exa->num_bound_samplers == 0 ) { /* solid fill */
4594322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin      renderer_solid(exa->renderer,
4604322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin                     dstX, dstY, dstX + width, dstY + height,
4614322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin                     exa->solid_color);
462319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   } else {
463319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      int pos[6] = {srcX, srcY, maskX, maskY, dstX, dstY};
464a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      float *src_matrix = NULL;
465a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      float *mask_matrix = NULL;
466a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin
467a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      if (exa->transform.has_src)
468a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin         src_matrix = exa->transform.src;
469a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin      if (exa->transform.has_mask)
470a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin         mask_matrix = exa->transform.mask;
471a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin
472a6d527d7b82579feae9db20657d47a3f86115bb4Zack Rusin#if 0
473319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin      renderer_draw_textures(exa->renderer,
474319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                             pos, width, height,
475319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin                             exa->bound_textures,
476a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin                             exa->num_bound_samplers,
477a39a3cc14e816cc91a81028a27c4dbd4816cdc9dZack Rusin                             src_matrix, mask_matrix);
478e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin#else
479e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin      renderer_texture(exa->renderer,
480e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                       pos, width, height,
481e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                       exa->bound_textures,
482e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                       exa->num_bound_samplers,
483e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin                       src_matrix, mask_matrix);
484e521bf7706a5527ad5750baef78feaa961f73eccZack Rusin#endif
485811aa02c7a0f4804189a8978395f07d27fb726ecZack Rusin   }
48621cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin}
48721cce6afb03bf9b9adfc6d8a1a446bb3ef22c7a8Zack Rusin
4883167c2e8a0a248c290ae8bfff23c88db8f39cd11Zack Rusinboolean xorg_solid_bind_state(struct exa_context *exa,
4893167c2e8a0a248c290ae8bfff23c88db8f39cd11Zack Rusin                              struct exa_pixmap_priv *pixmap,
4903167c2e8a0a248c290ae8bfff23c88db8f39cd11Zack Rusin                              Pixel fg)
4913167c2e8a0a248c290ae8bfff23c88db8f39cd11Zack Rusin{
4926be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin   unsigned vs_traits, fs_traits;
4936be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin   struct xorg_shader shader;
4946be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin
4956be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin   pixel_to_float4(fg, exa->solid_color);
4966be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin   exa->has_solid_color = TRUE;
4976be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin
498ef7746217176ba251dc6a5deb90c308c9964ed7bZack Rusin#if 0
4996be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin   debug_printf("Color Pixel=(%d, %d, %d, %d), RGBA=(%f, %f, %f, %f)\n",
5006be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin                (fg >> 24) & 0xff, (fg >> 16) & 0xff,
5016be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin                (fg >> 8) & 0xff,  (fg >> 0) & 0xff,
5026be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin                exa->solid_color[0], exa->solid_color[1],
5036be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin                exa->solid_color[2], exa->solid_color[3]);
5046be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin#endif
5056be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin
5066be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin   vs_traits = VS_SOLID_FILL;
5076be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin   fs_traits = FS_SOLID_FILL;
5086be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin
509319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   renderer_bind_framebuffer(exa->renderer, pixmap);
510319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   renderer_bind_viewport(exa->renderer, pixmap);
511319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   renderer_bind_rasterizer(exa->renderer);
512c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin   bind_blend_state(exa, PictOpSrc, NULL, NULL, NULL);
5136be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin   setup_constant_buffers(exa, pixmap);
5146be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin
515319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   shader = xorg_shaders_get(exa->renderer->shaders, vs_traits, fs_traits);
516319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cso_set_vertex_shader_handle(exa->renderer->cso, shader.vs);
517319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cso_set_fragment_shader_handle(exa->renderer->cso, shader.fs);
5186be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin
5194322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   renderer_begin_solid(exa->renderer);
5204322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin
52153d2fa46e7fa19d0cb7dec74efcd407ab6163c80Zack Rusin   return TRUE;
5223167c2e8a0a248c290ae8bfff23c88db8f39cd11Zack Rusin}
5233167c2e8a0a248c290ae8bfff23c88db8f39cd11Zack Rusin
5243167c2e8a0a248c290ae8bfff23c88db8f39cd11Zack Rusinvoid xorg_solid(struct exa_context *exa,
5253167c2e8a0a248c290ae8bfff23c88db8f39cd11Zack Rusin                struct exa_pixmap_priv *pixmap,
5263167c2e8a0a248c290ae8bfff23c88db8f39cd11Zack Rusin                int x0, int y0, int x1, int y1)
5273167c2e8a0a248c290ae8bfff23c88db8f39cd11Zack Rusin{
5284322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin   renderer_solid(exa->renderer,
5294322346f3fd03788a79d056ca7bce2db25bc9d88Zack Rusin                  x0, y0, x1, y1, exa->solid_color);
53057d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin}
53157d0934bc562c7a0de0c79fb0263ab3569eed002Zack Rusin
532