1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************************************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2009 VMware, Inc.  All Rights Reserved.
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions:
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software.
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef ASM_FILL_H
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ASM_FILL_H
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi/tgsi_ureg.h"
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef void (* ureg_func)( struct ureg_program *ureg,
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            struct ureg_dst *out,
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            struct ureg_src *in,
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            struct ureg_src *sampler,
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            struct ureg_dst *temp,
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            struct ureg_src *constant);
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsolid_fill( struct ureg_program *ureg,
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            struct ureg_dst *out,
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            struct ureg_src *in,
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            struct ureg_src *sampler,
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            struct ureg_dst *temp,
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            struct ureg_src *constant)
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MOV(ureg, *out, constant[2]);
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Perform frag-coord-to-paint-coord transform.  The transformation is in
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONST[4..6].
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define PAINT_TRANSFORM                                                 \
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MOV(ureg, ureg_writemask(temp[0], TGSI_WRITEMASK_XY), in[0]);   \
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MOV(ureg,                                                       \
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_writemask(temp[0], TGSI_WRITEMASK_Z),                  \
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_scalar(constant[3], TGSI_SWIZZLE_Y));                  \
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_DP3(ureg, temp[1], constant[4], ureg_src(temp[0]));             \
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_DP3(ureg, temp[2], constant[5], ureg_src(temp[0]));             \
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_DP3(ureg, temp[3], constant[6], ureg_src(temp[0]));             \
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_RCP(ureg, temp[3], ureg_src(temp[3]));                          \
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MUL(ureg, temp[1], ureg_src(temp[1]), ureg_src(temp[3]));       \
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MUL(ureg, temp[2], ureg_src(temp[2]), ureg_src(temp[3]));       \
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MOV(ureg,                                                       \
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_writemask(temp[4], TGSI_WRITEMASK_X),                  \
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_src(temp[1]));                                         \
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MOV(ureg,                                                       \
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_writemask(temp[4], TGSI_WRITEMASK_Y),                  \
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_src(temp[2]));
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglinear_grad( struct ureg_program *ureg,
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             struct ureg_dst *out,
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             struct ureg_src *in,
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             struct ureg_src *sampler,
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             struct ureg_dst *temp,
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             struct ureg_src *constant)
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PAINT_TRANSFORM
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* grad = DP2((x, y), CONST[2].xy) * CONST[2].z */
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MUL(ureg, temp[0],
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_scalar(constant[2], TGSI_SWIZZLE_Y),
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_scalar(ureg_src(temp[4]), TGSI_SWIZZLE_Y));
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MAD(ureg, temp[1],
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_scalar(constant[2], TGSI_SWIZZLE_X),
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_scalar(ureg_src(temp[4]), TGSI_SWIZZLE_X),
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_src(temp[0]));
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MUL(ureg, temp[2], ureg_src(temp[1]),
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_scalar(constant[2], TGSI_SWIZZLE_Z));
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_TEX(ureg, *out, TGSI_TEXTURE_1D, ureg_src(temp[2]), sampler[0]);
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgradial_grad( struct ureg_program *ureg,
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             struct ureg_dst *out,
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             struct ureg_src *in,
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             struct ureg_src *sampler,
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             struct ureg_dst *temp,
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             struct ureg_src *constant)
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PAINT_TRANSFORM
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Calculate (sqrt(B^2 + AC) - B) / A, where
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *   A is CONST[2].z,
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *   B is DP2((x, y), CONST[2].xy), and
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *   C is DP2((x, y), (x, y)).
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* B and C */
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_DP2(ureg, temp[0], ureg_src(temp[4]), constant[2]);
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_DP2(ureg, temp[1], ureg_src(temp[4]), ureg_src(temp[4]));
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* the square root */
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MUL(ureg, temp[2], ureg_src(temp[0]), ureg_src(temp[0]));
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MAD(ureg, temp[3], ureg_src(temp[1]),
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ureg_scalar(constant[2], TGSI_SWIZZLE_Z), ureg_src(temp[2]));
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_RSQ(ureg, temp[3], ureg_src(temp[3]));
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_RCP(ureg, temp[3], ureg_src(temp[3]));
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_SUB(ureg, temp[3], ureg_src(temp[3]), ureg_src(temp[0]));
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_RCP(ureg, temp[0], ureg_scalar(constant[2], TGSI_SWIZZLE_Z));
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MUL(ureg, temp[0], ureg_src(temp[0]), ureg_src(temp[3]));
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_TEX(ureg, *out, TGSI_TEXTURE_1D, ureg_src(temp[0]), sampler[0]);
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpattern( struct ureg_program *ureg,
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         struct ureg_dst     *out,
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         struct ureg_src     *in,
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         struct ureg_src     *sampler,
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         struct ureg_dst     *temp,
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         struct ureg_src     *constant)
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PAINT_TRANSFORM
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* (s, t) = (x / tex_width, y / tex_height) */
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_RCP(ureg, temp[0],
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_swizzle(constant[3],
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         TGSI_SWIZZLE_Z,
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         TGSI_SWIZZLE_W,
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         TGSI_SWIZZLE_Z,
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         TGSI_SWIZZLE_W));
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MOV(ureg, temp[1], ureg_src(temp[4]));
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MUL(ureg,
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_writemask(temp[1], TGSI_WRITEMASK_X),
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_src(temp[1]),
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_src(temp[0]));
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MUL(ureg,
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_writemask(temp[1], TGSI_WRITEMASK_Y),
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_src(temp[1]),
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_src(temp[0]));
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_TEX(ureg, *out, TGSI_TEXTURE_2D, ureg_src(temp[1]), sampler[0]);
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpaint_degenerate( struct ureg_program *ureg,
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  struct ureg_dst *out,
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  struct ureg_src *in,
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  struct ureg_src *sampler,
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  struct ureg_dst *temp,
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  struct ureg_src *constant)
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* CONST[3].y is 1.0f */
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MOV(ureg, temp[1], ureg_scalar(constant[3], TGSI_SWIZZLE_Y));
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_TEX(ureg, *out, TGSI_TEXTURE_1D, ureg_src(temp[1]), sampler[0]);
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgimage_normal( struct ureg_program *ureg,
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_dst *out,
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_src *in,
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_src *sampler,
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_dst *temp,
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_src *constant)
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* store and pass image color in TEMP[1] */
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_TEX(ureg, temp[1], TGSI_TEXTURE_2D, in[1], sampler[3]);
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MOV(ureg, *out, ureg_src(temp[1]));
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgimage_multiply( struct ureg_program *ureg,
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_dst *out,
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_src *in,
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_src *sampler,
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_dst *temp,
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_src *constant)
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* store and pass image color in TEMP[1] */
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_TEX(ureg, temp[1], TGSI_TEXTURE_2D, in[1], sampler[3]);
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MUL(ureg, *out, ureg_src(temp[0]), ureg_src(temp[1]));
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgimage_stencil( struct ureg_program *ureg,
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               struct ureg_dst *out,
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               struct ureg_src *in,
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               struct ureg_src *sampler,
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               struct ureg_dst *temp,
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               struct ureg_src *constant)
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* store and pass image color in TEMP[1] */
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_TEX(ureg, temp[1], TGSI_TEXTURE_2D, in[1], sampler[3]);
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MOV(ureg, *out, ureg_src(temp[0]));
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcolor_transform( struct ureg_program *ureg,
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 struct ureg_dst *out,
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 struct ureg_src *in,
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 struct ureg_src *sampler,
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 struct ureg_dst *temp,
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                 struct ureg_src *constant)
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* note that TEMP[1] may already be used for image color */
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MAD(ureg, temp[2], ureg_src(temp[0]), constant[0], constant[1]);
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* clamp to [0.0f, 1.0f] */
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_CLAMP(ureg, temp[2],
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              ureg_src(temp[2]),
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              ureg_scalar(constant[3], TGSI_SWIZZLE_X),
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              ureg_scalar(constant[3], TGSI_SWIZZLE_Y));
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MOV(ureg, *out, ureg_src(temp[2]));
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgalpha_normal( struct ureg_program *ureg,
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_dst *out,
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_src *in,
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_src *sampler,
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_dst *temp,
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_src *constant)
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* save per-channel alpha in TEMP[1] */
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MOV(ureg, temp[1], ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W));
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MOV(ureg, *out, ureg_src(temp[0]));
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgalpha_per_channel( struct ureg_program *ureg,
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   struct ureg_dst *out,
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   struct ureg_src *in,
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   struct ureg_src *sampler,
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   struct ureg_dst *temp,
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   struct ureg_src *constant)
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* save per-channel alpha in TEMP[1] */
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MUL(ureg,
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_writemask(temp[1], TGSI_WRITEMASK_W),
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_src(temp[0]),
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_src(temp[1]));
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MUL(ureg,
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_writemask(temp[1], TGSI_WRITEMASK_XYZ),
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_src(temp[1]),
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W));
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* update alpha */
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MOV(ureg,
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_writemask(temp[0], TGSI_WRITEMASK_W),
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_src(temp[1]));
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MOV(ureg, *out, ureg_src(temp[0]));
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Premultiply src and dst.
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgblend_premultiply( struct ureg_program *ureg,
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   struct ureg_src src,
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   struct ureg_src src_channel_alpha,
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   struct ureg_src dst)
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* premultiply src */
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MUL(ureg,
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_writemask(ureg_dst(src), TGSI_WRITEMASK_XYZ),
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            src,
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            src_channel_alpha);
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* premultiply dst */
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MUL(ureg,
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_writemask(ureg_dst(dst), TGSI_WRITEMASK_XYZ),
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dst,
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_scalar(dst, TGSI_SWIZZLE_W));
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Unpremultiply src.
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgblend_unpremultiply( struct ureg_program *ureg,
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     struct ureg_src src,
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     struct ureg_src one,
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     struct ureg_dst temp[1])
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* replace 0.0f by 1.0f before calculating reciprocal */
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_CMP(ureg,
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            temp[0],
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_negate(ureg_scalar(src, TGSI_SWIZZLE_W)),
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_scalar(src, TGSI_SWIZZLE_W),
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            one);
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_RCP(ureg, temp[0], ureg_src(temp[0]));
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MUL(ureg,
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_writemask(ureg_dst(src), TGSI_WRITEMASK_XYZ),
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            src,
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_src(temp[0]));
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Emit instructions for the specified blend mode.  Colors will be
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * unpremultiplied.  Two temporary registers are required.
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The output is written back to src.
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgblend_generic(struct ureg_program *ureg,
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              VGBlendMode mode,
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_src src,
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_src src_channel_alpha,
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_src dst,
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_src one,
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_dst temp[2])
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct ureg_dst out;
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   blend_premultiply(ureg, src, src_channel_alpha, dst);
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* blend in-place */
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   out = ureg_dst(src);
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (mode) {
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case VG_BLEND_SRC:
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ureg_MOV(ureg, out, src);
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case VG_BLEND_SRC_OVER:
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* RGBA_out = RGBA_src + (1 - A_src) * RGBA_dst */
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ureg_SUB(ureg, temp[0], one, src_channel_alpha);
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ureg_MAD(ureg, out, ureg_src(temp[0]), dst, src);
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case VG_BLEND_DST_OVER:
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* RGBA_out = RGBA_dst + (1 - A_dst) * RGBA_src */
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ureg_SUB(ureg, temp[0], one, ureg_scalar(dst, TGSI_SWIZZLE_W));
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ureg_MAD(ureg, out, ureg_src(temp[0]), src, dst);
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case VG_BLEND_SRC_IN:
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ureg_MUL(ureg, out, src, ureg_scalar(dst, TGSI_SWIZZLE_W));
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case VG_BLEND_DST_IN:
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ureg_MUL(ureg, out, dst, src_channel_alpha);
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case VG_BLEND_MULTIPLY:
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /*
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * RGB_out = (1 - A_dst) * RGB_src + (1 - A_src) * RGB_dst +
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       *           RGB_src * RGB_dst
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ureg_MAD(ureg, temp[0],
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_scalar(dst, TGSI_SWIZZLE_W), ureg_negate(src), src);
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ureg_MAD(ureg, temp[1],
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            src_channel_alpha, ureg_negate(dst), dst);
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ureg_MAD(ureg, temp[0], src, dst, ureg_src(temp[0]));
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ureg_ADD(ureg, out, ureg_src(temp[0]), ureg_src(temp[1]));
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* alpha is src over */
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ureg_ADD(ureg, ureg_writemask(out, TGSI_WRITEMASK_W),
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            src, ureg_src(temp[1]));
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case VG_BLEND_SCREEN:
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* RGBA_out = RGBA_src + (1 - RGBA_src) * RGBA_dst */
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ureg_SUB(ureg, temp[0], one, src);
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ureg_MAD(ureg, out, ureg_src(temp[0]), dst, src);
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case VG_BLEND_DARKEN:
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case VG_BLEND_LIGHTEN:
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* src over */
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ureg_SUB(ureg, temp[0], one, src_channel_alpha);
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ureg_MAD(ureg, temp[0], ureg_src(temp[0]), dst, src);
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* dst over */
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ureg_SUB(ureg, temp[1], one, ureg_scalar(dst, TGSI_SWIZZLE_W));
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ureg_MAD(ureg, temp[1], ureg_src(temp[1]), src, dst);
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* take min/max for colors */
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (mode == VG_BLEND_DARKEN) {
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ureg_MIN(ureg, ureg_writemask(out, TGSI_WRITEMASK_XYZ),
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               ureg_src(temp[0]), ureg_src(temp[1]));
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ureg_MAX(ureg, ureg_writemask(out, TGSI_WRITEMASK_XYZ),
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               ureg_src(temp[0]), ureg_src(temp[1]));
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case VG_BLEND_ADDITIVE:
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* RGBA_out = RGBA_src + RGBA_dst */
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ureg_ADD(ureg, temp[0], src, dst);
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ureg_MIN(ureg, out, ureg_src(temp[0]), one);
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(0);
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   blend_unpremultiply(ureg, src, one, temp);
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BLEND_GENERIC(mode) \
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   do { \
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ureg_TEX(ureg, temp[2], TGSI_TEXTURE_2D, in[0], sampler[2]);         \
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      blend_generic(ureg, (mode), ureg_src(temp[0]), ureg_src(temp[1]),    \
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    ureg_src(temp[2]),                                     \
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    ureg_scalar(constant[3], TGSI_SWIZZLE_Y), temp + 3);   \
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ureg_MOV(ureg, *out, ureg_src(temp[0]));                             \
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } while (0)
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgblend_src( struct ureg_program *ureg,
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           struct ureg_dst *out,
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           struct ureg_src *in,
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           struct ureg_src *sampler,
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           struct ureg_dst *temp,
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           struct ureg_src *constant)
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BLEND_GENERIC(VG_BLEND_SRC);
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgblend_src_over( struct ureg_program *ureg,
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_dst *out,
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_src *in,
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_src *sampler,
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_dst *temp,
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_src *constant)
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BLEND_GENERIC(VG_BLEND_SRC_OVER);
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgblend_dst_over( struct ureg_program *ureg,
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_dst *out,
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_src *in,
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_src *sampler,
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_dst *temp,
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_src *constant)
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BLEND_GENERIC(VG_BLEND_DST_OVER);
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgblend_src_in( struct ureg_program *ureg,
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_dst *out,
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_src *in,
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_src *sampler,
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_dst *temp,
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_src *constant)
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BLEND_GENERIC(VG_BLEND_SRC_IN);
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgblend_dst_in( struct ureg_program *ureg,
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_dst *out,
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_src *in,
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_src *sampler,
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_dst *temp,
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_src *constant)
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BLEND_GENERIC(VG_BLEND_DST_IN);
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgblend_multiply( struct ureg_program *ureg,
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_dst *out,
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_src *in,
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_src *sampler,
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_dst *temp,
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_src *constant)
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BLEND_GENERIC(VG_BLEND_MULTIPLY);
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgblend_screen( struct ureg_program *ureg,
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_dst     *out,
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_src     *in,
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_src     *sampler,
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_dst     *temp,
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_src     *constant)
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BLEND_GENERIC(VG_BLEND_SCREEN);
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgblend_darken( struct ureg_program *ureg,
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_dst     *out,
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_src     *in,
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_src     *sampler,
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_dst     *temp,
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              struct ureg_src     *constant)
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BLEND_GENERIC(VG_BLEND_DARKEN);
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgblend_lighten( struct ureg_program *ureg,
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               struct ureg_dst     *out,
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               struct ureg_src     *in,
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               struct ureg_src     *sampler,
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               struct ureg_dst *temp,
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               struct ureg_src     *constant)
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BLEND_GENERIC(VG_BLEND_LIGHTEN);
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgblend_additive( struct ureg_program *ureg,
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_dst *out,
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_src *in,
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_src *sampler,
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_dst *temp,
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_src *constant)
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BLEND_GENERIC(VG_BLEND_ADDITIVE);
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmask( struct ureg_program *ureg,
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct ureg_dst *out,
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct ureg_src *in,
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct ureg_src *sampler,
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct ureg_dst *temp,
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct ureg_src *constant)
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_TEX(ureg, temp[1], TGSI_TEXTURE_2D, in[0], sampler[1]);
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MUL(ureg, ureg_writemask(temp[0], TGSI_WRITEMASK_W),
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W),
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_scalar(ureg_src(temp[1]), TGSI_SWIZZLE_W));
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MOV(ureg, *out, ureg_src(temp[0]));
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpremultiply( struct ureg_program *ureg,
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_dst *out,
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_src *in,
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_src *sampler,
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_dst *temp,
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_src *constant)
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_MUL(ureg,
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_writemask(temp[0], TGSI_WRITEMASK_XYZ),
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_src(temp[0]),
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W));
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunpremultiply( struct ureg_program *ureg,
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_dst *out,
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_src *in,
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_src *sampler,
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_dst *temp,
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_src *constant)
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_TEX(ureg, temp[0], TGSI_TEXTURE_2D, in[0], sampler[1]);
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcolor_bw( struct ureg_program *ureg,
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_dst *out,
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_src *in,
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_src *sampler,
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_dst *temp,
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                struct ureg_src *constant)
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_ADD(ureg, temp[1],
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_scalar(constant[3], TGSI_SWIZZLE_Y),
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_scalar(constant[3], TGSI_SWIZZLE_Y));
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_RCP(ureg, temp[2], ureg_src(temp[1]));
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_ADD(ureg, temp[1],
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_scalar(constant[3], TGSI_SWIZZLE_Y),
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_src(temp[2]));
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_ADD(ureg, ureg_writemask(temp[2], TGSI_WRITEMASK_X),
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_X),
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_Y));
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_ADD(ureg, ureg_writemask(temp[2], TGSI_WRITEMASK_X),
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_Z),
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_X));
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_SGE(ureg,
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_writemask(temp[0], TGSI_WRITEMASK_XYZ),
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_scalar(ureg_src(temp[2]), TGSI_SWIZZLE_X),
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ureg_src(temp[1]));
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  ureg_SGE(ureg,
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           ureg_writemask(temp[0], TGSI_WRITEMASK_W),
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           ureg_scalar(ureg_src(temp[0]), TGSI_SWIZZLE_W),
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           ureg_scalar(ureg_src(temp[2]), TGSI_SWIZZLE_Y));
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  ureg_MOV(ureg, *out, ureg_src(temp[0]));
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct shader_asm_info {
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGint id;
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ureg_func func;
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGboolean needs_position;
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGint start_const;
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGint num_consts;
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGint start_sampler;
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGint num_samplers;
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGint start_temp;
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   VGint num_temps;
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* paint types */
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct shader_asm_info shaders_paint_asm[] = {
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {VEGA_SOLID_FILL_SHADER, solid_fill,
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    VG_FALSE, 2, 1, 0, 0, 0, 0},
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {VEGA_LINEAR_GRADIENT_SHADER, linear_grad,
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    VG_TRUE,  2, 5, 0, 1, 0, 5},
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {VEGA_RADIAL_GRADIENT_SHADER, radial_grad,
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    VG_TRUE,  2, 5, 0, 1, 0, 5},
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {VEGA_PATTERN_SHADER, pattern,
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    VG_TRUE,  3, 4, 0, 1, 0, 5},
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {VEGA_PAINT_DEGENERATE_SHADER, paint_degenerate,
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    VG_FALSE,  3, 1, 0, 1, 0, 2}
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* image draw modes */
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct shader_asm_info shaders_image_asm[] = {
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {VEGA_IMAGE_NORMAL_SHADER, image_normal,
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    VG_TRUE,  0, 0, 3, 1, 0, 2},
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {VEGA_IMAGE_MULTIPLY_SHADER, image_multiply,
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    VG_TRUE,  0, 0, 3, 1, 0, 2},
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {VEGA_IMAGE_STENCIL_SHADER, image_stencil,
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    VG_TRUE,  0, 0, 3, 1, 0, 2}
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct shader_asm_info shaders_color_transform_asm[] = {
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {VEGA_COLOR_TRANSFORM_SHADER, color_transform,
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    VG_FALSE, 0, 4, 0, 0, 0, 3}
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct shader_asm_info shaders_alpha_asm[] = {
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {VEGA_ALPHA_NORMAL_SHADER, alpha_normal,
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    VG_FALSE, 0, 0, 0, 0, 0, 2},
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {VEGA_ALPHA_PER_CHANNEL_SHADER, alpha_per_channel,
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    VG_FALSE, 0, 0, 0, 0, 0, 2}
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* extra blend modes */
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct shader_asm_info shaders_blend_asm[] = {
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BLEND_ASM_INFO(id, func) { (id), (func), VG_TRUE, 3, 1, 2, 1, 0, 5 }
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BLEND_ASM_INFO(VEGA_BLEND_SRC_SHADER, blend_src),
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BLEND_ASM_INFO(VEGA_BLEND_SRC_OVER_SHADER, blend_src_over),
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BLEND_ASM_INFO(VEGA_BLEND_DST_OVER_SHADER, blend_dst_over),
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BLEND_ASM_INFO(VEGA_BLEND_SRC_IN_SHADER, blend_src_in),
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BLEND_ASM_INFO(VEGA_BLEND_DST_IN_SHADER, blend_dst_in),
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BLEND_ASM_INFO(VEGA_BLEND_MULTIPLY_SHADER, blend_multiply),
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BLEND_ASM_INFO(VEGA_BLEND_SCREEN_SHADER, blend_screen),
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BLEND_ASM_INFO(VEGA_BLEND_DARKEN_SHADER, blend_darken),
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BLEND_ASM_INFO(VEGA_BLEND_LIGHTEN_SHADER, blend_lighten),
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BLEND_ASM_INFO(VEGA_BLEND_ADDITIVE_SHADER, blend_additive)
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef BLEND_ASM_INFO
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct shader_asm_info shaders_mask_asm[] = {
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {VEGA_MASK_SHADER, mask,
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    VG_TRUE,  0, 0, 1, 1, 0, 2}
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* premultiply */
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct shader_asm_info shaders_premultiply_asm[] = {
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {VEGA_PREMULTIPLY_SHADER, premultiply,
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    VG_FALSE,  0, 0, 0, 0, 0, 1},
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {VEGA_UNPREMULTIPLY_SHADER, unpremultiply,
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    VG_FALSE,  0, 0, 0, 0, 0, 1},
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* color transform to black and white */
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct shader_asm_info shaders_bw_asm[] = {
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {VEGA_BW_SHADER, color_bw,
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    VG_FALSE,  3, 1, 0, 0, 0, 3},
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
694