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