1fda9279dSmrg/*
2fda9279dSmrg * Copyright 2008 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#include "nv50_accel.h"
25fda9279dSmrg
26fda9279dSmrg#include "hwdefs/nv_object.xml.h"
27fda9279dSmrg#include "hwdefs/nv50_2d.xml.h"
28fda9279dSmrg#include "hwdefs/nv50_3d.xml.h"
29fda9279dSmrg
30fda9279dSmrgvoid
31fda9279dSmrgNV50SyncToVBlank(PixmapPtr ppix, BoxPtr box)
32fda9279dSmrg{
33fda9279dSmrg	ScrnInfoPtr pScrn = xf86ScreenToScrn(ppix->drawable.pScreen);
34fda9279dSmrg	NVPtr pNv = NVPTR(pScrn);
35fda9279dSmrg	struct nouveau_pushbuf *push = pNv->pushbuf;
36fda9279dSmrg	int head;
37fda9279dSmrg	xf86CrtcPtr crtc;
38fda9279dSmrg
39fda9279dSmrg	if (!nouveau_exa_pixmap_is_onscreen(ppix))
40fda9279dSmrg		return;
41fda9279dSmrg
4233adc6acSmrg	crtc = nouveau_pick_best_crtc(pScrn, box->x1, box->y1,
4333adc6acSmrg				      box->x2 - box->x1,
4433adc6acSmrg				      box->y2 - box->y1);
45fda9279dSmrg	if (!crtc)
46fda9279dSmrg		return;
47fda9279dSmrg
48fda9279dSmrg	if (!PUSH_SPACE(push, 10))
49fda9279dSmrg		return;
50fda9279dSmrg
51fda9279dSmrg	head = drmmode_head(crtc);
52fda9279dSmrg
53fda9279dSmrg	BEGIN_NV04(push, SUBC_NVSW(0x0060), 2);
54fda9279dSmrg	PUSH_DATA (push, pNv->vblank_sem->handle);
55fda9279dSmrg	PUSH_DATA (push, 0);
56fda9279dSmrg	BEGIN_NV04(push, SUBC_NVSW(0x006c), 1);
57fda9279dSmrg	PUSH_DATA (push, 0x22222222);
58fda9279dSmrg	BEGIN_NV04(push, SUBC_NVSW(0x0404), 2);
59fda9279dSmrg	PUSH_DATA (push, 0x11111111);
60fda9279dSmrg	PUSH_DATA (push, head);
61fda9279dSmrg	BEGIN_NV04(push, SUBC_NVSW(0x0068), 1);
62fda9279dSmrg	PUSH_DATA (push, 0x11111111);
63fda9279dSmrg}
64fda9279dSmrg
65fda9279dSmrgBool
66fda9279dSmrgNVAccelInitM2MF_NV50(ScrnInfoPtr pScrn)
67fda9279dSmrg{
68fda9279dSmrg	NVPtr pNv = NVPTR(pScrn);
69fda9279dSmrg	struct nouveau_pushbuf *push = pNv->pushbuf;
70fda9279dSmrg	struct nv04_fifo *fifo = pNv->channel->data;
71fda9279dSmrg
72fda9279dSmrg	if (nouveau_object_new(pNv->channel, NvMemFormat, NV50_M2MF_CLASS,
73fda9279dSmrg			       NULL, 0, &pNv->NvMemFormat))
74fda9279dSmrg		return FALSE;
75fda9279dSmrg
76fda9279dSmrg	if (!PUSH_SPACE(push, 8))
77fda9279dSmrg		return FALSE;
78fda9279dSmrg
79fda9279dSmrg	BEGIN_NV04(push, NV01_SUBC(M2MF, OBJECT), 1);
80fda9279dSmrg	PUSH_DATA (push, pNv->NvMemFormat->handle);
81fda9279dSmrg	BEGIN_NV04(push, NV03_M2MF(DMA_NOTIFY), 1);
82fda9279dSmrg	PUSH_DATA (push, pNv->notify0->handle);
83fda9279dSmrg	BEGIN_NV04(push, NV03_M2MF(DMA_BUFFER_IN), 2);
84fda9279dSmrg	PUSH_DATA (push, fifo->vram);
85fda9279dSmrg	PUSH_DATA (push, fifo->vram);
86fda9279dSmrg	return TRUE;
87fda9279dSmrg}
88fda9279dSmrg
89fda9279dSmrgBool
90fda9279dSmrgNVAccelInit2D_NV50(ScrnInfoPtr pScrn)
91fda9279dSmrg{
92fda9279dSmrg	NVPtr pNv = NVPTR(pScrn);
93fda9279dSmrg	struct nouveau_pushbuf *push = pNv->pushbuf;
94fda9279dSmrg	struct nv04_fifo *fifo = pNv->channel->data;
95fda9279dSmrg
96fda9279dSmrg	if (nouveau_object_new(pNv->channel, Nv2D, NV50_2D_CLASS,
97fda9279dSmrg			       NULL, 0, &pNv->Nv2D))
98fda9279dSmrg		return FALSE;
99fda9279dSmrg
100fda9279dSmrg	if (!PUSH_SPACE(push, 64))
101fda9279dSmrg		return FALSE;
102fda9279dSmrg
103fda9279dSmrg	BEGIN_NV04(push, NV01_SUBC(2D, OBJECT), 1);
104fda9279dSmrg	PUSH_DATA (push, pNv->Nv2D->handle);
105fda9279dSmrg	BEGIN_NV04(push, NV50_2D(DMA_NOTIFY), 3);
106fda9279dSmrg	PUSH_DATA (push, pNv->notify0->handle);
107fda9279dSmrg	PUSH_DATA (push, fifo->vram);
108fda9279dSmrg	PUSH_DATA (push, fifo->vram);
109fda9279dSmrg
110fda9279dSmrg	/* Magics from nv, no clue what they do, but at least some
111fda9279dSmrg	 * of them are needed to avoid crashes.
112fda9279dSmrg	 */
11316ee1e9aSmrg	BEGIN_NV04(push, NV50_2D(UNK260), 1);
114fda9279dSmrg	PUSH_DATA (push, 1);
115fda9279dSmrg	BEGIN_NV04(push, NV50_2D(CLIP_ENABLE), 1);
116fda9279dSmrg	PUSH_DATA (push, 1);
117fda9279dSmrg	BEGIN_NV04(push, NV50_2D(COLOR_KEY_ENABLE), 1);
118fda9279dSmrg	PUSH_DATA (push, 0);
11916ee1e9aSmrg	BEGIN_NV04(push, NV50_2D(UNK58C), 1);
120fda9279dSmrg	PUSH_DATA (push, 0x111);
121fda9279dSmrg
122fda9279dSmrg	pNv->currentRop = 0xfffffffa;
123fda9279dSmrg	return TRUE;
124fda9279dSmrg}
125fda9279dSmrg
126fda9279dSmrgBool
127fda9279dSmrgNVAccelInitNV50TCL(ScrnInfoPtr pScrn)
128fda9279dSmrg{
129fda9279dSmrg	NVPtr pNv = NVPTR(pScrn);
130fda9279dSmrg	struct nv04_fifo *fifo = pNv->channel->data;
131fda9279dSmrg	struct nouveau_pushbuf *push = pNv->pushbuf;
132fda9279dSmrg	struct nv04_notify ntfy = { .length = 32 };
133fda9279dSmrg	unsigned class;
134fda9279dSmrg	int i;
135fda9279dSmrg
136fda9279dSmrg	switch (pNv->dev->chipset & 0xf0) {
137fda9279dSmrg	case 0x50:
138fda9279dSmrg		class = NV50_3D_CLASS;
139fda9279dSmrg		break;
140fda9279dSmrg	case 0x80:
141fda9279dSmrg	case 0x90:
142fda9279dSmrg		class = NV84_3D_CLASS;
143fda9279dSmrg		break;
144fda9279dSmrg	case 0xa0:
145fda9279dSmrg		switch (pNv->dev->chipset) {
146fda9279dSmrg		case 0xa0:
147fda9279dSmrg		case 0xaa:
148fda9279dSmrg		case 0xac:
149fda9279dSmrg			class = NVA0_3D_CLASS;
150fda9279dSmrg			break;
151fda9279dSmrg		case 0xaf:
152fda9279dSmrg			class = NVAF_3D_CLASS;
153fda9279dSmrg			break;
154fda9279dSmrg		default:
155fda9279dSmrg			class = NVA3_3D_CLASS;
156fda9279dSmrg			break;
157fda9279dSmrg		}
158fda9279dSmrg		break;
159fda9279dSmrg	default:
160fda9279dSmrg		return FALSE;
161fda9279dSmrg	}
162fda9279dSmrg
163fda9279dSmrg	if (nouveau_object_new(pNv->channel, Nv3D, class, NULL, 0, &pNv->Nv3D))
164fda9279dSmrg		return FALSE;
165fda9279dSmrg
166fda9279dSmrg	if (nouveau_object_new(pNv->channel, NvSW, 0x506e, NULL, 0, &pNv->NvSW)) {
167fda9279dSmrg		nouveau_object_del(&pNv->Nv3D);
168fda9279dSmrg		return FALSE;
169fda9279dSmrg	}
170fda9279dSmrg
171fda9279dSmrg	if (nouveau_object_new(pNv->channel, NvVBlankSem, NOUVEAU_NOTIFIER_CLASS,
172fda9279dSmrg			       &ntfy, sizeof(ntfy), &pNv->vblank_sem)) {
173fda9279dSmrg		nouveau_object_del(&pNv->NvSW);
174fda9279dSmrg		nouveau_object_del(&pNv->Nv3D);
175fda9279dSmrg		return FALSE;
176fda9279dSmrg	}
177fda9279dSmrg
178fda9279dSmrg	if (nouveau_pushbuf_space(push, 512, 0, 0) ||
179fda9279dSmrg	    nouveau_pushbuf_refn (push, &(struct nouveau_pushbuf_refn) {
180fda9279dSmrg					pNv->scratch, NOUVEAU_BO_VRAM |
181fda9279dSmrg					NOUVEAU_BO_WR }, 1))
182fda9279dSmrg		return FALSE;
183fda9279dSmrg
184fda9279dSmrg	BEGIN_NV04(push, NV01_SUBC(NVSW, OBJECT), 1);
185fda9279dSmrg	PUSH_DATA (push, pNv->NvSW->handle);
186fda9279dSmrg	BEGIN_NV04(push, SUBC_NVSW(0x018c), 1);
187fda9279dSmrg	PUSH_DATA (push, pNv->vblank_sem->handle);
188fda9279dSmrg	BEGIN_NV04(push, SUBC_NVSW(0x0400), 1);
189fda9279dSmrg	PUSH_DATA (push, 0);
190fda9279dSmrg
191fda9279dSmrg	BEGIN_NV04(push, NV01_SUBC(3D, OBJECT), 1);
192fda9279dSmrg	PUSH_DATA (push, pNv->Nv3D->handle);
193fda9279dSmrg	BEGIN_NV04(push, NV50_3D(COND_MODE), 1);
194fda9279dSmrg	PUSH_DATA (push, NV50_3D_COND_MODE_ALWAYS);
195fda9279dSmrg	BEGIN_NV04(push, NV50_3D(DMA_NOTIFY), 1);
196fda9279dSmrg	PUSH_DATA (push, pNv->NvNull->handle);
197fda9279dSmrg	BEGIN_NV04(push, NV50_3D(DMA_ZETA), 11);
198fda9279dSmrg	for (i = 0; i < 11; i++)
199fda9279dSmrg		PUSH_DATA (push, fifo->vram);
200fda9279dSmrg	BEGIN_NV04(push, NV50_3D(DMA_COLOR(0)), NV50_3D_DMA_COLOR__LEN);
201fda9279dSmrg	for (i = 0; i < NV50_3D_DMA_COLOR__LEN; i++)
202fda9279dSmrg		PUSH_DATA (push, fifo->vram);
203fda9279dSmrg	BEGIN_NV04(push, NV50_3D(RT_CONTROL), 1);
204fda9279dSmrg	PUSH_DATA (push, 1);
205fda9279dSmrg
206fda9279dSmrg	BEGIN_NV04(push, NV50_3D(VIEWPORT_TRANSFORM_EN), 1);
207fda9279dSmrg	PUSH_DATA (push, 0);
20816ee1e9aSmrg	BEGIN_NV04(push, NV50_3D(COLOR_MASK_COMMON), 1);
209fda9279dSmrg	PUSH_DATA (push, 1);
21016ee1e9aSmrg	BEGIN_NV04(push, NV50_3D(ZETA_ENABLE), 1);
21116ee1e9aSmrg	PUSH_DATA (push, 0);
212fda9279dSmrg
213fda9279dSmrg	BEGIN_NV04(push, NV50_3D(TIC_ADDRESS_HIGH), 3);
214fda9279dSmrg	PUSH_DATA (push, (pNv->scratch->offset + TIC_OFFSET) >> 32);
215fda9279dSmrg	PUSH_DATA (push, (pNv->scratch->offset + TIC_OFFSET));
216fda9279dSmrg	PUSH_DATA (push, 0x00000800);
217fda9279dSmrg	BEGIN_NV04(push, NV50_3D(TSC_ADDRESS_HIGH), 3);
218fda9279dSmrg	PUSH_DATA (push, (pNv->scratch->offset + TSC_OFFSET) >> 32);
219fda9279dSmrg	PUSH_DATA (push, (pNv->scratch->offset + TSC_OFFSET));
220fda9279dSmrg	PUSH_DATA (push, 0x00000000);
221fda9279dSmrg	BEGIN_NV04(push, NV50_3D(LINKED_TSC), 1);
222fda9279dSmrg	PUSH_DATA (push, 1);
223fda9279dSmrg	BEGIN_NV04(push, NV50_3D(TEX_LIMITS(2)), 1);
224fda9279dSmrg	PUSH_DATA (push, 0x54);
225fda9279dSmrg
226fda9279dSmrg	PUSH_DATAu(push, pNv->scratch, PVP_OFFSET, 30 * 2);
227fda9279dSmrg	PUSH_DATA (push, 0x10000001);
22816ee1e9aSmrg	PUSH_DATA (push, 0x0423c788); /* mov b32 o[0x0] a[0x0] */
229fda9279dSmrg	PUSH_DATA (push, 0x10000205);
23016ee1e9aSmrg	PUSH_DATA (push, 0x0423c788); /* mov b32 o[0x4] a[0x4] */
231fda9279dSmrg	PUSH_DATA (push, 0xc0800401);
23216ee1e9aSmrg	PUSH_DATA (push, 0x00200780); /* mul rn f32 $r0 a[0x8] c0[0x0] */
233fda9279dSmrg	PUSH_DATA (push, 0xc0830405);
23416ee1e9aSmrg	PUSH_DATA (push, 0x00200780); /* mul rn f32 $r1 a[0x8] c0[0xc] */
235fda9279dSmrg	PUSH_DATA (push, 0xc0860409);
23616ee1e9aSmrg	PUSH_DATA (push, 0x00200780); /* mul rn f32 $r2 a[0x8] c0[0x18] */
237fda9279dSmrg	PUSH_DATA (push, 0xe0810601);
23816ee1e9aSmrg	PUSH_DATA (push, 0x00200780); /* add f32 $r0 (mul a[0xc] c0[0x4]) $r0 */
239fda9279dSmrg	PUSH_DATA (push, 0xe0840605);
24016ee1e9aSmrg	PUSH_DATA (push, 0x00204780); /* add f32 $r1 (mul a[0xc] c0[0x10]) $r1 */
241fda9279dSmrg	PUSH_DATA (push, 0xe0870609);
24216ee1e9aSmrg	PUSH_DATA (push, 0x00208780); /* add f32 $r2 (mul a[0xc] c0[0x1c]) $r2 */
243fda9279dSmrg	PUSH_DATA (push, 0xb1000001);
24416ee1e9aSmrg	PUSH_DATA (push, 0x00008780); /* add rn f32 $r0 $r0 c0[0x8] */
245fda9279dSmrg	PUSH_DATA (push, 0xb1000205);
24616ee1e9aSmrg	PUSH_DATA (push, 0x00014780); /* add rn f32 $r1 $r1 c0[0x14] */
247fda9279dSmrg	PUSH_DATA (push, 0xb1000409);
24816ee1e9aSmrg	PUSH_DATA (push, 0x00020780); /* add rn f32 $r2 $r2 c0[0x20] */
249fda9279dSmrg	PUSH_DATA (push, 0x90000409);
25016ee1e9aSmrg	PUSH_DATA (push, 0x00000780); /* rcp f32 $r2 $r2 */
251fda9279dSmrg	PUSH_DATA (push, 0xc0020001);
25216ee1e9aSmrg	PUSH_DATA (push, 0x00000780); /* mul rn f32 $r0 $r0 $r2 */
253fda9279dSmrg	PUSH_DATA (push, 0xc0020205);
25416ee1e9aSmrg	PUSH_DATA (push, 0x00000780); /* mul rn f32 $r1 $r1 $r2 */
255fda9279dSmrg	PUSH_DATA (push, 0xc0890009);
25616ee1e9aSmrg	PUSH_DATA (push, 0x00000788); /* mul rn f32 o[0x8] $r0 c0[0x24] */
257fda9279dSmrg	PUSH_DATA (push, 0xc08a020d);
25816ee1e9aSmrg	PUSH_DATA (push, 0x00000788); /* mul rn f32 o[0xc] $r1 c0[0x28] */
259fda9279dSmrg	PUSH_DATA (push, 0xc08b0801);
26016ee1e9aSmrg	PUSH_DATA (push, 0x00200780); /* mul rn f32 $r0 a[0x10] c0[0x2c] */
261fda9279dSmrg	PUSH_DATA (push, 0xc08e0805);
26216ee1e9aSmrg	PUSH_DATA (push, 0x00200780); /* mul rn f32 $r1 a[0x10] c0[0x38] */
263fda9279dSmrg	PUSH_DATA (push, 0xc0910809);
26416ee1e9aSmrg	PUSH_DATA (push, 0x00200780); /* mul rn f32 $r2 a[0x10] c0[0x44] */
265fda9279dSmrg	PUSH_DATA (push, 0xe08c0a01);
26616ee1e9aSmrg	PUSH_DATA (push, 0x00200780); /* add f32 $r0 (mul a[0x14] c0[0x30]) $r0 */
267fda9279dSmrg	PUSH_DATA (push, 0xe08f0a05);
26816ee1e9aSmrg	PUSH_DATA (push, 0x00204780); /* add f32 $r1 (mul a[0x14] c0[0x3c]) $r1 */
269fda9279dSmrg	PUSH_DATA (push, 0xe0920a09);
27016ee1e9aSmrg	PUSH_DATA (push, 0x00208780); /* add f32 $r2 (mul a[0x14] c0[0x48]) $r2 */
271fda9279dSmrg	PUSH_DATA (push, 0xb1000001);
27216ee1e9aSmrg	PUSH_DATA (push, 0x00034780); /* add rn f32 $r0 $r0 c0[0x34] */
273fda9279dSmrg	PUSH_DATA (push, 0xb1000205);
27416ee1e9aSmrg	PUSH_DATA (push, 0x00040780); /* add rn f32 $r1 $r1 c0[0x40] */
275fda9279dSmrg	PUSH_DATA (push, 0xb1000409);
27616ee1e9aSmrg	PUSH_DATA (push, 0x0004c780); /* add rn f32 $r2 $r2 c0[0x4c] */
277fda9279dSmrg	PUSH_DATA (push, 0x90000409);
27816ee1e9aSmrg	PUSH_DATA (push, 0x00000780); /* rcp f32 $r2 $r2 */
279fda9279dSmrg	PUSH_DATA (push, 0xc0020001);
28016ee1e9aSmrg	PUSH_DATA (push, 0x00000780); /* mul rn f32 $r0 $r0 $r2 */
281fda9279dSmrg	PUSH_DATA (push, 0xc0020205);
28216ee1e9aSmrg	PUSH_DATA (push, 0x00000780); /* mul rn f32 $r1 $r1 $r2 */
283fda9279dSmrg	PUSH_DATA (push, 0xc0940011);
28416ee1e9aSmrg	PUSH_DATA (push, 0x00000788); /* mul rn f32 o[0x10] $r0 c0[0x50] */
285fda9279dSmrg	PUSH_DATA (push, 0xc0950215);
28616ee1e9aSmrg	PUSH_DATA (push, 0x00000789); /* exit mul rn f32 o[0x14] $r1 c0[0x54] */
287fda9279dSmrg
288fda9279dSmrg	/* fetch only VTX_ATTR[0,8,9].xy */
289fda9279dSmrg	BEGIN_NV04(push, NV50_3D(VP_ATTR_EN(0)), 2);
290fda9279dSmrg	PUSH_DATA (push, 0x00000003);
291fda9279dSmrg	PUSH_DATA (push, 0x00000033);
292fda9279dSmrg	BEGIN_NV04(push, NV50_3D(VP_REG_ALLOC_RESULT), 1);
293fda9279dSmrg	PUSH_DATA (push, 6);
294fda9279dSmrg	BEGIN_NV04(push, NV50_3D(VP_RESULT_MAP_SIZE), 2);
295fda9279dSmrg	PUSH_DATA (push, 8);
296fda9279dSmrg	PUSH_DATA (push, 4); /* NV50_3D_VP_REG_ALLOC_TEMP */
297fda9279dSmrg	BEGIN_NV04(push, NV50_3D(VP_ADDRESS_HIGH), 2);
298fda9279dSmrg	PUSH_DATA (push, (pNv->scratch->offset + PVP_OFFSET) >> 32);
299fda9279dSmrg	PUSH_DATA (push, (pNv->scratch->offset + PVP_OFFSET));
300fda9279dSmrg	BEGIN_NV04(push, NV50_3D(CB_DEF_ADDRESS_HIGH), 3);
301fda9279dSmrg	PUSH_DATA (push, (pNv->scratch->offset + PVP_DATA) >> 32);
302fda9279dSmrg	PUSH_DATA (push, (pNv->scratch->offset + PVP_DATA));
303fda9279dSmrg	PUSH_DATA (push, (CB_PVP << NV50_3D_CB_DEF_SET_BUFFER__SHIFT) | 256);
304fda9279dSmrg	BEGIN_NV04(push, NV50_3D(SET_PROGRAM_CB), 1);
305fda9279dSmrg	PUSH_DATA (push, 0x00000001 | (CB_PVP << 12));
306fda9279dSmrg	BEGIN_NV04(push, NV50_3D(VP_START_ID), 1);
307fda9279dSmrg	PUSH_DATA (push, 0);
308fda9279dSmrg
309fda9279dSmrg	PUSH_DATAu(push, pNv->scratch, PFP_OFFSET + PFP_S, 6);
31016ee1e9aSmrg	PUSH_DATA (push, 0x80000000); /* interp $r0 v[0x0] */
31116ee1e9aSmrg	PUSH_DATA (push, 0x90000004); /* rcp f32 $r1 $r0 */
31216ee1e9aSmrg	PUSH_DATA (push, 0x82010200); /* interp $r0 v[0x4] $r1 */
31316ee1e9aSmrg	PUSH_DATA (push, 0x82020204); /* interp $r1 v[0x8] $r1 */
314fda9279dSmrg	PUSH_DATA (push, 0xf6400001);
31516ee1e9aSmrg	PUSH_DATA (push, 0x0000c785); /* exit texauto live $r0:$r1:$r2:$r3 $t0 $s0 $r0:$r1 0x0 0x0 0x0 */
316fda9279dSmrg	PUSH_DATAu(push, pNv->scratch, PFP_OFFSET + PFP_C, 16);
31716ee1e9aSmrg	PUSH_DATA (push, 0x80000000); /* interp $r0 v[0x0] */
31816ee1e9aSmrg	PUSH_DATA (push, 0x90000004); /* rcp f32 $r1 $r0 */
31916ee1e9aSmrg	PUSH_DATA (push, 0x82030210); /* interp $r4 v[0xc] $r1 */
32016ee1e9aSmrg	PUSH_DATA (push, 0x82040214); /* interp $r5 v[0x10] $r1 */
32116ee1e9aSmrg	PUSH_DATA (push, 0x82010200); /* interp $r0 v[0x4] $r1 */
32216ee1e9aSmrg	PUSH_DATA (push, 0x82020204); /* interp $r1 v[0x8] $r1 */
323fda9279dSmrg	PUSH_DATA (push, 0xf6400001);
32416ee1e9aSmrg	PUSH_DATA (push, 0x0000c784); /* texauto live $r0:$r1:$r2:$r3 $t0 $s0 $r0:$r1 0x0 0x0 0x0 */
325fda9279dSmrg	PUSH_DATA (push, 0xf0400211);
32616ee1e9aSmrg	PUSH_DATA (push, 0x00008784); /* texauto live #:#:#:$r4 $t1 $s0 $r4:$r5 0x0 0x0 0x0 */
32716ee1e9aSmrg	PUSH_DATA (push, 0xc0040000); /* mul f32 $r0 $r0 $r4 */
32816ee1e9aSmrg	PUSH_DATA (push, 0xc0040204); /* mul f32 $r1 $r1 $r4 */
329fda9279dSmrg	PUSH_DATA (push, 0xc0040409);
33016ee1e9aSmrg	PUSH_DATA (push, 0x00000780); /* mul rn f32 $r2 $r2 $r4 */
331fda9279dSmrg	PUSH_DATA (push, 0xc004060d);
33216ee1e9aSmrg	PUSH_DATA (push, 0x00000781); /* exit mul rn f32 $r3 $r3 $r4 */
333fda9279dSmrg	PUSH_DATAu(push, pNv->scratch, PFP_OFFSET + PFP_CCA, 16);
33416ee1e9aSmrg	PUSH_DATA (push, 0x80000000); /* interp $r0 v[0x0] */
33516ee1e9aSmrg	PUSH_DATA (push, 0x90000004); /* rcp f32 $r1 $r0 */
33616ee1e9aSmrg	PUSH_DATA (push, 0x82030210); /* interp $r4 v[0xc] $r1 */
33716ee1e9aSmrg	PUSH_DATA (push, 0x82040214); /* interp $r5 v[0x10] $r1 */
33816ee1e9aSmrg	PUSH_DATA (push, 0x82010200); /* interp $r0 v[0x4] $r1 */
33916ee1e9aSmrg	PUSH_DATA (push, 0x82020204); /* interp $r1 v[0x8] $r1 */
340fda9279dSmrg	PUSH_DATA (push, 0xf6400001);
34116ee1e9aSmrg	PUSH_DATA (push, 0x0000c784); /* texauto live $r0:$r1:$r2:$r3 $t0 $s0 $r0:$r1 0x0 0x0 0x0 */
342fda9279dSmrg	PUSH_DATA (push, 0xf6400211);
34316ee1e9aSmrg	PUSH_DATA (push, 0x0000c784); /* texauto live $r4:$r5:$r6:$r7 $t1 $s0 $r4:$r5 0x0 0x0 0x0 */
34416ee1e9aSmrg	PUSH_DATA (push, 0xc0040000); /* mul f32 $r0 $r0 $r4 */
34516ee1e9aSmrg	PUSH_DATA (push, 0xc0050204); /* mul f32 $r1 $r1 $r5 */
346fda9279dSmrg	PUSH_DATA (push, 0xc0060409);
34716ee1e9aSmrg	PUSH_DATA (push, 0x00000780); /* mul rn f32 $r2 $r2 $r6 */
348fda9279dSmrg	PUSH_DATA (push, 0xc007060d);
34916ee1e9aSmrg	PUSH_DATA (push, 0x00000781); /* exit mul rn f32 $r3 $r3 $r7 */
350fda9279dSmrg	PUSH_DATAu(push, pNv->scratch, PFP_OFFSET + PFP_CCASA, 16);
35116ee1e9aSmrg	PUSH_DATA (push, 0x80000000); /* interp $r0 v[0x0] */
35216ee1e9aSmrg	PUSH_DATA (push, 0x90000004); /* rcp f32 $r1 $r0 */
35316ee1e9aSmrg	PUSH_DATA (push, 0x82030200); /* interp $r0 v[0xc] $r1 */
35416ee1e9aSmrg	PUSH_DATA (push, 0x82040204); /* interp $r1 v[0x10] $r1 */
35516ee1e9aSmrg	PUSH_DATA (push, 0x82010210); /* interp $r4 v[0x4] $r1 */
35616ee1e9aSmrg	PUSH_DATA (push, 0x82020214); /* interp $r5 v[0x8] $r1 */
357fda9279dSmrg	PUSH_DATA (push, 0xf6400201);
35816ee1e9aSmrg	PUSH_DATA (push, 0x0000c784); /* texauto live $r0:$r1:$r2:$r3 $t1 $s0 $r0:$r1 0x0 0x0 0x0 */
359fda9279dSmrg	PUSH_DATA (push, 0xf0400011);
36016ee1e9aSmrg	PUSH_DATA (push, 0x00008784); /* texauto live #:#:#:$r4 $t0 $s0 $r4:$r5 0x0 0x0 0x0 */
36116ee1e9aSmrg	PUSH_DATA (push, 0xc0040000); /* mul f32 $r0 $r0 $r4 */
36216ee1e9aSmrg	PUSH_DATA (push, 0xc0040204); /* mul f32 $r1 $r1 $r4 */
363fda9279dSmrg	PUSH_DATA (push, 0xc0040409);
36416ee1e9aSmrg	PUSH_DATA (push, 0x00000780); /* mul rn f32 $r2 $r2 $r4 */
365fda9279dSmrg	PUSH_DATA (push, 0xc004060d);
36616ee1e9aSmrg	PUSH_DATA (push, 0x00000781); /* exit mul rn f32 $r3 $r3 $r4 */
367fda9279dSmrg	PUSH_DATAu(push, pNv->scratch, PFP_OFFSET + PFP_S_A8, 10);
36816ee1e9aSmrg	PUSH_DATA (push, 0x80000000); /* interp $r0 v[0x0] */
36916ee1e9aSmrg	PUSH_DATA (push, 0x90000004); /* rcp f32 $r1 $r0 */
37016ee1e9aSmrg	PUSH_DATA (push, 0x82010200); /* interp $r0 v[0x4] $r1 */
37116ee1e9aSmrg	PUSH_DATA (push, 0x82020204); /* interp $r1 v[0x8] $r1 */
372fda9279dSmrg	PUSH_DATA (push, 0xf0400001);
37316ee1e9aSmrg	PUSH_DATA (push, 0x00008784); /* texauto live #:#:#:$r0 $t0 $s0 $r0:$r1 0x0 0x0 0x0 */
37416ee1e9aSmrg	PUSH_DATA (push, 0x10008004); /* mov b32 $r1 $r0 */
37516ee1e9aSmrg	PUSH_DATA (push, 0x10008008); /* mov b32 $r2 $r0 */
376fda9279dSmrg	PUSH_DATA (push, 0x1000000d);
37716ee1e9aSmrg	PUSH_DATA (push, 0x0403c781); /* exit mov b32 $r3 $r0 */
378fda9279dSmrg	PUSH_DATAu(push, pNv->scratch, PFP_OFFSET + PFP_C_A8, 16);
37916ee1e9aSmrg	PUSH_DATA (push, 0x80000000); /* interp $r0 v[0x0] */
38016ee1e9aSmrg	PUSH_DATA (push, 0x90000004); /* rcp f32 $r1 $r0 */
38116ee1e9aSmrg	PUSH_DATA (push, 0x82030208); /* interp $r2 v[0xc] $r1 */
38216ee1e9aSmrg	PUSH_DATA (push, 0x8204020c); /* interp $r3 v[0x10] $r1 */
38316ee1e9aSmrg	PUSH_DATA (push, 0x82010200); /* interp $r0 v[0x4] $r1 */
38416ee1e9aSmrg	PUSH_DATA (push, 0x82020204); /* interp $r1 v[0x8] $r1 */
385fda9279dSmrg	PUSH_DATA (push, 0xf0400001);
38616ee1e9aSmrg	PUSH_DATA (push, 0x00008784); /* texauto live #:#:#:$r0 $t0 $s0 $r0:$r1 0x0 0x0 0x0 */
387fda9279dSmrg	PUSH_DATA (push, 0xf0400209);
38816ee1e9aSmrg	PUSH_DATA (push, 0x00008784); /* texauto live #:#:#:$r2 $t1 $s0 $r2:$r3 0x0 0x0 0x0 */
389fda9279dSmrg	PUSH_DATA (push, 0xc002000d);
39016ee1e9aSmrg	PUSH_DATA (push, 0x00000780); /* mul rn f32 $r3 $r0 $r2 */
39116ee1e9aSmrg	PUSH_DATA (push, 0x10008600); /* mov b32 $r0 $r3 */
39216ee1e9aSmrg	PUSH_DATA (push, 0x10008604); /* mov b32 $r1 $r3 */
393fda9279dSmrg	PUSH_DATA (push, 0x10000609);
39416ee1e9aSmrg	PUSH_DATA (push, 0x0403c781); /* exit mov b32 $r2 $r3 */
395fda9279dSmrg	PUSH_DATAu(push, pNv->scratch, PFP_OFFSET + PFP_NV12, 24);
39616ee1e9aSmrg	PUSH_DATA (push, 0x80000008); /* interp $r2 v[0x0] */
39716ee1e9aSmrg	PUSH_DATA (push, 0x90000408); /* rcp f32 $r2 $r2 */
39816ee1e9aSmrg	PUSH_DATA (push, 0x82010400); /* interp $r0 v[0x4] $r2 */
39916ee1e9aSmrg	PUSH_DATA (push, 0x82020404); /* interp $r1 v[0x8] $r2 */
400fda9279dSmrg	PUSH_DATA (push, 0xf0400001);
40116ee1e9aSmrg	PUSH_DATA (push, 0x00008784); /* texauto live #:#:#:$r0 $t0 $s0 $r0:$r1 0x0 0x0 0x0 */
40216ee1e9aSmrg	PUSH_DATA (push, 0xc0800014); /* mul f32 $r5 $r0 c0[0x0] */
40316ee1e9aSmrg	PUSH_DATA (push, 0xb0810a0c); /* add f32 $r3 $r5 c0[0x4] */
40416ee1e9aSmrg	PUSH_DATA (push, 0xb0820a10); /* add f32 $r4 $r5 c0[0x8] */
40516ee1e9aSmrg	PUSH_DATA (push, 0xb0830a14); /* add f32 $r5 $r5 c0[0xc] */
40616ee1e9aSmrg	PUSH_DATA (push, 0x82010400); /* interp $r0 v[0x4] $r2 */
40716ee1e9aSmrg	PUSH_DATA (push, 0x82020404); /* interp $r1 v[0x8] $r2 */
408fda9279dSmrg	PUSH_DATA (push, 0xf0400201);
40916ee1e9aSmrg	PUSH_DATA (push, 0x0000c784); /* texauto live #:#:$r0:$r1 $t1 $s0 $r0:$r1 0x0 0x0 0x0 */
41016ee1e9aSmrg	PUSH_DATA (push, 0xe084000c); /* add f32 $r3 (mul $r0 c0[0x10]) $r3 */
41116ee1e9aSmrg	PUSH_DATA (push, 0xe0850010); /* add f32 $r4 (mul $r0 c0[0x14]) $r4 */
412fda9279dSmrg	PUSH_DATA (push, 0xe0860015);
41316ee1e9aSmrg	PUSH_DATA (push, 0x00014780); /* add f32 $r5 (mul $r0 c0[0x18]) $r5 */
414fda9279dSmrg	PUSH_DATA (push, 0xe0870201);
41516ee1e9aSmrg	PUSH_DATA (push, 0x0000c780); /* add f32 $r0 (mul $r1 c0[0x1c]) $r3 */
416fda9279dSmrg	PUSH_DATA (push, 0xe0890209);
41716ee1e9aSmrg	PUSH_DATA (push, 0x00014780); /* add f32 $r2 (mul $r1 c0[0x24]) $r5 */
418fda9279dSmrg	PUSH_DATA (push, 0xe0880205);
41916ee1e9aSmrg	PUSH_DATA (push, 0x00010781); /* exit add f32 $r1 (mul $r1 c0[0x20]) $r4 */
420fda9279dSmrg
421fda9279dSmrg	/* HPOS.xy = ($o0, $o1), HPOS.zw = (0.0, 1.0), then map $o2 - $o5 */
422fda9279dSmrg	BEGIN_NV04(push, NV50_3D(VP_RESULT_MAP(0)), 2);
423fda9279dSmrg	PUSH_DATA (push, 0x41400100);
424fda9279dSmrg	PUSH_DATA (push, 0x05040302);
425fda9279dSmrg	BEGIN_NV04(push, NV50_3D(POINT_SPRITE_ENABLE), 1);
426fda9279dSmrg	PUSH_DATA (push, 0x00000000);
427fda9279dSmrg	BEGIN_NV04(push, NV50_3D(FP_INTERPOLANT_CTRL), 2);
428fda9279dSmrg	PUSH_DATA (push, 0x08040404);
429fda9279dSmrg	PUSH_DATA (push, 0x00000008); /* NV50_3D_FP_REG_ALLOC_TEMP */
430fda9279dSmrg	BEGIN_NV04(push, NV50_3D(FP_ADDRESS_HIGH), 2);
431fda9279dSmrg	PUSH_DATA (push, (pNv->scratch->offset + PFP_OFFSET) >> 32);
432fda9279dSmrg	PUSH_DATA (push, (pNv->scratch->offset + PFP_OFFSET));
433fda9279dSmrg	BEGIN_NV04(push, NV50_3D(CB_DEF_ADDRESS_HIGH), 3);
434fda9279dSmrg	PUSH_DATA (push, (pNv->scratch->offset + PFP_DATA) >> 32);
435fda9279dSmrg	PUSH_DATA (push, (pNv->scratch->offset + PFP_DATA));
436fda9279dSmrg	PUSH_DATA (push, (CB_PFP << NV50_3D_CB_DEF_SET_BUFFER__SHIFT) | 256);
437fda9279dSmrg	BEGIN_NV04(push, NV50_3D(SET_PROGRAM_CB), 1);
438fda9279dSmrg	PUSH_DATA (push, 0x00000031 | (CB_PFP << 12));
439fda9279dSmrg
440fda9279dSmrg	BEGIN_NV04(push, NV50_3D(SCISSOR_ENABLE(0)), 1);
441fda9279dSmrg	PUSH_DATA (push, 1);
442fda9279dSmrg
443fda9279dSmrg	BEGIN_NV04(push, NV50_3D(VIEWPORT_HORIZ(0)), 2);
444fda9279dSmrg	PUSH_DATA (push, 8192 << NV50_3D_VIEWPORT_HORIZ_W__SHIFT);
445fda9279dSmrg	PUSH_DATA (push, 8192 << NV50_3D_VIEWPORT_VERT_H__SHIFT);
446fda9279dSmrg	/* NV50_3D_SCISSOR_VERT_T_SHIFT is wrong, because it was deducted with
447fda9279dSmrg	 * origin lying at the bottom left. This will be changed to _MIN_ and _MAX_
448fda9279dSmrg	 * later, because it is origin dependent.
449fda9279dSmrg	 */
450fda9279dSmrg	BEGIN_NV04(push, NV50_3D(SCISSOR_HORIZ(0)), 2);
451fda9279dSmrg	PUSH_DATA (push, 8192 << NV50_3D_SCISSOR_HORIZ_MAX__SHIFT);
452fda9279dSmrg	PUSH_DATA (push, 8192 << NV50_3D_SCISSOR_VERT_MAX__SHIFT);
453fda9279dSmrg	BEGIN_NV04(push, NV50_3D(SCREEN_SCISSOR_HORIZ), 2);
454fda9279dSmrg	PUSH_DATA (push, 8192 << NV50_3D_SCREEN_SCISSOR_HORIZ_W__SHIFT);
455fda9279dSmrg	PUSH_DATA (push, 8192 << NV50_3D_SCREEN_SCISSOR_VERT_H__SHIFT);
456fda9279dSmrg
457fda9279dSmrg	return TRUE;
458fda9279dSmrg}
459