117076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin#include "xorg_exa_tgsi.h"
217076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin
317076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin/*### stupidity defined in X11/extensions/XI.h */
417076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin#undef Absolute
517076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin
617076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin#include "pipe/p_format.h"
717076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin#include "pipe/p_context.h"
817076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin#include "pipe/p_state.h"
917076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin#include "pipe/p_shader_tokens.h"
1017076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin
1117076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin#include "util/u_memory.h"
1217076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin
1317076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin#include "tgsi/tgsi_ureg.h"
1417076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin
1517076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin#include "cso_cache/cso_context.h"
1623b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin#include "cso_cache/cso_hash.h"
1717076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin
18f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin/* Vertex shader:
195c746d9214b72c181aa80f09aa527542e5b2f213Zack Rusin * IN[0]    = vertex pos
205c746d9214b72c181aa80f09aa527542e5b2f213Zack Rusin * IN[1]    = src tex coord | solid fill color
215c746d9214b72c181aa80f09aa527542e5b2f213Zack Rusin * IN[2]    = mask tex coord
225c746d9214b72c181aa80f09aa527542e5b2f213Zack Rusin * IN[3]    = dst tex coord
23f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin * CONST[0] = (2/dst_width, 2/dst_height, 1, 1)
24f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin * CONST[1] = (-1, -1, 0, 0)
25f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin *
265c746d9214b72c181aa80f09aa527542e5b2f213Zack Rusin * OUT[0]   = vertex pos
275c746d9214b72c181aa80f09aa527542e5b2f213Zack Rusin * OUT[1]   = src tex coord | solid fill color
285c746d9214b72c181aa80f09aa527542e5b2f213Zack Rusin * OUT[2]   = mask tex coord
295c746d9214b72c181aa80f09aa527542e5b2f213Zack Rusin * OUT[3]   = dst tex coord
30f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin */
31f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin
32f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin/* Fragment shader:
33f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin * SAMP[0]  = src
34f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin * SAMP[1]  = mask
35f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin * SAMP[2]  = dst
365c746d9214b72c181aa80f09aa527542e5b2f213Zack Rusin * IN[0]    = pos src | solid fill color
37f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin * IN[1]    = pos mask
38f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin * IN[2]    = pos dst
3917076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin * CONST[0] = (0, 0, 0, 1)
40f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin *
41f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin * OUT[0] = color
4217076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin */
4317076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin
44cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantzstatic void
45cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantzprint_fs_traits(int fs_traits)
46cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz{
47cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz   const char *strings[] = {
4831263f41a0aa2ac4514992cb3b5678116153939fVinson Lee      "FS_COMPOSITE",       /* = 1 << 0, */
4931263f41a0aa2ac4514992cb3b5678116153939fVinson Lee      "FS_MASK",            /* = 1 << 1, */
5031263f41a0aa2ac4514992cb3b5678116153939fVinson Lee      "FS_SOLID_FILL",      /* = 1 << 2, */
5131263f41a0aa2ac4514992cb3b5678116153939fVinson Lee      "FS_LINGRAD_FILL",    /* = 1 << 3, */
5231263f41a0aa2ac4514992cb3b5678116153939fVinson Lee      "FS_RADGRAD_FILL",    /* = 1 << 4, */
5331263f41a0aa2ac4514992cb3b5678116153939fVinson Lee      "FS_CA_FULL",         /* = 1 << 5, */ /* src.rgba * mask.rgba */
5431263f41a0aa2ac4514992cb3b5678116153939fVinson Lee      "FS_CA_SRCALPHA",     /* = 1 << 6, */ /* src.aaaa * mask.rgba */
5531263f41a0aa2ac4514992cb3b5678116153939fVinson Lee      "FS_YUV",             /* = 1 << 7, */
5631263f41a0aa2ac4514992cb3b5678116153939fVinson Lee      "FS_SRC_REPEAT_NONE", /* = 1 << 8, */
5731263f41a0aa2ac4514992cb3b5678116153939fVinson Lee      "FS_MASK_REPEAT_NONE",/* = 1 << 9, */
5831263f41a0aa2ac4514992cb3b5678116153939fVinson Lee      "FS_SRC_SWIZZLE_RGB", /* = 1 << 10, */
5931263f41a0aa2ac4514992cb3b5678116153939fVinson Lee      "FS_MASK_SWIZZLE_RGB",/* = 1 << 11, */
6031263f41a0aa2ac4514992cb3b5678116153939fVinson Lee      "FS_SRC_SET_ALPHA",   /* = 1 << 12, */
6131263f41a0aa2ac4514992cb3b5678116153939fVinson Lee      "FS_MASK_SET_ALPHA",  /* = 1 << 13, */
6231263f41a0aa2ac4514992cb3b5678116153939fVinson Lee      "FS_SRC_LUMINANCE",   /* = 1 << 14, */
6331263f41a0aa2ac4514992cb3b5678116153939fVinson Lee      "FS_MASK_LUMINANCE",  /* = 1 << 15, */
64cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz   };
65cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz   int i, k;
66cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz   debug_printf("%s: ", __func__);
67cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz
68cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz   for (i = 0, k = 1; k < (1 << 16); i++, k <<= 1) {
69cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz      if (fs_traits & k)
70cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz         debug_printf("%s, ", strings[i]);
71cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz   }
72cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz
73cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz   debug_printf("\n");
74cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz}
75cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz
76f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusinstruct xorg_shaders {
77319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   struct xorg_renderer *r;
78f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin
79f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   struct cso_hash *vs_hash;
80f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin   struct cso_hash *fs_hash;
81f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin};
82f9a3fce09044fbfe9a9b973d33b31cfe826d1386Zack Rusin
8317076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusinstatic INLINE void
8417076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusinsrc_in_mask(struct ureg_program *ureg,
8517076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin            struct ureg_dst dst,
8617076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin            struct ureg_src src,
87c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin            struct ureg_src mask,
88cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz            unsigned component_alpha,
89cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz            unsigned mask_luminance)
9017076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin{
91b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin   if (component_alpha == FS_CA_FULL) {
92c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin      ureg_MUL(ureg, dst, src, mask);
93b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin   } else if (component_alpha == FS_CA_SRCALPHA) {
94b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin      ureg_MUL(ureg, dst,
95b17c885a8aa88ef06f384330d59aeb23b73350bbZack Rusin               ureg_scalar(src, TGSI_SWIZZLE_W), mask);
96c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin   }
97c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin   else {
98cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz      if (mask_luminance)
99cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz         ureg_MUL(ureg, dst, src,
100cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz                  ureg_scalar(mask, TGSI_SWIZZLE_X));
101cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz      else
102cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz         ureg_MUL(ureg, dst, src,
103cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz                  ureg_scalar(mask, TGSI_SWIZZLE_W));
104c4af8ce69e1a7105b0178da8a085b73ab984e432Zack Rusin   }
10517076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin}
10617076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin
107f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusinstatic struct ureg_src
108f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusinvs_normalize_coords(struct ureg_program *ureg, struct ureg_src coords,
109f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin                    struct ureg_src const0, struct ureg_src const1)
110f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin{
111f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin   struct ureg_dst tmp = ureg_DECL_temporary(ureg);
112f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin   struct ureg_src ret;
113f1ce6b09cdb21d9217d6ad6057f7fb97375df8beZack Rusin   ureg_MAD(ureg, tmp, coords, const0, const1);
114f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin   ret = ureg_src(tmp);
115f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin   ureg_release_temporary(ureg, tmp);
116f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin   return ret;
117f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin}
118f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin
1195571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusinstatic void
1205571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusinlinear_gradient(struct ureg_program *ureg,
1215571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin                struct ureg_dst out,
1225571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin                struct ureg_src pos,
1235571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin                struct ureg_src sampler,
1245571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin                struct ureg_src coords,
1255571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin                struct ureg_src const0124,
1265571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin                struct ureg_src matrow0,
1275571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin                struct ureg_src matrow1,
1285571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin                struct ureg_src matrow2)
1295571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin{
1305571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin   struct ureg_dst temp0 = ureg_DECL_temporary(ureg);
1315571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin   struct ureg_dst temp1 = ureg_DECL_temporary(ureg);
1325571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin   struct ureg_dst temp2 = ureg_DECL_temporary(ureg);
1335571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin   struct ureg_dst temp3 = ureg_DECL_temporary(ureg);
1345571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin   struct ureg_dst temp4 = ureg_DECL_temporary(ureg);
1355571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin   struct ureg_dst temp5 = ureg_DECL_temporary(ureg);
1365571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin
1375571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin   ureg_MOV(ureg,
1385571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin            ureg_writemask(temp0, TGSI_WRITEMASK_XY), pos);
1395571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin   ureg_MOV(ureg,
1405571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin            ureg_writemask(temp0, TGSI_WRITEMASK_Z),
1415571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin            ureg_scalar(const0124, TGSI_SWIZZLE_Y));
1425571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin
1435571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin   ureg_DP3(ureg, temp1, matrow0, ureg_src(temp0));
1445571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin   ureg_DP3(ureg, temp2, matrow1, ureg_src(temp0));
1455571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin   ureg_DP3(ureg, temp3, matrow2, ureg_src(temp0));
1465571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin   ureg_RCP(ureg, temp3, ureg_src(temp3));
1475571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin   ureg_MUL(ureg, temp1, ureg_src(temp1), ureg_src(temp3));
1485571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin   ureg_MUL(ureg, temp2, ureg_src(temp2), ureg_src(temp3));
1495571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin
1505571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin   ureg_MOV(ureg, ureg_writemask(temp4, TGSI_WRITEMASK_X),
1515571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin            ureg_src(temp1));
1525571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin   ureg_MOV(ureg, ureg_writemask(temp4, TGSI_WRITEMASK_Y),
1535571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin            ureg_src(temp2));
1545571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin
1555571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin   ureg_MUL(ureg, temp0,
1565571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin            ureg_scalar(coords, TGSI_SWIZZLE_Y),
1575571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin            ureg_scalar(ureg_src(temp4), TGSI_SWIZZLE_Y));
1585571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin   ureg_MAD(ureg, temp1,
1595571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin            ureg_scalar(coords, TGSI_SWIZZLE_X),
1605571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin            ureg_scalar(ureg_src(temp4), TGSI_SWIZZLE_X),
1615571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin            ureg_src(temp0));
1625571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin
1635571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin   ureg_MUL(ureg, temp2,
1645571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin            ureg_src(temp1),
1655571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin            ureg_scalar(coords, TGSI_SWIZZLE_Z));
1665571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin
1675571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin   ureg_TEX(ureg, out,
1685571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin            TGSI_TEXTURE_1D, ureg_src(temp2), sampler);
169007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin
170007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_release_temporary(ureg, temp0);
171007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_release_temporary(ureg, temp1);
172007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_release_temporary(ureg, temp2);
173007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_release_temporary(ureg, temp3);
174007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_release_temporary(ureg, temp4);
175007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_release_temporary(ureg, temp5);
176007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin}
177007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin
178007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin
179007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusinstatic void
180007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusinradial_gradient(struct ureg_program *ureg,
181007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin                struct ureg_dst out,
182007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin                struct ureg_src pos,
183007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin                struct ureg_src sampler,
184007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin                struct ureg_src coords,
185007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin                struct ureg_src const0124,
186007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin                struct ureg_src matrow0,
187007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin                struct ureg_src matrow1,
188007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin                struct ureg_src matrow2)
189007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin{
190007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   struct ureg_dst temp0 = ureg_DECL_temporary(ureg);
191007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   struct ureg_dst temp1 = ureg_DECL_temporary(ureg);
192007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   struct ureg_dst temp2 = ureg_DECL_temporary(ureg);
193007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   struct ureg_dst temp3 = ureg_DECL_temporary(ureg);
194007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   struct ureg_dst temp4 = ureg_DECL_temporary(ureg);
195007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   struct ureg_dst temp5 = ureg_DECL_temporary(ureg);
196007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin
197007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_MOV(ureg,
198007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin            ureg_writemask(temp0, TGSI_WRITEMASK_XY),
199007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin            pos);
200007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_MOV(ureg,
201007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin            ureg_writemask(temp0, TGSI_WRITEMASK_Z),
202007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin            ureg_scalar(const0124, TGSI_SWIZZLE_Y));
203007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin
204007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_DP3(ureg, temp1, matrow0, ureg_src(temp0));
205007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_DP3(ureg, temp2, matrow1, ureg_src(temp0));
206007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_DP3(ureg, temp3, matrow2, ureg_src(temp0));
207007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_RCP(ureg, temp3, ureg_src(temp3));
208007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_MUL(ureg, temp1, ureg_src(temp1), ureg_src(temp3));
209007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_MUL(ureg, temp2, ureg_src(temp2), ureg_src(temp3));
210007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin
211007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_MOV(ureg, ureg_writemask(temp5, TGSI_WRITEMASK_X),
212007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin            ureg_src(temp1));
213007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_MOV(ureg, ureg_writemask(temp5, TGSI_WRITEMASK_Y),
214007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin            ureg_src(temp2));
215007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin
216007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_MUL(ureg, temp0, ureg_scalar(coords, TGSI_SWIZZLE_Y),
217007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin            ureg_scalar(ureg_src(temp5), TGSI_SWIZZLE_Y));
218007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_MAD(ureg, temp1,
219007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin            ureg_scalar(coords, TGSI_SWIZZLE_X),
220007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin            ureg_scalar(ureg_src(temp5), TGSI_SWIZZLE_X),
221007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin            ureg_src(temp0));
222007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_ADD(ureg, temp1,
223007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin            ureg_src(temp1), ureg_src(temp1));
224007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_MUL(ureg, temp3,
225007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin            ureg_scalar(ureg_src(temp5), TGSI_SWIZZLE_Y),
226007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin            ureg_scalar(ureg_src(temp5), TGSI_SWIZZLE_Y));
227007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_MAD(ureg, temp4,
228007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin            ureg_scalar(ureg_src(temp5), TGSI_SWIZZLE_X),
229007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin            ureg_scalar(ureg_src(temp5), TGSI_SWIZZLE_X),
230007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin            ureg_src(temp3));
231007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_MOV(ureg, temp4, ureg_negate(ureg_src(temp4)));
232007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_MUL(ureg, temp2,
233007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin            ureg_scalar(coords, TGSI_SWIZZLE_Z),
234007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin            ureg_src(temp4));
235007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_MUL(ureg, temp0,
236007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin            ureg_scalar(const0124, TGSI_SWIZZLE_W),
237007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin            ureg_src(temp2));
238007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_MUL(ureg, temp3,
239007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin            ureg_src(temp1), ureg_src(temp1));
240007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_SUB(ureg, temp2,
241007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin            ureg_src(temp3), ureg_src(temp0));
242007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_RSQ(ureg, temp2, ureg_abs(ureg_src(temp2)));
243007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_RCP(ureg, temp2, ureg_src(temp2));
244007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_SUB(ureg, temp1,
245007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin            ureg_src(temp2), ureg_src(temp1));
246007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_ADD(ureg, temp0,
247007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin            ureg_scalar(coords, TGSI_SWIZZLE_Z),
248007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin            ureg_scalar(coords, TGSI_SWIZZLE_Z));
249007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_RCP(ureg, temp0, ureg_src(temp0));
250007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_MUL(ureg, temp2,
251007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin            ureg_src(temp1), ureg_src(temp0));
252007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin   ureg_TEX(ureg, out, TGSI_TEXTURE_1D,
253007a843991cd2c03369590fa15cbb60a9b261c65Zack Rusin            ureg_src(temp2), sampler);
2545571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin
2555571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin   ureg_release_temporary(ureg, temp0);
2565571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin   ureg_release_temporary(ureg, temp1);
2575571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin   ureg_release_temporary(ureg, temp2);
2585571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin   ureg_release_temporary(ureg, temp3);
2595571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin   ureg_release_temporary(ureg, temp4);
2605571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin   ureg_release_temporary(ureg, temp5);
2615571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin}
2625571c4fe3650d062d9c469b774ff4930f43c4354Zack Rusin
2637bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusinstatic void *
264a0966c41a913666f0a6b04bde63162a30b1a1879Zack Rusincreate_vs(struct pipe_context *pipe,
2657bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin          unsigned vs_traits)
2667bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin{
267a0966c41a913666f0a6b04bde63162a30b1a1879Zack Rusin   struct ureg_program *ureg;
268a0966c41a913666f0a6b04bde63162a30b1a1879Zack Rusin   struct ureg_src src;
269a0966c41a913666f0a6b04bde63162a30b1a1879Zack Rusin   struct ureg_dst dst;
270f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin   struct ureg_src const0, const1;
2712cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin   boolean is_fill = (vs_traits & VS_FILL) != 0;
2722cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin   boolean is_composite = (vs_traits & VS_COMPOSITE) != 0;
2732cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin   boolean has_mask = (vs_traits & VS_MASK) != 0;
2742cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin   boolean is_yuv = (vs_traits & VS_YUV) != 0;
2756d8dbd3d1ec888300fb0e9ac3cf61808ba8ecc2bKeith Whitwell   unsigned input_slot = 0;
276a0966c41a913666f0a6b04bde63162a30b1a1879Zack Rusin
277a0966c41a913666f0a6b04bde63162a30b1a1879Zack Rusin   ureg = ureg_create(TGSI_PROCESSOR_VERTEX);
278a0966c41a913666f0a6b04bde63162a30b1a1879Zack Rusin   if (ureg == NULL)
279a0966c41a913666f0a6b04bde63162a30b1a1879Zack Rusin      return 0;
280a0966c41a913666f0a6b04bde63162a30b1a1879Zack Rusin
281ae4704eabc237e13c9b06df9c44f31c9baca6208Keith Whitwell   const0 = ureg_DECL_constant(ureg, 0);
282ae4704eabc237e13c9b06df9c44f31c9baca6208Keith Whitwell   const1 = ureg_DECL_constant(ureg, 1);
283f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin
2845c746d9214b72c181aa80f09aa527542e5b2f213Zack Rusin   /* it has to be either a fill or a composite op */
2850b069d648b787636cc57149f47a06fb16f7629abZack Rusin   debug_assert((is_fill ^ is_composite) ^ is_yuv);
2865c746d9214b72c181aa80f09aa527542e5b2f213Zack Rusin
2876d8dbd3d1ec888300fb0e9ac3cf61808ba8ecc2bKeith Whitwell   src = ureg_DECL_vs_input(ureg, input_slot++);
2885c746d9214b72c181aa80f09aa527542e5b2f213Zack Rusin   dst = ureg_DECL_output(ureg, TGSI_SEMANTIC_POSITION, 0);
2895c746d9214b72c181aa80f09aa527542e5b2f213Zack Rusin   src = vs_normalize_coords(ureg, src,
2905c746d9214b72c181aa80f09aa527542e5b2f213Zack Rusin                             const0, const1);
2915c746d9214b72c181aa80f09aa527542e5b2f213Zack Rusin   ureg_MOV(ureg, dst, src);
2925c746d9214b72c181aa80f09aa527542e5b2f213Zack Rusin
293a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin   if (is_yuv) {
294a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin      src = ureg_DECL_vs_input(ureg, input_slot++);
295a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin      dst = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 0);
296a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin      ureg_MOV(ureg, dst, src);
297a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin   }
298a9f8baf00b264a9b370ecb611334af3063674ce5Zack Rusin
2995c746d9214b72c181aa80f09aa527542e5b2f213Zack Rusin   if (is_composite) {
3006d8dbd3d1ec888300fb0e9ac3cf61808ba8ecc2bKeith Whitwell      src = ureg_DECL_vs_input(ureg, input_slot++);
301a016043386045d7cc35d70e42d963704fcae3731Zack Rusin      dst = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 0);
302a0966c41a913666f0a6b04bde63162a30b1a1879Zack Rusin      ureg_MOV(ureg, dst, src);
303a0966c41a913666f0a6b04bde63162a30b1a1879Zack Rusin   }
3046d8dbd3d1ec888300fb0e9ac3cf61808ba8ecc2bKeith Whitwell
3055c746d9214b72c181aa80f09aa527542e5b2f213Zack Rusin   if (is_fill) {
3066d8dbd3d1ec888300fb0e9ac3cf61808ba8ecc2bKeith Whitwell      src = ureg_DECL_vs_input(ureg, input_slot++);
3076be1a98ab9d64584c3852b97e2f1d63697f7bf76Zack Rusin      dst = ureg_DECL_output(ureg, TGSI_SEMANTIC_COLOR, 0);
3085c746d9214b72c181aa80f09aa527542e5b2f213Zack Rusin      ureg_MOV(ureg, dst, src);
3095c746d9214b72c181aa80f09aa527542e5b2f213Zack Rusin   }
3105c746d9214b72c181aa80f09aa527542e5b2f213Zack Rusin
3115c746d9214b72c181aa80f09aa527542e5b2f213Zack Rusin   if (has_mask) {
3126d8dbd3d1ec888300fb0e9ac3cf61808ba8ecc2bKeith Whitwell      src = ureg_DECL_vs_input(ureg, input_slot++);
31389bb33fb20e69d9fa5325da10abf31d61d51d371Zack Rusin      dst = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 1);
314a0966c41a913666f0a6b04bde63162a30b1a1879Zack Rusin      ureg_MOV(ureg, dst, src);
315a0966c41a913666f0a6b04bde63162a30b1a1879Zack Rusin   }
316a0966c41a913666f0a6b04bde63162a30b1a1879Zack Rusin
317a0966c41a913666f0a6b04bde63162a30b1a1879Zack Rusin   ureg_END(ureg);
318a0966c41a913666f0a6b04bde63162a30b1a1879Zack Rusin
319a0966c41a913666f0a6b04bde63162a30b1a1879Zack Rusin   return ureg_create_shader_and_destroy(ureg, pipe);
3207bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin}
3217bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin
3227bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusinstatic void *
3236b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusincreate_yuv_shader(struct pipe_context *pipe, struct ureg_program *ureg)
3246b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin{
3256b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   struct ureg_src y_sampler, u_sampler, v_sampler;
3266b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   struct ureg_src pos;
3276b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   struct ureg_src matrow0, matrow1, matrow2;
3286b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   struct ureg_dst y, u, v, rgb;
3296b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   struct ureg_dst out = ureg_DECL_output(ureg,
3306b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin                                          TGSI_SEMANTIC_COLOR,
3316b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin                                          0);
3326b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin
3336b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   pos = ureg_DECL_fs_input(ureg,
3346b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin                            TGSI_SEMANTIC_GENERIC,
3356b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin                            0,
3366b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin                            TGSI_INTERPOLATE_PERSPECTIVE);
3376b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin
3386b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   rgb = ureg_DECL_temporary(ureg);
3396b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   y = ureg_DECL_temporary(ureg);
3406b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   u = ureg_DECL_temporary(ureg);
3416b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   v = ureg_DECL_temporary(ureg);
3426b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin
3436b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   y_sampler = ureg_DECL_sampler(ureg, 0);
3446b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   u_sampler = ureg_DECL_sampler(ureg, 1);
3456b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   v_sampler = ureg_DECL_sampler(ureg, 2);
3466b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin
3476b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   matrow0 = ureg_DECL_constant(ureg, 0);
3486b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   matrow1 = ureg_DECL_constant(ureg, 1);
3496b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   matrow2 = ureg_DECL_constant(ureg, 2);
3506b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin
3516b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   ureg_TEX(ureg, y,
3526b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin            TGSI_TEXTURE_2D, pos, y_sampler);
3536b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   ureg_TEX(ureg, u,
3546b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin            TGSI_TEXTURE_2D, pos, u_sampler);
3556b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   ureg_TEX(ureg, v,
3566b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin            TGSI_TEXTURE_2D, pos, v_sampler);
3576b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin
3582947d1420270476730711892909c3683bb6c5bffZack Rusin   ureg_SUB(ureg, u, ureg_src(u),
3592947d1420270476730711892909c3683bb6c5bffZack Rusin            ureg_scalar(matrow0, TGSI_SWIZZLE_W));
3602947d1420270476730711892909c3683bb6c5bffZack Rusin   ureg_SUB(ureg, v, ureg_src(v),
3612947d1420270476730711892909c3683bb6c5bffZack Rusin            ureg_scalar(matrow0, TGSI_SWIZZLE_W));
3622947d1420270476730711892909c3683bb6c5bffZack Rusin
3636b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   ureg_MUL(ureg, rgb,
3646b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin            ureg_scalar(ureg_src(y), TGSI_SWIZZLE_X),
3656b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin            matrow0);
3666b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   ureg_MAD(ureg, rgb,
3676b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin            ureg_scalar(ureg_src(u), TGSI_SWIZZLE_X),
3686b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin            matrow1,
3696b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin            ureg_src(rgb));
3706b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   ureg_MAD(ureg, rgb,
3716b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin            ureg_scalar(ureg_src(v), TGSI_SWIZZLE_X),
3726b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin            matrow2,
3736b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin            ureg_src(rgb));
3746b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin
3756b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   /* rgb.a = 1; */
3766b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   ureg_MOV(ureg, ureg_writemask(rgb, TGSI_WRITEMASK_W),
3776b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin            ureg_scalar(matrow0, TGSI_SWIZZLE_X));
3786b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin
3796b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   ureg_MOV(ureg, out, ureg_src(rgb));
3806b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin
3816b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   ureg_release_temporary(ureg, rgb);
3826b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   ureg_release_temporary(ureg, y);
3836b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   ureg_release_temporary(ureg, u);
3846b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   ureg_release_temporary(ureg, v);
3856b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin
3866b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   ureg_END(ureg);
3876b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin
3886b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   return ureg_create_shader_and_destroy(ureg, pipe);
3896b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin}
3906b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin
3912cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin
3922cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusinstatic INLINE void
3932cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusinxrender_tex(struct ureg_program *ureg,
3942cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin            struct ureg_dst dst,
3952cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin            struct ureg_src coords,
3962cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin            struct ureg_src sampler,
397c712f3374626d96f9c08c3571a5572bcee60a5f2Zack Rusin            struct ureg_src imm0,
3985438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz            boolean repeat_none,
3995438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz            boolean swizzle,
4005438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz            boolean set_alpha)
4012cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin{
4022cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin   if (repeat_none) {
4032cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin      struct ureg_dst tmp0 = ureg_DECL_temporary(ureg);
4042cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin      struct ureg_dst tmp1 = ureg_DECL_temporary(ureg);
40572b4a7d67f90a20d774dddccbc6eed30d01a7f38Zack Rusin      ureg_SGT(ureg, tmp1, ureg_swizzle(coords,
4062cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin                                        TGSI_SWIZZLE_X,
4072cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin                                        TGSI_SWIZZLE_Y,
4082cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin                                        TGSI_SWIZZLE_X,
4092cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin                                        TGSI_SWIZZLE_Y),
4104d72f8f520e02366d695e35aa8ef09fc36f36804Zack Rusin               ureg_scalar(imm0, TGSI_SWIZZLE_X));
41172b4a7d67f90a20d774dddccbc6eed30d01a7f38Zack Rusin      ureg_SLT(ureg, tmp0, ureg_swizzle(coords,
4122cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin                                        TGSI_SWIZZLE_X,
4132cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin                                        TGSI_SWIZZLE_Y,
4142cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin                                        TGSI_SWIZZLE_X,
4152cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin                                        TGSI_SWIZZLE_Y),
4164d72f8f520e02366d695e35aa8ef09fc36f36804Zack Rusin               ureg_scalar(imm0, TGSI_SWIZZLE_W));
41772b4a7d67f90a20d774dddccbc6eed30d01a7f38Zack Rusin      ureg_MIN(ureg, tmp0, ureg_src(tmp0), ureg_src(tmp1));
41872b4a7d67f90a20d774dddccbc6eed30d01a7f38Zack Rusin      ureg_MIN(ureg, tmp0, ureg_scalar(ureg_src(tmp0), TGSI_SWIZZLE_X),
4192cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin               ureg_scalar(ureg_src(tmp0), TGSI_SWIZZLE_Y));
42072b4a7d67f90a20d774dddccbc6eed30d01a7f38Zack Rusin      ureg_TEX(ureg, tmp1, TGSI_TEXTURE_2D, coords, sampler);
4215438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz      if (swizzle)
4225438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz         ureg_MOV(ureg, tmp1, ureg_swizzle(ureg_src(tmp1),
4235438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz                                           TGSI_SWIZZLE_Z,
4245438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz                                           TGSI_SWIZZLE_Y,
4255438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz                                           TGSI_SWIZZLE_X,
4265438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz                                           TGSI_SWIZZLE_W));
4275438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz      if (set_alpha)
4285438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz         ureg_MOV(ureg,
4295438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz                  ureg_writemask(tmp1, TGSI_WRITEMASK_W),
4305438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz                  ureg_scalar(imm0, TGSI_SWIZZLE_W));
43172b4a7d67f90a20d774dddccbc6eed30d01a7f38Zack Rusin      ureg_MUL(ureg, dst, ureg_src(tmp1), ureg_src(tmp0));
4322cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin      ureg_release_temporary(ureg, tmp0);
4332cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin      ureg_release_temporary(ureg, tmp1);
4345438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz   } else {
4355438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz      if (swizzle) {
4365438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz         struct ureg_dst tmp = ureg_DECL_temporary(ureg);
4375438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz         ureg_TEX(ureg, tmp, TGSI_TEXTURE_2D, coords, sampler);
4385438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz         ureg_MOV(ureg, dst, ureg_swizzle(ureg_src(tmp),
4395438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz                                          TGSI_SWIZZLE_Z,
4405438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz                                          TGSI_SWIZZLE_Y,
4415438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz                                          TGSI_SWIZZLE_X,
4425438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz                                          TGSI_SWIZZLE_W));
4435438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz         ureg_release_temporary(ureg, tmp);
4445438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz      } else {
4455438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz         ureg_TEX(ureg, dst, TGSI_TEXTURE_2D, coords, sampler);
4465438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz      }
4475438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz      if (set_alpha)
4485438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz         ureg_MOV(ureg,
4495438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz                  ureg_writemask(dst, TGSI_WRITEMASK_W),
4505438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz                  ureg_scalar(imm0, TGSI_SWIZZLE_W));
4515438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz   }
4522cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin}
4532cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin
4546b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusinstatic void *
455b324aacf139bc88fa268057158af88f725c50c63Zack Rusincreate_fs(struct pipe_context *pipe,
456b324aacf139bc88fa268057158af88f725c50c63Zack Rusin          unsigned fs_traits)
4577bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin{
45817076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin   struct ureg_program *ureg;
459206eb504930e5c5f8c947949bcaf20b11627fac7Zack Rusin   struct ureg_src /*dst_sampler,*/ src_sampler, mask_sampler;
460323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin   struct ureg_src /*dst_pos,*/ src_input, mask_pos;
461323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin   struct ureg_dst src, mask;
462a0966c41a913666f0a6b04bde63162a30b1a1879Zack Rusin   struct ureg_dst out;
463c712f3374626d96f9c08c3571a5572bcee60a5f2Zack Rusin   struct ureg_src imm0 = { 0 };
4642cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin   unsigned has_mask = (fs_traits & FS_MASK) != 0;
4652cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin   unsigned is_fill = (fs_traits & FS_FILL) != 0;
4662cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin   unsigned is_composite = (fs_traits & FS_COMPOSITE) != 0;
4672cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin   unsigned is_solid   = (fs_traits & FS_SOLID_FILL) != 0;
4682cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin   unsigned is_lingrad = (fs_traits & FS_LINGRAD_FILL) != 0;
4692cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin   unsigned is_radgrad = (fs_traits & FS_RADGRAD_FILL) != 0;
470cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz   unsigned comp_alpha_mask = fs_traits & FS_COMPONENT_ALPHA;
4712cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin   unsigned is_yuv = (fs_traits & FS_YUV) != 0;
4722cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin   unsigned src_repeat_none = (fs_traits & FS_SRC_REPEAT_NONE) != 0;
4732cfbbc76e445d88bdac7dd4dd22aaf36bbc8e4ccZack Rusin   unsigned mask_repeat_none = (fs_traits & FS_MASK_REPEAT_NONE) != 0;
4745438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz   unsigned src_swizzle = (fs_traits & FS_SRC_SWIZZLE_RGB) != 0;
4755438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz   unsigned mask_swizzle = (fs_traits & FS_MASK_SWIZZLE_RGB) != 0;
4765438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz   unsigned src_set_alpha = (fs_traits & FS_SRC_SET_ALPHA) != 0;
4775438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz   unsigned mask_set_alpha = (fs_traits & FS_MASK_SET_ALPHA) != 0;
478cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz   unsigned src_luminance = (fs_traits & FS_SRC_LUMINANCE) != 0;
479cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz   unsigned mask_luminance = (fs_traits & FS_MASK_LUMINANCE) != 0;
480cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz
481cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz#if 0
482cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz   print_fs_traits(fs_traits);
483cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz#else
484cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz   (void)print_fs_traits;
485cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz#endif
48617076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin
487ffe8cc6cef9df796500a30acf88ffeac7588c28aZack Rusin   ureg = ureg_create(TGSI_PROCESSOR_FRAGMENT);
48817076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin   if (ureg == NULL)
489b324aacf139bc88fa268057158af88f725c50c63Zack Rusin      return 0;
49017076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin
4916b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   /* it has to be either a fill, a composite op or a yuv conversion */
4926b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   debug_assert((is_fill ^ is_composite) ^ is_yuv);
493c441386b0c5c70fc4ae5b3c1eff3fb7f09812a30Vinson Lee   (void) is_yuv;
494d918896a754460bfcc5a9ba1e2844255f21ecab7Zack Rusin
495f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin   out = ureg_DECL_output(ureg,
496f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin                          TGSI_SEMANTIC_COLOR,
497f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin                          0);
49817076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin
499c712f3374626d96f9c08c3571a5572bcee60a5f2Zack Rusin   if (src_repeat_none || mask_repeat_none ||
500c712f3374626d96f9c08c3571a5572bcee60a5f2Zack Rusin       src_set_alpha || mask_set_alpha ||
501c712f3374626d96f9c08c3571a5572bcee60a5f2Zack Rusin       src_luminance) {
502c712f3374626d96f9c08c3571a5572bcee60a5f2Zack Rusin      imm0 = ureg_imm4f(ureg, 0, 0, 0, 1);
503c712f3374626d96f9c08c3571a5572bcee60a5f2Zack Rusin   }
504d918896a754460bfcc5a9ba1e2844255f21ecab7Zack Rusin   if (is_composite) {
5055643942517f05c7a986d208be4402927a111555eZack Rusin      src_sampler = ureg_DECL_sampler(ureg, 0);
506323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin      src_input = ureg_DECL_fs_input(ureg,
507a016043386045d7cc35d70e42d963704fcae3731Zack Rusin                                     TGSI_SEMANTIC_GENERIC,
508323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin                                     0,
509323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin                                     TGSI_INTERPOLATE_PERSPECTIVE);
5106b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   } else if (is_fill) {
511323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin      if (is_solid)
512323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin         src_input = ureg_DECL_fs_input(ureg,
513323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin                                        TGSI_SEMANTIC_COLOR,
514323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin                                        0,
515323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin                                        TGSI_INTERPOLATE_PERSPECTIVE);
516323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin      else
517323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin         src_input = ureg_DECL_fs_input(ureg,
518323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin                                        TGSI_SEMANTIC_POSITION,
519323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin                                        0,
520323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin                                        TGSI_INTERPOLATE_PERSPECTIVE);
5216b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin   } else {
5226b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin      debug_assert(is_yuv);
5236b8ce4cc4f9acdd9227e26a812dd911f45b623a5Zack Rusin      return create_yuv_shader(pipe, ureg);
524d918896a754460bfcc5a9ba1e2844255f21ecab7Zack Rusin   }
52517076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin
526323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin   if (has_mask) {
5275643942517f05c7a986d208be4402927a111555eZack Rusin      mask_sampler = ureg_DECL_sampler(ureg, 1);
528b324aacf139bc88fa268057158af88f725c50c63Zack Rusin      mask_pos = ureg_DECL_fs_input(ureg,
529b0ddfe8a3dc3dfee87dd382a4aa7cbd03a395f37Michel Dänzer                                    TGSI_SEMANTIC_GENERIC,
530f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin                                    1,
531b324aacf139bc88fa268057158af88f725c50c63Zack Rusin                                    TGSI_INTERPOLATE_PERSPECTIVE);
53217076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin   }
53317076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin
534f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin#if 0  /* unused right now */
5355643942517f05c7a986d208be4402927a111555eZack Rusin   dst_sampler = ureg_DECL_sampler(ureg, 2);
536f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin   dst_pos = ureg_DECL_fs_input(ureg,
537f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin                                TGSI_SEMANTIC_POSITION,
538f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin                                2,
539f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin                                TGSI_INTERPOLATE_PERSPECTIVE);
540f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin#endif
541f1c0a4b2f4b0054a3371fcaf5121bf53ef29b756Zack Rusin
542c712f3374626d96f9c08c3571a5572bcee60a5f2Zack Rusin
543323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin   if (is_composite) {
544c712f3374626d96f9c08c3571a5572bcee60a5f2Zack Rusin      if (has_mask || src_luminance)
545323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin         src = ureg_DECL_temporary(ureg);
546323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin      else
547323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin         src = out;
548c712f3374626d96f9c08c3571a5572bcee60a5f2Zack Rusin      xrender_tex(ureg, src, src_input, src_sampler, imm0,
5495438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz                  src_repeat_none, src_swizzle, src_set_alpha);
550323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin   } else if (is_fill) {
551323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin      if (is_solid) {
552c712f3374626d96f9c08c3571a5572bcee60a5f2Zack Rusin         if (has_mask || src_luminance)
553323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin            src = ureg_dst(src_input);
554323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin         else
555323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin            ureg_MOV(ureg, out, src_input);
556323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin      } else if (is_lingrad || is_radgrad) {
557323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin         struct ureg_src coords, const0124,
558323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin            matrow0, matrow1, matrow2;
559323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin
560c712f3374626d96f9c08c3571a5572bcee60a5f2Zack Rusin         if (has_mask || src_luminance)
561323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin            src = ureg_DECL_temporary(ureg);
562323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin         else
563323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin            src = out;
564323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin
5655a87a25a65012122dd91256a8d2f3d1c3ffe5de0Brian Paul         coords = ureg_DECL_constant(ureg, 0);
5665a87a25a65012122dd91256a8d2f3d1c3ffe5de0Brian Paul         const0124 = ureg_DECL_constant(ureg, 1);
5675a87a25a65012122dd91256a8d2f3d1c3ffe5de0Brian Paul         matrow0 = ureg_DECL_constant(ureg, 2);
5685a87a25a65012122dd91256a8d2f3d1c3ffe5de0Brian Paul         matrow1 = ureg_DECL_constant(ureg, 3);
5695a87a25a65012122dd91256a8d2f3d1c3ffe5de0Brian Paul         matrow2 = ureg_DECL_constant(ureg, 4);
570323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin
571323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin         if (is_lingrad) {
572323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin            linear_gradient(ureg, src,
573323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin                            src_input, src_sampler,
574323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin                            coords, const0124,
575323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin                            matrow0, matrow1, matrow2);
576323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin         } else if (is_radgrad) {
577323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin            radial_gradient(ureg, src,
578323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin                            src_input, src_sampler,
579323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin                            coords, const0124,
580323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin                            matrow0, matrow1, matrow2);
581323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin         }
582323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin      } else
583323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin         debug_assert(!"Unknown fill type!");
584323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin   }
585c712f3374626d96f9c08c3571a5572bcee60a5f2Zack Rusin   if (src_luminance) {
586c712f3374626d96f9c08c3571a5572bcee60a5f2Zack Rusin      ureg_MOV(ureg, src,
587c712f3374626d96f9c08c3571a5572bcee60a5f2Zack Rusin               ureg_scalar(ureg_src(src), TGSI_SWIZZLE_X));
588c712f3374626d96f9c08c3571a5572bcee60a5f2Zack Rusin      ureg_MOV(ureg, ureg_writemask(src, TGSI_WRITEMASK_XYZ),
589c712f3374626d96f9c08c3571a5572bcee60a5f2Zack Rusin               ureg_scalar(imm0, TGSI_SWIZZLE_X));
590c712f3374626d96f9c08c3571a5572bcee60a5f2Zack Rusin      if (!has_mask)
591c712f3374626d96f9c08c3571a5572bcee60a5f2Zack Rusin         ureg_MOV(ureg, out, ureg_src(src));
592c712f3374626d96f9c08c3571a5572bcee60a5f2Zack Rusin   }
593323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin
594323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin   if (has_mask) {
595323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin      mask = ureg_DECL_temporary(ureg);
596c712f3374626d96f9c08c3571a5572bcee60a5f2Zack Rusin      xrender_tex(ureg, mask, mask_pos, mask_sampler, imm0,
5975438ee3ecfe5c25102d196fd6d7258201e27e6caJakob Bornecrantz                  mask_repeat_none, mask_swizzle, mask_set_alpha);
59817076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin      /* src IN mask */
599cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz      src_in_mask(ureg, out, ureg_src(src), ureg_src(mask),
600cb060f3b987c9fa07ebe06cf2e7e54d1eaded1e1Jakob Bornecrantz                  comp_alpha_mask, mask_luminance);
601323440b3e204a6de8faa8009eea9bb05c3b11991Zack Rusin      ureg_release_temporary(ureg, mask);
60217076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin   }
60317076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin
60417076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin   ureg_END(ureg);
60517076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin
606b324aacf139bc88fa268057158af88f725c50c63Zack Rusin   return ureg_create_shader_and_destroy(ureg, pipe);
60723b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin}
60823b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin
609319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusinstruct xorg_shaders * xorg_shaders_create(struct xorg_renderer *r)
61023b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin{
61123b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin   struct xorg_shaders *sc = CALLOC_STRUCT(xorg_shaders);
61223b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin
613319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   sc->r = r;
61423b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin   sc->vs_hash = cso_hash_create();
61523b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin   sc->fs_hash = cso_hash_create();
61623b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin
61723b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin   return sc;
61823b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin}
61923b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin
62023b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusinstatic void
62123b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusincache_destroy(struct cso_context *cso,
62223b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin              struct cso_hash *hash,
62323b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin              unsigned processor)
62423b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin{
62523b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin   struct cso_hash_iter iter = cso_hash_first_node(hash);
62623b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin   while (!cso_hash_iter_is_null(iter)) {
62723b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin      void *shader = (void *)cso_hash_iter_data(iter);
62823b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin      if (processor == PIPE_SHADER_FRAGMENT) {
62923b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin         cso_delete_fragment_shader(cso, shader);
63023b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin      } else if (processor == PIPE_SHADER_VERTEX) {
63123b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin         cso_delete_vertex_shader(cso, shader);
63223b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin      }
63323b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin      iter = cso_hash_erase(hash, iter);
63423b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin   }
63523b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin   cso_hash_delete(hash);
63623b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin}
63723b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin
63823b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusinvoid xorg_shaders_destroy(struct xorg_shaders *sc)
63923b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin{
640319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cache_destroy(sc->r->cso, sc->vs_hash,
64123b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin                 PIPE_SHADER_VERTEX);
642319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   cache_destroy(sc->r->cso, sc->fs_hash,
64323b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin                 PIPE_SHADER_FRAGMENT);
64423b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin
64578215b02e4b4b12d68ee7eecab7c9dff21494bf5nobled   FREE(sc);
64623b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin}
64723b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin
6487bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusinstatic INLINE void *
6497bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusinshader_from_cache(struct pipe_context *pipe,
6507bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin                  unsigned type,
6517bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin                  struct cso_hash *hash,
6527bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin                  unsigned key)
6537bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin{
6547bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin   void *shader = 0;
6557bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin
6567bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin   struct cso_hash_iter iter = cso_hash_find(hash, key);
6577bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin
6587bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin   if (cso_hash_iter_is_null(iter)) {
6597bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin      if (type == PIPE_SHADER_VERTEX)
6607bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin         shader = create_vs(pipe, key);
6617bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin      else
6627bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin         shader = create_fs(pipe, key);
6637bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin      cso_hash_insert(hash, key, shader);
6647bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin   } else
6657bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin      shader = (void *)cso_hash_iter_data(iter);
6667bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin
6677bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin   return shader;
6687bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin}
6697bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin
67023b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusinstruct xorg_shader xorg_shaders_get(struct xorg_shaders *sc,
67123b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin                                    unsigned vs_traits,
67223b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin                                    unsigned fs_traits)
67323b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin{
6749c449502a2a92bc71bc438f366138ae82404c066Michel Dänzer   struct xorg_shader shader = { NULL, NULL };
6757bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin   void *vs, *fs;
6767bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin
677319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   vs = shader_from_cache(sc->r->pipe, PIPE_SHADER_VERTEX,
6787bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin                          sc->vs_hash, vs_traits);
679319a588238b4c0c58f8f8807e1143ad79cd8f698Zack Rusin   fs = shader_from_cache(sc->r->pipe, PIPE_SHADER_FRAGMENT,
6807bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin                          sc->fs_hash, fs_traits);
6817bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin
6827bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin   debug_assert(vs && fs);
6837bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin   if (!vs || !fs)
6847bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin      return shader;
6857bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin
6867bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin   shader.vs = vs;
6877bc4744026fadd3859097bf076e9b345f4e310f4Zack Rusin   shader.fs = fs;
68823b59d3b4029ea89b5a8e85ea3cc10bea1ab01d0Zack Rusin
689ffe8cc6cef9df796500a30acf88ffeac7588c28aZack Rusin   return shader;
69017076d700c94402f82c22b2e1d99a1753e4a0834Zack Rusin}
691