asm_fill.h revision ba1128db4582d8c54834b771749ee503738243fc
11cb2d742eb6635aeab6132ee5f0b5781d39487d7Nico Weber/************************************************************************** 2143520261eb41411beb3e2a8cf6d8dc822db7d50Eli Friedman * 31b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner * Copyright 2009 VMware, Inc. All Rights Reserved. 41b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner * 52d67097ad41f4c2fe82ebce3f587e06498f1bd71Richard Smith * Permission is hereby granted, free of charge, to any person obtaining a 61b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner * copy of this software and associated documentation files (the 71b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner * "Software"), to deal in the Software without restriction, including 81b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner * without limitation the rights to use, copy, modify, merge, publish, 91b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner * distribute, sub license, and/or sell copies of the Software, and to 101b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner * permit persons to whom the Software is furnished to do so, subject to 111b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner * the following conditions: 121b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner * 131b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner * The above copyright notice and this permission notice (including the 141b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner * next paragraph) shall be included in all copies or substantial portions 151b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner * of the Software. 161b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner * 171b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 181b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 191b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 201b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 211b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 221b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 231b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 241b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner * 251b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner **************************************************************************/ 261b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner 275caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner#ifndef ASM_FILL_H 28634785ca8423b6dd6c15e80714a076c3aaa5a047Chris Lattner#define ASM_FILL_H 297da71020b97c69b95831bd03d35e8e8404bfdea0Fariborz Jahanian 30db9e9e61f8311d8852bd15730f78e56f3ffa0508Ted Kremenek#include "tgsi/tgsi_ureg.h" 312fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieu 32634785ca8423b6dd6c15e80714a076c3aaa5a047Chris Lattnertypedef void (* ureg_func)( struct ureg_program *ureg, 331b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner struct ureg_dst *out, 341b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner struct ureg_src *in, 3595e2c71181c7ec1ffea0066bbae49e8742bd0687Chris Lattner struct ureg_src *sampler, 365caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner struct ureg_dst *temp, 375caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner struct ureg_src *constant); 38d1969d803cfcc65f1c334df4cc89c7fdd33ee4c9Mike Stump 395caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattnerstatic INLINE void 402fb985bdda20037bda228628acd4cbaa8a3b36acGabor Greifsolid_fill( struct ureg_program *ureg, 415caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner struct ureg_dst *out, 425caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner struct ureg_src *in, 4380a8eb76a0043271adcfee5cb1e643ce3927fcbfEli Friedman struct ureg_src *sampler, 44d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth struct ureg_dst *temp, 45d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth struct ureg_src *constant) 46d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth{ 47db4325b098eff5e9e660db19f0148423fb21f27fChandler Carruth ureg_MOV(ureg, *out, constant[0]); 48db4325b098eff5e9e660db19f0148423fb21f27fChandler Carruth} 49db4325b098eff5e9e660db19f0148423fb21f27fChandler Carruth 50db4325b098eff5e9e660db19f0148423fb21f27fChandler Carruthstatic INLINE void 51db4325b098eff5e9e660db19f0148423fb21f27fChandler Carruthlinear_grad( struct ureg_program *ureg, 525caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner struct ureg_dst *out, 5321190d54634d6e244e85d28ad915ce2fe86ecbffChris Lattner struct ureg_src *in, 542ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara struct ureg_src *sampler, 552ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara struct ureg_dst *temp, 562ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara struct ureg_src *constant) 572ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara{ 582ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara 592ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara ureg_MOV(ureg, 602ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara ureg_writemask(temp[0], TGSI_WRITEMASK_XY), 612ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara in[0]); 622ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara ureg_MOV(ureg, 632ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara ureg_writemask(temp[0], TGSI_WRITEMASK_Z), 642ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara ureg_scalar(constant[1], TGSI_SWIZZLE_Y)); 652ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara ureg_DP3(ureg, temp[1], constant[2], ureg_src(temp[0])); 662ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara ureg_DP3(ureg, temp[2], constant[3], ureg_src(temp[0])); 672ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara ureg_DP3(ureg, temp[3], constant[4], ureg_src(temp[0])); 6821190d54634d6e244e85d28ad915ce2fe86ecbffChris Lattner ureg_RCP(ureg, temp[3], ureg_src(temp[3])); 6921190d54634d6e244e85d28ad915ce2fe86ecbffChris Lattner ureg_MUL(ureg, temp[1], ureg_src(temp[1]), ureg_src(temp[3])); 7021190d54634d6e244e85d28ad915ce2fe86ecbffChris Lattner ureg_MUL(ureg, temp[2], ureg_src(temp[2]), ureg_src(temp[3])); 7121190d54634d6e244e85d28ad915ce2fe86ecbffChris Lattner ureg_MOV(ureg, ureg_writemask(temp[4], TGSI_WRITEMASK_X), ureg_src(temp[1])); 7221190d54634d6e244e85d28ad915ce2fe86ecbffChris Lattner ureg_MOV(ureg, ureg_writemask(temp[4], TGSI_WRITEMASK_Y), ureg_src(temp[2])); 732fb985bdda20037bda228628acd4cbaa8a3b36acGabor Greif ureg_MUL(ureg, temp[0], 7421190d54634d6e244e85d28ad915ce2fe86ecbffChris Lattner ureg_scalar(constant[0], TGSI_SWIZZLE_Y), 752fb985bdda20037bda228628acd4cbaa8a3b36acGabor Greif ureg_scalar(ureg_src(temp[4]), TGSI_SWIZZLE_Y)); 7621190d54634d6e244e85d28ad915ce2fe86ecbffChris Lattner ureg_MAD(ureg, temp[1], 7721190d54634d6e244e85d28ad915ce2fe86ecbffChris Lattner ureg_scalar(constant[0], TGSI_SWIZZLE_X), 7821fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner ureg_scalar(ureg_src(temp[4]), TGSI_SWIZZLE_X), 7921fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner ureg_src(temp[0])); 802fb985bdda20037bda228628acd4cbaa8a3b36acGabor Greif ureg_MUL(ureg, temp[2], ureg_src(temp[1]), 8121fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner ureg_scalar(constant[0], TGSI_SWIZZLE_Z)); 8221fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner ureg_TEX(ureg, *out, TGSI_TEXTURE_1D, ureg_src(temp[2]), sampler[0]); 8321fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner} 8421fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner 855e8965525282a48fd34af05183b8c3705a5b00d5Eric Christopherstatic INLINE void 8621fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattnerradial_grad( struct ureg_program *ureg, 8721fb98ee003e992b0c4e204d98a19e0ef544cae3Chris Lattner struct ureg_dst *out, 8850dd255e5ad05f0d44bb92f358ff3f541a3d7a4bChris Lattner struct ureg_src *in, 8950dd255e5ad05f0d44bb92f358ff3f541a3d7a4bChris Lattner struct ureg_src *sampler, 9050dd255e5ad05f0d44bb92f358ff3f541a3d7a4bChris Lattner struct ureg_dst *temp, 9150dd255e5ad05f0d44bb92f358ff3f541a3d7a4bChris Lattner struct ureg_src *constant) 9250dd255e5ad05f0d44bb92f358ff3f541a3d7a4bChris Lattner{ 939a8c9a2eacd80437f18edb339a37516ab7e773cdDouglas Gregor 949a8c9a2eacd80437f18edb339a37516ab7e773cdDouglas Gregor ureg_MOV(ureg, ureg_writemask(temp[0], TGSI_WRITEMASK_XY), in[0]); 95122de3e131a6902d22c97471520ec9005cca6f03Hans Wennborg ureg_MOV(ureg, 96122de3e131a6902d22c97471520ec9005cca6f03Hans Wennborg ureg_writemask(temp[0], TGSI_WRITEMASK_Z), 979a8c9a2eacd80437f18edb339a37516ab7e773cdDouglas Gregor ureg_scalar(constant[1], TGSI_SWIZZLE_Y)); 98dee832c8958ca100c671881b6541fbb857a33592Benjamin Kramer ureg_DP3(ureg, temp[1], constant[2], ureg_src(temp[0])); 99dee832c8958ca100c671881b6541fbb857a33592Benjamin Kramer ureg_DP3(ureg, temp[2], constant[3], ureg_src(temp[0])); 100dee832c8958ca100c671881b6541fbb857a33592Benjamin Kramer ureg_DP3(ureg, temp[3], constant[4], ureg_src(temp[0])); 101dee832c8958ca100c671881b6541fbb857a33592Benjamin Kramer ureg_RCP(ureg, temp[3], ureg_src(temp[3])); 102c46111e821664fcdf54d07325a384570972e9caeDouglas Gregor ureg_MUL(ureg, temp[1], ureg_src(temp[1]), ureg_src(temp[3])); 103c46111e821664fcdf54d07325a384570972e9caeDouglas Gregor ureg_MUL(ureg, temp[2], ureg_src(temp[2]), ureg_src(temp[3])); 104c46111e821664fcdf54d07325a384570972e9caeDouglas Gregor ureg_MOV(ureg, ureg_writemask(temp[5], TGSI_WRITEMASK_X), ureg_src(temp[1])); 105c46111e821664fcdf54d07325a384570972e9caeDouglas Gregor ureg_MOV(ureg, ureg_writemask(temp[5], TGSI_WRITEMASK_Y), ureg_src(temp[2])); 106c46111e821664fcdf54d07325a384570972e9caeDouglas Gregor ureg_MUL(ureg, temp[0], ureg_scalar(constant[0], TGSI_SWIZZLE_Y), 107c46111e821664fcdf54d07325a384570972e9caeDouglas Gregor ureg_scalar(ureg_src(temp[5]), TGSI_SWIZZLE_Y)); 1081e32ca6e3007e09073ddafb3cb5e0adc1f83293cDouglas Gregor ureg_MAD(ureg, temp[1], 1091e32ca6e3007e09073ddafb3cb5e0adc1f83293cDouglas Gregor ureg_scalar(constant[0], TGSI_SWIZZLE_X), 1101e32ca6e3007e09073ddafb3cb5e0adc1f83293cDouglas Gregor ureg_scalar(ureg_src(temp[5]), TGSI_SWIZZLE_X), ureg_src(temp[0])); 1111e32ca6e3007e09073ddafb3cb5e0adc1f83293cDouglas Gregor ureg_ADD(ureg, temp[1], ureg_src(temp[1]), ureg_src(temp[1])); 1121e32ca6e3007e09073ddafb3cb5e0adc1f83293cDouglas Gregor ureg_MUL(ureg, temp[3], 11375c29a012793292ff4578015a9113bf086156d7fChris Lattner ureg_scalar(ureg_src(temp[5]), TGSI_SWIZZLE_Y), 11475c29a012793292ff4578015a9113bf086156d7fChris Lattner ureg_scalar(ureg_src(temp[5]), TGSI_SWIZZLE_Y)); 11575c29a012793292ff4578015a9113bf086156d7fChris Lattner ureg_MAD(ureg, temp[4], 11675c29a012793292ff4578015a9113bf086156d7fChris Lattner ureg_scalar(ureg_src(temp[5]), TGSI_SWIZZLE_X), 11775c29a012793292ff4578015a9113bf086156d7fChris Lattner ureg_scalar(ureg_src(temp[5]), TGSI_SWIZZLE_X), 11875c29a012793292ff4578015a9113bf086156d7fChris Lattner ureg_src(temp[3])); 119e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_MOV(ureg, temp[4], ureg_negate(ureg_src(temp[4]))); 120e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_MUL(ureg, temp[2], 121e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_scalar(constant[0], TGSI_SWIZZLE_Z), 122e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_src(temp[4])); 123e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_MUL(ureg, temp[0], 124e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_scalar(constant[1], TGSI_SWIZZLE_W), 125e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_src(temp[2])); 126e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_MUL(ureg, temp[3], ureg_src(temp[1]), ureg_src(temp[1])); 127e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith 128e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_SUB(ureg, temp[2], ureg_src(temp[3]), ureg_src(temp[0])); 129e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_RSQ(ureg, temp[2], ureg_abs(ureg_src(temp[2]))); 130e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_RCP(ureg, temp[2], ureg_src(temp[2])); 131e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_SUB(ureg, temp[1], ureg_src(temp[2]), ureg_src(temp[1])); 132e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_ADD(ureg, temp[0], 133e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_scalar(constant[0], TGSI_SWIZZLE_Z), 134e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_scalar(constant[0], TGSI_SWIZZLE_Z)); 135e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_RCP(ureg, temp[0], ureg_src(temp[0])); 136e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_MUL(ureg, temp[2], ureg_src(temp[1]), ureg_src(temp[0])); 137e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_TEX(ureg, *out, TGSI_TEXTURE_1D, ureg_src(temp[2]), sampler[0]); 138e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith 139e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith} 140e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith 141e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith 142e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smithstatic INLINE void 143e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smithpattern( struct ureg_program *ureg, 144e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith struct ureg_dst *out, 145e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith struct ureg_src *in, 146e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith struct ureg_src *sampler, 147e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith struct ureg_dst *temp, 148e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith struct ureg_src *constant) 149e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith{ 150e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_MOV(ureg, 151e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_writemask(temp[0], TGSI_WRITEMASK_XY), 152e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith in[0]); 153e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_MOV(ureg, 154e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_writemask(temp[0], TGSI_WRITEMASK_Z), 155e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_scalar(constant[1], TGSI_SWIZZLE_Y)); 156e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_DP3(ureg, temp[1], constant[2], ureg_src(temp[0])); 157e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_DP3(ureg, temp[2], constant[3], ureg_src(temp[0])); 158e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_DP3(ureg, temp[3], constant[4], ureg_src(temp[0])); 159e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_RCP(ureg, temp[3], ureg_src(temp[3])); 160e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_MUL(ureg, temp[1], ureg_src(temp[1]), ureg_src(temp[3])); 161e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_MUL(ureg, temp[2], ureg_src(temp[2]), ureg_src(temp[3])); 162e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_MOV(ureg, ureg_writemask(temp[4], TGSI_WRITEMASK_X), ureg_src(temp[1])); 163e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_MOV(ureg, ureg_writemask(temp[4], TGSI_WRITEMASK_Y), ureg_src(temp[2])); 164e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_RCP(ureg, temp[0], 165e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_swizzle(constant[1], 166e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith TGSI_SWIZZLE_Z, 167e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith TGSI_SWIZZLE_W, 168e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith TGSI_SWIZZLE_Z, 169e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith TGSI_SWIZZLE_W)); 170e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_MOV(ureg, temp[1], ureg_src(temp[4])); 171e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_MUL(ureg, 172e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_writemask(temp[1], TGSI_WRITEMASK_X), 173e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_src(temp[1]), 174e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_src(temp[0])); 175e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_MUL(ureg, 176e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_writemask(temp[1], TGSI_WRITEMASK_Y), 177e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_src(temp[1]), 178e052d46f4db91f9ba572859ffc984e85cbf5d5ffRichard Smith ureg_src(temp[0])); 1798bfb700a3ddcfffc32d97ad8a6565563e249d3eeBill Wendling ureg_TEX(ureg, *out, TGSI_TEXTURE_2D, ureg_src(temp[1]), sampler[0]); 1808bfb700a3ddcfffc32d97ad8a6565563e249d3eeBill Wendling} 1818bfb700a3ddcfffc32d97ad8a6565563e249d3eeBill Wendling 1828bfb700a3ddcfffc32d97ad8a6565563e249d3eeBill Wendlingstatic INLINE void 1838bfb700a3ddcfffc32d97ad8a6565563e249d3eeBill Wendlingmask( struct ureg_program *ureg, 1848bfb700a3ddcfffc32d97ad8a6565563e249d3eeBill Wendling struct ureg_dst *out, 1858bfb700a3ddcfffc32d97ad8a6565563e249d3eeBill Wendling struct ureg_src *in, 1868bfb700a3ddcfffc32d97ad8a6565563e249d3eeBill Wendling struct ureg_src *sampler, 1878bfb700a3ddcfffc32d97ad8a6565563e249d3eeBill Wendling struct ureg_dst *temp, 1888bfb700a3ddcfffc32d97ad8a6565563e249d3eeBill Wendling struct ureg_src *constant) 1898bfb700a3ddcfffc32d97ad8a6565563e249d3eeBill Wendling{ 1908bfb700a3ddcfffc32d97ad8a6565563e249d3eeBill Wendling ureg_TEX(ureg, temp[1], TGSI_TEXTURE_2D, in[0], sampler[1]); 1918bfb700a3ddcfffc32d97ad8a6565563e249d3eeBill Wendling ureg_MUL(ureg, ureg_writemask(temp[0], TGSI_WRITEMASK_W), 1928bfb700a3ddcfffc32d97ad8a6565563e249d3eeBill Wendling ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W), 1938bfb700a3ddcfffc32d97ad8a6565563e249d3eeBill Wendling ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W)); 194f2941ec5bfcce36feffac514582d168b4e0ef811Reid Kleckner ureg_MOV(ureg, *out, ureg_src(temp[0])); 195f2941ec5bfcce36feffac514582d168b4e0ef811Reid Kleckner} 196f2941ec5bfcce36feffac514582d168b4e0ef811Reid Kleckner 197f2941ec5bfcce36feffac514582d168b4e0ef811Reid Klecknerstatic INLINE void 198f2941ec5bfcce36feffac514582d168b4e0ef811Reid Klecknerimage_normal( struct ureg_program *ureg, 199f2941ec5bfcce36feffac514582d168b4e0ef811Reid Kleckner struct ureg_dst *out, 200ef8225444452a1486bd721f3285301fe84643b00Stephen Hines struct ureg_src *in, 201ef8225444452a1486bd721f3285301fe84643b00Stephen Hines struct ureg_src *sampler, 202ef8225444452a1486bd721f3285301fe84643b00Stephen Hines struct ureg_dst *temp, 203ef8225444452a1486bd721f3285301fe84643b00Stephen Hines struct ureg_src *constant) 204ef8225444452a1486bd721f3285301fe84643b00Stephen Hines{ 205 ureg_TEX(ureg, *out, TGSI_TEXTURE_2D, in[1], sampler[3]); 206} 207 208 209static INLINE void 210image_multiply( struct ureg_program *ureg, 211 struct ureg_dst *out, 212 struct ureg_src *in, 213 struct ureg_src *sampler, 214 struct ureg_dst *temp, 215 struct ureg_src *constant) 216{ 217 ureg_TEX(ureg, temp[1], TGSI_TEXTURE_2D, in[1], sampler[3]); 218 ureg_MUL(ureg, *out, ureg_src(temp[0]), ureg_src(temp[1])); 219} 220 221 222static INLINE void 223image_stencil( struct ureg_program *ureg, 224 struct ureg_dst *out, 225 struct ureg_src *in, 226 struct ureg_src *sampler, 227 struct ureg_dst *temp, 228 struct ureg_src *constant) 229{ 230 ureg_TEX(ureg, temp[1], TGSI_TEXTURE_2D, in[1], sampler[3]); 231 ureg_MUL(ureg, *out, ureg_src(temp[0]), ureg_src(temp[1])); 232} 233 234#define EXTENDED_BLENDER_OVER_FUNC \ 235 ureg_SUB(ureg, temp[3], \ 236 ureg_scalar(constant[1], TGSI_SWIZZLE_Y), \ 237 ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W)); \ 238 ureg_SUB(ureg, temp[4], \ 239 ureg_scalar(constant[1], TGSI_SWIZZLE_Y), \ 240 ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W)); \ 241 ureg_MUL(ureg, temp[3], ureg_src(temp[0]), ureg_src(temp[3])); \ 242 ureg_MUL(ureg, temp[4], ureg_src(temp[1]), ureg_src(temp[4])); \ 243 ureg_ADD(ureg, temp[3], ureg_src(temp[3]), ureg_src(temp[4])); 244 245 246static INLINE void 247blend_multiply( struct ureg_program *ureg, 248 struct ureg_dst *out, 249 struct ureg_src *in, 250 struct ureg_src *sampler, 251 struct ureg_dst *temp, 252 struct ureg_src *constant) 253{ 254 ureg_TEX(ureg, temp[1], TGSI_TEXTURE_2D, in[0], sampler[2]); 255 EXTENDED_BLENDER_OVER_FUNC 256 ureg_MUL(ureg, temp[4], ureg_src(temp[0]), ureg_src(temp[1])); 257 ureg_ADD(ureg, temp[1], ureg_src(temp[4]), ureg_src(temp[3])); 258 259 ureg_MUL(ureg, temp[2], ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W), 260 ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W)); 261 ureg_ADD(ureg, temp[3], ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W), 262 ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W)); 263 ureg_SUB(ureg, ureg_writemask(temp[1], TGSI_WRITEMASK_W), 264 ureg_src(temp[3]), ureg_src(temp[2])); 265 266 ureg_MOV(ureg, *out, ureg_src(temp[1])); 267} 268 269static INLINE void 270blend_screen( struct ureg_program *ureg, 271 struct ureg_dst *out, 272 struct ureg_src *in, 273 struct ureg_src *sampler, 274 struct ureg_dst *temp, 275 struct ureg_src *constant) 276{ 277 ureg_TEX(ureg, temp[1], TGSI_TEXTURE_2D, in[0], sampler[2]); 278 ureg_ADD(ureg, temp[3], ureg_src(temp[0]), ureg_src(temp[1])); 279 ureg_MUL(ureg, temp[2], ureg_src(temp[0]), ureg_src(temp[1])); 280 ureg_SUB(ureg, *out, ureg_src(temp[3]), ureg_src(temp[2])); 281} 282 283static INLINE void 284blend_darken( struct ureg_program *ureg, 285 struct ureg_dst *out, 286 struct ureg_src *in, 287 struct ureg_src *sampler, 288 struct ureg_dst *temp, 289 struct ureg_src *constant) 290{ 291 ureg_TEX(ureg, temp[1], TGSI_TEXTURE_2D, in[0], sampler[2]); 292 EXTENDED_BLENDER_OVER_FUNC 293 ureg_MUL(ureg, temp[4], ureg_src(temp[0]), 294 ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W)); 295 ureg_MUL(ureg, temp[5], ureg_src(temp[1]), 296 ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W)); 297 ureg_MIN(ureg, temp[4], ureg_src(temp[4]), ureg_src(temp[5])); 298 ureg_ADD(ureg, temp[1], ureg_src(temp[3]), ureg_src(temp[4])); 299 300 ureg_MUL(ureg, temp[2], ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W), 301 ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W)); 302 ureg_ADD(ureg, temp[3], ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W), 303 ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W)); 304 ureg_SUB(ureg, ureg_writemask(temp[1], TGSI_WRITEMASK_W), 305 ureg_src(temp[3]), ureg_src(temp[2])); 306 307 ureg_MOV(ureg, *out, ureg_src(temp[1])); 308} 309 310static INLINE void 311blend_lighten( struct ureg_program *ureg, 312 struct ureg_dst *out, 313 struct ureg_src *in, 314 struct ureg_src *sampler, 315 struct ureg_dst *temp, 316 struct ureg_src *constant) 317{ 318 ureg_TEX(ureg, temp[1], TGSI_TEXTURE_2D, in[0], sampler[2]); 319 EXTENDED_BLENDER_OVER_FUNC 320 ureg_MUL(ureg, temp[4], ureg_src(temp[0]), 321 ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W)); 322 ureg_MUL(ureg, temp[5], ureg_src(temp[1]), 323 ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W)); 324 ureg_MAX(ureg, temp[4], ureg_src(temp[4]), ureg_src(temp[5])); 325 ureg_ADD(ureg, temp[1], ureg_src(temp[3]), ureg_src(temp[4])); 326 327 ureg_MUL(ureg, temp[2], ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W), 328 ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W)); 329 ureg_ADD(ureg, temp[3], ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W), 330 ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W)); 331 ureg_SUB(ureg, ureg_writemask(temp[1], TGSI_WRITEMASK_W), 332 ureg_src(temp[3]), ureg_src(temp[2])); 333 334 ureg_MOV(ureg, *out, ureg_src(temp[1])); 335} 336 337static INLINE void 338premultiply( struct ureg_program *ureg, 339 struct ureg_dst *out, 340 struct ureg_src *in, 341 struct ureg_src *sampler, 342 struct ureg_dst *temp, 343 struct ureg_src *constant) 344{ 345 ureg_MUL(ureg, 346 ureg_writemask(temp[0], TGSI_WRITEMASK_XYZ), 347 ureg_src(temp[0]), 348 ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W)); 349} 350 351static INLINE void 352unpremultiply( struct ureg_program *ureg, 353 struct ureg_dst *out, 354 struct ureg_src *in, 355 struct ureg_src *sampler, 356 struct ureg_dst *temp, 357 struct ureg_src *constant) 358{ 359 ureg_TEX(ureg, temp[0], TGSI_TEXTURE_2D, in[0], sampler[1]); 360} 361 362 363static INLINE void 364color_bw( struct ureg_program *ureg, 365 struct ureg_dst *out, 366 struct ureg_src *in, 367 struct ureg_src *sampler, 368 struct ureg_dst *temp, 369 struct ureg_src *constant) 370{ 371 ureg_ADD(ureg, temp[1], 372 ureg_scalar(constant[1], TGSI_SWIZZLE_Y), 373 ureg_scalar(constant[1], TGSI_SWIZZLE_Y)); 374 ureg_RCP(ureg, temp[2], ureg_src(temp[1])); 375 ureg_ADD(ureg, temp[1], 376 ureg_scalar(constant[1], TGSI_SWIZZLE_Y), 377 ureg_src(temp[2])); 378 ureg_ADD(ureg, ureg_writemask(temp[2], TGSI_WRITEMASK_X), 379 ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_X), 380 ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_Y)); 381 ureg_ADD(ureg, ureg_writemask(temp[2], TGSI_WRITEMASK_X), 382 ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_Z), 383 ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_X)); 384 ureg_SGE(ureg, 385 ureg_writemask(temp[0], TGSI_WRITEMASK_XYZ), 386 ureg_scalar(ureg_src(temp[2]), TGSI_SWIZZLE_X), 387 ureg_src(temp[1])); 388 ureg_SGE(ureg, 389 ureg_writemask(temp[0], TGSI_WRITEMASK_W), 390 ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W), 391 ureg_scalar(ureg_src(temp[2]), TGSI_SWIZZLE_Y)); 392 ureg_MOV(ureg, *out, ureg_src(temp[0])); 393} 394 395 396struct shader_asm_info { 397 VGint id; 398 ureg_func func; 399 400 VGboolean needs_position; 401 402 VGint start_const; 403 VGint num_consts; 404 405 VGint start_sampler; 406 VGint num_samplers; 407 408 VGint start_temp; 409 VGint num_temps; 410}; 411 412 413static const struct shader_asm_info shaders_asm[] = { 414 /* fills */ 415 {VEGA_SOLID_FILL_SHADER, solid_fill, 416 VG_FALSE, 0, 1, 0, 0, 0, 0}, 417 {VEGA_LINEAR_GRADIENT_SHADER, linear_grad, 418 VG_TRUE, 0, 5, 0, 1, 0, 5}, 419 {VEGA_RADIAL_GRADIENT_SHADER, radial_grad, 420 VG_TRUE, 0, 5, 0, 1, 0, 6}, 421 {VEGA_PATTERN_SHADER, pattern, 422 VG_TRUE, 1, 4, 0, 1, 0, 5}, 423 424 /* image draw modes */ 425 {VEGA_IMAGE_NORMAL_SHADER, image_normal, 426 VG_TRUE, 0, 0, 3, 1, 0, 0}, 427 {VEGA_IMAGE_MULTIPLY_SHADER, image_multiply, 428 VG_TRUE, 0, 0, 3, 1, 0, 2}, 429 {VEGA_IMAGE_STENCIL_SHADER, image_stencil, 430 VG_TRUE, 0, 0, 3, 1, 0, 2}, 431 432 {VEGA_MASK_SHADER, mask, 433 VG_TRUE, 0, 0, 1, 1, 0, 2}, 434 435 /* extra blend modes */ 436 {VEGA_BLEND_MULTIPLY_SHADER, blend_multiply, 437 VG_TRUE, 1, 1, 2, 1, 0, 5}, 438 {VEGA_BLEND_SCREEN_SHADER, blend_screen, 439 VG_TRUE, 0, 0, 2, 1, 0, 4}, 440 {VEGA_BLEND_DARKEN_SHADER, blend_darken, 441 VG_TRUE, 1, 1, 2, 1, 0, 6}, 442 {VEGA_BLEND_LIGHTEN_SHADER, blend_lighten, 443 VG_TRUE, 1, 1, 2, 1, 0, 6}, 444 445 /* premultiply */ 446 {VEGA_PREMULTIPLY_SHADER, premultiply, 447 VG_FALSE, 0, 0, 0, 0, 0, 1}, 448 {VEGA_UNPREMULTIPLY_SHADER, unpremultiply, 449 VG_FALSE, 0, 0, 0, 0, 0, 1}, 450 451 /* color transform to black and white */ 452 {VEGA_BW_SHADER, color_bw, 453 VG_FALSE, 1, 1, 0, 0, 0, 3}, 454}; 455#endif 456