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