nv40_exa.c revision 16ee1e9a
1fda9279dSmrg/*
2fda9279dSmrg * Copyright 2007 Ben Skeggs
3fda9279dSmrg *
4fda9279dSmrg * Permission is hereby granted, free of charge, to any person obtaining a
5fda9279dSmrg * copy of this software and associated documentation files (the "Software"),
6fda9279dSmrg * to deal in the Software without restriction, including without limitation
7fda9279dSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8fda9279dSmrg * and/or sell copies of the Software, and to permit persons to whom the
9fda9279dSmrg * Software is furnished to do so, subject to the following conditions:
10fda9279dSmrg *
11fda9279dSmrg * The above copyright notice and this permission notice shall be included in
12fda9279dSmrg * all copies or substantial portions of the Software.
13fda9279dSmrg *
14fda9279dSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15fda9279dSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16fda9279dSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17fda9279dSmrg * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18fda9279dSmrg * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
19fda9279dSmrg * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20fda9279dSmrg * SOFTWARE.
21fda9279dSmrg */
22fda9279dSmrg
23fda9279dSmrg#include "nv_include.h"
24fda9279dSmrg
25fda9279dSmrg#include "hwdefs/nv_object.xml.h"
26fda9279dSmrg#include "hwdefs/nv30-40_3d.xml.h"
27fda9279dSmrg#include "nv04_accel.h"
28fda9279dSmrg
29fda9279dSmrgtypedef struct nv_pict_surface_format {
30fda9279dSmrg	int	 pict_fmt;
31fda9279dSmrg	uint32_t card_fmt;
32fda9279dSmrg} nv_pict_surface_format_t;
33fda9279dSmrg
34fda9279dSmrgtypedef struct nv_pict_texture_format {
35fda9279dSmrg	int	 pict_fmt;
36fda9279dSmrg	uint32_t card_fmt;
37fda9279dSmrg	uint32_t card_swz;
38fda9279dSmrg} nv_pict_texture_format_t;
39fda9279dSmrg
40fda9279dSmrgtypedef struct nv_pict_op {
41fda9279dSmrg	Bool	 src_alpha;
42fda9279dSmrg	Bool	 dst_alpha;
43fda9279dSmrg	uint32_t src_card_op;
44fda9279dSmrg	uint32_t dst_card_op;
45fda9279dSmrg} nv_pict_op_t;
46fda9279dSmrg
47fda9279dSmrgstatic nv_pict_surface_format_t
48fda9279dSmrgNV40SurfaceFormat[] = {
49fda9279dSmrg	{ PICT_a8r8g8b8	, NV30_3D_RT_FORMAT_COLOR_A8R8G8B8 },
50fda9279dSmrg	{ PICT_x8r8g8b8	, NV30_3D_RT_FORMAT_COLOR_X8R8G8B8 },
51fda9279dSmrg	{ PICT_r5g6b5	, NV30_3D_RT_FORMAT_COLOR_R5G6B5   },
52fda9279dSmrg	{ PICT_a8       , NV30_3D_RT_FORMAT_COLOR_B8       },
53fda9279dSmrg	{ -1, ~0 }
54fda9279dSmrg};
55fda9279dSmrg
56fda9279dSmrgstatic nv_pict_surface_format_t *
57fda9279dSmrgNV40_GetPictSurfaceFormat(int format)
58fda9279dSmrg{
59fda9279dSmrg	int i = 0;
60fda9279dSmrg
61fda9279dSmrg	while (NV40SurfaceFormat[i].pict_fmt != -1) {
62fda9279dSmrg		if (NV40SurfaceFormat[i].pict_fmt == format)
63fda9279dSmrg			return &NV40SurfaceFormat[i];
64fda9279dSmrg		i++;
65fda9279dSmrg	}
66fda9279dSmrg
67fda9279dSmrg	return NULL;
68fda9279dSmrg}
69fda9279dSmrg
70fda9279dSmrg#define _(r,tf,ts0x,ts0y,ts0z,ts0w,ts1x,ts1y,ts1z,ts1w)                        \
71fda9279dSmrg  {                                                                            \
72fda9279dSmrg  PICT_##r, NV40_3D_TEX_FORMAT_FORMAT_##tf,                                    \
73fda9279dSmrg  NV30_3D_TEX_SWIZZLE_S0_X_##ts0x | NV30_3D_TEX_SWIZZLE_S0_Y_##ts0y |          \
74fda9279dSmrg  NV30_3D_TEX_SWIZZLE_S0_Z_##ts0z | NV30_3D_TEX_SWIZZLE_S0_W_##ts0w |          \
75fda9279dSmrg  NV30_3D_TEX_SWIZZLE_S1_X_##ts1x | NV30_3D_TEX_SWIZZLE_S1_Y_##ts1y |          \
76fda9279dSmrg  NV30_3D_TEX_SWIZZLE_S1_Z_##ts1z | NV30_3D_TEX_SWIZZLE_S1_W_##ts1w,           \
77fda9279dSmrg  }
78fda9279dSmrgstatic nv_pict_texture_format_t
79fda9279dSmrgNV40TextureFormat[] = {
80fda9279dSmrg        _(a8r8g8b8, A8R8G8B8,   S1,   S1,   S1,   S1, X, Y, Z, W),
81fda9279dSmrg        _(x8r8g8b8, A8R8G8B8,   S1,   S1,   S1,  ONE, X, Y, Z, W),
82fda9279dSmrg        _(x8b8g8r8, A8R8G8B8,   S1,   S1,   S1,  ONE, Z, Y, X, W),
83fda9279dSmrg        _(a1r5g5b5, A1R5G5B5,   S1,   S1,   S1,   S1, X, Y, Z, W),
84fda9279dSmrg        _(x1r5g5b5, A1R5G5B5,   S1,   S1,   S1,  ONE, X, Y, Z, W),
85fda9279dSmrg        _(  r5g6b5,   R5G6B5,   S1,   S1,   S1,   S1, X, Y, Z, W),
86fda9279dSmrg        _(      a8,       L8, ZERO, ZERO, ZERO,   S1, X, X, X, X),
87fda9279dSmrg        { -1, ~0, ~0 }
88fda9279dSmrg};
89fda9279dSmrg#undef _
90fda9279dSmrg
91fda9279dSmrgstatic nv_pict_texture_format_t *
92fda9279dSmrgNV40_GetPictTextureFormat(int format)
93fda9279dSmrg{
94fda9279dSmrg	int i = 0;
95fda9279dSmrg
96fda9279dSmrg	while (NV40TextureFormat[i].pict_fmt != -1) {
97fda9279dSmrg		if (NV40TextureFormat[i].pict_fmt == format)
98fda9279dSmrg			return &NV40TextureFormat[i];
99fda9279dSmrg		i++;
100fda9279dSmrg	}
101fda9279dSmrg
102fda9279dSmrg	return NULL;
103fda9279dSmrg}
104fda9279dSmrg
105fda9279dSmrg#define SF(bf) (NV30_3D_BLEND_FUNC_SRC_RGB_##bf |                              \
106fda9279dSmrg		NV30_3D_BLEND_FUNC_SRC_ALPHA_##bf)
107fda9279dSmrg#define DF(bf) (NV30_3D_BLEND_FUNC_DST_RGB_##bf |                              \
108fda9279dSmrg		NV30_3D_BLEND_FUNC_DST_ALPHA_##bf)
109fda9279dSmrgstatic nv_pict_op_t
110fda9279dSmrgNV40PictOp[] = {
111fda9279dSmrg/* Clear       */ { 0, 0, SF(               ZERO), DF(               ZERO) },
112fda9279dSmrg/* Src         */ { 0, 0, SF(                ONE), DF(               ZERO) },
113fda9279dSmrg/* Dst         */ { 0, 0, SF(               ZERO), DF(                ONE) },
114fda9279dSmrg/* Over        */ { 1, 0, SF(                ONE), DF(ONE_MINUS_SRC_ALPHA) },
115fda9279dSmrg/* OverReverse */ { 0, 1, SF(ONE_MINUS_DST_ALPHA), DF(                ONE) },
116fda9279dSmrg/* In          */ { 0, 1, SF(          DST_ALPHA), DF(               ZERO) },
117fda9279dSmrg/* InReverse   */ { 1, 0, SF(               ZERO), DF(          SRC_ALPHA) },
118fda9279dSmrg/* Out         */ { 0, 1, SF(ONE_MINUS_DST_ALPHA), DF(               ZERO) },
119fda9279dSmrg/* OutReverse  */ { 1, 0, SF(               ZERO), DF(ONE_MINUS_SRC_ALPHA) },
120fda9279dSmrg/* Atop        */ { 1, 1, SF(          DST_ALPHA), DF(ONE_MINUS_SRC_ALPHA) },
121fda9279dSmrg/* AtopReverse */ { 1, 1, SF(ONE_MINUS_DST_ALPHA), DF(          SRC_ALPHA) },
122fda9279dSmrg/* Xor         */ { 1, 1, SF(ONE_MINUS_DST_ALPHA), DF(ONE_MINUS_SRC_ALPHA) },
123fda9279dSmrg/* Add         */ { 0, 0, SF(                ONE), DF(                ONE) }
124fda9279dSmrg};
125fda9279dSmrg
126fda9279dSmrgstatic nv_pict_op_t *
127fda9279dSmrgNV40_GetPictOpRec(int op)
128fda9279dSmrg{
129fda9279dSmrg	if (op >= PictOpSaturate)
130fda9279dSmrg		return NULL;
131fda9279dSmrg	return &NV40PictOp[op];
132fda9279dSmrg}
133fda9279dSmrg
134fda9279dSmrgstatic void
135fda9279dSmrgNV40_SetupBlend(ScrnInfoPtr pScrn, nv_pict_op_t *blend,
136fda9279dSmrg		PictFormatShort dest_format, Bool component_alpha)
137fda9279dSmrg{
138fda9279dSmrg	NVPtr pNv = NVPTR(pScrn);
139fda9279dSmrg	struct nouveau_pushbuf *push = pNv->pushbuf;
140fda9279dSmrg	uint32_t sblend, dblend;
141fda9279dSmrg
142fda9279dSmrg	sblend = blend->src_card_op;
143fda9279dSmrg	dblend = blend->dst_card_op;
144fda9279dSmrg
145fda9279dSmrg	if (blend->dst_alpha) {
146fda9279dSmrg		if (!PICT_FORMAT_A(dest_format)) {
147fda9279dSmrg			if (sblend == SF(DST_ALPHA)) {
148fda9279dSmrg				sblend = SF(ONE);
149fda9279dSmrg			} else if (sblend == SF(ONE_MINUS_DST_ALPHA)) {
150fda9279dSmrg				sblend = SF(ZERO);
151fda9279dSmrg			}
152fda9279dSmrg		} else if (dest_format == PICT_a8) {
153fda9279dSmrg			if (sblend == SF(DST_ALPHA)) {
154fda9279dSmrg				sblend = SF(DST_COLOR);
155fda9279dSmrg			} else if (sblend == SF(ONE_MINUS_DST_ALPHA)) {
156fda9279dSmrg				sblend = SF(ONE_MINUS_DST_COLOR);
157fda9279dSmrg			}
158fda9279dSmrg		}
159fda9279dSmrg	}
160fda9279dSmrg
161fda9279dSmrg	if (blend->src_alpha && (component_alpha || dest_format == PICT_a8)) {
162fda9279dSmrg		if (dblend == DF(SRC_ALPHA)) {
163fda9279dSmrg			dblend = DF(SRC_COLOR);
164fda9279dSmrg		} else if (dblend == DF(ONE_MINUS_SRC_ALPHA)) {
165fda9279dSmrg			dblend = DF(ONE_MINUS_SRC_COLOR);
166fda9279dSmrg		}
167fda9279dSmrg	}
168fda9279dSmrg
169fda9279dSmrg	if (sblend == SF(ONE) && dblend == DF(ZERO)) {
170fda9279dSmrg		BEGIN_NV04(push, NV30_3D(BLEND_FUNC_ENABLE), 1);
171fda9279dSmrg		PUSH_DATA (push, 0);
172fda9279dSmrg	} else {
173fda9279dSmrg		BEGIN_NV04(push, NV30_3D(BLEND_FUNC_ENABLE), 5);
174fda9279dSmrg		PUSH_DATA (push, 1);
175fda9279dSmrg		PUSH_DATA (push, sblend);
176fda9279dSmrg		PUSH_DATA (push, dblend);
177fda9279dSmrg		PUSH_DATA (push, 0x00000000);
178fda9279dSmrg		PUSH_DATA (push, NV40_3D_BLEND_EQUATION_ALPHA_FUNC_ADD |
179fda9279dSmrg				 NV40_3D_BLEND_EQUATION_RGB_FUNC_ADD);
180fda9279dSmrg	}
181fda9279dSmrg}
182fda9279dSmrg
183fda9279dSmrgstatic Bool
184fda9279dSmrgNV40EXAPictSolid(NVPtr pNv, PicturePtr pPict, int unit)
185fda9279dSmrg{
186fda9279dSmrg	struct nouveau_pushbuf *push = pNv->pushbuf;
187fda9279dSmrg
188fda9279dSmrg	PUSH_DATAu(push, pNv->scratch, SOLID(unit), 2);
189fda9279dSmrg	PUSH_DATA (push, pPict->pSourcePict->solidFill.color);
190fda9279dSmrg	PUSH_DATA (push, 0);
191fda9279dSmrg	BEGIN_NV04(push, NV30_3D(TEX_OFFSET(unit)), 8);
192fda9279dSmrg	PUSH_MTHDl(push, NV30_3D(TEX_OFFSET(unit)), pNv->scratch, SOLID(unit),
193fda9279dSmrg			 NOUVEAU_BO_VRAM | NOUVEAU_BO_RD);
194fda9279dSmrg	PUSH_DATA (push, NV40_3D_TEX_FORMAT_FORMAT_A8R8G8B8 | 0x8000 |
195fda9279dSmrg			 NV40_3D_TEX_FORMAT_LINEAR |
196fda9279dSmrg			 NV30_3D_TEX_FORMAT_DIMS_2D |
197fda9279dSmrg			 NV30_3D_TEX_FORMAT_NO_BORDER |
198fda9279dSmrg			 (1 << NV40_3D_TEX_FORMAT_MIPMAP_COUNT__SHIFT) |
199fda9279dSmrg			 NV30_3D_TEX_FORMAT_DMA0);
200fda9279dSmrg	PUSH_DATA (push, NV30_3D_TEX_WRAP_S_REPEAT |
201fda9279dSmrg			 NV30_3D_TEX_WRAP_T_REPEAT |
202fda9279dSmrg			 NV30_3D_TEX_WRAP_R_REPEAT);
203fda9279dSmrg	PUSH_DATA (push, NV40_3D_TEX_ENABLE_ENABLE);
204fda9279dSmrg	PUSH_DATA (push, 0x0000aae4);
205fda9279dSmrg	PUSH_DATA (push, NV30_3D_TEX_FILTER_MIN_NEAREST |
206fda9279dSmrg			 NV30_3D_TEX_FILTER_MAG_NEAREST | 0x3fd6);
207fda9279dSmrg	PUSH_DATA (push, 0x00010001);
208fda9279dSmrg	PUSH_DATA (push, 0x00000000);
209fda9279dSmrg	BEGIN_NV04(push, NV40_3D(TEX_SIZE1(unit)), 1);
210fda9279dSmrg	PUSH_DATA (push, 0x00100040);
211fda9279dSmrg
212fda9279dSmrg	BEGIN_NV04(push, NV30_3D(VP_UPLOAD_CONST_ID), 17);
213fda9279dSmrg	PUSH_DATA (push, unit * 4);
214fda9279dSmrg	PUSH_DATAf(push, 1.0);
215fda9279dSmrg	PUSH_DATAf(push, 0.0);
216fda9279dSmrg	PUSH_DATAf(push, 0.0);
217fda9279dSmrg	PUSH_DATAf(push, 0.0);
218fda9279dSmrg	PUSH_DATAf(push, 0.0);
219fda9279dSmrg	PUSH_DATAf(push, 1.0);
220fda9279dSmrg	PUSH_DATAf(push, 0.0);
221fda9279dSmrg	PUSH_DATAf(push, 0.0);
222fda9279dSmrg	PUSH_DATAf(push, 0.0);
223fda9279dSmrg	PUSH_DATAf(push, 0.0);
224fda9279dSmrg	PUSH_DATAf(push, 1.0);
225fda9279dSmrg	PUSH_DATAf(push, 0.0);
226fda9279dSmrg	PUSH_DATAf(push, 1.0);
227fda9279dSmrg	PUSH_DATAf(push, 1.0);
228fda9279dSmrg	PUSH_DATAf(push, 0.0);
229fda9279dSmrg	PUSH_DATAf(push, 0.0);
230fda9279dSmrg	return TRUE;
231fda9279dSmrg}
232fda9279dSmrg
233fda9279dSmrgstatic Bool
234fda9279dSmrgNV40EXAPictGradient(NVPtr pNv, PicturePtr pPict, int unit)
235fda9279dSmrg{
236fda9279dSmrg	return FALSE;
237fda9279dSmrg}
238fda9279dSmrg
239fda9279dSmrgstatic Bool
240fda9279dSmrgNV40EXAPictTexture(NVPtr pNv, PixmapPtr pPix, PicturePtr pPict, int unit)
241fda9279dSmrg{
242fda9279dSmrg	unsigned reloc = NOUVEAU_BO_VRAM | NOUVEAU_BO_GART | NOUVEAU_BO_WR;
243fda9279dSmrg	struct nouveau_pushbuf *push = pNv->pushbuf;
244fda9279dSmrg	struct nouveau_bo *bo = nouveau_pixmap_bo(pPix);
245fda9279dSmrg	nv_pict_texture_format_t *fmt;
246fda9279dSmrg
247fda9279dSmrg	fmt = NV40_GetPictTextureFormat(pPict->format);
248fda9279dSmrg	if (!fmt)
249fda9279dSmrg		return FALSE;
250fda9279dSmrg
251fda9279dSmrg	BEGIN_NV04(push, NV30_3D(TEX_OFFSET(unit)), 8);
252fda9279dSmrg	PUSH_MTHDl(push, NV30_3D(TEX_OFFSET(unit)), bo, 0, reloc);
253fda9279dSmrg	PUSH_MTHDs(push, NV30_3D(TEX_FORMAT(unit)), bo, fmt->card_fmt |
254fda9279dSmrg			 NV40_3D_TEX_FORMAT_LINEAR |
255fda9279dSmrg			 NV30_3D_TEX_FORMAT_DIMS_2D | 0x8000 |
256fda9279dSmrg			 NV30_3D_TEX_FORMAT_NO_BORDER |
257fda9279dSmrg			 (1 << NV40_3D_TEX_FORMAT_MIPMAP_COUNT__SHIFT),
258fda9279dSmrg			 reloc | NOUVEAU_BO_OR,
259fda9279dSmrg			 NV30_3D_TEX_FORMAT_DMA0, NV30_3D_TEX_FORMAT_DMA1);
260fda9279dSmrg	if (pPict->repeat) {
261fda9279dSmrg		switch(pPict->repeatType) {
262fda9279dSmrg		case RepeatPad:
263fda9279dSmrg			PUSH_DATA (push, NV30_3D_TEX_WRAP_S_CLAMP_TO_EDGE |
264fda9279dSmrg					 NV30_3D_TEX_WRAP_T_CLAMP_TO_EDGE |
265fda9279dSmrg					 NV30_3D_TEX_WRAP_R_CLAMP_TO_EDGE);
266fda9279dSmrg			break;
267fda9279dSmrg		case RepeatReflect:
268fda9279dSmrg			PUSH_DATA (push, NV30_3D_TEX_WRAP_S_MIRRORED_REPEAT |
269fda9279dSmrg					 NV30_3D_TEX_WRAP_T_MIRRORED_REPEAT |
270fda9279dSmrg					 NV30_3D_TEX_WRAP_R_MIRRORED_REPEAT);
271fda9279dSmrg			break;
272fda9279dSmrg		case RepeatNormal:
273fda9279dSmrg		default:
274fda9279dSmrg			PUSH_DATA (push, NV30_3D_TEX_WRAP_S_REPEAT |
275fda9279dSmrg					 NV30_3D_TEX_WRAP_T_REPEAT |
276fda9279dSmrg					 NV30_3D_TEX_WRAP_R_REPEAT);
277fda9279dSmrg			break;
278fda9279dSmrg		}
279fda9279dSmrg	} else {
280fda9279dSmrg		PUSH_DATA (push, NV30_3D_TEX_WRAP_S_CLAMP_TO_BORDER |
281fda9279dSmrg				 NV30_3D_TEX_WRAP_T_CLAMP_TO_BORDER |
282fda9279dSmrg				 NV30_3D_TEX_WRAP_R_CLAMP_TO_BORDER);
283fda9279dSmrg	}
284fda9279dSmrg	PUSH_DATA (push, NV40_3D_TEX_ENABLE_ENABLE);
285fda9279dSmrg	PUSH_DATA (push, fmt->card_swz);
286fda9279dSmrg	if (pPict->filter == PictFilterBilinear) {
287fda9279dSmrg		PUSH_DATA (push, NV30_3D_TEX_FILTER_MIN_LINEAR |
288fda9279dSmrg				 NV30_3D_TEX_FILTER_MAG_LINEAR | 0x3fd6);
289fda9279dSmrg	} else {
290fda9279dSmrg		PUSH_DATA (push, NV30_3D_TEX_FILTER_MIN_NEAREST |
291fda9279dSmrg				 NV30_3D_TEX_FILTER_MAG_NEAREST | 0x3fd6);
292fda9279dSmrg	}
293fda9279dSmrg	PUSH_DATA (push, (pPix->drawable.width << 16) | pPix->drawable.height);
294fda9279dSmrg	PUSH_DATA (push, 0); /* border ARGB */
295fda9279dSmrg	BEGIN_NV04(push, NV40_3D(TEX_SIZE1(unit)), 1);
296fda9279dSmrg	PUSH_DATA (push, (1 << NV40_3D_TEX_SIZE1_DEPTH__SHIFT) |
297fda9279dSmrg			 (uint32_t)exaGetPixmapPitch(pPix));
298fda9279dSmrg
299fda9279dSmrg	BEGIN_NV04(push, NV30_3D(VP_UPLOAD_CONST_ID), 17);
300fda9279dSmrg	PUSH_DATA (push, unit * 4);
301fda9279dSmrg	if (pPict->transform) {
302fda9279dSmrg		PUSH_DATAf(push, xFixedToFloat(pPict->transform->matrix[0][0]));
303fda9279dSmrg		PUSH_DATAf(push, xFixedToFloat(pPict->transform->matrix[0][1]));
304fda9279dSmrg		PUSH_DATAf(push, xFixedToFloat(pPict->transform->matrix[0][2]));
305fda9279dSmrg		PUSH_DATAf(push, 0);
306fda9279dSmrg		PUSH_DATAf(push, xFixedToFloat(pPict->transform->matrix[1][0]));
307fda9279dSmrg		PUSH_DATAf(push, xFixedToFloat(pPict->transform->matrix[1][1]));
308fda9279dSmrg		PUSH_DATAf(push, xFixedToFloat(pPict->transform->matrix[1][2]));
309fda9279dSmrg		PUSH_DATAf(push, 0);
310fda9279dSmrg		PUSH_DATAf(push, xFixedToFloat(pPict->transform->matrix[2][0]));
311fda9279dSmrg		PUSH_DATAf(push, xFixedToFloat(pPict->transform->matrix[2][1]));
312fda9279dSmrg		PUSH_DATAf(push, xFixedToFloat(pPict->transform->matrix[2][2]));
313fda9279dSmrg		PUSH_DATAf(push, 0);
314fda9279dSmrg	} else {
315fda9279dSmrg		PUSH_DATAf(push, 1.0);
316fda9279dSmrg		PUSH_DATAf(push, 0.0);
317fda9279dSmrg		PUSH_DATAf(push, 0.0);
318fda9279dSmrg		PUSH_DATAf(push, 0.0);
319fda9279dSmrg		PUSH_DATAf(push, 0.0);
320fda9279dSmrg		PUSH_DATAf(push, 1.0);
321fda9279dSmrg		PUSH_DATAf(push, 0.0);
322fda9279dSmrg		PUSH_DATAf(push, 0.0);
323fda9279dSmrg		PUSH_DATAf(push, 0.0);
324fda9279dSmrg		PUSH_DATAf(push, 0.0);
325fda9279dSmrg		PUSH_DATAf(push, 1.0);
326fda9279dSmrg		PUSH_DATAf(push, 0.0);
327fda9279dSmrg	}
328fda9279dSmrg	PUSH_DATAf(push, 1.0 / pPix->drawable.width);
329fda9279dSmrg	PUSH_DATAf(push, 1.0 / pPix->drawable.height);
330fda9279dSmrg	PUSH_DATAf(push, 0.0);
331fda9279dSmrg	PUSH_DATAf(push, 1.0);
332fda9279dSmrg
333fda9279dSmrg	return TRUE;
334fda9279dSmrg}
335fda9279dSmrg
336fda9279dSmrgstatic Bool
337fda9279dSmrgNV40EXAPicture(NVPtr pNv, PixmapPtr ppix, PicturePtr ppict, int unit)
338fda9279dSmrg{
339fda9279dSmrg	if (ppict->pDrawable)
340fda9279dSmrg		return NV40EXAPictTexture(pNv, ppix, ppict, unit);
341fda9279dSmrg
342fda9279dSmrg	switch (ppict->pSourcePict->type) {
343fda9279dSmrg	case SourcePictTypeSolidFill:
344fda9279dSmrg		return NV40EXAPictSolid(pNv, ppict, unit);
345fda9279dSmrg	case SourcePictTypeLinear:
346fda9279dSmrg		return NV40EXAPictGradient(pNv, ppict, unit);
347fda9279dSmrg	default:
348fda9279dSmrg		break;
349fda9279dSmrg	}
350fda9279dSmrg
351fda9279dSmrg	return FALSE;
352fda9279dSmrg}
353fda9279dSmrg
354fda9279dSmrgstatic Bool
355fda9279dSmrgNV40_SetupSurface(ScrnInfoPtr pScrn, PixmapPtr pPix, PictFormatShort format)
356fda9279dSmrg{
357fda9279dSmrg	NVPtr pNv = NVPTR(pScrn);
358fda9279dSmrg	struct nouveau_pushbuf *push = pNv->pushbuf;
359fda9279dSmrg	struct nouveau_bo *bo = nouveau_pixmap_bo(pPix);
360fda9279dSmrg	nv_pict_surface_format_t *fmt;
361fda9279dSmrg
362fda9279dSmrg	fmt = NV40_GetPictSurfaceFormat(format);
363fda9279dSmrg	if (!fmt) {
364fda9279dSmrg		ErrorF("AIII no format\n");
365fda9279dSmrg		return FALSE;
366fda9279dSmrg	}
367fda9279dSmrg
368fda9279dSmrg	BEGIN_NV04(push, NV30_3D(RT_FORMAT), 3);
369fda9279dSmrg	PUSH_DATA (push, NV30_3D_RT_FORMAT_TYPE_LINEAR |
370fda9279dSmrg			 NV30_3D_RT_FORMAT_ZETA_Z24S8 | fmt->card_fmt);
371fda9279dSmrg	PUSH_DATA (push, exaGetPixmapPitch(pPix));
372fda9279dSmrg	PUSH_MTHDl(push, NV30_3D(COLOR0_OFFSET), bo, 0,
373fda9279dSmrg			 NOUVEAU_BO_VRAM | NOUVEAU_BO_RDWR);
374fda9279dSmrg	return TRUE;
375fda9279dSmrg}
376fda9279dSmrg
377fda9279dSmrgstatic Bool
378fda9279dSmrgNV40EXACheckCompositeTexture(PicturePtr pPict, PicturePtr pdPict, int op)
379fda9279dSmrg{
380fda9279dSmrg	nv_pict_texture_format_t *fmt;
381fda9279dSmrg	int w = 1, h = 1;
382fda9279dSmrg
383fda9279dSmrg	if (pPict->pDrawable) {
384fda9279dSmrg		w = pPict->pDrawable->width;
385fda9279dSmrg		h = pPict->pDrawable->height;
386fda9279dSmrg	} else {
387fda9279dSmrg		switch (pPict->pSourcePict->type) {
388fda9279dSmrg		case SourcePictTypeSolidFill:
389fda9279dSmrg			break;
390fda9279dSmrg		default:
391fda9279dSmrg			NOUVEAU_FALLBACK("gradient\n");
392fda9279dSmrg		}
393fda9279dSmrg	}
394fda9279dSmrg
395fda9279dSmrg	if ((w > 4096) || (h > 4096))
396fda9279dSmrg		NOUVEAU_FALLBACK("picture too large, %dx%d\n", w, h);
397fda9279dSmrg
398fda9279dSmrg	fmt = NV40_GetPictTextureFormat(pPict->format);
399fda9279dSmrg	if (!fmt)
400fda9279dSmrg		NOUVEAU_FALLBACK("picture format 0x%08x not supported\n",
401fda9279dSmrg				pPict->format);
402fda9279dSmrg
403fda9279dSmrg	if (pPict->filter != PictFilterNearest &&
404fda9279dSmrg	    pPict->filter != PictFilterBilinear)
405fda9279dSmrg		NOUVEAU_FALLBACK("filter 0x%x not supported\n", pPict->filter);
406fda9279dSmrg
407fda9279dSmrg	/* Opengl and Render disagree on what should be sampled outside an XRGB
408fda9279dSmrg	 * texture (with no repeating). Opengl has a hardcoded alpha value of
409fda9279dSmrg	 * 1.0, while render expects 0.0. We assume that clipping is done for
410fda9279dSmrg	 * untranformed sources.
411fda9279dSmrg	 */
412fda9279dSmrg	if (NV40PictOp[op].src_alpha && !pPict->repeat &&
413fda9279dSmrg		pPict->transform && (PICT_FORMAT_A(pPict->format) == 0)
414fda9279dSmrg		&& (PICT_FORMAT_A(pdPict->format) != 0))
415fda9279dSmrg		NOUVEAU_FALLBACK("REPEAT_NONE unsupported for XRGB source\n");
416fda9279dSmrg
417fda9279dSmrg	return TRUE;
418fda9279dSmrg}
419fda9279dSmrg
420fda9279dSmrgBool
421fda9279dSmrgNV40EXACheckComposite(int op, PicturePtr psPict,
422fda9279dSmrg			      PicturePtr pmPict,
423fda9279dSmrg			      PicturePtr pdPict)
424fda9279dSmrg{
425fda9279dSmrg	nv_pict_surface_format_t *fmt;
426fda9279dSmrg	nv_pict_op_t *opr;
427fda9279dSmrg
428fda9279dSmrg	opr = NV40_GetPictOpRec(op);
429fda9279dSmrg	if (!opr)
430fda9279dSmrg		NOUVEAU_FALLBACK("unsupported blend op 0x%x\n", op);
431fda9279dSmrg
432fda9279dSmrg	fmt = NV40_GetPictSurfaceFormat(pdPict->format);
433fda9279dSmrg	if (!fmt)
434fda9279dSmrg		NOUVEAU_FALLBACK("dst picture format 0x%08x not supported\n",
435fda9279dSmrg				pdPict->format);
436fda9279dSmrg
437fda9279dSmrg	if (!NV40EXACheckCompositeTexture(psPict, pdPict, op))
438fda9279dSmrg		NOUVEAU_FALLBACK("src picture\n");
439fda9279dSmrg	if (pmPict) {
440fda9279dSmrg		if (pmPict->componentAlpha &&
441fda9279dSmrg		    PICT_FORMAT_RGB(pmPict->format) &&
442fda9279dSmrg		    opr->src_alpha && opr->src_card_op != SF(ZERO))
443fda9279dSmrg			NOUVEAU_FALLBACK("mask CA + SA\n");
444fda9279dSmrg		if (!NV40EXACheckCompositeTexture(pmPict, pdPict, op))
445fda9279dSmrg			NOUVEAU_FALLBACK("mask picture\n");
446fda9279dSmrg	}
447fda9279dSmrg
448fda9279dSmrg	return TRUE;
449fda9279dSmrg}
450fda9279dSmrg
451fda9279dSmrgBool
452fda9279dSmrgNV40EXAPrepareComposite(int op, PicturePtr psPict,
453fda9279dSmrg				PicturePtr pmPict,
454fda9279dSmrg				PicturePtr pdPict,
455fda9279dSmrg				PixmapPtr  psPix,
456fda9279dSmrg				PixmapPtr  pmPix,
457fda9279dSmrg				PixmapPtr  pdPix)
458fda9279dSmrg{
459fda9279dSmrg	ScrnInfoPtr pScrn = xf86ScreenToScrn(pdPix->drawable.pScreen);
460fda9279dSmrg	NVPtr pNv = NVPTR(pScrn);
461fda9279dSmrg	nv_pict_op_t *blend = NV40_GetPictOpRec(op);
462fda9279dSmrg	struct nouveau_pushbuf *push = pNv->pushbuf;
463fda9279dSmrg	uint32_t fragprog;
464fda9279dSmrg
465fda9279dSmrg	if (!PUSH_SPACE(push, 128))
466fda9279dSmrg		NOUVEAU_FALLBACK("space\n");
467fda9279dSmrg	PUSH_RESET(push);
468fda9279dSmrg
469fda9279dSmrg	NV40_SetupBlend(pScrn, blend, pdPict->format,
470fda9279dSmrg			(pmPict && pmPict->componentAlpha &&
471fda9279dSmrg			 PICT_FORMAT_RGB(pmPict->format)));
472fda9279dSmrg
473fda9279dSmrg	if (!NV40_SetupSurface(pScrn, pdPix, pdPict->format) ||
474fda9279dSmrg	    !NV40EXAPicture(pNv, psPix, psPict, 0))
475fda9279dSmrg		return FALSE;
476fda9279dSmrg
477fda9279dSmrg	if (pmPict) {
478fda9279dSmrg		if (!NV40EXAPicture(pNv, pmPix, pmPict, 1))
479fda9279dSmrg			return FALSE;
480fda9279dSmrg
481fda9279dSmrg		if (pdPict->format == PICT_a8) {
482fda9279dSmrg			fragprog = PFP_C_A8;
483fda9279dSmrg		} else
484fda9279dSmrg		if (pmPict->componentAlpha && PICT_FORMAT_RGB(pmPict->format)) {
485fda9279dSmrg			if (blend->src_alpha)
486fda9279dSmrg				fragprog = PFP_CCASA;
487fda9279dSmrg			else
488fda9279dSmrg				fragprog = PFP_CCA;
489fda9279dSmrg		} else {
490fda9279dSmrg			fragprog = PFP_C;
491fda9279dSmrg		}
492fda9279dSmrg	} else {
493fda9279dSmrg		if (pdPict->format == PICT_a8)
494fda9279dSmrg			fragprog = PFP_S_A8;
495fda9279dSmrg		else
496fda9279dSmrg			fragprog = PFP_S;
497fda9279dSmrg	}
498fda9279dSmrg
499fda9279dSmrg	BEGIN_NV04(push, NV30_3D(FP_ACTIVE_PROGRAM), 1);
500fda9279dSmrg	PUSH_MTHD (push, NV30_3D(FP_ACTIVE_PROGRAM), pNv->scratch, fragprog,
501fda9279dSmrg			 NOUVEAU_BO_VRAM | NOUVEAU_BO_RD | NOUVEAU_BO_LOW |
502fda9279dSmrg			 NOUVEAU_BO_OR,
503fda9279dSmrg			 NV30_3D_FP_ACTIVE_PROGRAM_DMA0,
504fda9279dSmrg			 NV30_3D_FP_ACTIVE_PROGRAM_DMA1);
505fda9279dSmrg	BEGIN_NV04(push, NV30_3D(FP_CONTROL), 1);
506fda9279dSmrg	PUSH_DATA (push, 0x02000000);
507fda9279dSmrg
508fda9279dSmrg	/* Appears to be some kind of cache flush, needed here at least
509fda9279dSmrg	 * sometimes.. funky text rendering otherwise :)
510fda9279dSmrg	 */
511fda9279dSmrg	BEGIN_NV04(push, NV40_3D(TEX_CACHE_CTL), 1);
512fda9279dSmrg	PUSH_DATA (push, 2);
513fda9279dSmrg	BEGIN_NV04(push, NV40_3D(TEX_CACHE_CTL), 1);
514fda9279dSmrg	PUSH_DATA (push, 1);
515fda9279dSmrg
516fda9279dSmrg	nouveau_pushbuf_bufctx(push, pNv->bufctx);
517fda9279dSmrg	if (nouveau_pushbuf_validate(push)) {
518fda9279dSmrg		nouveau_pushbuf_bufctx(push, NULL);
519fda9279dSmrg		return FALSE;
520fda9279dSmrg	}
521fda9279dSmrg
522fda9279dSmrg	return TRUE;
523fda9279dSmrg}
524fda9279dSmrg
525fda9279dSmrgstatic __inline__ void
526fda9279dSmrgPUSH_VTX2s(struct nouveau_pushbuf *push,
527fda9279dSmrg	   int x1, int y1, int x2, int y2, int dx, int dy)
528fda9279dSmrg{
529fda9279dSmrg	BEGIN_NV04(push, NV30_3D(VTX_ATTR_2I(8)), 2);
530fda9279dSmrg	PUSH_DATA (push, ((y1 & 0xffff) << 16) | (x1 & 0xffff));
531fda9279dSmrg	PUSH_DATA (push, ((y2 & 0xffff) << 16) | (x2 & 0xffff));
532fda9279dSmrg	BEGIN_NV04(push, NV30_3D(VTX_ATTR_2I(0)), 1);
533fda9279dSmrg	PUSH_DATA (push, ((dy & 0xffff) << 16) | (dx & 0xffff));
534fda9279dSmrg}
535fda9279dSmrg
536fda9279dSmrgvoid
537fda9279dSmrgNV40EXAComposite(PixmapPtr pdPix,
538fda9279dSmrg		 int sx, int sy, int mx, int my, int dx, int dy, int w, int h)
539fda9279dSmrg{
540fda9279dSmrg	ScrnInfoPtr pScrn = xf86ScreenToScrn(pdPix->drawable.pScreen);
541fda9279dSmrg	NVPtr pNv = NVPTR(pScrn);
542fda9279dSmrg	struct nouveau_pushbuf *push = pNv->pushbuf;
543fda9279dSmrg
544fda9279dSmrg	if (!PUSH_SPACE(push, 64))
545fda9279dSmrg		return;
546fda9279dSmrg
547fda9279dSmrg	/* We're drawing a triangle, we need to scissor it to a quad. */
548fda9279dSmrg	/* The scissors are here for a good reason, we don't get the full
549fda9279dSmrg	 * image, but just a part.
550fda9279dSmrg	 */
551fda9279dSmrg	/* Handling the cliprects is done for us already. */
552fda9279dSmrg	BEGIN_NV04(push, NV30_3D(SCISSOR_HORIZ), 2);
553fda9279dSmrg	PUSH_DATA (push, (w << 16) | dx);
554fda9279dSmrg	PUSH_DATA (push, (h << 16) | dy);
555fda9279dSmrg	BEGIN_NV04(push, NV30_3D(VERTEX_BEGIN_END), 1);
556fda9279dSmrg	PUSH_DATA (push, NV30_3D_VERTEX_BEGIN_END_TRIANGLES);
557fda9279dSmrg	PUSH_VTX2s(push, sx, sy + (h * 2), mx, my + (h * 2), dx, dy + (h * 2));
558fda9279dSmrg	PUSH_VTX2s(push, sx, sy, mx, my, dx, dy);
559fda9279dSmrg	PUSH_VTX2s(push, sx + (w * 2), sy, mx + (w * 2), my, dx + (w * 2), dy);
560fda9279dSmrg	BEGIN_NV04(push, NV30_3D(VERTEX_BEGIN_END), 1);
561fda9279dSmrg	PUSH_DATA (push, NV30_3D_VERTEX_BEGIN_END_STOP);
562fda9279dSmrg}
563fda9279dSmrg
564fda9279dSmrgvoid
565fda9279dSmrgNV40EXADoneComposite(PixmapPtr pdPix)
566fda9279dSmrg{
567fda9279dSmrg	ScrnInfoPtr pScrn = xf86ScreenToScrn(pdPix->drawable.pScreen);
568fda9279dSmrg	nouveau_pushbuf_bufctx(NVPTR(pScrn)->pushbuf, NULL);
569fda9279dSmrg}
570fda9279dSmrg
571fda9279dSmrg#define NV30_3D_CHIPSET_4X_MASK 0x00000baf
572fda9279dSmrg#define NV44TCL_CHIPSET_4X_MASK 0x00005450
573fda9279dSmrgBool
574fda9279dSmrgNVAccelInitNV40TCL(ScrnInfoPtr pScrn)
575fda9279dSmrg{
576fda9279dSmrg	NVPtr pNv = NVPTR(pScrn);
577fda9279dSmrg	struct nouveau_pushbuf *push = pNv->pushbuf;
578fda9279dSmrg	struct nv04_fifo *fifo = pNv->channel->data;
579fda9279dSmrg	uint32_t class = 0, chipset;
580fda9279dSmrg	int i;
581fda9279dSmrg
582fda9279dSmrg	NVXVComputeBicubicFilter(pNv->scratch, XV_TABLE, XV_TABLE_SIZE);
583fda9279dSmrg
584fda9279dSmrg	chipset = pNv->dev->chipset;
585fda9279dSmrg	if ((chipset & 0xf0) == NV_ARCH_40) {
586fda9279dSmrg		chipset &= 0xf;
587fda9279dSmrg		if (NV30_3D_CHIPSET_4X_MASK & (1<<chipset))
588fda9279dSmrg			class = NV40_3D_CLASS;
589fda9279dSmrg		else if (NV44TCL_CHIPSET_4X_MASK & (1<<chipset))
590fda9279dSmrg			class = NV44_3D_CLASS;
591fda9279dSmrg		else {
592fda9279dSmrg			xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
593fda9279dSmrg					"NV40EXA: Unknown chipset NV4%1x\n", chipset);
594fda9279dSmrg			return FALSE;
595fda9279dSmrg		}
596fda9279dSmrg	} else if ( (chipset & 0xf0) == 0x60) {
597fda9279dSmrg		class = NV44_3D_CLASS;
598fda9279dSmrg	} else
599fda9279dSmrg		return TRUE;
600fda9279dSmrg
601fda9279dSmrg	if (nouveau_object_new(pNv->channel, Nv3D, class, NULL, 0, &pNv->Nv3D))
602fda9279dSmrg		return FALSE;
603fda9279dSmrg
604fda9279dSmrg	if (!PUSH_SPACE(push, 256))
605fda9279dSmrg		return FALSE;
606fda9279dSmrg
607fda9279dSmrg	BEGIN_NV04(push, NV01_SUBC(3D, OBJECT), 1);
608fda9279dSmrg	PUSH_DATA (push, pNv->Nv3D->handle);
609fda9279dSmrg	BEGIN_NV04(push, NV30_3D(DMA_NOTIFY), 1);
610fda9279dSmrg	PUSH_DATA (push, pNv->notify0->handle);
611fda9279dSmrg	BEGIN_NV04(push, NV30_3D(DMA_TEXTURE0), 2);
612fda9279dSmrg	PUSH_DATA (push, fifo->vram);
613fda9279dSmrg	PUSH_DATA (push, fifo->gart);
614fda9279dSmrg	BEGIN_NV04(push, NV30_3D(DMA_COLOR0), 2);
615fda9279dSmrg	PUSH_DATA (push, fifo->vram);
616fda9279dSmrg	PUSH_DATA (push, fifo->vram);
617fda9279dSmrg
618fda9279dSmrg	/* voodoo */
619fda9279dSmrg	BEGIN_NV04(push, SUBC_3D(0x1ea4), 3);
620fda9279dSmrg	PUSH_DATA (push, 0x00000010);
621fda9279dSmrg	PUSH_DATA (push, 0x01000100);
622fda9279dSmrg	PUSH_DATA (push, 0xff800006);
623fda9279dSmrg	BEGIN_NV04(push, SUBC_3D(0x1fc4), 1);
624fda9279dSmrg	PUSH_DATA (push, 0x06144321);
625fda9279dSmrg	BEGIN_NV04(push, SUBC_3D(0x1fc8), 2);
626fda9279dSmrg	PUSH_DATA (push, 0xedcba987);
627fda9279dSmrg	PUSH_DATA (push, 0x00000021);
628fda9279dSmrg	BEGIN_NV04(push, SUBC_3D(0x1fd0), 1);
629fda9279dSmrg	PUSH_DATA (push, 0x00171615);
630fda9279dSmrg	BEGIN_NV04(push, SUBC_3D(0x1fd4), 1);
631fda9279dSmrg	PUSH_DATA (push, 0x001b1a19);
632fda9279dSmrg	BEGIN_NV04(push, SUBC_3D(0x1ef8), 1);
633fda9279dSmrg	PUSH_DATA (push, 0x0020ffff);
634fda9279dSmrg	BEGIN_NV04(push, SUBC_3D(0x1d64), 1);
635fda9279dSmrg	PUSH_DATA (push, 0x00d30000);
63616ee1e9aSmrg	BEGIN_NV04(push, NV30_3D(ENGINE), 1);
63716ee1e9aSmrg	PUSH_DATA (push, NV30_3D_ENGINE_FP);
638fda9279dSmrg
639fda9279dSmrg	/* This removes the the stair shaped tearing that i get. */
640fda9279dSmrg	/* Verified on one G70 card that it doesn't cause regressions for people without the problem. */
641fda9279dSmrg	/* The blob sets this up by default for NV43. */
64216ee1e9aSmrg	BEGIN_NV04(push, NV30_3D(FP_REG_CONTROL), 1);
643fda9279dSmrg	PUSH_DATA (push, 0x0000000F);
644fda9279dSmrg
645fda9279dSmrg	BEGIN_NV04(push, NV30_3D(VIEWPORT_TRANSLATE_X), 8);
646fda9279dSmrg	PUSH_DATAf(push, 0.0);
647fda9279dSmrg	PUSH_DATAf(push, 0.0);
648fda9279dSmrg	PUSH_DATAf(push, 0.0);
649fda9279dSmrg	PUSH_DATAf(push, 0.0);
650fda9279dSmrg	PUSH_DATAf(push, 1.0);
651fda9279dSmrg	PUSH_DATAf(push, 1.0);
652fda9279dSmrg	PUSH_DATAf(push, 1.0);
653fda9279dSmrg	PUSH_DATAf(push, 0.0);
654fda9279dSmrg
655fda9279dSmrg	/* default 3D state */
656fda9279dSmrg	/*XXX: replace with the same state that the DRI emits on startup */
657fda9279dSmrg	BEGIN_NV04(push, NV30_3D(STENCIL_ENABLE(0)), 1);
658fda9279dSmrg	PUSH_DATA (push, 0);
659fda9279dSmrg	BEGIN_NV04(push, NV30_3D(STENCIL_ENABLE(1)), 1);
660fda9279dSmrg	PUSH_DATA (push, 0);
661fda9279dSmrg	BEGIN_NV04(push, NV30_3D(ALPHA_FUNC_ENABLE), 1);
662fda9279dSmrg	PUSH_DATA (push, 0);
663fda9279dSmrg	BEGIN_NV04(push, NV30_3D(DEPTH_WRITE_ENABLE), 2);
664fda9279dSmrg	PUSH_DATA (push, 0);
665fda9279dSmrg	PUSH_DATA (push, 0);
666fda9279dSmrg	BEGIN_NV04(push, NV30_3D(COLOR_MASK), 1);
667fda9279dSmrg	PUSH_DATA (push, 0x01010101); /* TR,TR,TR,TR */
668fda9279dSmrg	BEGIN_NV04(push, NV30_3D(CULL_FACE_ENABLE), 1);
669fda9279dSmrg	PUSH_DATA (push, 0);
670fda9279dSmrg	BEGIN_NV04(push, NV30_3D(BLEND_FUNC_ENABLE), 1);
671fda9279dSmrg	PUSH_DATA (push, 0);
672fda9279dSmrg	BEGIN_NV04(push, NV30_3D(COLOR_LOGIC_OP_ENABLE), 2);
673fda9279dSmrg	PUSH_DATA (push, 0);
674fda9279dSmrg	PUSH_DATA (push, NV30_3D_COLOR_LOGIC_OP_OP_COPY);
675fda9279dSmrg	BEGIN_NV04(push, NV30_3D(DITHER_ENABLE), 1);
676fda9279dSmrg	PUSH_DATA (push, 0);
677fda9279dSmrg	BEGIN_NV04(push, NV30_3D(SHADE_MODEL), 1);
678fda9279dSmrg	PUSH_DATA (push, NV30_3D_SHADE_MODEL_SMOOTH);
679fda9279dSmrg	BEGIN_NV04(push, NV30_3D(POLYGON_OFFSET_FACTOR),2);
680fda9279dSmrg	PUSH_DATAf(push, 0.0);
681fda9279dSmrg	PUSH_DATAf(push, 0.0);
682fda9279dSmrg	BEGIN_NV04(push, NV30_3D(POLYGON_MODE_FRONT), 2);
683fda9279dSmrg	PUSH_DATA (push, NV30_3D_POLYGON_MODE_FRONT_FILL);
684fda9279dSmrg	PUSH_DATA (push, NV30_3D_POLYGON_MODE_BACK_FILL);
685fda9279dSmrg	BEGIN_NV04(push, NV30_3D(POLYGON_STIPPLE_PATTERN(0)), 0x20);
686fda9279dSmrg	for (i=0;i<0x20;i++)
687fda9279dSmrg		PUSH_DATA (push, 0xFFFFFFFF);
688fda9279dSmrg	for (i=0;i<16;i++) {
689fda9279dSmrg		BEGIN_NV04(push, NV30_3D(TEX_ENABLE(i)), 1);
690fda9279dSmrg		PUSH_DATA (push, 0);
691fda9279dSmrg	}
692fda9279dSmrg
69316ee1e9aSmrg	BEGIN_NV04(push, NV30_3D(DEPTH_CONTROL), 1);
694fda9279dSmrg	PUSH_DATA (push, 0x110);
695fda9279dSmrg
696fda9279dSmrg	BEGIN_NV04(push, NV30_3D(RT_ENABLE), 1);
697fda9279dSmrg	PUSH_DATA (push, NV30_3D_RT_ENABLE_COLOR0);
698fda9279dSmrg
699fda9279dSmrg	BEGIN_NV04(push, NV30_3D(RT_HORIZ), 2);
700fda9279dSmrg	PUSH_DATA (push, (4096 << 16));
701fda9279dSmrg	PUSH_DATA (push, (4096 << 16));
702fda9279dSmrg	BEGIN_NV04(push, NV30_3D(SCISSOR_HORIZ), 2);
703fda9279dSmrg	PUSH_DATA (push, (4096 << 16));
704fda9279dSmrg	PUSH_DATA (push, (4096 << 16));
705fda9279dSmrg	BEGIN_NV04(push, NV30_3D(VIEWPORT_HORIZ), 2);
706fda9279dSmrg	PUSH_DATA (push, (4096 << 16));
707fda9279dSmrg	PUSH_DATA (push, (4096 << 16));
708fda9279dSmrg	BEGIN_NV04(push, NV30_3D(VIEWPORT_CLIP_HORIZ(0)), 2);
709fda9279dSmrg	PUSH_DATA (push, (4095 << 16));
710fda9279dSmrg	PUSH_DATA (push, (4095 << 16));
711fda9279dSmrg
712fda9279dSmrg	BEGIN_NV04(push, NV30_3D(VP_UPLOAD_FROM_ID), 1);
713fda9279dSmrg	PUSH_DATA (push, 0);
714fda9279dSmrg	BEGIN_NV04(push, NV30_3D(VP_UPLOAD_INST(0)), 4);
715fda9279dSmrg	PUSH_DATA (push, 0x401f9c6c); /* mov o[hpos], a[0] */
716fda9279dSmrg	PUSH_DATA (push, 0x0040000d);
717fda9279dSmrg	PUSH_DATA (push, 0x8106c083);
718fda9279dSmrg	PUSH_DATA (push, 0x6041ef80);
719fda9279dSmrg	BEGIN_NV04(push, NV30_3D(VP_UPLOAD_INST(0)), 4);
720fda9279dSmrg	PUSH_DATA (push, 0x00001c6c); /* mov r0.xyw, a[8].xyww */
721fda9279dSmrg	PUSH_DATA (push, 0x0040080f);
722fda9279dSmrg	PUSH_DATA (push, 0x8106c083);
723fda9279dSmrg	PUSH_DATA (push, 0x6041affc);
724fda9279dSmrg	BEGIN_NV04(push, NV30_3D(VP_UPLOAD_INST(0)), 4);
725fda9279dSmrg	PUSH_DATA (push, 0x00009c6c); /* dp3 r1.x, r0.xyw, c[0].xyz */
726fda9279dSmrg	PUSH_DATA (push, 0x0140000f);
727fda9279dSmrg	PUSH_DATA (push, 0x808680c3);
728fda9279dSmrg	PUSH_DATA (push, 0x60410ffc);
729fda9279dSmrg	BEGIN_NV04(push, NV30_3D(VP_UPLOAD_INST(0)), 4);
730fda9279dSmrg	PUSH_DATA (push, 0x00009c6c); /* dp3 r1.y, r0.xyw, c[1].xyz */
731fda9279dSmrg	PUSH_DATA (push, 0x0140100f);
732fda9279dSmrg	PUSH_DATA (push, 0x808680c3);
733fda9279dSmrg	PUSH_DATA (push, 0x60408ffc);
734fda9279dSmrg	BEGIN_NV04(push, NV30_3D(VP_UPLOAD_INST(0)), 4);
735fda9279dSmrg	PUSH_DATA (push, 0x00009c6c); /* dp3 r1.w, r0.xyw, c[2].xyz */
736fda9279dSmrg	PUSH_DATA (push, 0x0140200f);
737fda9279dSmrg	PUSH_DATA (push, 0x808680c3);
738fda9279dSmrg	PUSH_DATA (push, 0x60402ffc);
739fda9279dSmrg	BEGIN_NV04(push, NV30_3D(VP_UPLOAD_INST(0)), 4);
740fda9279dSmrg	PUSH_DATA (push, 0x401f9c6c); /* mul o[tex0].xyw, r1, c[3] */
741fda9279dSmrg	PUSH_DATA (push, 0x0080300d);
742fda9279dSmrg	PUSH_DATA (push, 0x8286c0c3);
743fda9279dSmrg	PUSH_DATA (push, 0x6041af9c);
744fda9279dSmrg	BEGIN_NV04(push, NV30_3D(VP_UPLOAD_INST(0)), 4);
745fda9279dSmrg	PUSH_DATA (push, 0x00001c6c); /* mov r0.xyw, a[9].xyww */
746fda9279dSmrg	PUSH_DATA (push, 0x0040090f);
747fda9279dSmrg	PUSH_DATA (push, 0x8106c083);
748fda9279dSmrg	PUSH_DATA (push, 0x6041affc);
749fda9279dSmrg	BEGIN_NV04(push, NV30_3D(VP_UPLOAD_INST(0)), 4);
750fda9279dSmrg	PUSH_DATA (push, 0x00009c6c); /* dp3 r1.x, r0.xyw, c[4].xyz */
751fda9279dSmrg	PUSH_DATA (push, 0x0140400f);
752fda9279dSmrg	PUSH_DATA (push, 0x808680c3);
753fda9279dSmrg	PUSH_DATA (push, 0x60410ffc);
754fda9279dSmrg	BEGIN_NV04(push, NV30_3D(VP_UPLOAD_INST(0)), 4);
755fda9279dSmrg	PUSH_DATA (push, 0x00009c6c); /* dp3 r1.y, r0.xyw, c[5].xyz */
756fda9279dSmrg	PUSH_DATA (push, 0x0140500f);
757fda9279dSmrg	PUSH_DATA (push, 0x808680c3);
758fda9279dSmrg	PUSH_DATA (push, 0x60408ffc);
759fda9279dSmrg	BEGIN_NV04(push, NV30_3D(VP_UPLOAD_INST(0)), 4);
760fda9279dSmrg	PUSH_DATA (push, 0x00009c6c); /* dp3 r1.w, r0.xyw, c[6].xyz */
761fda9279dSmrg	PUSH_DATA (push, 0x0140600f);
762fda9279dSmrg	PUSH_DATA (push, 0x808680c3);
763fda9279dSmrg	PUSH_DATA (push, 0x60402ffc);
764fda9279dSmrg	BEGIN_NV04(push, NV30_3D(VP_UPLOAD_INST(0)), 4);
765fda9279dSmrg	PUSH_DATA (push, 0x401f9c6c); /* exit mul o[tex1].xyw, r1, c[4] */
766fda9279dSmrg	PUSH_DATA (push, 0x0080700d);
767fda9279dSmrg	PUSH_DATA (push, 0x8286c0c3);
768fda9279dSmrg	PUSH_DATA (push, 0x6041afa1);
769fda9279dSmrg	BEGIN_NV04(push, NV30_3D(VP_UPLOAD_INST(0)), 4);
770fda9279dSmrg	PUSH_DATA (push, 0x00000000); /* exit */
771fda9279dSmrg	PUSH_DATA (push, 0x00000000);
772fda9279dSmrg	PUSH_DATA (push, 0x00000000);
773fda9279dSmrg	PUSH_DATA (push, 0x00000001);
774fda9279dSmrg	BEGIN_NV04(push, NV30_3D(VP_START_FROM_ID), 1);
775fda9279dSmrg	PUSH_DATA (push, 0);
776fda9279dSmrg	BEGIN_NV04(push, NV40_3D(VP_ATTRIB_EN), 2);
777fda9279dSmrg	PUSH_DATA (push, 0x00000309);
778fda9279dSmrg	PUSH_DATA (push, 0x0000c001);
779fda9279dSmrg
780fda9279dSmrg	PUSH_DATAu(push, pNv->scratch, PFP_PASS, 1 * 4);
781fda9279dSmrg	PUSH_DATAs(push, 0x01403e81); /* mov r0, a[col0] */
782fda9279dSmrg	PUSH_DATAs(push, 0x1c9dc801);
783fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
784fda9279dSmrg	PUSH_DATAs(push, 0x3fe1c800);
785fda9279dSmrg
786fda9279dSmrg	PUSH_DATAu(push, pNv->scratch, PFP_S, 2 * 4);
787fda9279dSmrg	PUSH_DATAs(push, 0x18009e00); /* txp r0, a[tex0], t[0] */
788fda9279dSmrg	PUSH_DATAs(push, 0x1c9dc801);
789fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
790fda9279dSmrg	PUSH_DATAs(push, 0x3fe1c800);
791fda9279dSmrg	PUSH_DATAs(push, 0x01401e81); /* mov r0, r0 */
792fda9279dSmrg	PUSH_DATAs(push, 0x1c9dc800);
793fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
794fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
795fda9279dSmrg
796fda9279dSmrg	PUSH_DATAu(push, pNv->scratch, PFP_S_A8, 2 * 4);
797fda9279dSmrg	PUSH_DATAs(push, 0x18009000); /* txp r0.w, a[tex0], t[0] */
798fda9279dSmrg	PUSH_DATAs(push, 0x1c9dc801);
799fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
800fda9279dSmrg	PUSH_DATAs(push, 0x3fe1c800);
801fda9279dSmrg	PUSH_DATAs(push, 0x01401e81); /* mov r0, r0.w */
802fda9279dSmrg	PUSH_DATAs(push, 0x1c9dfe00);
803fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
804fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
805fda9279dSmrg
806fda9279dSmrg	PUSH_DATAu(push, pNv->scratch, PFP_C, 3 * 4);
807fda9279dSmrg	PUSH_DATAs(push, 0x1802b102); /* txpc0 r1.w, a[tex1], t[1] */
808fda9279dSmrg	PUSH_DATAs(push, 0x1c9dc801);
809fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
810fda9279dSmrg	PUSH_DATAs(push, 0x3fe1c800);
811fda9279dSmrg	PUSH_DATAs(push, 0x18009e00); /* txp r0 (ne0.w), a[tex0], t[0] */
812fda9279dSmrg	PUSH_DATAs(push, 0x1ff5c801);
813fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
814fda9279dSmrg	PUSH_DATAs(push, 0x3fe1c800);
815fda9279dSmrg	PUSH_DATAs(push, 0x02001e81); /* mul r0, r0, r1.w */
816fda9279dSmrg	PUSH_DATAs(push, 0x1c9dc800);
817fda9279dSmrg	PUSH_DATAs(push, 0x0001fe04);
818fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
819fda9279dSmrg
820fda9279dSmrg	PUSH_DATAu(push, pNv->scratch, PFP_C_A8, 3 * 4);
821fda9279dSmrg	PUSH_DATAs(push, 0x1802b102); /* txpc0 r1.w, a[tex1], t[1] */
822fda9279dSmrg	PUSH_DATAs(push, 0x1c9dc801);
823fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
824fda9279dSmrg	PUSH_DATAs(push, 0x3fe1c800);
825fda9279dSmrg	PUSH_DATAs(push, 0x18009000); /* txp r0.w (ne0.w), a[tex0], t[0] */
826fda9279dSmrg	PUSH_DATAs(push, 0x1ff5c801);
827fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
828fda9279dSmrg	PUSH_DATAs(push, 0x3fe1c800);
829fda9279dSmrg	PUSH_DATAs(push, 0x02001e81); /* mul r0, r0.w, r1.w */
830fda9279dSmrg	PUSH_DATAs(push, 0x1c9dfe00);
831fda9279dSmrg	PUSH_DATAs(push, 0x0001fe04);
832fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
833fda9279dSmrg
834fda9279dSmrg	PUSH_DATAu(push, pNv->scratch, PFP_CCA, 3 * 4);
835fda9279dSmrg	PUSH_DATAs(push, 0x18009f00); /* txpc0 r0, a[tex0], t[0] */
836fda9279dSmrg	PUSH_DATAs(push, 0x1c9dc801);
837fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
838fda9279dSmrg	PUSH_DATAs(push, 0x3fe1c800);
839fda9279dSmrg	PUSH_DATAs(push, 0x1802be02); /* txp r1 (ne0), a[tex1], t[1] */
840fda9279dSmrg	PUSH_DATAs(push, 0x1c95c801);
841fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
842fda9279dSmrg	PUSH_DATAs(push, 0x3fe1c800);
843fda9279dSmrg	PUSH_DATAs(push, 0x02001e81); /* mul r0, r0, r1 */
844fda9279dSmrg	PUSH_DATAs(push, 0x1c9dc800);
845fda9279dSmrg	PUSH_DATAs(push, 0x0001c804);
846fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
847fda9279dSmrg
848fda9279dSmrg	PUSH_DATAu(push, pNv->scratch, PFP_CCASA, 3 * 4);
849fda9279dSmrg	PUSH_DATAs(push, 0x18009102); /* txpc0 r1.w, a[tex0], t[0] */
850fda9279dSmrg	PUSH_DATAs(push, 0x1c9dc801);
851fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
852fda9279dSmrg	PUSH_DATAs(push, 0x3fe1c800);
853fda9279dSmrg	PUSH_DATAs(push, 0x1802be00); /* txp r0 (ne0.w), a[tex1], t[1] */
854fda9279dSmrg	PUSH_DATAs(push, 0x1ff5c801);
855fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
856fda9279dSmrg	PUSH_DATAs(push, 0x3fe1c800);
857fda9279dSmrg	PUSH_DATAs(push, 0x02001e81); /* mul r0, r1.w, r0 */
858fda9279dSmrg	PUSH_DATAs(push, 0x1c9dfe04);
859fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
860fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
861fda9279dSmrg
862fda9279dSmrg	PUSH_DATAu(push, pNv->scratch, PFP_NV12_BILINEAR, 8 * 4);
863fda9279dSmrg	PUSH_DATAs(push, 0x17028200); /* texr r0.x, a[tex0], t[1] */
864fda9279dSmrg	PUSH_DATAs(push, 0x1c9dc801);
865fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
866fda9279dSmrg	PUSH_DATAs(push, 0x3fe1c800);
867fda9279dSmrg	PUSH_DATAs(push, 0x04000e02); /* madr r1.xyz, r0.x, imm.x, imm.yzww */
868fda9279dSmrg	PUSH_DATAs(push, 0x1c9c0000);
869fda9279dSmrg	PUSH_DATAs(push, 0x00000002);
870fda9279dSmrg	PUSH_DATAs(push, 0x0001f202);
871fda9279dSmrg	PUSH_DATAs(push, 0x3f9507c8); /* { 1.16, -0.87, 0.53, -1.08 } */
872fda9279dSmrg	PUSH_DATAs(push, 0xbf5ee393);
873fda9279dSmrg	PUSH_DATAs(push, 0x3f078fef);
874fda9279dSmrg	PUSH_DATAs(push, 0xbf8a6762);
875fda9279dSmrg	PUSH_DATAs(push, 0x1704ac80); /* texr r0.yz, a[tex1], t[2] */
876fda9279dSmrg	PUSH_DATAs(push, 0x1c9dc801);
877fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
878fda9279dSmrg	PUSH_DATAs(push, 0x3fe1c800);
879fda9279dSmrg	PUSH_DATAs(push, 0x04000e02); /* madr r1.xyz, r0.y, imm, r1 */
880fda9279dSmrg	PUSH_DATAs(push, 0x1c9cab00);
881fda9279dSmrg	PUSH_DATAs(push, 0x0001c802);
882fda9279dSmrg	PUSH_DATAs(push, 0x0001c804);
883fda9279dSmrg	PUSH_DATAs(push, 0x00000000); /* { 0.00, -0.39, 2.02, 0.00 } */
884fda9279dSmrg	PUSH_DATAs(push, 0xbec890d6);
885fda9279dSmrg	PUSH_DATAs(push, 0x40011687);
886fda9279dSmrg	PUSH_DATAs(push, 0x00000000);
887fda9279dSmrg	PUSH_DATAs(push, 0x04000e81); /* madr r0.xyz, r0.z, imm, r1 */
888fda9279dSmrg	PUSH_DATAs(push, 0x1c9d5500);
889fda9279dSmrg	PUSH_DATAs(push, 0x0001c802);
890fda9279dSmrg	PUSH_DATAs(push, 0x0001c804);
891fda9279dSmrg	PUSH_DATAs(push, 0x3fcc432d); /* { 1.60, -0.81, 0.00, 0.00 } */
892fda9279dSmrg	PUSH_DATAs(push, 0xbf501a37);
893fda9279dSmrg	PUSH_DATAs(push, 0x00000000);
894fda9279dSmrg	PUSH_DATAs(push, 0x00000000);
895fda9279dSmrg
896fda9279dSmrg
897fda9279dSmrg	PUSH_DATAu(push, pNv->scratch, PFP_NV12_BICUBIC, 29 * 4);
898fda9279dSmrg	PUSH_DATAs(push, 0x01008600); /* movr r0.xy, a[tex0] */
899fda9279dSmrg	PUSH_DATAs(push, 0x1c9dc801);
900fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
901fda9279dSmrg	PUSH_DATAs(push, 0x3fe1c800);
902fda9279dSmrg	PUSH_DATAs(push, 0x03000800); /* addr r0.z, r0.y, imm.x */
903fda9279dSmrg	PUSH_DATAs(push, 0x1c9caa00);
904fda9279dSmrg	PUSH_DATAs(push, 0x00000002);
905fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
906fda9279dSmrg	PUSH_DATAs(push, 0x3f000000); /* { 0.50, 0.00, 0.00, 0.00 } */
907fda9279dSmrg	PUSH_DATAs(push, 0x00000000);
908fda9279dSmrg	PUSH_DATAs(push, 0x00000000);
909fda9279dSmrg	PUSH_DATAs(push, 0x00000000);
910fda9279dSmrg	PUSH_DATAs(push, 0x03000202); /* addr r1.x, r0, imm.x */
911fda9279dSmrg	PUSH_DATAs(push, 0x1c9dc800);
912fda9279dSmrg	PUSH_DATAs(push, 0x00000002);
913fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
914fda9279dSmrg	PUSH_DATAs(push, 0x3f000000); /* { 0.50, 0.00, 0.00, 0.00 } */
915fda9279dSmrg	PUSH_DATAs(push, 0x00000000);
916fda9279dSmrg	PUSH_DATAs(push, 0x00000000);
917fda9279dSmrg	PUSH_DATAs(push, 0x00000000);
918fda9279dSmrg	PUSH_DATAs(push, 0x17000f82); /* texrc0 r1.xyz, r0.z, t[0] */
919fda9279dSmrg	PUSH_DATAs(push, 0x1c9d5400);
920fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
921fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
922fda9279dSmrg	PUSH_DATAs(push, 0x02001404); /* mulr r2.yw, r1.xxyy, imm.xxyy */
923fda9279dSmrg	PUSH_DATAs(push, 0x1c9ca104);
924fda9279dSmrg	PUSH_DATAs(push, 0x0000a002);
925fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
926fda9279dSmrg	PUSH_DATAs(push, 0xbf800000); /* { -1.00, 1.00, 0.00, 0.00 } */
927fda9279dSmrg	PUSH_DATAs(push, 0x3f800000);
928fda9279dSmrg	PUSH_DATAs(push, 0x00000000);
929fda9279dSmrg	PUSH_DATAs(push, 0x00000000);
930fda9279dSmrg	PUSH_DATAs(push, 0x17000e86); /* texr r3.xyz, r1, t[0] */
931fda9279dSmrg	PUSH_DATAs(push, 0x1c9dc804);
932fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
933fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
934fda9279dSmrg	PUSH_DATAs(push, 0x02000a04); /* mulr r2.xz, r3.xxyy, imm.xxyy */
935fda9279dSmrg	PUSH_DATAs(push, 0x1c9ca10c);
936fda9279dSmrg	PUSH_DATAs(push, 0x0000a002);
937fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
938fda9279dSmrg	PUSH_DATAs(push, 0xbf800000); /* { -1.00, 1.00, 0.00, 0.00 } */
939fda9279dSmrg	PUSH_DATAs(push, 0x3f800000);
940fda9279dSmrg	PUSH_DATAs(push, 0x00000000);
941fda9279dSmrg	PUSH_DATAs(push, 0x00000000);
942fda9279dSmrg	PUSH_DATAs(push, 0x03001e04); /* addr r2, r0.xyxy, r2 */
943fda9279dSmrg	PUSH_DATAs(push, 0x1c9c8800);
944fda9279dSmrg	PUSH_DATAs(push, 0x0001c808);
945fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
946fda9279dSmrg	PUSH_DATAs(push, 0x17020402); /* texr r1.y, r2.zwzz, -t[1] */
947fda9279dSmrg	PUSH_DATAs(push, 0x1c9d5c08);
948fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
949fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
950fda9279dSmrg	PUSH_DATAs(push, 0x04400282); /* madh r1.x, -r1.z, r1.y, r1.y */
951fda9279dSmrg	PUSH_DATAs(push, 0x1c9f5504);
952fda9279dSmrg	PUSH_DATAs(push, 0x0000aa04);
953fda9279dSmrg	PUSH_DATAs(push, 0x0000aa04);
954fda9279dSmrg	PUSH_DATAs(push, 0x17020400); /* texr r0.y, r2.xwxw, -t[1] */
955fda9279dSmrg	PUSH_DATAs(push, 0x1c9d9808);
956fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
957fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
958fda9279dSmrg	PUSH_DATAs(push, 0x04401080); /* madh r0.w, -r1.z, r0.y, r0.y */
959fda9279dSmrg	PUSH_DATAs(push, 0x1c9f5504);
960fda9279dSmrg	PUSH_DATAs(push, 0x0000aa00);
961fda9279dSmrg	PUSH_DATAs(push, 0x0000aa00);
962fda9279dSmrg	PUSH_DATAs(push, 0x17020200); /* texr r0.x, r2.zyxy, t[1] */
963fda9279dSmrg	PUSH_DATAs(push, 0x1c9c8c08);
964fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
965fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
966fda9279dSmrg	PUSH_DATAs(push, 0x04400282); /* madh r1.x, r1.z, r0, r1 */
967fda9279dSmrg	PUSH_DATAs(push, 0x1c9d5504);
968fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
969fda9279dSmrg	PUSH_DATAs(push, 0x0001c904);
970fda9279dSmrg	PUSH_DATAs(push, 0x17020200); /* texr r0.x (NE0.z), r2, t[1] */
971fda9279dSmrg	PUSH_DATAs(push, 0x1555c808);
972fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
973fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
974fda9279dSmrg	PUSH_DATAs(push, 0x04400280); /* madh r0.x, r1.z, r0, r0.w */
975fda9279dSmrg	PUSH_DATAs(push, 0x1c9d5504);
976fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
977fda9279dSmrg	PUSH_DATAs(push, 0x0001ff00);
978fda9279dSmrg	PUSH_DATAs(push, 0x04401080); /* madh r0.w, -r3.z, r1.x, r1.x */
979fda9279dSmrg	PUSH_DATAs(push, 0x1c9f550c);
980fda9279dSmrg	PUSH_DATAs(push, 0x00000104);
981fda9279dSmrg	PUSH_DATAs(push, 0x00000104);
982fda9279dSmrg	PUSH_DATAs(push, 0x1704ac80); /* texr r0.yz, a[tex1], t[2] */
983fda9279dSmrg	PUSH_DATAs(push, 0x1c9dc801);
984fda9279dSmrg	PUSH_DATAs(push, 0x0001c800);
985fda9279dSmrg	PUSH_DATAs(push, 0x3fe1c800);
986fda9279dSmrg	PUSH_DATAs(push, 0x04400280); /* madh r0.x, r3.z, r0, r0.w */
987fda9279dSmrg	PUSH_DATAs(push, 0x1c9d550c);
988fda9279dSmrg	PUSH_DATAs(push, 0x0001c900);
989fda9279dSmrg	PUSH_DATAs(push, 0x0001ff00);
990fda9279dSmrg	PUSH_DATAs(push, 0x04400e82); /* madh r1.xyz, r0.x, imm.x, imm.yzww */
991fda9279dSmrg	PUSH_DATAs(push, 0x1c9c0100);
992fda9279dSmrg	PUSH_DATAs(push, 0x00000002);
993fda9279dSmrg	PUSH_DATAs(push, 0x0001f202);
994fda9279dSmrg	PUSH_DATAs(push, 0x3f9507c8); /* { 1.16, -0.87, 0.53, -1.08 } */
995fda9279dSmrg	PUSH_DATAs(push, 0xbf5ee393);
996fda9279dSmrg	PUSH_DATAs(push, 0x3f078fef);
997fda9279dSmrg	PUSH_DATAs(push, 0xbf8a6762);
998fda9279dSmrg	PUSH_DATAs(push, 0x04400e82); /* madh r1.xyz, r0.y, imm, r1 */
999fda9279dSmrg	PUSH_DATAs(push, 0x1c9cab00);
1000fda9279dSmrg	PUSH_DATAs(push, 0x0001c802);
1001fda9279dSmrg	PUSH_DATAs(push, 0x0001c904);
1002fda9279dSmrg	PUSH_DATAs(push, 0x00000000); /* { 0.00, -0.39, 2.02, 0.00 } */
1003fda9279dSmrg	PUSH_DATAs(push, 0xbec890d6);
1004fda9279dSmrg	PUSH_DATAs(push, 0x40011687);
1005fda9279dSmrg	PUSH_DATAs(push, 0x00000000);
1006fda9279dSmrg	PUSH_DATAs(push, 0x04400e81); /* madh r0.xyz, r0.z, imm, r1 */
1007fda9279dSmrg	PUSH_DATAs(push, 0x1c9d5500);
1008fda9279dSmrg	PUSH_DATAs(push, 0x0001c802);
1009fda9279dSmrg	PUSH_DATAs(push, 0x0001c904);
1010fda9279dSmrg	PUSH_DATAs(push, 0x3fcc432d); /* { 1.60, -0.81, 0.00, 0.00 } */
1011fda9279dSmrg	PUSH_DATAs(push, 0xbf501a37);
1012fda9279dSmrg	PUSH_DATAs(push, 0x00000000);
1013fda9279dSmrg	PUSH_DATAs(push, 0x00000000);
1014fda9279dSmrg	return TRUE;
1015fda9279dSmrg}
1016