13a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "xorg_exa_tgsi.h"
23a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
33a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/*### stupidity defined in X11/extensions/XI.h */
43a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#undef Absolute
53a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
63a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "pipe/p_format.h"
73a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "pipe/p_context.h"
83a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "pipe/p_state.h"
93a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "pipe/p_shader_tokens.h"
103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "util/u_memory.h"
123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "tgsi/tgsi_ureg.h"
143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "cso_cache/cso_context.h"
163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "cso_cache/cso_hash.h"
173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* Vertex shader:
193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * IN[0]    = vertex pos
203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * IN[1]    = src tex coord | solid fill color
213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * IN[2]    = mask tex coord
223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * IN[3]    = dst tex coord
233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * CONST[0] = (2/dst_width, 2/dst_height, 1, 1)
243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * CONST[1] = (-1, -1, 0, 0)
253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * OUT[0]   = vertex pos
273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * OUT[1]   = src tex coord | solid fill color
283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * OUT[2]   = mask tex coord
293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * OUT[3]   = dst tex coord
303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */
313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* Fragment shader:
333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * SAMP[0]  = src
343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * SAMP[1]  = mask
353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * SAMP[2]  = dst
363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * IN[0]    = pos src | solid fill color
373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * IN[1]    = pos mask
383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * IN[2]    = pos dst
393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * CONST[0] = (0, 0, 0, 1)
403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * OUT[0] = color
423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */
433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void
453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgprint_fs_traits(int fs_traits)
463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   const char *strings[] = {
48760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org      "FS_COMPOSITE",       /* = 1 << 0, */
49760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org      "FS_MASK",            /* = 1 << 1, */
50760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org      "FS_SOLID_FILL",      /* = 1 << 2, */
51760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org      "FS_LINGRAD_FILL",    /* = 1 << 3, */
52760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org      "FS_RADGRAD_FILL",    /* = 1 << 4, */
53760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org      "FS_CA_FULL",         /* = 1 << 5, */ /* src.rgba * mask.rgba */
54760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org      "FS_CA_SRCALPHA",     /* = 1 << 6, */ /* src.aaaa * mask.rgba */
55760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org      "FS_YUV",             /* = 1 << 7, */
56760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org      "FS_SRC_REPEAT_NONE", /* = 1 << 8, */
57760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org      "FS_MASK_REPEAT_NONE",/* = 1 << 9, */
58760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org      "FS_SRC_SWIZZLE_RGB", /* = 1 << 10, */
59760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org      "FS_MASK_SWIZZLE_RGB",/* = 1 << 11, */
60760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org      "FS_SRC_SET_ALPHA",   /* = 1 << 12, */
61760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org      "FS_MASK_SET_ALPHA",  /* = 1 << 13, */
62760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org      "FS_SRC_LUMINANCE",   /* = 1 << 14, */
63760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org      "FS_MASK_LUMINANCE",  /* = 1 << 15, */
643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   };
653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int i, k;
663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   debug_printf("%s: ", __func__);
673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   for (i = 0, k = 1; k < (1 << 16); i++, k <<= 1) {
693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (fs_traits & k)
703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         debug_printf("%s, ", strings[i]);
713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   debug_printf("\n");
743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstruct xorg_shaders {
773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct xorg_renderer *r;
783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct cso_hash *vs_hash;
803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct cso_hash *fs_hash;
813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org};
823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic INLINE void
843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgsrc_in_mask(struct ureg_program *ureg,
853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            struct ureg_dst dst,
863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            struct ureg_src src,
873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            struct ureg_src mask,
883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            unsigned component_alpha,
893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            unsigned mask_luminance)
903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (component_alpha == FS_CA_FULL) {
923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      ureg_MUL(ureg, dst, src, mask);
933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   } else if (component_alpha == FS_CA_SRCALPHA) {
943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      ureg_MUL(ureg, dst,
953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org               ureg_scalar(src, TGSI_SWIZZLE_W), mask);
963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   else {
983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (mask_luminance)
993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         ureg_MUL(ureg, dst, src,
1003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                  ureg_scalar(mask, TGSI_SWIZZLE_X));
1013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      else
1023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         ureg_MUL(ureg, dst, src,
1033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                  ureg_scalar(mask, TGSI_SWIZZLE_W));
1043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
1053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
1063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic struct ureg_src
1083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvs_normalize_coords(struct ureg_program *ureg, struct ureg_src coords,
1093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                    struct ureg_src const0, struct ureg_src const1)
1103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
1113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct ureg_dst tmp = ureg_DECL_temporary(ureg);
1123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct ureg_src ret;
1133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_MAD(ureg, tmp, coords, const0, const1);
1143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ret = ureg_src(tmp);
1153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_release_temporary(ureg, tmp);
1163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return ret;
1173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
1183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void
1203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orglinear_gradient(struct ureg_program *ureg,
1213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                struct ureg_dst out,
1223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                struct ureg_src pos,
1233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                struct ureg_src sampler,
1243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                struct ureg_src coords,
1253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                struct ureg_src const0124,
1263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                struct ureg_src matrow0,
1273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                struct ureg_src matrow1,
1283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                struct ureg_src matrow2)
1293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
1303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct ureg_dst temp0 = ureg_DECL_temporary(ureg);
1313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct ureg_dst temp1 = ureg_DECL_temporary(ureg);
1323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct ureg_dst temp2 = ureg_DECL_temporary(ureg);
1333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct ureg_dst temp3 = ureg_DECL_temporary(ureg);
1343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct ureg_dst temp4 = ureg_DECL_temporary(ureg);
1353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct ureg_dst temp5 = ureg_DECL_temporary(ureg);
1363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_MOV(ureg,
1383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_writemask(temp0, TGSI_WRITEMASK_XY), pos);
1393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_MOV(ureg,
1403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_writemask(temp0, TGSI_WRITEMASK_Z),
1413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_scalar(const0124, TGSI_SWIZZLE_Y));
1423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_DP3(ureg, temp1, matrow0, ureg_src(temp0));
1443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_DP3(ureg, temp2, matrow1, ureg_src(temp0));
1453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_DP3(ureg, temp3, matrow2, ureg_src(temp0));
1463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_RCP(ureg, temp3, ureg_src(temp3));
1473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_MUL(ureg, temp1, ureg_src(temp1), ureg_src(temp3));
1483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_MUL(ureg, temp2, ureg_src(temp2), ureg_src(temp3));
1493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_MOV(ureg, ureg_writemask(temp4, TGSI_WRITEMASK_X),
1513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_src(temp1));
1523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_MOV(ureg, ureg_writemask(temp4, TGSI_WRITEMASK_Y),
1533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_src(temp2));
1543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_MUL(ureg, temp0,
1563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_scalar(coords, TGSI_SWIZZLE_Y),
1573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_scalar(ureg_src(temp4), TGSI_SWIZZLE_Y));
1583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_MAD(ureg, temp1,
1593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_scalar(coords, TGSI_SWIZZLE_X),
1603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_scalar(ureg_src(temp4), TGSI_SWIZZLE_X),
1613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_src(temp0));
1623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_MUL(ureg, temp2,
1643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_src(temp1),
1653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_scalar(coords, TGSI_SWIZZLE_Z));
1663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_TEX(ureg, out,
1683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            TGSI_TEXTURE_1D, ureg_src(temp2), sampler);
1693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_release_temporary(ureg, temp0);
1713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_release_temporary(ureg, temp1);
1723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_release_temporary(ureg, temp2);
1733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_release_temporary(ureg, temp3);
1743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_release_temporary(ureg, temp4);
1753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_release_temporary(ureg, temp5);
1763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
1773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void
1803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgradial_gradient(struct ureg_program *ureg,
1813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                struct ureg_dst out,
1823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                struct ureg_src pos,
1833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                struct ureg_src sampler,
1843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                struct ureg_src coords,
1853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                struct ureg_src const0124,
1863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                struct ureg_src matrow0,
1873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                struct ureg_src matrow1,
1883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                struct ureg_src matrow2)
1893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
1903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct ureg_dst temp0 = ureg_DECL_temporary(ureg);
1913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct ureg_dst temp1 = ureg_DECL_temporary(ureg);
1923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct ureg_dst temp2 = ureg_DECL_temporary(ureg);
1933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct ureg_dst temp3 = ureg_DECL_temporary(ureg);
1943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct ureg_dst temp4 = ureg_DECL_temporary(ureg);
1953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct ureg_dst temp5 = ureg_DECL_temporary(ureg);
1963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_MOV(ureg,
1983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_writemask(temp0, TGSI_WRITEMASK_XY),
1993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            pos);
2003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_MOV(ureg,
2013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_writemask(temp0, TGSI_WRITEMASK_Z),
2023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_scalar(const0124, TGSI_SWIZZLE_Y));
2033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_DP3(ureg, temp1, matrow0, ureg_src(temp0));
2053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_DP3(ureg, temp2, matrow1, ureg_src(temp0));
2063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_DP3(ureg, temp3, matrow2, ureg_src(temp0));
2073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_RCP(ureg, temp3, ureg_src(temp3));
2083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_MUL(ureg, temp1, ureg_src(temp1), ureg_src(temp3));
2093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_MUL(ureg, temp2, ureg_src(temp2), ureg_src(temp3));
2103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_MOV(ureg, ureg_writemask(temp5, TGSI_WRITEMASK_X),
2123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_src(temp1));
2133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_MOV(ureg, ureg_writemask(temp5, TGSI_WRITEMASK_Y),
2143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_src(temp2));
2153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_MUL(ureg, temp0, ureg_scalar(coords, TGSI_SWIZZLE_Y),
2173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_scalar(ureg_src(temp5), TGSI_SWIZZLE_Y));
2183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_MAD(ureg, temp1,
2193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_scalar(coords, TGSI_SWIZZLE_X),
2203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_scalar(ureg_src(temp5), TGSI_SWIZZLE_X),
2213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_src(temp0));
2223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_ADD(ureg, temp1,
2233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_src(temp1), ureg_src(temp1));
2243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_MUL(ureg, temp3,
2253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_scalar(ureg_src(temp5), TGSI_SWIZZLE_Y),
2263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_scalar(ureg_src(temp5), TGSI_SWIZZLE_Y));
2273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_MAD(ureg, temp4,
2283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_scalar(ureg_src(temp5), TGSI_SWIZZLE_X),
2293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_scalar(ureg_src(temp5), TGSI_SWIZZLE_X),
2303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_src(temp3));
2313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_MOV(ureg, temp4, ureg_negate(ureg_src(temp4)));
2323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_MUL(ureg, temp2,
2333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_scalar(coords, TGSI_SWIZZLE_Z),
2343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_src(temp4));
2353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_MUL(ureg, temp0,
2363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_scalar(const0124, TGSI_SWIZZLE_W),
2373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_src(temp2));
2383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_MUL(ureg, temp3,
2393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_src(temp1), ureg_src(temp1));
2403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_SUB(ureg, temp2,
2413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_src(temp3), ureg_src(temp0));
2423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_RSQ(ureg, temp2, ureg_abs(ureg_src(temp2)));
2433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_RCP(ureg, temp2, ureg_src(temp2));
2443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_SUB(ureg, temp1,
2453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_src(temp2), ureg_src(temp1));
2463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_ADD(ureg, temp0,
2473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_scalar(coords, TGSI_SWIZZLE_Z),
2483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_scalar(coords, TGSI_SWIZZLE_Z));
2493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_RCP(ureg, temp0, ureg_src(temp0));
2503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_MUL(ureg, temp2,
2513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_src(temp1), ureg_src(temp0));
2523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_TEX(ureg, out, TGSI_TEXTURE_1D,
2533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_src(temp2), sampler);
2543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_release_temporary(ureg, temp0);
2563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_release_temporary(ureg, temp1);
2573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_release_temporary(ureg, temp2);
2583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_release_temporary(ureg, temp3);
2593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_release_temporary(ureg, temp4);
2603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_release_temporary(ureg, temp5);
2613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
2623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void *
2643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgcreate_vs(struct pipe_context *pipe,
2653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org          unsigned vs_traits)
2663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
2673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct ureg_program *ureg;
2683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct ureg_src src;
2693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct ureg_dst dst;
2703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct ureg_src const0, const1;
2713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   boolean is_fill = (vs_traits & VS_FILL) != 0;
2723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   boolean is_composite = (vs_traits & VS_COMPOSITE) != 0;
2733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   boolean has_mask = (vs_traits & VS_MASK) != 0;
2743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   boolean is_yuv = (vs_traits & VS_YUV) != 0;
2753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   unsigned input_slot = 0;
2763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg = ureg_create(TGSI_PROCESSOR_VERTEX);
2783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (ureg == NULL)
2793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return 0;
2803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   const0 = ureg_DECL_constant(ureg, 0);
2823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   const1 = ureg_DECL_constant(ureg, 1);
2833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* it has to be either a fill or a composite op */
2853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   debug_assert((is_fill ^ is_composite) ^ is_yuv);
2863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   src = ureg_DECL_vs_input(ureg, input_slot++);
2883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   dst = ureg_DECL_output(ureg, TGSI_SEMANTIC_POSITION, 0);
2893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   src = vs_normalize_coords(ureg, src,
2903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                             const0, const1);
2913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_MOV(ureg, dst, src);
2923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (is_yuv) {
2943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      src = ureg_DECL_vs_input(ureg, input_slot++);
2953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      dst = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 0);
2963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      ureg_MOV(ureg, dst, src);
2973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
2983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (is_composite) {
3003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      src = ureg_DECL_vs_input(ureg, input_slot++);
3013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      dst = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 0);
3023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      ureg_MOV(ureg, dst, src);
3033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
3043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (is_fill) {
3063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      src = ureg_DECL_vs_input(ureg, input_slot++);
3073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      dst = ureg_DECL_output(ureg, TGSI_SEMANTIC_COLOR, 0);
3083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      ureg_MOV(ureg, dst, src);
3093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
3103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (has_mask) {
3123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      src = ureg_DECL_vs_input(ureg, input_slot++);
3133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      dst = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 1);
3143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      ureg_MOV(ureg, dst, src);
3153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
3163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_END(ureg);
3183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return ureg_create_shader_and_destroy(ureg, pipe);
3203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
3213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void *
3233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgcreate_yuv_shader(struct pipe_context *pipe, struct ureg_program *ureg)
3243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
3253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct ureg_src y_sampler, u_sampler, v_sampler;
3263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct ureg_src pos;
3273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct ureg_src matrow0, matrow1, matrow2;
3283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct ureg_dst y, u, v, rgb;
3293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct ureg_dst out = ureg_DECL_output(ureg,
3303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                          TGSI_SEMANTIC_COLOR,
3313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                          0);
3323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   pos = ureg_DECL_fs_input(ureg,
3343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                            TGSI_SEMANTIC_GENERIC,
3353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                            0,
3363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                            TGSI_INTERPOLATE_PERSPECTIVE);
3373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   rgb = ureg_DECL_temporary(ureg);
3393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   y = ureg_DECL_temporary(ureg);
3403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   u = ureg_DECL_temporary(ureg);
3413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   v = ureg_DECL_temporary(ureg);
3423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   y_sampler = ureg_DECL_sampler(ureg, 0);
3443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   u_sampler = ureg_DECL_sampler(ureg, 1);
3453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   v_sampler = ureg_DECL_sampler(ureg, 2);
3463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   matrow0 = ureg_DECL_constant(ureg, 0);
3483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   matrow1 = ureg_DECL_constant(ureg, 1);
3493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   matrow2 = ureg_DECL_constant(ureg, 2);
3503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_TEX(ureg, y,
3523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            TGSI_TEXTURE_2D, pos, y_sampler);
3533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_TEX(ureg, u,
3543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            TGSI_TEXTURE_2D, pos, u_sampler);
3553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_TEX(ureg, v,
3563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            TGSI_TEXTURE_2D, pos, v_sampler);
3573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_SUB(ureg, u, ureg_src(u),
3593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_scalar(matrow0, TGSI_SWIZZLE_W));
3603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_SUB(ureg, v, ureg_src(v),
3613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_scalar(matrow0, TGSI_SWIZZLE_W));
3623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_MUL(ureg, rgb,
3643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_scalar(ureg_src(y), TGSI_SWIZZLE_X),
3653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            matrow0);
3663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_MAD(ureg, rgb,
3673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_scalar(ureg_src(u), TGSI_SWIZZLE_X),
3683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            matrow1,
3693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_src(rgb));
3703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_MAD(ureg, rgb,
3713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_scalar(ureg_src(v), TGSI_SWIZZLE_X),
3723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            matrow2,
3733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_src(rgb));
3743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* rgb.a = 1; */
3763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_MOV(ureg, ureg_writemask(rgb, TGSI_WRITEMASK_W),
3773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_scalar(matrow0, TGSI_SWIZZLE_X));
3783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_MOV(ureg, out, ureg_src(rgb));
3803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_release_temporary(ureg, rgb);
3823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_release_temporary(ureg, y);
3833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_release_temporary(ureg, u);
3843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_release_temporary(ureg, v);
3853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_END(ureg);
3873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return ureg_create_shader_and_destroy(ureg, pipe);
3893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
3903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic INLINE void
3933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgxrender_tex(struct ureg_program *ureg,
3943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            struct ureg_dst dst,
3953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            struct ureg_src coords,
3963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            struct ureg_src sampler,
3973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            struct ureg_src imm0,
3983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            boolean repeat_none,
3993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            boolean swizzle,
4003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            boolean set_alpha)
4013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
4023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (repeat_none) {
4033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      struct ureg_dst tmp0 = ureg_DECL_temporary(ureg);
4043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      struct ureg_dst tmp1 = ureg_DECL_temporary(ureg);
4053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      ureg_SGT(ureg, tmp1, ureg_swizzle(coords,
4063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                        TGSI_SWIZZLE_X,
4073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                        TGSI_SWIZZLE_Y,
4083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                        TGSI_SWIZZLE_X,
4093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                        TGSI_SWIZZLE_Y),
4103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org               ureg_scalar(imm0, TGSI_SWIZZLE_X));
4113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      ureg_SLT(ureg, tmp0, ureg_swizzle(coords,
4123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                        TGSI_SWIZZLE_X,
4133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                        TGSI_SWIZZLE_Y,
4143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                        TGSI_SWIZZLE_X,
4153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                        TGSI_SWIZZLE_Y),
4163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org               ureg_scalar(imm0, TGSI_SWIZZLE_W));
4173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      ureg_MIN(ureg, tmp0, ureg_src(tmp0), ureg_src(tmp1));
4183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      ureg_MIN(ureg, tmp0, ureg_scalar(ureg_src(tmp0), TGSI_SWIZZLE_X),
4193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org               ureg_scalar(ureg_src(tmp0), TGSI_SWIZZLE_Y));
4203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      ureg_TEX(ureg, tmp1, TGSI_TEXTURE_2D, coords, sampler);
4213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (swizzle)
4223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         ureg_MOV(ureg, tmp1, ureg_swizzle(ureg_src(tmp1),
4233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                           TGSI_SWIZZLE_Z,
4243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                           TGSI_SWIZZLE_Y,
4253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                           TGSI_SWIZZLE_X,
4263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                           TGSI_SWIZZLE_W));
4273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (set_alpha)
4283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         ureg_MOV(ureg,
4293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                  ureg_writemask(tmp1, TGSI_WRITEMASK_W),
4303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                  ureg_scalar(imm0, TGSI_SWIZZLE_W));
4313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      ureg_MUL(ureg, dst, ureg_src(tmp1), ureg_src(tmp0));
4323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      ureg_release_temporary(ureg, tmp0);
4333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      ureg_release_temporary(ureg, tmp1);
4343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   } else {
4353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (swizzle) {
4363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         struct ureg_dst tmp = ureg_DECL_temporary(ureg);
4373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         ureg_TEX(ureg, tmp, TGSI_TEXTURE_2D, coords, sampler);
4383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         ureg_MOV(ureg, dst, ureg_swizzle(ureg_src(tmp),
4393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                          TGSI_SWIZZLE_Z,
4403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                          TGSI_SWIZZLE_Y,
4413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                          TGSI_SWIZZLE_X,
4423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                          TGSI_SWIZZLE_W));
4433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         ureg_release_temporary(ureg, tmp);
4443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      } else {
4453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         ureg_TEX(ureg, dst, TGSI_TEXTURE_2D, coords, sampler);
4463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
4473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (set_alpha)
4483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         ureg_MOV(ureg,
4493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                  ureg_writemask(dst, TGSI_WRITEMASK_W),
4503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                  ureg_scalar(imm0, TGSI_SWIZZLE_W));
4513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
4523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
4533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void *
4553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgcreate_fs(struct pipe_context *pipe,
4563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org          unsigned fs_traits)
4573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
4583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct ureg_program *ureg;
4593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct ureg_src /*dst_sampler,*/ src_sampler, mask_sampler;
4603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct ureg_src /*dst_pos,*/ src_input, mask_pos;
4613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct ureg_dst src, mask;
4623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct ureg_dst out;
4633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct ureg_src imm0 = { 0 };
4643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   unsigned has_mask = (fs_traits & FS_MASK) != 0;
4653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   unsigned is_fill = (fs_traits & FS_FILL) != 0;
4663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   unsigned is_composite = (fs_traits & FS_COMPOSITE) != 0;
4673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   unsigned is_solid   = (fs_traits & FS_SOLID_FILL) != 0;
4683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   unsigned is_lingrad = (fs_traits & FS_LINGRAD_FILL) != 0;
4693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   unsigned is_radgrad = (fs_traits & FS_RADGRAD_FILL) != 0;
4703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   unsigned comp_alpha_mask = fs_traits & FS_COMPONENT_ALPHA;
4713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   unsigned is_yuv = (fs_traits & FS_YUV) != 0;
4723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   unsigned src_repeat_none = (fs_traits & FS_SRC_REPEAT_NONE) != 0;
4733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   unsigned mask_repeat_none = (fs_traits & FS_MASK_REPEAT_NONE) != 0;
4743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   unsigned src_swizzle = (fs_traits & FS_SRC_SWIZZLE_RGB) != 0;
4753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   unsigned mask_swizzle = (fs_traits & FS_MASK_SWIZZLE_RGB) != 0;
4763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   unsigned src_set_alpha = (fs_traits & FS_SRC_SET_ALPHA) != 0;
4773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   unsigned mask_set_alpha = (fs_traits & FS_MASK_SET_ALPHA) != 0;
4783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   unsigned src_luminance = (fs_traits & FS_SRC_LUMINANCE) != 0;
4793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   unsigned mask_luminance = (fs_traits & FS_MASK_LUMINANCE) != 0;
4803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#if 0
4823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   print_fs_traits(fs_traits);
4833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#else
4843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   (void)print_fs_traits;
4853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#endif
4863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg = ureg_create(TGSI_PROCESSOR_FRAGMENT);
4883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (ureg == NULL)
4893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return 0;
4903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   /* it has to be either a fill, a composite op or a yuv conversion */
4923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   debug_assert((is_fill ^ is_composite) ^ is_yuv);
493760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   (void) is_yuv;
4943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   out = ureg_DECL_output(ureg,
4963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                          TGSI_SEMANTIC_COLOR,
4973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                          0);
4983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (src_repeat_none || mask_repeat_none ||
5003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org       src_set_alpha || mask_set_alpha ||
5013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org       src_luminance) {
5023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      imm0 = ureg_imm4f(ureg, 0, 0, 0, 1);
5033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
5043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (is_composite) {
5053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      src_sampler = ureg_DECL_sampler(ureg, 0);
5063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      src_input = ureg_DECL_fs_input(ureg,
5073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                     TGSI_SEMANTIC_GENERIC,
5083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                     0,
5093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                     TGSI_INTERPOLATE_PERSPECTIVE);
5103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   } else if (is_fill) {
5113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (is_solid)
5123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         src_input = ureg_DECL_fs_input(ureg,
5133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                        TGSI_SEMANTIC_COLOR,
5143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                        0,
5153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                        TGSI_INTERPOLATE_PERSPECTIVE);
5163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      else
5173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         src_input = ureg_DECL_fs_input(ureg,
5183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                        TGSI_SEMANTIC_POSITION,
5193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                        0,
5203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                        TGSI_INTERPOLATE_PERSPECTIVE);
5213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   } else {
5223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      debug_assert(is_yuv);
5233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return create_yuv_shader(pipe, ureg);
5243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
5253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (has_mask) {
5273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      mask_sampler = ureg_DECL_sampler(ureg, 1);
5283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      mask_pos = ureg_DECL_fs_input(ureg,
5293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                    TGSI_SEMANTIC_GENERIC,
5303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                    1,
5313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                    TGSI_INTERPOLATE_PERSPECTIVE);
5323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
5333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#if 0  /* unused right now */
5353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   dst_sampler = ureg_DECL_sampler(ureg, 2);
5363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   dst_pos = ureg_DECL_fs_input(ureg,
5373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                TGSI_SEMANTIC_POSITION,
5383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                2,
5393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                TGSI_INTERPOLATE_PERSPECTIVE);
5403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#endif
5413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (is_composite) {
5443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (has_mask || src_luminance)
5453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         src = ureg_DECL_temporary(ureg);
5463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      else
5473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         src = out;
5483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      xrender_tex(ureg, src, src_input, src_sampler, imm0,
5493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                  src_repeat_none, src_swizzle, src_set_alpha);
5503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   } else if (is_fill) {
5513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (is_solid) {
5523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         if (has_mask || src_luminance)
5533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            src = ureg_dst(src_input);
5543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         else
5553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            ureg_MOV(ureg, out, src_input);
5563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      } else if (is_lingrad || is_radgrad) {
5573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         struct ureg_src coords, const0124,
5583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            matrow0, matrow1, matrow2;
5593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         if (has_mask || src_luminance)
5613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            src = ureg_DECL_temporary(ureg);
5623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         else
5633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            src = out;
5643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         coords = ureg_DECL_constant(ureg, 0);
5663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         const0124 = ureg_DECL_constant(ureg, 1);
5673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         matrow0 = ureg_DECL_constant(ureg, 2);
5683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         matrow1 = ureg_DECL_constant(ureg, 3);
5693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         matrow2 = ureg_DECL_constant(ureg, 4);
5703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         if (is_lingrad) {
5723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            linear_gradient(ureg, src,
5733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                            src_input, src_sampler,
5743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                            coords, const0124,
5753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                            matrow0, matrow1, matrow2);
5763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         } else if (is_radgrad) {
5773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org            radial_gradient(ureg, src,
5783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                            src_input, src_sampler,
5793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                            coords, const0124,
5803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                            matrow0, matrow1, matrow2);
5813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         }
5823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      } else
5833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         debug_assert(!"Unknown fill type!");
5843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
5853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (src_luminance) {
5863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      ureg_MOV(ureg, src,
5873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org               ureg_scalar(ureg_src(src), TGSI_SWIZZLE_X));
5883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      ureg_MOV(ureg, ureg_writemask(src, TGSI_WRITEMASK_XYZ),
5893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org               ureg_scalar(imm0, TGSI_SWIZZLE_X));
5903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (!has_mask)
5913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         ureg_MOV(ureg, out, ureg_src(src));
5923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
5933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (has_mask) {
5953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      mask = ureg_DECL_temporary(ureg);
5963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      xrender_tex(ureg, mask, mask_pos, mask_sampler, imm0,
5973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                  mask_repeat_none, mask_swizzle, mask_set_alpha);
5983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      /* src IN mask */
5993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      src_in_mask(ureg, out, ureg_src(src), ureg_src(mask),
6003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                  comp_alpha_mask, mask_luminance);
6013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      ureg_release_temporary(ureg, mask);
6023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
6033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   ureg_END(ureg);
6053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return ureg_create_shader_and_destroy(ureg, pipe);
6073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
6083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstruct xorg_shaders * xorg_shaders_create(struct xorg_renderer *r)
6103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
6113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct xorg_shaders *sc = CALLOC_STRUCT(xorg_shaders);
6123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   sc->r = r;
6143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   sc->vs_hash = cso_hash_create();
6153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   sc->fs_hash = cso_hash_create();
6163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return sc;
6183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
6193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void
6213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgcache_destroy(struct cso_context *cso,
6223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org              struct cso_hash *hash,
6233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org              unsigned processor)
6243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
6253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct cso_hash_iter iter = cso_hash_first_node(hash);
6263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   while (!cso_hash_iter_is_null(iter)) {
6273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      void *shader = (void *)cso_hash_iter_data(iter);
6283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (processor == PIPE_SHADER_FRAGMENT) {
6293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         cso_delete_fragment_shader(cso, shader);
6303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      } else if (processor == PIPE_SHADER_VERTEX) {
6313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         cso_delete_vertex_shader(cso, shader);
6323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
6333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      iter = cso_hash_erase(hash, iter);
6343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
6353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   cso_hash_delete(hash);
6363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
6373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid xorg_shaders_destroy(struct xorg_shaders *sc)
6393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
6403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   cache_destroy(sc->r->cso, sc->vs_hash,
6413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                 PIPE_SHADER_VERTEX);
6423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   cache_destroy(sc->r->cso, sc->fs_hash,
6433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                 PIPE_SHADER_FRAGMENT);
6443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
645760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org   FREE(sc);
6463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
6473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic INLINE void *
6493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgshader_from_cache(struct pipe_context *pipe,
6503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                  unsigned type,
6513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                  struct cso_hash *hash,
6523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                  unsigned key)
6533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
6543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   void *shader = 0;
6553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct cso_hash_iter iter = cso_hash_find(hash, key);
6573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (cso_hash_iter_is_null(iter)) {
6593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (type == PIPE_SHADER_VERTEX)
6603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         shader = create_vs(pipe, key);
6613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      else
6623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org         shader = create_fs(pipe, key);
6633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      cso_hash_insert(hash, key, shader);
6643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   } else
6653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      shader = (void *)cso_hash_iter_data(iter);
6663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return shader;
6683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
6693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstruct xorg_shader xorg_shaders_get(struct xorg_shaders *sc,
6713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                    unsigned vs_traits,
6723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                    unsigned fs_traits)
6733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
6743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct xorg_shader shader = { NULL, NULL };
6753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   void *vs, *fs;
6763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   vs = shader_from_cache(sc->r->pipe, PIPE_SHADER_VERTEX,
6783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                          sc->vs_hash, vs_traits);
6793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   fs = shader_from_cache(sc->r->pipe, PIPE_SHADER_FRAGMENT,
6803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                          sc->fs_hash, fs_traits);
6813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   debug_assert(vs && fs);
6833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (!vs || !fs)
6843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return shader;
6853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   shader.vs = vs;
6873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   shader.fs = fs;
6883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return shader;
6903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
691