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