19f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom/**********************************************************
29f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * Copyright 2009-2011 VMware, Inc. All rights reserved.
39f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom *
49f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * Permission is hereby granted, free of charge, to any person
59f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * obtaining a copy of this software and associated documentation
69f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * files (the "Software"), to deal in the Software without
79f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * restriction, including without limitation the rights to use, copy,
89f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * modify, merge, publish, distribute, sublicense, and/or sell copies
99f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * of the Software, and to permit persons to whom the Software is
109f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * furnished to do so, subject to the following conditions:
119f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom *
129f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * The above copyright notice and this permission notice shall be
139f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * included in all copies or substantial portions of the Software.
149f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom *
159f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
169f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
179f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
189f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
199f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
209f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
219f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
229f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * SOFTWARE.
239f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom *
249f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom *********************************************************
259f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * Authors:
269f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * Zack Rusin <zackr-at-vmware-dot-com>
279f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom */
289f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom#include "xa_priv.h"
299f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
309f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom#include "pipe/p_format.h"
319f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom#include "pipe/p_context.h"
329f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom#include "pipe/p_state.h"
339f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom#include "pipe/p_shader_tokens.h"
349f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
359f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom#include "util/u_memory.h"
369f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
379f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom#include "tgsi/tgsi_ureg.h"
389f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
399f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom#include "cso_cache/cso_context.h"
409f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom#include "cso_cache/cso_hash.h"
419f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
429f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom/* Vertex shader:
439f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * IN[0]    = vertex pos
449f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * IN[1]    = src tex coord | solid fill color
459f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * IN[2]    = mask tex coord
469f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * IN[3]    = dst tex coord
479f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * CONST[0] = (2/dst_width, 2/dst_height, 1, 1)
489f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * CONST[1] = (-1, -1, 0, 0)
499f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom *
509f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * OUT[0]   = vertex pos
519f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * OUT[1]   = src tex coord | solid fill color
529f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * OUT[2]   = mask tex coord
539f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * OUT[3]   = dst tex coord
549f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom */
559f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
569f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom/* Fragment shader:
579f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * SAMP[0]  = src
589f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * SAMP[1]  = mask
599f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * SAMP[2]  = dst
609f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * IN[0]    = pos src | solid fill color
619f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * IN[1]    = pos mask
629f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * IN[2]    = pos dst
639f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * CONST[0] = (0, 0, 0, 1)
649f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom *
659f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom * OUT[0] = color
669f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom */
679f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
689f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromstatic void
699f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromprint_fs_traits(int fs_traits)
709f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
719f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    const char *strings[] = {
729f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	"FS_COMPOSITE",		/* = 1 << 0, */
739f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	"FS_MASK",		/* = 1 << 1, */
749f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	"FS_SOLID_FILL",	/* = 1 << 2, */
759f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	"FS_LINGRAD_FILL",	/* = 1 << 3, */
769f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	"FS_RADGRAD_FILL",	/* = 1 << 4, */
779f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	"FS_CA_FULL",		/* = 1 << 5, *//* src.rgba * mask.rgba */
789f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	"FS_CA_SRCALPHA",	/* = 1 << 6, *//* src.aaaa * mask.rgba */
799f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	"FS_YUV",		/* = 1 << 7, */
809f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	"FS_SRC_REPEAT_NONE",	/* = 1 << 8, */
819f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	"FS_MASK_REPEAT_NONE",	/* = 1 << 9, */
829f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	"FS_SRC_SWIZZLE_RGB",	/* = 1 << 10, */
839f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	"FS_MASK_SWIZZLE_RGB",	/* = 1 << 11, */
849f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	"FS_SRC_SET_ALPHA",	/* = 1 << 12, */
859f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	"FS_MASK_SET_ALPHA",	/* = 1 << 13, */
869f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	"FS_SRC_LUMINANCE",	/* = 1 << 14, */
879f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	"FS_MASK_LUMINANCE",	/* = 1 << 15, */
88568d99cc6c8eea75ce50fe29e1ea8a94fe7ff7a7Thomas Hellstrom	"FS_DST_LUMINANCE",     /* = 1 << 15, */
899f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    };
909f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    int i, k;
919f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
929f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    debug_printf("%s: ", __func__);
939f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
949f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    for (i = 0, k = 1; k < (1 << 16); i++, k <<= 1) {
959f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	if (fs_traits & k)
969f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    debug_printf("%s, ", strings[i]);
979f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    }
989f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
999f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    debug_printf("\n");
1009f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
1019f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1029f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromstruct xa_shaders {
1039f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct xa_context *r;
1049f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1059f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct cso_hash *vs_hash;
1069f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct cso_hash *fs_hash;
1079f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom};
1089f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1099f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromstatic INLINE void
1109f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromsrc_in_mask(struct ureg_program *ureg,
1119f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    struct ureg_dst dst,
1129f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    struct ureg_src src,
1139f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    struct ureg_src mask,
1149f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    unsigned component_alpha, unsigned mask_luminance)
1159f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
1169f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    if (component_alpha == FS_CA_FULL) {
1179f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	ureg_MUL(ureg, dst, src, mask);
1189f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    } else if (component_alpha == FS_CA_SRCALPHA) {
1199f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	ureg_MUL(ureg, dst, ureg_scalar(src, TGSI_SWIZZLE_W), mask);
1209f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    } else {
1219f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	if (mask_luminance)
1229f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    ureg_MUL(ureg, dst, src, ureg_scalar(mask, TGSI_SWIZZLE_X));
1239f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	else
1249f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    ureg_MUL(ureg, dst, src, ureg_scalar(mask, TGSI_SWIZZLE_W));
1259f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    }
1269f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
1279f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1289f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromstatic struct ureg_src
1299f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromvs_normalize_coords(struct ureg_program *ureg,
1309f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		    struct ureg_src coords,
1319f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		    struct ureg_src const0, struct ureg_src const1)
1329f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
1339f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct ureg_dst tmp = ureg_DECL_temporary(ureg);
1349f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct ureg_src ret;
1359f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1369f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_MAD(ureg, tmp, coords, const0, const1);
1379f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ret = ureg_src(tmp);
1389f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_release_temporary(ureg, tmp);
1399f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    return ret;
1409f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
1419f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1429f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromstatic void
1439f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromlinear_gradient(struct ureg_program *ureg,
1449f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		struct ureg_dst out,
1459f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		struct ureg_src pos,
1469f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		struct ureg_src sampler,
1479f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		struct ureg_src coords,
1489f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		struct ureg_src const0124,
1499f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		struct ureg_src matrow0,
1509f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		struct ureg_src matrow1, struct ureg_src matrow2)
1519f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
1529f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct ureg_dst temp0 = ureg_DECL_temporary(ureg);
1539f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct ureg_dst temp1 = ureg_DECL_temporary(ureg);
1549f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct ureg_dst temp2 = ureg_DECL_temporary(ureg);
1559f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct ureg_dst temp3 = ureg_DECL_temporary(ureg);
1569f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct ureg_dst temp4 = ureg_DECL_temporary(ureg);
1579f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct ureg_dst temp5 = ureg_DECL_temporary(ureg);
1589f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1599f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_MOV(ureg, ureg_writemask(temp0, TGSI_WRITEMASK_XY), pos);
1609f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_MOV(ureg,
1619f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	     ureg_writemask(temp0, TGSI_WRITEMASK_Z),
1629f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	     ureg_scalar(const0124, TGSI_SWIZZLE_Y));
1639f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1649f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_DP3(ureg, temp1, matrow0, ureg_src(temp0));
1659f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_DP3(ureg, temp2, matrow1, ureg_src(temp0));
1669f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_DP3(ureg, temp3, matrow2, ureg_src(temp0));
1679f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_RCP(ureg, temp3, ureg_src(temp3));
1689f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_MUL(ureg, temp1, ureg_src(temp1), ureg_src(temp3));
1699f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_MUL(ureg, temp2, ureg_src(temp2), ureg_src(temp3));
1709f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1719f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_MOV(ureg, ureg_writemask(temp4, TGSI_WRITEMASK_X), ureg_src(temp1));
1729f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_MOV(ureg, ureg_writemask(temp4, TGSI_WRITEMASK_Y), ureg_src(temp2));
1739f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1749f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_MUL(ureg, temp0,
1759f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	     ureg_scalar(coords, TGSI_SWIZZLE_Y),
1769f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	     ureg_scalar(ureg_src(temp4), TGSI_SWIZZLE_Y));
1779f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_MAD(ureg, temp1,
1789f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	     ureg_scalar(coords, TGSI_SWIZZLE_X),
1799f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	     ureg_scalar(ureg_src(temp4), TGSI_SWIZZLE_X), ureg_src(temp0));
1809f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1819f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_MUL(ureg, temp2, ureg_src(temp1), ureg_scalar(coords, TGSI_SWIZZLE_Z));
1829f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1839f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_TEX(ureg, out, TGSI_TEXTURE_1D, ureg_src(temp2), sampler);
1849f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1859f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_release_temporary(ureg, temp0);
1869f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_release_temporary(ureg, temp1);
1879f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_release_temporary(ureg, temp2);
1889f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_release_temporary(ureg, temp3);
1899f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_release_temporary(ureg, temp4);
1909f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_release_temporary(ureg, temp5);
1919f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
1929f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
1939f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromstatic void
1949f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromradial_gradient(struct ureg_program *ureg,
1959f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		struct ureg_dst out,
1969f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		struct ureg_src pos,
1979f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		struct ureg_src sampler,
1989f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		struct ureg_src coords,
1999f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		struct ureg_src const0124,
2009f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		struct ureg_src matrow0,
2019f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		struct ureg_src matrow1, struct ureg_src matrow2)
2029f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
2039f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct ureg_dst temp0 = ureg_DECL_temporary(ureg);
2049f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct ureg_dst temp1 = ureg_DECL_temporary(ureg);
2059f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct ureg_dst temp2 = ureg_DECL_temporary(ureg);
2069f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct ureg_dst temp3 = ureg_DECL_temporary(ureg);
2079f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct ureg_dst temp4 = ureg_DECL_temporary(ureg);
2089f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct ureg_dst temp5 = ureg_DECL_temporary(ureg);
2099f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
2109f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_MOV(ureg, ureg_writemask(temp0, TGSI_WRITEMASK_XY), pos);
2119f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_MOV(ureg,
2129f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	     ureg_writemask(temp0, TGSI_WRITEMASK_Z),
2139f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	     ureg_scalar(const0124, TGSI_SWIZZLE_Y));
2149f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
2159f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_DP3(ureg, temp1, matrow0, ureg_src(temp0));
2169f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_DP3(ureg, temp2, matrow1, ureg_src(temp0));
2179f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_DP3(ureg, temp3, matrow2, ureg_src(temp0));
2189f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_RCP(ureg, temp3, ureg_src(temp3));
2199f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_MUL(ureg, temp1, ureg_src(temp1), ureg_src(temp3));
2209f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_MUL(ureg, temp2, ureg_src(temp2), ureg_src(temp3));
2219f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
2229f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_MOV(ureg, ureg_writemask(temp5, TGSI_WRITEMASK_X), ureg_src(temp1));
2239f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_MOV(ureg, ureg_writemask(temp5, TGSI_WRITEMASK_Y), ureg_src(temp2));
2249f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
2259f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_MUL(ureg, temp0, ureg_scalar(coords, TGSI_SWIZZLE_Y),
2269f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	     ureg_scalar(ureg_src(temp5), TGSI_SWIZZLE_Y));
2279f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_MAD(ureg, temp1,
2289f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	     ureg_scalar(coords, TGSI_SWIZZLE_X),
2299f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	     ureg_scalar(ureg_src(temp5), TGSI_SWIZZLE_X), ureg_src(temp0));
2309f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_ADD(ureg, temp1, ureg_src(temp1), ureg_src(temp1));
2319f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_MUL(ureg, temp3,
2329f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	     ureg_scalar(ureg_src(temp5), TGSI_SWIZZLE_Y),
2339f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	     ureg_scalar(ureg_src(temp5), TGSI_SWIZZLE_Y));
2349f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_MAD(ureg, temp4,
2359f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	     ureg_scalar(ureg_src(temp5), TGSI_SWIZZLE_X),
2369f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	     ureg_scalar(ureg_src(temp5), TGSI_SWIZZLE_X), ureg_src(temp3));
2379f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_MOV(ureg, temp4, ureg_negate(ureg_src(temp4)));
2389f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_MUL(ureg, temp2, ureg_scalar(coords, TGSI_SWIZZLE_Z), ureg_src(temp4));
2399f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_MUL(ureg, temp0,
2409f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	     ureg_scalar(const0124, TGSI_SWIZZLE_W), ureg_src(temp2));
2419f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_MUL(ureg, temp3, ureg_src(temp1), ureg_src(temp1));
2429f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_SUB(ureg, temp2, ureg_src(temp3), ureg_src(temp0));
2439f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_RSQ(ureg, temp2, ureg_abs(ureg_src(temp2)));
2449f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_RCP(ureg, temp2, ureg_src(temp2));
2459f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_SUB(ureg, temp1, ureg_src(temp2), ureg_src(temp1));
2469f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_ADD(ureg, temp0,
2479f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	     ureg_scalar(coords, TGSI_SWIZZLE_Z),
2489f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	     ureg_scalar(coords, TGSI_SWIZZLE_Z));
2499f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_RCP(ureg, temp0, ureg_src(temp0));
2509f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_MUL(ureg, temp2, ureg_src(temp1), ureg_src(temp0));
2519f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_TEX(ureg, out, TGSI_TEXTURE_1D, ureg_src(temp2), sampler);
2529f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
2539f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_release_temporary(ureg, temp0);
2549f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_release_temporary(ureg, temp1);
2559f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_release_temporary(ureg, temp2);
2569f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_release_temporary(ureg, temp3);
2579f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_release_temporary(ureg, temp4);
2589f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_release_temporary(ureg, temp5);
2599f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
2609f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
2619f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromstatic void *
2629f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromcreate_vs(struct pipe_context *pipe, unsigned vs_traits)
2639f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
2649f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct ureg_program *ureg;
2659f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct ureg_src src;
2669f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct ureg_dst dst;
2679f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct ureg_src const0, const1;
2689f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    boolean is_fill = (vs_traits & VS_FILL) != 0;
2699f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    boolean is_composite = (vs_traits & VS_COMPOSITE) != 0;
2709f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    boolean has_mask = (vs_traits & VS_MASK) != 0;
2719f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    boolean is_yuv = (vs_traits & VS_YUV) != 0;
2729f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    unsigned input_slot = 0;
2739f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
2749f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg = ureg_create(TGSI_PROCESSOR_VERTEX);
2759f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    if (ureg == NULL)
2769f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	return 0;
2779f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
2789f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    const0 = ureg_DECL_constant(ureg, 0);
2799f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    const1 = ureg_DECL_constant(ureg, 1);
2809f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
2819f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    /* it has to be either a fill or a composite op */
2829f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    debug_assert((is_fill ^ is_composite) ^ is_yuv);
2839f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
2849f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    src = ureg_DECL_vs_input(ureg, input_slot++);
2859f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    dst = ureg_DECL_output(ureg, TGSI_SEMANTIC_POSITION, 0);
2869f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    src = vs_normalize_coords(ureg, src, const0, const1);
2879f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_MOV(ureg, dst, src);
2889f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
2899f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    if (is_yuv) {
2909f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	src = ureg_DECL_vs_input(ureg, input_slot++);
2919f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	dst = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 0);
2929f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	ureg_MOV(ureg, dst, src);
2939f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    }
2949f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
2959f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    if (is_composite) {
2969f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	src = ureg_DECL_vs_input(ureg, input_slot++);
2979f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	dst = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 0);
2989f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	ureg_MOV(ureg, dst, src);
2999f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    }
3009f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
3019f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    if (is_fill) {
3029f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	src = ureg_DECL_vs_input(ureg, input_slot++);
3039f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	dst = ureg_DECL_output(ureg, TGSI_SEMANTIC_COLOR, 0);
3049f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	ureg_MOV(ureg, dst, src);
3059f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    }
3069f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
3079f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    if (has_mask) {
3089f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	src = ureg_DECL_vs_input(ureg, input_slot++);
3099f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	dst = ureg_DECL_output(ureg, TGSI_SEMANTIC_GENERIC, 1);
3109f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	ureg_MOV(ureg, dst, src);
3119f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    }
3129f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
3139f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_END(ureg);
3149f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
3159f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    return ureg_create_shader_and_destroy(ureg, pipe);
3169f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
3179f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
3189f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromstatic void *
3199f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromcreate_yuv_shader(struct pipe_context *pipe, struct ureg_program *ureg)
3209f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
3219f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct ureg_src y_sampler, u_sampler, v_sampler;
3229f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct ureg_src pos;
323340c0f6f9ece070e3f3245134eabe80d7551a870Thomas Hellstrom    struct ureg_src matrow0, matrow1, matrow2, matrow3;
3249f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct ureg_dst y, u, v, rgb;
3259f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct ureg_dst out = ureg_DECL_output(ureg,
3269f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom					   TGSI_SEMANTIC_COLOR,
3279f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom					   0);
3289f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
3299f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    pos = ureg_DECL_fs_input(ureg,
3309f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom			     TGSI_SEMANTIC_GENERIC, 0,
3319f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom			     TGSI_INTERPOLATE_PERSPECTIVE);
3329f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
3339f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    rgb = ureg_DECL_temporary(ureg);
3349f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    y = ureg_DECL_temporary(ureg);
3359f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    u = ureg_DECL_temporary(ureg);
3369f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    v = ureg_DECL_temporary(ureg);
3379f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
3389f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    y_sampler = ureg_DECL_sampler(ureg, 0);
3399f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    u_sampler = ureg_DECL_sampler(ureg, 1);
3409f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    v_sampler = ureg_DECL_sampler(ureg, 2);
3419f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
3429f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    matrow0 = ureg_DECL_constant(ureg, 0);
3439f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    matrow1 = ureg_DECL_constant(ureg, 1);
3449f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    matrow2 = ureg_DECL_constant(ureg, 2);
345340c0f6f9ece070e3f3245134eabe80d7551a870Thomas Hellstrom    matrow3 = ureg_DECL_constant(ureg, 3);
3469f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
3479f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_TEX(ureg, y, TGSI_TEXTURE_2D, pos, y_sampler);
3489f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_TEX(ureg, u, TGSI_TEXTURE_2D, pos, u_sampler);
3499f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_TEX(ureg, v, TGSI_TEXTURE_2D, pos, v_sampler);
3509f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
351340c0f6f9ece070e3f3245134eabe80d7551a870Thomas Hellstrom    ureg_MOV(ureg, rgb, matrow3);
352340c0f6f9ece070e3f3245134eabe80d7551a870Thomas Hellstrom    ureg_MAD(ureg, rgb,
353340c0f6f9ece070e3f3245134eabe80d7551a870Thomas Hellstrom	     ureg_scalar(ureg_src(y), TGSI_SWIZZLE_X), matrow0, ureg_src(rgb));
3549f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_MAD(ureg, rgb,
3559f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	     ureg_scalar(ureg_src(u), TGSI_SWIZZLE_X), matrow1, ureg_src(rgb));
3569f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_MAD(ureg, rgb,
3579f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	     ureg_scalar(ureg_src(v), TGSI_SWIZZLE_X), matrow2, ureg_src(rgb));
3589f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
3599f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_MOV(ureg, out, ureg_src(rgb));
3609f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
3619f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_release_temporary(ureg, rgb);
3629f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_release_temporary(ureg, y);
3639f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_release_temporary(ureg, u);
3649f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_release_temporary(ureg, v);
3659f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
3669f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_END(ureg);
3679f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
3689f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    return ureg_create_shader_and_destroy(ureg, pipe);
3699f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
3709f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
3719f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromstatic INLINE void
3729f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromxrender_tex(struct ureg_program *ureg,
3739f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    struct ureg_dst dst,
3749f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    struct ureg_src coords,
3759f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    struct ureg_src sampler,
3769f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    struct ureg_src imm0,
3779f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    boolean repeat_none, boolean swizzle, boolean set_alpha)
3789f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
3799f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    if (repeat_none) {
3809f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	struct ureg_dst tmp0 = ureg_DECL_temporary(ureg);
3819f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	struct ureg_dst tmp1 = ureg_DECL_temporary(ureg);
3829f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
3839f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	ureg_SGT(ureg, tmp1, ureg_swizzle(coords,
3849f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom					  TGSI_SWIZZLE_X,
3859f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom					  TGSI_SWIZZLE_Y,
3869f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom					  TGSI_SWIZZLE_X,
3879f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom					  TGSI_SWIZZLE_Y), ureg_scalar(imm0,
3889f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom								       TGSI_SWIZZLE_X));
3899f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	ureg_SLT(ureg, tmp0,
3909f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		 ureg_swizzle(coords, TGSI_SWIZZLE_X, TGSI_SWIZZLE_Y,
3919f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom			      TGSI_SWIZZLE_X, TGSI_SWIZZLE_Y), ureg_scalar(imm0,
3929f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom									   TGSI_SWIZZLE_W));
3939f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	ureg_MIN(ureg, tmp0, ureg_src(tmp0), ureg_src(tmp1));
3949f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	ureg_MIN(ureg, tmp0, ureg_scalar(ureg_src(tmp0), TGSI_SWIZZLE_X),
3959f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		 ureg_scalar(ureg_src(tmp0), TGSI_SWIZZLE_Y));
3969f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	ureg_TEX(ureg, tmp1, TGSI_TEXTURE_2D, coords, sampler);
3979f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	if (swizzle)
3989f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    ureg_MOV(ureg, tmp1, ureg_swizzle(ureg_src(tmp1),
3999f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom					      TGSI_SWIZZLE_Z,
4009f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom					      TGSI_SWIZZLE_Y, TGSI_SWIZZLE_X,
4019f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom					      TGSI_SWIZZLE_W));
4029f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	if (set_alpha)
4039f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    ureg_MOV(ureg,
4049f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		     ureg_writemask(tmp1, TGSI_WRITEMASK_W),
4059f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		     ureg_scalar(imm0, TGSI_SWIZZLE_W));
4069f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	ureg_MUL(ureg, dst, ureg_src(tmp1), ureg_src(tmp0));
4079f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	ureg_release_temporary(ureg, tmp0);
4089f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	ureg_release_temporary(ureg, tmp1);
4099f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    } else {
4109f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	if (swizzle) {
4119f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    struct ureg_dst tmp = ureg_DECL_temporary(ureg);
4129f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
4139f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    ureg_TEX(ureg, tmp, TGSI_TEXTURE_2D, coords, sampler);
4149f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    ureg_MOV(ureg, dst, ureg_swizzle(ureg_src(tmp),
4159f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom					     TGSI_SWIZZLE_Z,
4169f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom					     TGSI_SWIZZLE_Y, TGSI_SWIZZLE_X,
4179f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom					     TGSI_SWIZZLE_W));
4189f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    ureg_release_temporary(ureg, tmp);
4199f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	} else {
4209f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    ureg_TEX(ureg, dst, TGSI_TEXTURE_2D, coords, sampler);
4219f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	}
4229f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	if (set_alpha)
4239f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    ureg_MOV(ureg,
4249f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		     ureg_writemask(dst, TGSI_WRITEMASK_W),
4259f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		     ureg_scalar(imm0, TGSI_SWIZZLE_W));
4269f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    }
4279f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
4289f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
4299f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromstatic void *
4309f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromcreate_fs(struct pipe_context *pipe, unsigned fs_traits)
4319f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
4329f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct ureg_program *ureg;
4339f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct ureg_src /*dst_sampler, */ src_sampler, mask_sampler;
4349f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct ureg_src /*dst_pos, */ src_input, mask_pos;
4359f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct ureg_dst src, mask;
4369f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct ureg_dst out;
4379f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct ureg_src imm0 = { 0 };
4389f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    unsigned has_mask = (fs_traits & FS_MASK) != 0;
4399f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    unsigned is_fill = (fs_traits & FS_FILL) != 0;
4409f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    unsigned is_composite = (fs_traits & FS_COMPOSITE) != 0;
4419f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    unsigned is_solid = (fs_traits & FS_SOLID_FILL) != 0;
4429f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    unsigned is_lingrad = (fs_traits & FS_LINGRAD_FILL) != 0;
4439f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    unsigned is_radgrad = (fs_traits & FS_RADGRAD_FILL) != 0;
4449f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    unsigned comp_alpha_mask = fs_traits & FS_COMPONENT_ALPHA;
4459f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    unsigned is_yuv = (fs_traits & FS_YUV) != 0;
4469f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    unsigned src_repeat_none = (fs_traits & FS_SRC_REPEAT_NONE) != 0;
4479f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    unsigned mask_repeat_none = (fs_traits & FS_MASK_REPEAT_NONE) != 0;
4489f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    unsigned src_swizzle = (fs_traits & FS_SRC_SWIZZLE_RGB) != 0;
4499f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    unsigned mask_swizzle = (fs_traits & FS_MASK_SWIZZLE_RGB) != 0;
4509f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    unsigned src_set_alpha = (fs_traits & FS_SRC_SET_ALPHA) != 0;
4519f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    unsigned mask_set_alpha = (fs_traits & FS_MASK_SET_ALPHA) != 0;
4529f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    unsigned src_luminance = (fs_traits & FS_SRC_LUMINANCE) != 0;
4539f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    unsigned mask_luminance = (fs_traits & FS_MASK_LUMINANCE) != 0;
454568d99cc6c8eea75ce50fe29e1ea8a94fe7ff7a7Thomas Hellstrom    unsigned dst_luminance = (fs_traits & FS_DST_LUMINANCE) != 0;
4559f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
4569f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom#if 0
4579f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    print_fs_traits(fs_traits);
4589f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom#else
4599f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    (void)print_fs_traits;
4609f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom#endif
4619f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
4629f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg = ureg_create(TGSI_PROCESSOR_FRAGMENT);
4639f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    if (ureg == NULL)
4649f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	return 0;
4659f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
4669f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    /* it has to be either a fill, a composite op or a yuv conversion */
4679f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    debug_assert((is_fill ^ is_composite) ^ is_yuv);
4689f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    (void)is_yuv;
4699f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
4709f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    out = ureg_DECL_output(ureg, TGSI_SEMANTIC_COLOR, 0);
4719f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
4729f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    if (src_repeat_none || mask_repeat_none ||
4739f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	src_set_alpha || mask_set_alpha || src_luminance) {
4749f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	imm0 = ureg_imm4f(ureg, 0, 0, 0, 1);
4759f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    }
4769f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    if (is_composite) {
4779f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	src_sampler = ureg_DECL_sampler(ureg, 0);
4789f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	src_input = ureg_DECL_fs_input(ureg,
4799f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom				       TGSI_SEMANTIC_GENERIC, 0,
4809f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom				       TGSI_INTERPOLATE_PERSPECTIVE);
4819f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    } else if (is_fill) {
4829f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	if (is_solid)
4839f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    src_input = ureg_DECL_fs_input(ureg,
4849f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom					   TGSI_SEMANTIC_COLOR, 0,
4859f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom					   TGSI_INTERPOLATE_PERSPECTIVE);
4869f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	else
4879f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    src_input = ureg_DECL_fs_input(ureg,
4889f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom					   TGSI_SEMANTIC_POSITION, 0,
4899f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom					   TGSI_INTERPOLATE_PERSPECTIVE);
4909f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    } else {
4919f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	debug_assert(is_yuv);
4929f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	return create_yuv_shader(pipe, ureg);
4939f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    }
4949f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
4959f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    if (has_mask) {
4969f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	mask_sampler = ureg_DECL_sampler(ureg, 1);
4979f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	mask_pos = ureg_DECL_fs_input(ureg,
4989f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom				      TGSI_SEMANTIC_GENERIC, 1,
4999f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom				      TGSI_INTERPOLATE_PERSPECTIVE);
5009f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    }
5019f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom#if 0				/* unused right now */
5029f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    dst_sampler = ureg_DECL_sampler(ureg, 2);
5039f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    dst_pos = ureg_DECL_fs_input(ureg,
5049f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom				 TGSI_SEMANTIC_POSITION, 2,
5059f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom				 TGSI_INTERPOLATE_PERSPECTIVE);
5069f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom#endif
5079f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
5089f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    if (is_composite) {
509568d99cc6c8eea75ce50fe29e1ea8a94fe7ff7a7Thomas Hellstrom	if (has_mask || src_luminance || dst_luminance)
5109f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    src = ureg_DECL_temporary(ureg);
5119f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	else
5129f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    src = out;
5139f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	xrender_tex(ureg, src, src_input, src_sampler, imm0,
5149f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		    src_repeat_none, src_swizzle, src_set_alpha);
5159f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    } else if (is_fill) {
5169f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	if (is_solid) {
517568d99cc6c8eea75ce50fe29e1ea8a94fe7ff7a7Thomas Hellstrom	    if (has_mask || src_luminance || dst_luminance)
5189f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		src = ureg_dst(src_input);
5199f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    else
5209f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		ureg_MOV(ureg, out, src_input);
5219f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	} else if (is_lingrad || is_radgrad) {
5229f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    struct ureg_src coords, const0124, matrow0, matrow1, matrow2;
5239f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
524568d99cc6c8eea75ce50fe29e1ea8a94fe7ff7a7Thomas Hellstrom	    if (has_mask || src_luminance || dst_luminance)
5259f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		src = ureg_DECL_temporary(ureg);
5269f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    else
5279f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		src = out;
5289f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
5299f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    coords = ureg_DECL_constant(ureg, 0);
5309f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    const0124 = ureg_DECL_constant(ureg, 1);
5319f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    matrow0 = ureg_DECL_constant(ureg, 2);
5329f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    matrow1 = ureg_DECL_constant(ureg, 3);
5339f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    matrow2 = ureg_DECL_constant(ureg, 4);
5349f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
5359f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    if (is_lingrad) {
5369f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		linear_gradient(ureg, src,
5379f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom				src_input, src_sampler,
5389f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom				coords, const0124, matrow0, matrow1, matrow2);
5399f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    } else if (is_radgrad) {
5409f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		radial_gradient(ureg, src,
5419f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom				src_input, src_sampler,
5429f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom				coords, const0124, matrow0, matrow1, matrow2);
5439f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    }
5449f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	} else
5459f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    debug_assert(!"Unknown fill type!");
5469f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    }
5479f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    if (src_luminance) {
5489f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	ureg_MOV(ureg, src, ureg_scalar(ureg_src(src), TGSI_SWIZZLE_X));
5499f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	ureg_MOV(ureg, ureg_writemask(src, TGSI_WRITEMASK_XYZ),
5509f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		 ureg_scalar(imm0, TGSI_SWIZZLE_X));
551568d99cc6c8eea75ce50fe29e1ea8a94fe7ff7a7Thomas Hellstrom	if (!has_mask && !dst_luminance)
5529f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    ureg_MOV(ureg, out, ureg_src(src));
5539f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    }
5549f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
5559f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    if (has_mask) {
5569f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	mask = ureg_DECL_temporary(ureg);
5579f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	xrender_tex(ureg, mask, mask_pos, mask_sampler, imm0,
5589f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		    mask_repeat_none, mask_swizzle, mask_set_alpha);
5599f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	/* src IN mask */
560568d99cc6c8eea75ce50fe29e1ea8a94fe7ff7a7Thomas Hellstrom
561568d99cc6c8eea75ce50fe29e1ea8a94fe7ff7a7Thomas Hellstrom	src_in_mask(ureg, (dst_luminance) ? src : out, ureg_src(src),
562568d99cc6c8eea75ce50fe29e1ea8a94fe7ff7a7Thomas Hellstrom		    ureg_src(mask),
5639f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		    comp_alpha_mask, mask_luminance);
564568d99cc6c8eea75ce50fe29e1ea8a94fe7ff7a7Thomas Hellstrom
5659f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	ureg_release_temporary(ureg, mask);
5669f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    }
5679f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
568568d99cc6c8eea75ce50fe29e1ea8a94fe7ff7a7Thomas Hellstrom    if (dst_luminance) {
569568d99cc6c8eea75ce50fe29e1ea8a94fe7ff7a7Thomas Hellstrom	/*
570568d99cc6c8eea75ce50fe29e1ea8a94fe7ff7a7Thomas Hellstrom	 * Make sure the alpha channel goes into the output L8 surface.
571568d99cc6c8eea75ce50fe29e1ea8a94fe7ff7a7Thomas Hellstrom	 */
572568d99cc6c8eea75ce50fe29e1ea8a94fe7ff7a7Thomas Hellstrom	ureg_MOV(ureg, out, ureg_scalar(ureg_src(src), TGSI_SWIZZLE_W));
573568d99cc6c8eea75ce50fe29e1ea8a94fe7ff7a7Thomas Hellstrom    }
574568d99cc6c8eea75ce50fe29e1ea8a94fe7ff7a7Thomas Hellstrom
5759f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    ureg_END(ureg);
5769f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
5779f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    return ureg_create_shader_and_destroy(ureg, pipe);
5789f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
5799f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
5809f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromstruct xa_shaders *
5819f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromxa_shaders_create(struct xa_context *r)
5829f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
5839f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct xa_shaders *sc = CALLOC_STRUCT(xa_shaders);
5849f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
5859f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    sc->r = r;
5869f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    sc->vs_hash = cso_hash_create();
5879f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    sc->fs_hash = cso_hash_create();
5889f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
5899f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    return sc;
5909f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
5919f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
5929f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromstatic void
5939f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromcache_destroy(struct cso_context *cso,
5949f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	      struct cso_hash *hash, unsigned processor)
5959f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
5969f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct cso_hash_iter iter = cso_hash_first_node(hash);
5979f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
5989f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    while (!cso_hash_iter_is_null(iter)) {
5999f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	void *shader = (void *)cso_hash_iter_data(iter);
6009f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
6019f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	if (processor == PIPE_SHADER_FRAGMENT) {
6029f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    cso_delete_fragment_shader(cso, shader);
6039f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	} else if (processor == PIPE_SHADER_VERTEX) {
6049f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    cso_delete_vertex_shader(cso, shader);
6059f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	}
6069f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	iter = cso_hash_erase(hash, iter);
6079f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    }
6089f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    cso_hash_delete(hash);
6099f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
6109f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
6119f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromvoid
6129f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromxa_shaders_destroy(struct xa_shaders *sc)
6139f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
6149f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    cache_destroy(sc->r->cso, sc->vs_hash, PIPE_SHADER_VERTEX);
6159f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    cache_destroy(sc->r->cso, sc->fs_hash, PIPE_SHADER_FRAGMENT);
6169f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
6179f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    FREE(sc);
6189f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
6199f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
6209f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromstatic INLINE void *
6219f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromshader_from_cache(struct pipe_context *pipe,
6229f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom		  unsigned type, struct cso_hash *hash, unsigned key)
6239f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
6249f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    void *shader = 0;
6259f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
6269f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct cso_hash_iter iter = cso_hash_find(hash, key);
6279f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
6289f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    if (cso_hash_iter_is_null(iter)) {
6299f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	if (type == PIPE_SHADER_VERTEX)
6309f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    shader = create_vs(pipe, key);
6319f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	else
6329f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	    shader = create_fs(pipe, key);
6339f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	cso_hash_insert(hash, key, shader);
6349f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    } else
6359f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	shader = (void *)cso_hash_iter_data(iter);
6369f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
6379f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    return shader;
6389f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
6399f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
6409f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromstruct xa_shader
6419f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstromxa_shaders_get(struct xa_shaders *sc, unsigned vs_traits, unsigned fs_traits)
6429f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom{
6439f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    struct xa_shader shader = { NULL, NULL };
6449f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    void *vs, *fs;
6459f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
6469f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    vs = shader_from_cache(sc->r->pipe, PIPE_SHADER_VERTEX,
6479f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom			   sc->vs_hash, vs_traits);
6489f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    fs = shader_from_cache(sc->r->pipe, PIPE_SHADER_FRAGMENT,
6499f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom			   sc->fs_hash, fs_traits);
6509f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
6519f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    debug_assert(vs && fs);
6529f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    if (!vs || !fs)
6539f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom	return shader;
6549f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
6559f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    shader.vs = vs;
6569f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    shader.fs = fs;
6579f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom
6589f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom    return shader;
6599f2f5b3d7fd70663b98da5d302fcdfd5bc93db05Thomas Hellstrom}
660