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