nvc0_accel.c revision fda9279d
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 "nvc0_accel.h"
25fda9279dSmrg
26fda9279dSmrg#include "shader/xfrm2nvc0.vp"
27fda9279dSmrg#include "shader/videonvc0.fp"
28fda9279dSmrg
29fda9279dSmrg#include "shader/exascnvc0.fp"
30fda9279dSmrg#include "shader/exacmnvc0.fp"
31fda9279dSmrg#include "shader/exacanvc0.fp"
32fda9279dSmrg#include "shader/exasanvc0.fp"
33fda9279dSmrg#include "shader/exas8nvc0.fp"
34fda9279dSmrg#include "shader/exac8nvc0.fp"
35fda9279dSmrg
36fda9279dSmrg#include "shader/xfrm2nve0.vp"
37fda9279dSmrg#include "shader/videonve0.fp"
38fda9279dSmrg
39fda9279dSmrg#include "shader/exascnve0.fp"
40fda9279dSmrg#include "shader/exacmnve0.fp"
41fda9279dSmrg#include "shader/exacanve0.fp"
42fda9279dSmrg#include "shader/exasanve0.fp"
43fda9279dSmrg#include "shader/exas8nve0.fp"
44fda9279dSmrg#include "shader/exac8nve0.fp"
45fda9279dSmrg
46fda9279dSmrg#include "shader/xfrm2nvf0.vp"
47fda9279dSmrg#include "shader/videonvf0.fp"
48fda9279dSmrg
49fda9279dSmrg#include "shader/exascnvf0.fp"
50fda9279dSmrg#include "shader/exacmnvf0.fp"
51fda9279dSmrg#include "shader/exacanvf0.fp"
52fda9279dSmrg#include "shader/exasanvf0.fp"
53fda9279dSmrg#include "shader/exas8nvf0.fp"
54fda9279dSmrg#include "shader/exac8nvf0.fp"
55fda9279dSmrg
56fda9279dSmrg#define NVC0PushProgram(pNv,addr,code) do {                                    \
57fda9279dSmrg	const unsigned size = sizeof(code) / sizeof(code[0]);                  \
58fda9279dSmrg	PUSH_DATAu((pNv)->pushbuf, (pNv)->scratch, (addr), size);              \
59fda9279dSmrg	PUSH_DATAp((pNv)->pushbuf, (code), size);                              \
60fda9279dSmrg} while(0)
61fda9279dSmrg
62fda9279dSmrgvoid
63fda9279dSmrgNVC0SyncToVBlank(PixmapPtr ppix, BoxPtr box)
64fda9279dSmrg{
65fda9279dSmrg	ScrnInfoPtr pScrn = xf86ScreenToScrn(ppix->drawable.pScreen);
66fda9279dSmrg	NVPtr pNv = NVPTR(pScrn);
67fda9279dSmrg	struct nouveau_pushbuf *push = pNv->pushbuf;
68fda9279dSmrg	int head;
69fda9279dSmrg	xf86CrtcPtr crtc;
70fda9279dSmrg
71fda9279dSmrg	if (!pNv->NvSW || !nouveau_exa_pixmap_is_onscreen(ppix))
72fda9279dSmrg		return;
73fda9279dSmrg
74fda9279dSmrg	crtc = nouveau_pick_best_crtc(pScrn, FALSE, box->x1, box->y1,
75fda9279dSmrg                                  box->x2 - box->x1,
76fda9279dSmrg                                  box->y2 - box->y1);
77fda9279dSmrg	if (!crtc)
78fda9279dSmrg		return;
79fda9279dSmrg
80fda9279dSmrg	if (!PUSH_SPACE(push, 32))
81fda9279dSmrg		return;
82fda9279dSmrg
83fda9279dSmrg	head = drmmode_head(crtc);
84fda9279dSmrg
85fda9279dSmrg	BEGIN_NVC0(push, NV01_SUBC(NVSW, OBJECT), 1);
86fda9279dSmrg	PUSH_DATA (push, pNv->NvSW->handle);
87fda9279dSmrg	BEGIN_NVC0(push, NV84_SUBC(NVSW, SEMAPHORE_ADDRESS_HIGH), 4);
88fda9279dSmrg	PUSH_DATA (push, (pNv->scratch->offset + SEMA_OFFSET) >> 32);
89fda9279dSmrg	PUSH_DATA (push, (pNv->scratch->offset + SEMA_OFFSET));
90fda9279dSmrg	PUSH_DATA (push, 0x22222222);
91fda9279dSmrg	PUSH_DATA (push, NV84_SUBCHAN_SEMAPHORE_TRIGGER_WRITE_LONG);
92fda9279dSmrg	BEGIN_NVC0(push, SUBC_NVSW(0x0400), 4);
93fda9279dSmrg	PUSH_DATA (push, (pNv->scratch->offset + SEMA_OFFSET) >> 32);
94fda9279dSmrg	PUSH_DATA (push, (pNv->scratch->offset + SEMA_OFFSET));
95fda9279dSmrg	PUSH_DATA (push, 0x11111111);
96fda9279dSmrg	PUSH_DATA (push, head);
97fda9279dSmrg	BEGIN_NVC0(push, NV84_SUBC(NVSW, SEMAPHORE_ADDRESS_HIGH), 4);
98fda9279dSmrg	PUSH_DATA (push, (pNv->scratch->offset + SEMA_OFFSET) >> 32);
99fda9279dSmrg	PUSH_DATA (push, (pNv->scratch->offset + SEMA_OFFSET));
100fda9279dSmrg	PUSH_DATA (push, 0x11111111);
101fda9279dSmrg	PUSH_DATA (push, NV84_SUBCHAN_SEMAPHORE_TRIGGER_ACQUIRE_EQUAL);
102fda9279dSmrg}
103fda9279dSmrg
104fda9279dSmrgBool
105fda9279dSmrgNVAccelInitM2MF_NVC0(ScrnInfoPtr pScrn)
106fda9279dSmrg{
107fda9279dSmrg	NVPtr pNv = NVPTR(pScrn);
108fda9279dSmrg	struct nouveau_pushbuf *push = pNv->pushbuf;
109fda9279dSmrg	int ret;
110fda9279dSmrg
111fda9279dSmrg	ret = nouveau_object_new(pNv->channel, 0x00009039, 0x9039,
112fda9279dSmrg				 NULL, 0, &pNv->NvMemFormat);
113fda9279dSmrg	if (ret)
114fda9279dSmrg		return FALSE;
115fda9279dSmrg
116fda9279dSmrg	BEGIN_NVC0(push, NV01_SUBC(M2MF, OBJECT), 1);
117fda9279dSmrg	PUSH_DATA (push, pNv->NvMemFormat->handle);
118fda9279dSmrg	BEGIN_NVC0(push, NVC0_M2MF(QUERY_ADDRESS_HIGH), 3);
119fda9279dSmrg	PUSH_DATA (push, (pNv->scratch->offset + NTFY_OFFSET) >> 32);
120fda9279dSmrg	PUSH_DATA (push, (pNv->scratch->offset + NTFY_OFFSET));
121fda9279dSmrg	PUSH_DATA (push, 0);
122fda9279dSmrg
123fda9279dSmrg	return TRUE;
124fda9279dSmrg}
125fda9279dSmrg
126fda9279dSmrgBool
127fda9279dSmrgNVAccelInitP2MF_NVE0(ScrnInfoPtr pScrn)
128fda9279dSmrg{
129fda9279dSmrg	NVPtr pNv = NVPTR(pScrn);
130fda9279dSmrg	struct nouveau_pushbuf *push = pNv->pushbuf;
131fda9279dSmrg	uint32_t class = (pNv->dev->chipset < 0xf0) ? 0xa040 : 0xa140;
132fda9279dSmrg	int ret;
133fda9279dSmrg
134fda9279dSmrg	ret = nouveau_object_new(pNv->channel, class, class, NULL, 0,
135fda9279dSmrg				&pNv->NvMemFormat);
136fda9279dSmrg	if (ret)
137fda9279dSmrg		return FALSE;
138fda9279dSmrg
139fda9279dSmrg	BEGIN_NVC0(push, NV01_SUBC(P2MF, OBJECT), 1);
140fda9279dSmrg	PUSH_DATA (push, pNv->NvMemFormat->handle);
141fda9279dSmrg	return TRUE;
142fda9279dSmrg}
143fda9279dSmrg
144fda9279dSmrgBool
145fda9279dSmrgNVAccelInitCOPY_NVE0(ScrnInfoPtr pScrn)
146fda9279dSmrg{
147fda9279dSmrg	NVPtr pNv = NVPTR(pScrn);
148fda9279dSmrg	struct nouveau_pushbuf *push = pNv->pushbuf;
149fda9279dSmrg	int ret;
150fda9279dSmrg
151fda9279dSmrg	ret = nouveau_object_new(pNv->channel, 0x0000a0b5, 0xa0b5,
152fda9279dSmrg				 NULL, 0, &pNv->NvCOPY);
153fda9279dSmrg	if (ret)
154fda9279dSmrg		return FALSE;
155fda9279dSmrg
156fda9279dSmrg	BEGIN_NVC0(push, NV01_SUBC(COPY, OBJECT), 1);
157fda9279dSmrg	PUSH_DATA (push, pNv->NvCOPY->handle);
158fda9279dSmrg	return TRUE;
159fda9279dSmrg}
160fda9279dSmrg
161fda9279dSmrgBool
162fda9279dSmrgNVAccelInit2D_NVC0(ScrnInfoPtr pScrn)
163fda9279dSmrg{
164fda9279dSmrg	NVPtr pNv = NVPTR(pScrn);
165fda9279dSmrg	struct nouveau_pushbuf *push = pNv->pushbuf;
166fda9279dSmrg	int ret;
167fda9279dSmrg
168fda9279dSmrg	ret = nouveau_object_new(pNv->channel, 0x0000902d, 0x902d,
169fda9279dSmrg				 NULL, 0, &pNv->Nv2D);
170fda9279dSmrg	if (ret)
171fda9279dSmrg		return FALSE;
172fda9279dSmrg
173fda9279dSmrg	if (!PUSH_SPACE(push, 64))
174fda9279dSmrg		return FALSE;
175fda9279dSmrg
176fda9279dSmrg	BEGIN_NVC0(push, NV01_SUBC(2D, OBJECT), 1);
177fda9279dSmrg	PUSH_DATA (push, pNv->Nv2D->handle);
178fda9279dSmrg
179fda9279dSmrg	BEGIN_NVC0(push, NV50_2D(CLIP_ENABLE), 1);
180fda9279dSmrg	PUSH_DATA (push, 1);
181fda9279dSmrg	BEGIN_NVC0(push, NV50_2D(COLOR_KEY_ENABLE), 1);
182fda9279dSmrg	PUSH_DATA (push, 0);
183fda9279dSmrg	BEGIN_NVC0(push, SUBC_2D(0x0884), 1);
184fda9279dSmrg	PUSH_DATA (push, 0x3f);
185fda9279dSmrg	BEGIN_NVC0(push, SUBC_2D(0x0888), 1);
186fda9279dSmrg	PUSH_DATA (push, 1);
187fda9279dSmrg	BEGIN_NVC0(push, NV50_2D(ROP), 1);
188fda9279dSmrg	PUSH_DATA (push, 0x55);
189fda9279dSmrg	BEGIN_NVC0(push, NV50_2D(OPERATION), 1);
190fda9279dSmrg	PUSH_DATA (push, NV50_2D_OPERATION_SRCCOPY);
191fda9279dSmrg
192fda9279dSmrg	BEGIN_NVC0(push, NV50_2D(BLIT_DU_DX_FRACT), 4);
193fda9279dSmrg	PUSH_DATA (push, 0);
194fda9279dSmrg	PUSH_DATA (push, 1);
195fda9279dSmrg	PUSH_DATA (push, 0);
196fda9279dSmrg	PUSH_DATA (push, 1);
197fda9279dSmrg	BEGIN_NVC0(push, NV50_2D(DRAW_SHAPE), 2);
198fda9279dSmrg	PUSH_DATA (push, 4);
199fda9279dSmrg	PUSH_DATA (push, NV50_SURFACE_FORMAT_B5G6R5_UNORM);
200fda9279dSmrg	BEGIN_NVC0(push, NV50_2D(PATTERN_COLOR_FORMAT), 2);
201fda9279dSmrg	PUSH_DATA (push, 2);
202fda9279dSmrg	PUSH_DATA (push, 1);
203fda9279dSmrg
204fda9279dSmrg	pNv->currentRop = 0xfffffffa;
205fda9279dSmrg	return TRUE;
206fda9279dSmrg}
207fda9279dSmrg
208fda9279dSmrgBool
209fda9279dSmrgNVAccelInit3D_NVC0(ScrnInfoPtr pScrn)
210fda9279dSmrg{
211fda9279dSmrg	NVPtr pNv = NVPTR(pScrn);
212fda9279dSmrg	struct nouveau_pushbuf *push = pNv->pushbuf;
213fda9279dSmrg	struct nouveau_bo *bo = pNv->scratch;
214fda9279dSmrg	uint32_t class, handle;
215fda9279dSmrg	int ret;
216fda9279dSmrg
217fda9279dSmrg	if (pNv->Architecture < NV_KEPLER) {
218fda9279dSmrg		class  = 0x9097;
219fda9279dSmrg		handle = 0x001f906e;
220fda9279dSmrg	} else
221fda9279dSmrg	if (pNv->dev->chipset < 0xf0) {
222fda9279dSmrg		class  = 0xa097;
223fda9279dSmrg		handle = 0x0000906e;
224fda9279dSmrg	} else {
225fda9279dSmrg		class  = 0xa197;
226fda9279dSmrg		handle = 0x0000906e;
227fda9279dSmrg	}
228fda9279dSmrg
229fda9279dSmrg	ret = nouveau_object_new(pNv->channel, class, class,
230fda9279dSmrg				 NULL, 0, &pNv->Nv3D);
231fda9279dSmrg	if (ret)
232fda9279dSmrg		return FALSE;
233fda9279dSmrg
234fda9279dSmrg	ret = nouveau_object_new(pNv->channel, handle, 0x906e,
235fda9279dSmrg				 NULL, 0, &pNv->NvSW);
236fda9279dSmrg	if (ret) {
237fda9279dSmrg		xf86DrvMsg(pScrn->scrnIndex, X_INFO,
238fda9279dSmrg			   "DRM doesn't support sync-to-vblank\n");
239fda9279dSmrg	}
240fda9279dSmrg
241fda9279dSmrg	if (nouveau_pushbuf_space(push, 512, 0, 0) ||
242fda9279dSmrg	    nouveau_pushbuf_refn (push, &(struct nouveau_pushbuf_refn) {
243fda9279dSmrg					pNv->scratch, NOUVEAU_BO_VRAM |
244fda9279dSmrg					NOUVEAU_BO_WR }, 1))
245fda9279dSmrg		return FALSE;
246fda9279dSmrg
247fda9279dSmrg	BEGIN_NVC0(push, NV01_SUBC(3D, OBJECT), 1);
248fda9279dSmrg	PUSH_DATA (push, pNv->Nv3D->handle);
249fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(COND_MODE), 1);
250fda9279dSmrg	PUSH_DATA (push, NVC0_3D_COND_MODE_ALWAYS);
251fda9279dSmrg	BEGIN_NVC0(push, SUBC_3D(NVC0_GRAPH_NOTIFY_ADDRESS_HIGH), 3);
252fda9279dSmrg	PUSH_DATA (push, (pNv->scratch->offset + NTFY_OFFSET) >> 32);
253fda9279dSmrg	PUSH_DATA (push, (pNv->scratch->offset + NTFY_OFFSET));
254fda9279dSmrg	PUSH_DATA (push, 0);
255fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(CSAA_ENABLE), 1);
256fda9279dSmrg	PUSH_DATA (push, 0);
257fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(ZETA_ENABLE), 1);
258fda9279dSmrg	PUSH_DATA (push, 0);
259fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(RT_SEPARATE_FRAG_DATA), 1);
260fda9279dSmrg	PUSH_DATA (push, 0);
261fda9279dSmrg
262fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(VIEWPORT_HORIZ(0)), 2);
263fda9279dSmrg	PUSH_DATA (push, (8192 << 16) | 0);
264fda9279dSmrg	PUSH_DATA (push, (8192 << 16) | 0);
265fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(SCREEN_SCISSOR_HORIZ), 2);
266fda9279dSmrg	PUSH_DATA (push, (8192 << 16) | 0);
267fda9279dSmrg	PUSH_DATA (push, (8192 << 16) | 0);
268fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(SCISSOR_ENABLE(0)), 1);
269fda9279dSmrg	PUSH_DATA (push, 1);
270fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(VIEWPORT_TRANSFORM_EN), 1);
271fda9279dSmrg	PUSH_DATA (push, 0);
272fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(VIEW_VOLUME_CLIP_CTRL), 1);
273fda9279dSmrg	PUSH_DATA (push, 0);
274fda9279dSmrg
275fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(TIC_ADDRESS_HIGH), 3);
276fda9279dSmrg	PUSH_DATA (push, (bo->offset + TIC_OFFSET) >> 32);
277fda9279dSmrg	PUSH_DATA (push, (bo->offset + TIC_OFFSET));
278fda9279dSmrg	PUSH_DATA (push, 15);
279fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(TSC_ADDRESS_HIGH), 3);
280fda9279dSmrg	PUSH_DATA (push, (bo->offset + TSC_OFFSET) >> 32);
281fda9279dSmrg	PUSH_DATA (push, (bo->offset + TSC_OFFSET));
282fda9279dSmrg	PUSH_DATA (push, 0);
283fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(LINKED_TSC), 1);
284fda9279dSmrg	PUSH_DATA (push, 1);
285fda9279dSmrg	if (pNv->Architecture < NV_KEPLER) {
286fda9279dSmrg		BEGIN_NVC0(push, NVC0_3D(TEX_LIMITS(4)), 1);
287fda9279dSmrg		PUSH_DATA (push, 0x54);
288fda9279dSmrg		BEGIN_NIC0(push, NVC0_3D(BIND_TIC(4)), 2);
289fda9279dSmrg		PUSH_DATA (push, (0 << 9) | (0 << 1) | NVC0_3D_BIND_TIC_ACTIVE);
290fda9279dSmrg		PUSH_DATA (push, (1 << 9) | (1 << 1) | NVC0_3D_BIND_TIC_ACTIVE);
291fda9279dSmrg	} else {
292fda9279dSmrg		BEGIN_NVC0(push, NVC0_3D(CB_SIZE), 6);
293fda9279dSmrg		PUSH_DATA (push, 256);
294fda9279dSmrg		PUSH_DATA (push, (bo->offset + TB_OFFSET) >> 32);
295fda9279dSmrg		PUSH_DATA (push, (bo->offset + TB_OFFSET));
296fda9279dSmrg		PUSH_DATA (push, 0);
297fda9279dSmrg		PUSH_DATA (push, 0x00000000);
298fda9279dSmrg		PUSH_DATA (push, 0x00000001);
299fda9279dSmrg		BEGIN_NVC0(push, NVC0_3D(CB_BIND(4)), 1);
300fda9279dSmrg		PUSH_DATA (push, 0x11);
301fda9279dSmrg		BEGIN_NVC0(push, SUBC_3D(0x2608), 1);
302fda9279dSmrg		PUSH_DATA (push, 1);
303fda9279dSmrg	}
304fda9279dSmrg
305fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(VERTEX_QUARANTINE_ADDRESS_HIGH), 3);
306fda9279dSmrg	PUSH_DATA (push, (bo->offset + MISC_OFFSET) >> 32);
307fda9279dSmrg	PUSH_DATA (push, (bo->offset + MISC_OFFSET));
308fda9279dSmrg	PUSH_DATA (push, 1);
309fda9279dSmrg
310fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(CODE_ADDRESS_HIGH), 2);
311fda9279dSmrg	PUSH_DATA (push, (bo->offset + CODE_OFFSET) >> 32);
312fda9279dSmrg	PUSH_DATA (push, (bo->offset + CODE_OFFSET));
313fda9279dSmrg	if (pNv->Architecture < NV_KEPLER) {
314fda9279dSmrg		NVC0PushProgram(pNv, PVP_PASS, NVC0VP_Transform2);
315fda9279dSmrg		NVC0PushProgram(pNv, PFP_S, NVC0FP_Source);
316fda9279dSmrg		NVC0PushProgram(pNv, PFP_C, NVC0FP_Composite);
317fda9279dSmrg		NVC0PushProgram(pNv, PFP_CCA, NVC0FP_CAComposite);
318fda9279dSmrg		NVC0PushProgram(pNv, PFP_CCASA, NVC0FP_CACompositeSrcAlpha);
319fda9279dSmrg		NVC0PushProgram(pNv, PFP_S_A8, NVC0FP_Source_A8);
320fda9279dSmrg		NVC0PushProgram(pNv, PFP_C_A8, NVC0FP_Composite_A8);
321fda9279dSmrg		NVC0PushProgram(pNv, PFP_NV12, NVC0FP_NV12);
322fda9279dSmrg
323fda9279dSmrg		BEGIN_NVC0(push, NVC0_3D(MEM_BARRIER), 1);
324fda9279dSmrg		PUSH_DATA (push, 0x1111);
325fda9279dSmrg	} else
326fda9279dSmrg	if (pNv->dev->chipset < 0xf0) {
327fda9279dSmrg		NVC0PushProgram(pNv, PVP_PASS, NVE0VP_Transform2);
328fda9279dSmrg		NVC0PushProgram(pNv, PFP_S, NVE0FP_Source);
329fda9279dSmrg		NVC0PushProgram(pNv, PFP_C, NVE0FP_Composite);
330fda9279dSmrg		NVC0PushProgram(pNv, PFP_CCA, NVE0FP_CAComposite);
331fda9279dSmrg		NVC0PushProgram(pNv, PFP_CCASA, NVE0FP_CACompositeSrcAlpha);
332fda9279dSmrg		NVC0PushProgram(pNv, PFP_S_A8, NVE0FP_Source_A8);
333fda9279dSmrg		NVC0PushProgram(pNv, PFP_C_A8, NVE0FP_Composite_A8);
334fda9279dSmrg		NVC0PushProgram(pNv, PFP_NV12, NVE0FP_NV12);
335fda9279dSmrg	} else {
336fda9279dSmrg		NVC0PushProgram(pNv, PVP_PASS, NVF0VP_Transform2);
337fda9279dSmrg		NVC0PushProgram(pNv, PFP_S, NVF0FP_Source);
338fda9279dSmrg		NVC0PushProgram(pNv, PFP_C, NVF0FP_Composite);
339fda9279dSmrg		NVC0PushProgram(pNv, PFP_CCA, NVF0FP_CAComposite);
340fda9279dSmrg		NVC0PushProgram(pNv, PFP_CCASA, NVF0FP_CACompositeSrcAlpha);
341fda9279dSmrg		NVC0PushProgram(pNv, PFP_S_A8, NVF0FP_Source_A8);
342fda9279dSmrg		NVC0PushProgram(pNv, PFP_C_A8, NVF0FP_Composite_A8);
343fda9279dSmrg		NVC0PushProgram(pNv, PFP_NV12, NVF0FP_NV12);
344fda9279dSmrg	}
345fda9279dSmrg
346fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(SP_SELECT(1)), 4);
347fda9279dSmrg	PUSH_DATA (push, NVC0_3D_SP_SELECT_PROGRAM_VP_B |
348fda9279dSmrg			 NVC0_3D_SP_SELECT_ENABLE);
349fda9279dSmrg	PUSH_DATA (push, PVP_PASS);
350fda9279dSmrg	PUSH_DATA (push, 0x00000000);
351fda9279dSmrg	PUSH_DATA (push, 8);
352fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(VERT_COLOR_CLAMP_EN), 1);
353fda9279dSmrg	PUSH_DATA (push, 1);
354fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(CB_SIZE), 3);
355fda9279dSmrg	PUSH_DATA (push, 256);
356fda9279dSmrg	PUSH_DATA (push, (bo->offset + PVP_DATA) >> 32);
357fda9279dSmrg	PUSH_DATA (push, (bo->offset + PVP_DATA));
358fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(CB_BIND(0)), 1);
359fda9279dSmrg	PUSH_DATA (push, 0x01);
360fda9279dSmrg
361fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(SP_SELECT(5)), 4);
362fda9279dSmrg	PUSH_DATA (push, NVC0_3D_SP_SELECT_PROGRAM_FP |
363fda9279dSmrg			 NVC0_3D_SP_SELECT_ENABLE);
364fda9279dSmrg	PUSH_DATA (push, PFP_S);
365fda9279dSmrg	PUSH_DATA (push, 0x00000000);
366fda9279dSmrg	PUSH_DATA (push, 8);
367fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(FRAG_COLOR_CLAMP_EN), 1);
368fda9279dSmrg	PUSH_DATA (push, 0x11111111);
369fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(CB_SIZE), 3);
370fda9279dSmrg	PUSH_DATA (push, 256);
371fda9279dSmrg	PUSH_DATA (push, (bo->offset + PFP_DATA) >> 32);
372fda9279dSmrg	PUSH_DATA (push, (bo->offset + PFP_DATA));
373fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(CB_BIND(4)), 1);
374fda9279dSmrg	PUSH_DATA (push, 0x01);
375fda9279dSmrg
376fda9279dSmrg	return TRUE;
377fda9279dSmrg}
378fda9279dSmrg
379