1544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin/**************************************************************************
2544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin *
3544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * Copyright 2009 VMware, Inc.  All Rights Reserved.
4544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin *
5544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * Permission is hereby granted, free of charge, to any person obtaining a
6544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * copy of this software and associated documentation files (the
7544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * "Software"), to deal in the Software without restriction, including
8544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * without limitation the rights to use, copy, modify, merge, publish,
9544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * distribute, sub license, and/or sell copies of the Software, and to
10544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * permit persons to whom the Software is furnished to do so, subject to
11544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * the following conditions:
12544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin *
13544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * The above copyright notice and this permission notice (including the
14544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * next paragraph) shall be included in all copies or substantial portions
15544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * of the Software.
16544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin *
17544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
20544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
21544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin *
25544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin **************************************************************************/
26544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
27544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#ifndef ASM_FILL_H
28544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#define ASM_FILL_H
29544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
30231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira#include "tgsi/tgsi_ureg.h"
31231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira
32231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveiratypedef void (* ureg_func)( struct ureg_program *ureg,
33231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                            struct ureg_dst *out,
34231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                            struct ureg_src *in,
35231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                            struct ureg_src *sampler,
36231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                            struct ureg_dst *temp,
37231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                            struct ureg_src *constant);
38231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira
39231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveirastatic INLINE void
40231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveirasolid_fill( struct ureg_program *ureg,
41231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira            struct ureg_dst *out,
42231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira            struct ureg_src *in,
43231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira            struct ureg_src *sampler,
44231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira            struct ureg_dst *temp,
45231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira            struct ureg_src *constant)
46231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira{
47e360f91f152615b35857a4d008d0439a3c3285a8Chia-I Wu   ureg_MOV(ureg, *out, constant[2]);
48231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira}
49231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira
50a09baf166826aba5be7dcf2347047129730f1628Chia-I Wu/**
51a09baf166826aba5be7dcf2347047129730f1628Chia-I Wu * Perform frag-coord-to-paint-coord transform.  The transformation is in
52a09baf166826aba5be7dcf2347047129730f1628Chia-I Wu * CONST[4..6].
53a09baf166826aba5be7dcf2347047129730f1628Chia-I Wu */
542bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu#define PAINT_TRANSFORM                                                 \
552bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu   ureg_MOV(ureg, ureg_writemask(temp[0], TGSI_WRITEMASK_XY), in[0]);   \
562bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu   ureg_MOV(ureg,                                                       \
572bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu            ureg_writemask(temp[0], TGSI_WRITEMASK_Z),                  \
582bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu            ureg_scalar(constant[3], TGSI_SWIZZLE_Y));                  \
592bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu   ureg_DP3(ureg, temp[1], constant[4], ureg_src(temp[0]));             \
602bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu   ureg_DP3(ureg, temp[2], constant[5], ureg_src(temp[0]));             \
612bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu   ureg_DP3(ureg, temp[3], constant[6], ureg_src(temp[0]));             \
622bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu   ureg_RCP(ureg, temp[3], ureg_src(temp[3]));                          \
632bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu   ureg_MUL(ureg, temp[1], ureg_src(temp[1]), ureg_src(temp[3]));       \
642bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu   ureg_MUL(ureg, temp[2], ureg_src(temp[2]), ureg_src(temp[3]));       \
652bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu   ureg_MOV(ureg,                                                       \
662bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu            ureg_writemask(temp[4], TGSI_WRITEMASK_X),                  \
672bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu            ureg_src(temp[1]));                                         \
682bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu   ureg_MOV(ureg,                                                       \
692bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu            ureg_writemask(temp[4], TGSI_WRITEMASK_Y),                  \
702bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu            ureg_src(temp[2]));
712bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu
72231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveirastatic INLINE void
73231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveiralinear_grad( struct ureg_program *ureg,
74231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira             struct ureg_dst *out,
75231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira             struct ureg_src *in,
76231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira             struct ureg_src *sampler,
77231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira             struct ureg_dst *temp,
78231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira             struct ureg_src *constant)
79231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira{
802bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu   PAINT_TRANSFORM
81231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira
82a09baf166826aba5be7dcf2347047129730f1628Chia-I Wu   /* grad = DP2((x, y), CONST[2].xy) * CONST[2].z */
83231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira   ureg_MUL(ureg, temp[0],
84e360f91f152615b35857a4d008d0439a3c3285a8Chia-I Wu            ureg_scalar(constant[2], TGSI_SWIZZLE_Y),
85231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira            ureg_scalar(ureg_src(temp[4]), TGSI_SWIZZLE_Y));
86231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira   ureg_MAD(ureg, temp[1],
87e360f91f152615b35857a4d008d0439a3c3285a8Chia-I Wu            ureg_scalar(constant[2], TGSI_SWIZZLE_X),
88231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira            ureg_scalar(ureg_src(temp[4]), TGSI_SWIZZLE_X),
89231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira            ureg_src(temp[0]));
90231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira   ureg_MUL(ureg, temp[2], ureg_src(temp[1]),
91e360f91f152615b35857a4d008d0439a3c3285a8Chia-I Wu            ureg_scalar(constant[2], TGSI_SWIZZLE_Z));
92a09baf166826aba5be7dcf2347047129730f1628Chia-I Wu
93231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira   ureg_TEX(ureg, *out, TGSI_TEXTURE_1D, ureg_src(temp[2]), sampler[0]);
94231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira}
95231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira
96231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveirastatic INLINE void
97231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveiraradial_grad( struct ureg_program *ureg,
98231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira             struct ureg_dst *out,
99231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira             struct ureg_src *in,
100231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira             struct ureg_src *sampler,
101231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira             struct ureg_dst *temp,
102231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira             struct ureg_src *constant)
103231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira{
1042bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu   PAINT_TRANSFORM
1052bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu
1062bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu   /*
1072bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu    * Calculate (sqrt(B^2 + AC) - B) / A, where
1082bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu    *
1092bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu    *   A is CONST[2].z,
1102bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu    *   B is DP2((x, y), CONST[2].xy), and
1112bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu    *   C is DP2((x, y), (x, y)).
1122bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu    */
1132bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu
1142bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu   /* B and C */
1152bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu   ureg_DP2(ureg, temp[0], ureg_src(temp[4]), constant[2]);
1162bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu   ureg_DP2(ureg, temp[1], ureg_src(temp[4]), ureg_src(temp[4]));
1172bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu
1182bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu   /* the square root */
1192bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu   ureg_MUL(ureg, temp[2], ureg_src(temp[0]), ureg_src(temp[0]));
1202bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu   ureg_MAD(ureg, temp[3], ureg_src(temp[1]),
1212bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu         ureg_scalar(constant[2], TGSI_SWIZZLE_Z), ureg_src(temp[2]));
1222bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu   ureg_RSQ(ureg, temp[3], ureg_src(temp[3]));
123231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira   ureg_RCP(ureg, temp[3], ureg_src(temp[3]));
124231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira
1252bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu   ureg_SUB(ureg, temp[3], ureg_src(temp[3]), ureg_src(temp[0]));
1262bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu   ureg_RCP(ureg, temp[0], ureg_scalar(constant[2], TGSI_SWIZZLE_Z));
1272bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu   ureg_MUL(ureg, temp[0], ureg_src(temp[0]), ureg_src(temp[3]));
1282bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu
1292bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu   ureg_TEX(ureg, *out, TGSI_TEXTURE_1D, ureg_src(temp[0]), sampler[0]);
130231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira}
131231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira
132231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira
133231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveirastatic INLINE void
134231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveirapattern( struct ureg_program *ureg,
135231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira         struct ureg_dst     *out,
136231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira         struct ureg_src     *in,
137231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira         struct ureg_src     *sampler,
138231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira         struct ureg_dst     *temp,
139231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira         struct ureg_src     *constant)
140231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira{
1412bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu   PAINT_TRANSFORM
1422bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu
143a09baf166826aba5be7dcf2347047129730f1628Chia-I Wu   /* (s, t) = (x / tex_width, y / tex_height) */
144231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira   ureg_RCP(ureg, temp[0],
145e360f91f152615b35857a4d008d0439a3c3285a8Chia-I Wu            ureg_swizzle(constant[3],
146231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                         TGSI_SWIZZLE_Z,
147231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                         TGSI_SWIZZLE_W,
148231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                         TGSI_SWIZZLE_Z,
149231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                         TGSI_SWIZZLE_W));
150231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira   ureg_MOV(ureg, temp[1], ureg_src(temp[4]));
151231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira   ureg_MUL(ureg,
152231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira            ureg_writemask(temp[1], TGSI_WRITEMASK_X),
153231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira            ureg_src(temp[1]),
154231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira            ureg_src(temp[0]));
155231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira   ureg_MUL(ureg,
156231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira            ureg_writemask(temp[1], TGSI_WRITEMASK_Y),
157231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira            ureg_src(temp[1]),
158231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira            ureg_src(temp[0]));
159a09baf166826aba5be7dcf2347047129730f1628Chia-I Wu
160231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira   ureg_TEX(ureg, *out, TGSI_TEXTURE_2D, ureg_src(temp[1]), sampler[0]);
161231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira}
162231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira
163231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveirastatic INLINE void
164d7aa03b4feb7c30408b2ed3070e0fe33e2fd05baChia-I Wupaint_degenerate( struct ureg_program *ureg,
165d7aa03b4feb7c30408b2ed3070e0fe33e2fd05baChia-I Wu                  struct ureg_dst *out,
166d7aa03b4feb7c30408b2ed3070e0fe33e2fd05baChia-I Wu                  struct ureg_src *in,
167d7aa03b4feb7c30408b2ed3070e0fe33e2fd05baChia-I Wu                  struct ureg_src *sampler,
168d7aa03b4feb7c30408b2ed3070e0fe33e2fd05baChia-I Wu                  struct ureg_dst *temp,
169d7aa03b4feb7c30408b2ed3070e0fe33e2fd05baChia-I Wu                  struct ureg_src *constant)
170d7aa03b4feb7c30408b2ed3070e0fe33e2fd05baChia-I Wu{
171a09baf166826aba5be7dcf2347047129730f1628Chia-I Wu   /* CONST[3].y is 1.0f */
172d7aa03b4feb7c30408b2ed3070e0fe33e2fd05baChia-I Wu   ureg_MOV(ureg, temp[1], ureg_scalar(constant[3], TGSI_SWIZZLE_Y));
173d7aa03b4feb7c30408b2ed3070e0fe33e2fd05baChia-I Wu   ureg_TEX(ureg, *out, TGSI_TEXTURE_1D, ureg_src(temp[1]), sampler[0]);
174d7aa03b4feb7c30408b2ed3070e0fe33e2fd05baChia-I Wu}
175d7aa03b4feb7c30408b2ed3070e0fe33e2fd05baChia-I Wu
176d7aa03b4feb7c30408b2ed3070e0fe33e2fd05baChia-I Wustatic INLINE void
177231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveiraimage_normal( struct ureg_program *ureg,
178231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira              struct ureg_dst *out,
179231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira              struct ureg_src *in,
180231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira              struct ureg_src *sampler,
181231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira              struct ureg_dst *temp,
182231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira              struct ureg_src *constant)
183231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira{
184e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu   /* store and pass image color in TEMP[1] */
185e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu   ureg_TEX(ureg, temp[1], TGSI_TEXTURE_2D, in[1], sampler[3]);
186e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu   ureg_MOV(ureg, *out, ureg_src(temp[1]));
187231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira}
188231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira
189231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira
190231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveirastatic INLINE void
191231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveiraimage_multiply( struct ureg_program *ureg,
192231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                struct ureg_dst *out,
193231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                struct ureg_src *in,
194231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                struct ureg_src *sampler,
195231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                struct ureg_dst *temp,
196231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                struct ureg_src *constant)
197231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira{
198e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu   /* store and pass image color in TEMP[1] */
199231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira   ureg_TEX(ureg, temp[1], TGSI_TEXTURE_2D, in[1], sampler[3]);
200231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira   ureg_MUL(ureg, *out, ureg_src(temp[0]), ureg_src(temp[1]));
201231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira}
202231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira
203231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira
204231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveirastatic INLINE void
205231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveiraimage_stencil( struct ureg_program *ureg,
206231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira               struct ureg_dst *out,
207231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira               struct ureg_src *in,
208231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira               struct ureg_src *sampler,
209231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira               struct ureg_dst *temp,
210231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira               struct ureg_src *constant)
211231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira{
212e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu   /* store and pass image color in TEMP[1] */
213231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira   ureg_TEX(ureg, temp[1], TGSI_TEXTURE_2D, in[1], sampler[3]);
214e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu   ureg_MOV(ureg, *out, ureg_src(temp[0]));
215231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira}
216231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira
217a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wustatic INLINE void
218a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wucolor_transform( struct ureg_program *ureg,
219a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wu                 struct ureg_dst *out,
220a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wu                 struct ureg_src *in,
221a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wu                 struct ureg_src *sampler,
222a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wu                 struct ureg_dst *temp,
223a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wu                 struct ureg_src *constant)
224a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wu{
225e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu   /* note that TEMP[1] may already be used for image color */
226e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu
227e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu   ureg_MAD(ureg, temp[2], ureg_src(temp[0]), constant[0], constant[1]);
228a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wu   /* clamp to [0.0f, 1.0f] */
229e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu   ureg_CLAMP(ureg, temp[2],
230e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu              ureg_src(temp[2]),
231a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wu              ureg_scalar(constant[3], TGSI_SWIZZLE_X),
232a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wu              ureg_scalar(constant[3], TGSI_SWIZZLE_Y));
233e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu   ureg_MOV(ureg, *out, ureg_src(temp[2]));
234e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu}
235e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu
236e8ff3931f801dffdfd54832c298351e933688235Chia-I Wustatic INLINE void
237e8ff3931f801dffdfd54832c298351e933688235Chia-I Wualpha_normal( struct ureg_program *ureg,
238e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu              struct ureg_dst *out,
239e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu              struct ureg_src *in,
240e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu              struct ureg_src *sampler,
241e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu              struct ureg_dst *temp,
242e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu              struct ureg_src *constant)
243e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu{
244e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu   /* save per-channel alpha in TEMP[1] */
245e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu   ureg_MOV(ureg, temp[1], ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W));
246e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu
247e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu   ureg_MOV(ureg, *out, ureg_src(temp[0]));
248e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu}
249e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu
250e8ff3931f801dffdfd54832c298351e933688235Chia-I Wustatic INLINE void
251e8ff3931f801dffdfd54832c298351e933688235Chia-I Wualpha_per_channel( struct ureg_program *ureg,
252e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu                   struct ureg_dst *out,
253e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu                   struct ureg_src *in,
254e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu                   struct ureg_src *sampler,
255e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu                   struct ureg_dst *temp,
256e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu                   struct ureg_src *constant)
257e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu{
258e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu   /* save per-channel alpha in TEMP[1] */
259e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu   ureg_MUL(ureg,
260e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu            ureg_writemask(temp[1], TGSI_WRITEMASK_W),
261e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu            ureg_src(temp[0]),
262e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu            ureg_src(temp[1]));
263e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu   ureg_MUL(ureg,
264e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu            ureg_writemask(temp[1], TGSI_WRITEMASK_XYZ),
265e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu            ureg_src(temp[1]),
266e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu            ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W));
267e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu
268e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu   /* update alpha */
269e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu   ureg_MOV(ureg,
270e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu            ureg_writemask(temp[0], TGSI_WRITEMASK_W),
271e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu            ureg_src(temp[1]));
272e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu   ureg_MOV(ureg, *out, ureg_src(temp[0]));
273a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wu}
274a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wu
2753b4c8886539b02653761f092a387c27b5c562496Chia-I Wu/**
276e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu * Premultiply src and dst.
277e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu */
278e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wustatic INLINE void
279e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wublend_premultiply( struct ureg_program *ureg,
280e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu                   struct ureg_src src,
281e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu                   struct ureg_src src_channel_alpha,
282e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu                   struct ureg_src dst)
283e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu{
284e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu   /* premultiply src */
285e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu   ureg_MUL(ureg,
286e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu            ureg_writemask(ureg_dst(src), TGSI_WRITEMASK_XYZ),
287e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu            src,
288e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu            src_channel_alpha);
289e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu   /* premultiply dst */
290e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu   ureg_MUL(ureg,
291e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu            ureg_writemask(ureg_dst(dst), TGSI_WRITEMASK_XYZ),
292e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu            dst,
293e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu            ureg_scalar(dst, TGSI_SWIZZLE_W));
294e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu}
295e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu
296e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu/**
297e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu * Unpremultiply src.
298e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu */
299e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wustatic INLINE void
300e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wublend_unpremultiply( struct ureg_program *ureg,
301e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu                     struct ureg_src src,
302e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu                     struct ureg_src one,
303e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu                     struct ureg_dst temp[1])
304e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu{
305e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu   /* replace 0.0f by 1.0f before calculating reciprocal */
306e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu   ureg_CMP(ureg,
307e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu            temp[0],
308e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu            ureg_negate(ureg_scalar(src, TGSI_SWIZZLE_W)),
309e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu            ureg_scalar(src, TGSI_SWIZZLE_W),
310e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu            one);
311e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu   ureg_RCP(ureg, temp[0], ureg_src(temp[0]));
312e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu
313e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu   ureg_MUL(ureg,
314e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu            ureg_writemask(ureg_dst(src), TGSI_WRITEMASK_XYZ),
315e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu            src,
316e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu            ureg_src(temp[0]));
317e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu}
318e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu
319e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu/**
320e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu * Emit instructions for the specified blend mode.  Colors will be
321e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu * unpremultiplied.  Two temporary registers are required.
3223b4c8886539b02653761f092a387c27b5c562496Chia-I Wu *
323e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu * The output is written back to src.
3243b4c8886539b02653761f092a387c27b5c562496Chia-I Wu */
3253b4c8886539b02653761f092a387c27b5c562496Chia-I Wustatic INLINE void
3263b4c8886539b02653761f092a387c27b5c562496Chia-I Wublend_generic(struct ureg_program *ureg,
3273b4c8886539b02653761f092a387c27b5c562496Chia-I Wu              VGBlendMode mode,
3283b4c8886539b02653761f092a387c27b5c562496Chia-I Wu              struct ureg_src src,
3293b4c8886539b02653761f092a387c27b5c562496Chia-I Wu              struct ureg_src src_channel_alpha,
330e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu              struct ureg_src dst,
3313b4c8886539b02653761f092a387c27b5c562496Chia-I Wu              struct ureg_src one,
3323b4c8886539b02653761f092a387c27b5c562496Chia-I Wu              struct ureg_dst temp[2])
3333b4c8886539b02653761f092a387c27b5c562496Chia-I Wu{
334e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu   struct ureg_dst out;
335e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu
336e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu   blend_premultiply(ureg, src, src_channel_alpha, dst);
337e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu
338e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu   /* blend in-place */
339e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu   out = ureg_dst(src);
340e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu
3413b4c8886539b02653761f092a387c27b5c562496Chia-I Wu   switch (mode) {
3423b4c8886539b02653761f092a387c27b5c562496Chia-I Wu   case VG_BLEND_SRC:
3433b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      ureg_MOV(ureg, out, src);
3443b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      break;
3453b4c8886539b02653761f092a387c27b5c562496Chia-I Wu   case VG_BLEND_SRC_OVER:
3463b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      /* RGBA_out = RGBA_src + (1 - A_src) * RGBA_dst */
3473b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      ureg_SUB(ureg, temp[0], one, src_channel_alpha);
3483b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      ureg_MAD(ureg, out, ureg_src(temp[0]), dst, src);
3493b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      break;
3503b4c8886539b02653761f092a387c27b5c562496Chia-I Wu   case VG_BLEND_DST_OVER:
3513b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      /* RGBA_out = RGBA_dst + (1 - A_dst) * RGBA_src */
3523b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      ureg_SUB(ureg, temp[0], one, ureg_scalar(dst, TGSI_SWIZZLE_W));
3533b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      ureg_MAD(ureg, out, ureg_src(temp[0]), src, dst);
3543b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      break;
3553b4c8886539b02653761f092a387c27b5c562496Chia-I Wu   case VG_BLEND_SRC_IN:
3563b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      ureg_MUL(ureg, out, src, ureg_scalar(dst, TGSI_SWIZZLE_W));
3573b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      break;
3583b4c8886539b02653761f092a387c27b5c562496Chia-I Wu   case VG_BLEND_DST_IN:
3593b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      ureg_MUL(ureg, out, dst, src_channel_alpha);
3603b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      break;
3613b4c8886539b02653761f092a387c27b5c562496Chia-I Wu   case VG_BLEND_MULTIPLY:
3623b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      /*
3633b4c8886539b02653761f092a387c27b5c562496Chia-I Wu       * RGB_out = (1 - A_dst) * RGB_src + (1 - A_src) * RGB_dst +
3643b4c8886539b02653761f092a387c27b5c562496Chia-I Wu       *           RGB_src * RGB_dst
3653b4c8886539b02653761f092a387c27b5c562496Chia-I Wu       */
3663b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      ureg_MAD(ureg, temp[0],
3673b4c8886539b02653761f092a387c27b5c562496Chia-I Wu            ureg_scalar(dst, TGSI_SWIZZLE_W), ureg_negate(src), src);
3683b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      ureg_MAD(ureg, temp[1],
3693b4c8886539b02653761f092a387c27b5c562496Chia-I Wu            src_channel_alpha, ureg_negate(dst), dst);
3705d244111404fc36c55266f9703f81b27a5200a47Chia-I Wu      ureg_MAD(ureg, temp[0], src, dst, ureg_src(temp[0]));
3713b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      ureg_ADD(ureg, out, ureg_src(temp[0]), ureg_src(temp[1]));
3723b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      /* alpha is src over */
3733b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      ureg_ADD(ureg, ureg_writemask(out, TGSI_WRITEMASK_W),
3743b4c8886539b02653761f092a387c27b5c562496Chia-I Wu            src, ureg_src(temp[1]));
3753b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      break;
3763b4c8886539b02653761f092a387c27b5c562496Chia-I Wu   case VG_BLEND_SCREEN:
3773b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      /* RGBA_out = RGBA_src + (1 - RGBA_src) * RGBA_dst */
3783b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      ureg_SUB(ureg, temp[0], one, src);
3793b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      ureg_MAD(ureg, out, ureg_src(temp[0]), dst, src);
3803b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      break;
3813b4c8886539b02653761f092a387c27b5c562496Chia-I Wu   case VG_BLEND_DARKEN:
3823b4c8886539b02653761f092a387c27b5c562496Chia-I Wu   case VG_BLEND_LIGHTEN:
3833b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      /* src over */
3843b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      ureg_SUB(ureg, temp[0], one, src_channel_alpha);
3853b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      ureg_MAD(ureg, temp[0], ureg_src(temp[0]), dst, src);
3863b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      /* dst over */
3873b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      ureg_SUB(ureg, temp[1], one, ureg_scalar(dst, TGSI_SWIZZLE_W));
3883b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      ureg_MAD(ureg, temp[1], ureg_src(temp[1]), src, dst);
3893b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      /* take min/max for colors */
3903b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      if (mode == VG_BLEND_DARKEN) {
3913b4c8886539b02653761f092a387c27b5c562496Chia-I Wu         ureg_MIN(ureg, ureg_writemask(out, TGSI_WRITEMASK_XYZ),
3923b4c8886539b02653761f092a387c27b5c562496Chia-I Wu               ureg_src(temp[0]), ureg_src(temp[1]));
3933b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      }
3943b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      else {
3953b4c8886539b02653761f092a387c27b5c562496Chia-I Wu         ureg_MAX(ureg, ureg_writemask(out, TGSI_WRITEMASK_XYZ),
3963b4c8886539b02653761f092a387c27b5c562496Chia-I Wu               ureg_src(temp[0]), ureg_src(temp[1]));
3973b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      }
3983b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      break;
3993b4c8886539b02653761f092a387c27b5c562496Chia-I Wu   case VG_BLEND_ADDITIVE:
4003b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      /* RGBA_out = RGBA_src + RGBA_dst */
4013b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      ureg_ADD(ureg, temp[0], src, dst);
4023b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      ureg_MIN(ureg, out, ureg_src(temp[0]), one);
4033b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      break;
4043b4c8886539b02653761f092a387c27b5c562496Chia-I Wu   default:
4053b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      assert(0);
4063b4c8886539b02653761f092a387c27b5c562496Chia-I Wu      break;
4073b4c8886539b02653761f092a387c27b5c562496Chia-I Wu   }
408e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu
409e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu   blend_unpremultiply(ureg, src, one, temp);
4103b4c8886539b02653761f092a387c27b5c562496Chia-I Wu}
411231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira
4120ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu#define BLEND_GENERIC(mode) \
4130ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu   do { \
4140ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu      ureg_TEX(ureg, temp[2], TGSI_TEXTURE_2D, in[0], sampler[2]);         \
4150ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu      blend_generic(ureg, (mode), ureg_src(temp[0]), ureg_src(temp[1]),    \
4160ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu                    ureg_src(temp[2]),                                     \
4170ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu                    ureg_scalar(constant[3], TGSI_SWIZZLE_Y), temp + 3);   \
4180ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu      ureg_MOV(ureg, *out, ureg_src(temp[0]));                             \
4190ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu   } while (0)
4200ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu
421231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveirastatic INLINE void
4220ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wublend_src( struct ureg_program *ureg,
4230ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu           struct ureg_dst *out,
4240ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu           struct ureg_src *in,
4250ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu           struct ureg_src *sampler,
4260ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu           struct ureg_dst *temp,
4270ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu           struct ureg_src *constant)
4280ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu{
4290ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu   BLEND_GENERIC(VG_BLEND_SRC);
4300ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu}
4310ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu
4320ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wustatic INLINE void
4330ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wublend_src_over( struct ureg_program *ureg,
434231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                struct ureg_dst *out,
435231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                struct ureg_src *in,
436231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                struct ureg_src *sampler,
437231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                struct ureg_dst *temp,
438231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                struct ureg_src *constant)
439231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira{
4400ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu   BLEND_GENERIC(VG_BLEND_SRC_OVER);
4410ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu}
442e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu
4430ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wustatic INLINE void
4440ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wublend_dst_over( struct ureg_program *ureg,
4450ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu                struct ureg_dst *out,
4460ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu                struct ureg_src *in,
4470ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu                struct ureg_src *sampler,
4480ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu                struct ureg_dst *temp,
4490ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu                struct ureg_src *constant)
4500ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu{
4510ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu   BLEND_GENERIC(VG_BLEND_DST_OVER);
4520ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu}
453e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu
4540ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wustatic INLINE void
4550ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wublend_src_in( struct ureg_program *ureg,
4560ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu              struct ureg_dst *out,
4570ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu              struct ureg_src *in,
4580ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu              struct ureg_src *sampler,
4590ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu              struct ureg_dst *temp,
4600ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu              struct ureg_src *constant)
4610ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu{
4620ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu   BLEND_GENERIC(VG_BLEND_SRC_IN);
4630ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu}
4640ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu
4650ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wustatic INLINE void
4660ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wublend_dst_in( struct ureg_program *ureg,
4670ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu              struct ureg_dst *out,
4680ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu              struct ureg_src *in,
4690ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu              struct ureg_src *sampler,
4700ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu              struct ureg_dst *temp,
4710ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu              struct ureg_src *constant)
4720ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu{
4730ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu   BLEND_GENERIC(VG_BLEND_DST_IN);
4740ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu}
4750ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu
4760ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wustatic INLINE void
4770ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wublend_multiply( struct ureg_program *ureg,
4780ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu                struct ureg_dst *out,
4790ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu                struct ureg_src *in,
4800ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu                struct ureg_src *sampler,
4810ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu                struct ureg_dst *temp,
4820ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu                struct ureg_src *constant)
4830ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu{
4840ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu   BLEND_GENERIC(VG_BLEND_MULTIPLY);
485231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira}
486231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira
487231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveirastatic INLINE void
488231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveirablend_screen( struct ureg_program *ureg,
489231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira              struct ureg_dst     *out,
490231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira              struct ureg_src     *in,
491231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira              struct ureg_src     *sampler,
492231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira              struct ureg_dst     *temp,
493231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira              struct ureg_src     *constant)
494231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira{
4950ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu   BLEND_GENERIC(VG_BLEND_SCREEN);
496231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira}
497231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira
498231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveirastatic INLINE void
499231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveirablend_darken( struct ureg_program *ureg,
500231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira              struct ureg_dst     *out,
501231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira              struct ureg_src     *in,
502231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira              struct ureg_src     *sampler,
503231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira              struct ureg_dst     *temp,
504231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira              struct ureg_src     *constant)
505231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira{
5060ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu   BLEND_GENERIC(VG_BLEND_DARKEN);
507231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira}
508231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira
509231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveirastatic INLINE void
510231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveirablend_lighten( struct ureg_program *ureg,
511231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira               struct ureg_dst     *out,
512231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira               struct ureg_src     *in,
513231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira               struct ureg_src     *sampler,
514231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira               struct ureg_dst *temp,
515231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira               struct ureg_src     *constant)
516231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira{
5170ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu   BLEND_GENERIC(VG_BLEND_LIGHTEN);
5180ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu}
519e87a0cd260804a2488ef3eb1cf988fef1dd70e06Chia-I Wu
5200ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wustatic INLINE void
5210ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wublend_additive( struct ureg_program *ureg,
5220ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu                struct ureg_dst *out,
5230ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu                struct ureg_src *in,
5240ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu                struct ureg_src *sampler,
5250ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu                struct ureg_dst *temp,
5260ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu                struct ureg_src *constant)
5270ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu{
5280ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu   BLEND_GENERIC(VG_BLEND_ADDITIVE);
529231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira}
530231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira
531231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveirastatic INLINE void
532a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wumask( struct ureg_program *ureg,
533a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wu      struct ureg_dst *out,
534a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wu      struct ureg_src *in,
535a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wu      struct ureg_src *sampler,
536a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wu      struct ureg_dst *temp,
537a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wu      struct ureg_src *constant)
538a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wu{
539a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wu   ureg_TEX(ureg, temp[1], TGSI_TEXTURE_2D, in[0], sampler[1]);
540a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wu   ureg_MUL(ureg, ureg_writemask(temp[0], TGSI_WRITEMASK_W),
541a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wu            ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W),
542a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wu            ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W));
543a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wu   ureg_MOV(ureg, *out, ureg_src(temp[0]));
544a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wu}
545a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wu
546a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wustatic INLINE void
547231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveirapremultiply( struct ureg_program *ureg,
548231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                struct ureg_dst *out,
549231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                struct ureg_src *in,
550231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                struct ureg_src *sampler,
551231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                struct ureg_dst *temp,
552231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                struct ureg_src *constant)
553231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira{
554231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira   ureg_MUL(ureg,
555231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira            ureg_writemask(temp[0], TGSI_WRITEMASK_XYZ),
556231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira            ureg_src(temp[0]),
557231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira            ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W));
558231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira}
559231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira
560231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveirastatic INLINE void
561231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveiraunpremultiply( struct ureg_program *ureg,
562231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                struct ureg_dst *out,
563231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                struct ureg_src *in,
564231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                struct ureg_src *sampler,
565231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                struct ureg_dst *temp,
566231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                struct ureg_src *constant)
567231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira{
568231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira   ureg_TEX(ureg, temp[0], TGSI_TEXTURE_2D, in[0], sampler[1]);
569231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira}
570231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira
571231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira
572231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveirastatic INLINE void
573231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveiracolor_bw( struct ureg_program *ureg,
574231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                struct ureg_dst *out,
575231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                struct ureg_src *in,
576231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                struct ureg_src *sampler,
577231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                struct ureg_dst *temp,
578231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira                struct ureg_src *constant)
579231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira{
580231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira   ureg_ADD(ureg, temp[1],
581e360f91f152615b35857a4d008d0439a3c3285a8Chia-I Wu            ureg_scalar(constant[3], TGSI_SWIZZLE_Y),
582e360f91f152615b35857a4d008d0439a3c3285a8Chia-I Wu            ureg_scalar(constant[3], TGSI_SWIZZLE_Y));
583231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira   ureg_RCP(ureg, temp[2], ureg_src(temp[1]));
584231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira   ureg_ADD(ureg, temp[1],
585e360f91f152615b35857a4d008d0439a3c3285a8Chia-I Wu            ureg_scalar(constant[3], TGSI_SWIZZLE_Y),
586231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira            ureg_src(temp[2]));
587231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira   ureg_ADD(ureg, ureg_writemask(temp[2], TGSI_WRITEMASK_X),
588231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira            ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_X),
589231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira            ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_Y));
590231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira   ureg_ADD(ureg, ureg_writemask(temp[2], TGSI_WRITEMASK_X),
591231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira            ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_Z),
592231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira            ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_X));
593231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira   ureg_SGE(ureg,
594231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira            ureg_writemask(temp[0], TGSI_WRITEMASK_XYZ),
595231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira            ureg_scalar(ureg_src(temp[2]), TGSI_SWIZZLE_X),
596231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira            ureg_src(temp[1]));
597231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira  ureg_SGE(ureg,
598231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira           ureg_writemask(temp[0], TGSI_WRITEMASK_W),
599231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira           ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W),
600231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira           ureg_scalar(ureg_src(temp[2]), TGSI_SWIZZLE_Y));
601231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira  ureg_MOV(ureg, *out, ureg_src(temp[0]));
602231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira}
603544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
604544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
605544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusinstruct shader_asm_info {
606544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGint id;
607231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira   ureg_func func;
608544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
609544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGboolean needs_position;
610544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
611544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGint start_const;
612544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGint num_consts;
613544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
614544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGint start_sampler;
615544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGint num_samplers;
616544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
617544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGint start_temp;
618544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin   VGint num_temps;
619544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin};
620544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
621544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
622213e288e78bf5b0fb0a996cc17dfd959756c2c53Chia-I Wu/* paint types */
623213e288e78bf5b0fb0a996cc17dfd959756c2c53Chia-I Wustatic const struct shader_asm_info shaders_paint_asm[] = {
624231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira   {VEGA_SOLID_FILL_SHADER, solid_fill,
625e360f91f152615b35857a4d008d0439a3c3285a8Chia-I Wu    VG_FALSE, 2, 1, 0, 0, 0, 0},
626231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira   {VEGA_LINEAR_GRADIENT_SHADER, linear_grad,
627e360f91f152615b35857a4d008d0439a3c3285a8Chia-I Wu    VG_TRUE,  2, 5, 0, 1, 0, 5},
628231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira   {VEGA_RADIAL_GRADIENT_SHADER, radial_grad,
6292bb788ccc674669bc03ad09e4396f079044112e8Chia-I Wu    VG_TRUE,  2, 5, 0, 1, 0, 5},
630231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira   {VEGA_PATTERN_SHADER, pattern,
631d7aa03b4feb7c30408b2ed3070e0fe33e2fd05baChia-I Wu    VG_TRUE,  3, 4, 0, 1, 0, 5},
632d7aa03b4feb7c30408b2ed3070e0fe33e2fd05baChia-I Wu   {VEGA_PAINT_DEGENERATE_SHADER, paint_degenerate,
633d7aa03b4feb7c30408b2ed3070e0fe33e2fd05baChia-I Wu    VG_FALSE,  3, 1, 0, 1, 0, 2}
634213e288e78bf5b0fb0a996cc17dfd959756c2c53Chia-I Wu};
635544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
636213e288e78bf5b0fb0a996cc17dfd959756c2c53Chia-I Wu/* image draw modes */
637213e288e78bf5b0fb0a996cc17dfd959756c2c53Chia-I Wustatic const struct shader_asm_info shaders_image_asm[] = {
638231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira   {VEGA_IMAGE_NORMAL_SHADER, image_normal,
639e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu    VG_TRUE,  0, 0, 3, 1, 0, 2},
640231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira   {VEGA_IMAGE_MULTIPLY_SHADER, image_multiply,
641544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin    VG_TRUE,  0, 0, 3, 1, 0, 2},
642231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira   {VEGA_IMAGE_STENCIL_SHADER, image_stencil,
643213e288e78bf5b0fb0a996cc17dfd959756c2c53Chia-I Wu    VG_TRUE,  0, 0, 3, 1, 0, 2}
644213e288e78bf5b0fb0a996cc17dfd959756c2c53Chia-I Wu};
645544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
646e360f91f152615b35857a4d008d0439a3c3285a8Chia-I Wustatic const struct shader_asm_info shaders_color_transform_asm[] = {
647e360f91f152615b35857a4d008d0439a3c3285a8Chia-I Wu   {VEGA_COLOR_TRANSFORM_SHADER, color_transform,
648e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu    VG_FALSE, 0, 4, 0, 0, 0, 3}
649e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu};
650e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu
651e8ff3931f801dffdfd54832c298351e933688235Chia-I Wustatic const struct shader_asm_info shaders_alpha_asm[] = {
652e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu   {VEGA_ALPHA_NORMAL_SHADER, alpha_normal,
653e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu    VG_FALSE, 0, 0, 0, 0, 0, 2},
654e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu   {VEGA_ALPHA_PER_CHANNEL_SHADER, alpha_per_channel,
655e8ff3931f801dffdfd54832c298351e933688235Chia-I Wu    VG_FALSE, 0, 0, 0, 0, 0, 2}
656e360f91f152615b35857a4d008d0439a3c3285a8Chia-I Wu};
657e360f91f152615b35857a4d008d0439a3c3285a8Chia-I Wu
658213e288e78bf5b0fb0a996cc17dfd959756c2c53Chia-I Wu/* extra blend modes */
659213e288e78bf5b0fb0a996cc17dfd959756c2c53Chia-I Wustatic const struct shader_asm_info shaders_blend_asm[] = {
6600ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu#define BLEND_ASM_INFO(id, func) { (id), (func), VG_TRUE, 3, 1, 2, 1, 0, 5 }
6610ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu   BLEND_ASM_INFO(VEGA_BLEND_SRC_SHADER, blend_src),
6620ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu   BLEND_ASM_INFO(VEGA_BLEND_SRC_OVER_SHADER, blend_src_over),
6630ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu   BLEND_ASM_INFO(VEGA_BLEND_DST_OVER_SHADER, blend_dst_over),
6640ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu   BLEND_ASM_INFO(VEGA_BLEND_SRC_IN_SHADER, blend_src_in),
6650ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu   BLEND_ASM_INFO(VEGA_BLEND_DST_IN_SHADER, blend_dst_in),
6660ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu   BLEND_ASM_INFO(VEGA_BLEND_MULTIPLY_SHADER, blend_multiply),
6670ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu   BLEND_ASM_INFO(VEGA_BLEND_SCREEN_SHADER, blend_screen),
6680ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu   BLEND_ASM_INFO(VEGA_BLEND_DARKEN_SHADER, blend_darken),
6690ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu   BLEND_ASM_INFO(VEGA_BLEND_LIGHTEN_SHADER, blend_lighten),
6700ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu   BLEND_ASM_INFO(VEGA_BLEND_ADDITIVE_SHADER, blend_additive)
6710ee73edeccd21034e03e9e43dd0d09fa6fbf7842Chia-I Wu#undef BLEND_ASM_INFO
672213e288e78bf5b0fb0a996cc17dfd959756c2c53Chia-I Wu};
673544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
674a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wustatic const struct shader_asm_info shaders_mask_asm[] = {
675a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wu   {VEGA_MASK_SHADER, mask,
676a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wu    VG_TRUE,  0, 0, 1, 1, 0, 2}
677a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wu};
678a19eaaa6c1956add5343295af7e9f682efa08d74Chia-I Wu
679213e288e78bf5b0fb0a996cc17dfd959756c2c53Chia-I Wu/* premultiply */
680213e288e78bf5b0fb0a996cc17dfd959756c2c53Chia-I Wustatic const struct shader_asm_info shaders_premultiply_asm[] = {
681231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira   {VEGA_PREMULTIPLY_SHADER, premultiply,
682544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin    VG_FALSE,  0, 0, 0, 0, 0, 1},
683231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira   {VEGA_UNPREMULTIPLY_SHADER, unpremultiply,
684544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin    VG_FALSE,  0, 0, 0, 0, 0, 1},
685213e288e78bf5b0fb0a996cc17dfd959756c2c53Chia-I Wu};
686544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin
687213e288e78bf5b0fb0a996cc17dfd959756c2c53Chia-I Wu/* color transform to black and white */
688213e288e78bf5b0fb0a996cc17dfd959756c2c53Chia-I Wustatic const struct shader_asm_info shaders_bw_asm[] = {
689231d5457b275c1d9bbeff14165cf3da33dda176bIgor Oliveira   {VEGA_BW_SHADER, color_bw,
690e360f91f152615b35857a4d008d0439a3c3285a8Chia-I Wu    VG_FALSE,  3, 1, 0, 0, 0, 3},
691544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin};
692213e288e78bf5b0fb0a996cc17dfd959756c2c53Chia-I Wu
693544dd4b11f7be76bb00fe29a60eaf2772dcc69caZack Rusin#endif
694