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
56cd34e0e1Smrg#include "shader/xfrm2nv110.vp"
57cd34e0e1Smrg#include "shader/videonv110.fp"
58cd34e0e1Smrg
59cd34e0e1Smrg#include "shader/exascnv110.fp"
60cd34e0e1Smrg#include "shader/exacmnv110.fp"
61cd34e0e1Smrg#include "shader/exacanv110.fp"
62cd34e0e1Smrg#include "shader/exasanv110.fp"
63cd34e0e1Smrg#include "shader/exas8nv110.fp"
64cd34e0e1Smrg#include "shader/exac8nv110.fp"
65cd34e0e1Smrg
66fda9279dSmrg#define NVC0PushProgram(pNv,addr,code) do {                                    \
67fda9279dSmrg	const unsigned size = sizeof(code) / sizeof(code[0]);                  \
68fda9279dSmrg	PUSH_DATAu((pNv)->pushbuf, (pNv)->scratch, (addr), size);              \
69fda9279dSmrg	PUSH_DATAp((pNv)->pushbuf, (code), size);                              \
70fda9279dSmrg} while(0)
71fda9279dSmrg
72fda9279dSmrgvoid
73fda9279dSmrgNVC0SyncToVBlank(PixmapPtr ppix, BoxPtr box)
74fda9279dSmrg{
75fda9279dSmrg	ScrnInfoPtr pScrn = xf86ScreenToScrn(ppix->drawable.pScreen);
76fda9279dSmrg	NVPtr pNv = NVPTR(pScrn);
77fda9279dSmrg	struct nouveau_pushbuf *push = pNv->pushbuf;
78fda9279dSmrg	int head;
79fda9279dSmrg	xf86CrtcPtr crtc;
80fda9279dSmrg
81fda9279dSmrg	if (!pNv->NvSW || !nouveau_exa_pixmap_is_onscreen(ppix))
82fda9279dSmrg		return;
83fda9279dSmrg
8433adc6acSmrg	crtc = nouveau_pick_best_crtc(pScrn, box->x1, box->y1,
8533adc6acSmrg				      box->x2 - box->x1,
8633adc6acSmrg				      box->y2 - box->y1);
87fda9279dSmrg	if (!crtc)
88fda9279dSmrg		return;
89fda9279dSmrg
90fda9279dSmrg	if (!PUSH_SPACE(push, 32))
91fda9279dSmrg		return;
92fda9279dSmrg
93fda9279dSmrg	head = drmmode_head(crtc);
94fda9279dSmrg
95fda9279dSmrg	BEGIN_NVC0(push, NV01_SUBC(NVSW, OBJECT), 1);
96fda9279dSmrg	PUSH_DATA (push, pNv->NvSW->handle);
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, 0x22222222);
101fda9279dSmrg	PUSH_DATA (push, NV84_SUBCHAN_SEMAPHORE_TRIGGER_WRITE_LONG);
102fda9279dSmrg	BEGIN_NVC0(push, SUBC_NVSW(0x0400), 4);
103fda9279dSmrg	PUSH_DATA (push, (pNv->scratch->offset + SEMA_OFFSET) >> 32);
104fda9279dSmrg	PUSH_DATA (push, (pNv->scratch->offset + SEMA_OFFSET));
105fda9279dSmrg	PUSH_DATA (push, 0x11111111);
106fda9279dSmrg	PUSH_DATA (push, head);
107fda9279dSmrg	BEGIN_NVC0(push, NV84_SUBC(NVSW, SEMAPHORE_ADDRESS_HIGH), 4);
108fda9279dSmrg	PUSH_DATA (push, (pNv->scratch->offset + SEMA_OFFSET) >> 32);
109fda9279dSmrg	PUSH_DATA (push, (pNv->scratch->offset + SEMA_OFFSET));
110fda9279dSmrg	PUSH_DATA (push, 0x11111111);
111fda9279dSmrg	PUSH_DATA (push, NV84_SUBCHAN_SEMAPHORE_TRIGGER_ACQUIRE_EQUAL);
112fda9279dSmrg}
113fda9279dSmrg
114fda9279dSmrgBool
115fda9279dSmrgNVAccelInitM2MF_NVC0(ScrnInfoPtr pScrn)
116fda9279dSmrg{
117fda9279dSmrg	NVPtr pNv = NVPTR(pScrn);
118fda9279dSmrg	struct nouveau_pushbuf *push = pNv->pushbuf;
119fda9279dSmrg	int ret;
120fda9279dSmrg
121fda9279dSmrg	ret = nouveau_object_new(pNv->channel, 0x00009039, 0x9039,
122fda9279dSmrg				 NULL, 0, &pNv->NvMemFormat);
123fda9279dSmrg	if (ret)
124fda9279dSmrg		return FALSE;
125fda9279dSmrg
126fda9279dSmrg	BEGIN_NVC0(push, NV01_SUBC(M2MF, OBJECT), 1);
127fda9279dSmrg	PUSH_DATA (push, pNv->NvMemFormat->handle);
128fda9279dSmrg	BEGIN_NVC0(push, NVC0_M2MF(QUERY_ADDRESS_HIGH), 3);
129fda9279dSmrg	PUSH_DATA (push, (pNv->scratch->offset + NTFY_OFFSET) >> 32);
130fda9279dSmrg	PUSH_DATA (push, (pNv->scratch->offset + NTFY_OFFSET));
131fda9279dSmrg	PUSH_DATA (push, 0);
132fda9279dSmrg
133fda9279dSmrg	return TRUE;
134fda9279dSmrg}
135fda9279dSmrg
136fda9279dSmrgBool
137fda9279dSmrgNVAccelInitP2MF_NVE0(ScrnInfoPtr pScrn)
138fda9279dSmrg{
139fda9279dSmrg	NVPtr pNv = NVPTR(pScrn);
140fda9279dSmrg	struct nouveau_pushbuf *push = pNv->pushbuf;
141fda9279dSmrg	uint32_t class = (pNv->dev->chipset < 0xf0) ? 0xa040 : 0xa140;
142fda9279dSmrg	int ret;
143fda9279dSmrg
144fda9279dSmrg	ret = nouveau_object_new(pNv->channel, class, class, NULL, 0,
145fda9279dSmrg				&pNv->NvMemFormat);
146fda9279dSmrg	if (ret)
147fda9279dSmrg		return FALSE;
148fda9279dSmrg
149fda9279dSmrg	BEGIN_NVC0(push, NV01_SUBC(P2MF, OBJECT), 1);
150fda9279dSmrg	PUSH_DATA (push, pNv->NvMemFormat->handle);
151fda9279dSmrg	return TRUE;
152fda9279dSmrg}
153fda9279dSmrg
154fda9279dSmrgBool
155fda9279dSmrgNVAccelInitCOPY_NVE0(ScrnInfoPtr pScrn)
156fda9279dSmrg{
157fda9279dSmrg	NVPtr pNv = NVPTR(pScrn);
158fda9279dSmrg	struct nouveau_pushbuf *push = pNv->pushbuf;
159cd34e0e1Smrg	uint32_t class;
160fda9279dSmrg	int ret;
161fda9279dSmrg
162cd34e0e1Smrg	if (pNv->dev->chipset < 0x110)
163cd34e0e1Smrg		class = 0xa0b5;
164cd34e0e1Smrg	else if (pNv->dev->chipset < 0x130)
165cd34e0e1Smrg		class = 0xb0b5;
166cd34e0e1Smrg	else
167cd34e0e1Smrg		class = 0xc0b5;
168cd34e0e1Smrg
169cd34e0e1Smrg	ret = nouveau_object_new(pNv->channel, class, class,
170fda9279dSmrg				 NULL, 0, &pNv->NvCOPY);
171fda9279dSmrg	if (ret)
172fda9279dSmrg		return FALSE;
173fda9279dSmrg
174fda9279dSmrg	BEGIN_NVC0(push, NV01_SUBC(COPY, OBJECT), 1);
175fda9279dSmrg	PUSH_DATA (push, pNv->NvCOPY->handle);
176fda9279dSmrg	return TRUE;
177fda9279dSmrg}
178fda9279dSmrg
179fda9279dSmrgBool
180fda9279dSmrgNVAccelInit2D_NVC0(ScrnInfoPtr pScrn)
181fda9279dSmrg{
182fda9279dSmrg	NVPtr pNv = NVPTR(pScrn);
183fda9279dSmrg	struct nouveau_pushbuf *push = pNv->pushbuf;
184fda9279dSmrg	int ret;
185fda9279dSmrg
186fda9279dSmrg	ret = nouveau_object_new(pNv->channel, 0x0000902d, 0x902d,
187fda9279dSmrg				 NULL, 0, &pNv->Nv2D);
188fda9279dSmrg	if (ret)
189fda9279dSmrg		return FALSE;
190fda9279dSmrg
191fda9279dSmrg	if (!PUSH_SPACE(push, 64))
192fda9279dSmrg		return FALSE;
193fda9279dSmrg
194fda9279dSmrg	BEGIN_NVC0(push, NV01_SUBC(2D, OBJECT), 1);
195fda9279dSmrg	PUSH_DATA (push, pNv->Nv2D->handle);
196fda9279dSmrg
197fda9279dSmrg	BEGIN_NVC0(push, NV50_2D(CLIP_ENABLE), 1);
198fda9279dSmrg	PUSH_DATA (push, 1);
199fda9279dSmrg	BEGIN_NVC0(push, NV50_2D(COLOR_KEY_ENABLE), 1);
200fda9279dSmrg	PUSH_DATA (push, 0);
20116ee1e9aSmrg	BEGIN_NVC0(push, NV50_2D(UNK0884), 1);
202fda9279dSmrg	PUSH_DATA (push, 0x3f);
20316ee1e9aSmrg	BEGIN_NVC0(push, NV50_2D(UNK0888), 1);
204fda9279dSmrg	PUSH_DATA (push, 1);
205fda9279dSmrg	BEGIN_NVC0(push, NV50_2D(ROP), 1);
206fda9279dSmrg	PUSH_DATA (push, 0x55);
207fda9279dSmrg	BEGIN_NVC0(push, NV50_2D(OPERATION), 1);
208fda9279dSmrg	PUSH_DATA (push, NV50_2D_OPERATION_SRCCOPY);
209fda9279dSmrg
210fda9279dSmrg	BEGIN_NVC0(push, NV50_2D(BLIT_DU_DX_FRACT), 4);
211fda9279dSmrg	PUSH_DATA (push, 0);
212fda9279dSmrg	PUSH_DATA (push, 1);
213fda9279dSmrg	PUSH_DATA (push, 0);
214fda9279dSmrg	PUSH_DATA (push, 1);
215fda9279dSmrg	BEGIN_NVC0(push, NV50_2D(DRAW_SHAPE), 2);
216fda9279dSmrg	PUSH_DATA (push, 4);
217fda9279dSmrg	PUSH_DATA (push, NV50_SURFACE_FORMAT_B5G6R5_UNORM);
218fda9279dSmrg	BEGIN_NVC0(push, NV50_2D(PATTERN_COLOR_FORMAT), 2);
219fda9279dSmrg	PUSH_DATA (push, 2);
220fda9279dSmrg	PUSH_DATA (push, 1);
221fda9279dSmrg
222fda9279dSmrg	pNv->currentRop = 0xfffffffa;
223fda9279dSmrg	return TRUE;
224fda9279dSmrg}
225fda9279dSmrg
226fda9279dSmrgBool
227fda9279dSmrgNVAccelInit3D_NVC0(ScrnInfoPtr pScrn)
228fda9279dSmrg{
229fda9279dSmrg	NVPtr pNv = NVPTR(pScrn);
230fda9279dSmrg	struct nouveau_pushbuf *push = pNv->pushbuf;
231fda9279dSmrg	struct nouveau_bo *bo = pNv->scratch;
232fda9279dSmrg	uint32_t class, handle;
233fda9279dSmrg	int ret;
234fda9279dSmrg
235fda9279dSmrg	if (pNv->Architecture < NV_KEPLER) {
236fda9279dSmrg		class  = 0x9097;
237fda9279dSmrg		handle = 0x001f906e;
23816ee1e9aSmrg	} else if (pNv->dev->chipset == 0xea) {
23916ee1e9aSmrg		class = 0xa297;
24016ee1e9aSmrg		handle = 0x0000906e;
24116ee1e9aSmrg	} else if (pNv->dev->chipset < 0xf0) {
242fda9279dSmrg		class  = 0xa097;
243fda9279dSmrg		handle = 0x0000906e;
244cd34e0e1Smrg	} else if (pNv->dev->chipset < 0x110) {
245fda9279dSmrg		class  = 0xa197;
246fda9279dSmrg		handle = 0x0000906e;
247cd34e0e1Smrg	} else if (pNv->dev->chipset < 0x120) {
248cd34e0e1Smrg		class  = 0xb097;
249cd34e0e1Smrg		handle = 0x0000906e;
250cd34e0e1Smrg	} else if (pNv->dev->chipset < 0x130) {
251cd34e0e1Smrg		class  = 0xb197;
252cd34e0e1Smrg		handle = 0x0000906e;
253cd34e0e1Smrg	} else if (pNv->dev->chipset == 0x130) {
254cd34e0e1Smrg		class  = 0xc097;
255cd34e0e1Smrg		handle = 0x0000906e;
256cd34e0e1Smrg	} else if (pNv->dev->chipset < 0x140) {
257cd34e0e1Smrg		class  = 0xc197;
258cd34e0e1Smrg		handle = 0x0000906e;
259cd34e0e1Smrg	} else {
260cd34e0e1Smrg		xf86DrvMsg(pScrn->scrnIndex, X_INFO,
261cd34e0e1Smrg			   "No 3D acceleration support for NV%X\n",
262cd34e0e1Smrg			   pNv->dev->chipset);
263cd34e0e1Smrg		return FALSE;
264fda9279dSmrg	}
265fda9279dSmrg
266fda9279dSmrg	ret = nouveau_object_new(pNv->channel, class, class,
267fda9279dSmrg				 NULL, 0, &pNv->Nv3D);
268fda9279dSmrg	if (ret)
269fda9279dSmrg		return FALSE;
270fda9279dSmrg
271fda9279dSmrg	ret = nouveau_object_new(pNv->channel, handle, 0x906e,
272fda9279dSmrg				 NULL, 0, &pNv->NvSW);
273fda9279dSmrg	if (ret) {
274fda9279dSmrg		xf86DrvMsg(pScrn->scrnIndex, X_INFO,
275fda9279dSmrg			   "DRM doesn't support sync-to-vblank\n");
276fda9279dSmrg	}
277fda9279dSmrg
278fda9279dSmrg	if (nouveau_pushbuf_space(push, 512, 0, 0) ||
279fda9279dSmrg	    nouveau_pushbuf_refn (push, &(struct nouveau_pushbuf_refn) {
280fda9279dSmrg					pNv->scratch, NOUVEAU_BO_VRAM |
281fda9279dSmrg					NOUVEAU_BO_WR }, 1))
282fda9279dSmrg		return FALSE;
283fda9279dSmrg
284fda9279dSmrg	BEGIN_NVC0(push, NV01_SUBC(3D, OBJECT), 1);
285fda9279dSmrg	PUSH_DATA (push, pNv->Nv3D->handle);
286fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(COND_MODE), 1);
287fda9279dSmrg	PUSH_DATA (push, NVC0_3D_COND_MODE_ALWAYS);
288fda9279dSmrg	BEGIN_NVC0(push, SUBC_3D(NVC0_GRAPH_NOTIFY_ADDRESS_HIGH), 3);
289fda9279dSmrg	PUSH_DATA (push, (pNv->scratch->offset + NTFY_OFFSET) >> 32);
290fda9279dSmrg	PUSH_DATA (push, (pNv->scratch->offset + NTFY_OFFSET));
291fda9279dSmrg	PUSH_DATA (push, 0);
292fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(CSAA_ENABLE), 1);
293fda9279dSmrg	PUSH_DATA (push, 0);
294fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(ZETA_ENABLE), 1);
295fda9279dSmrg	PUSH_DATA (push, 0);
296fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(RT_SEPARATE_FRAG_DATA), 1);
297fda9279dSmrg	PUSH_DATA (push, 0);
298fda9279dSmrg
299fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(VIEWPORT_HORIZ(0)), 2);
300fda9279dSmrg	PUSH_DATA (push, (8192 << 16) | 0);
301fda9279dSmrg	PUSH_DATA (push, (8192 << 16) | 0);
302fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(SCREEN_SCISSOR_HORIZ), 2);
303fda9279dSmrg	PUSH_DATA (push, (8192 << 16) | 0);
304fda9279dSmrg	PUSH_DATA (push, (8192 << 16) | 0);
305fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(SCISSOR_ENABLE(0)), 1);
306fda9279dSmrg	PUSH_DATA (push, 1);
307fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(VIEWPORT_TRANSFORM_EN), 1);
308fda9279dSmrg	PUSH_DATA (push, 0);
309fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(VIEW_VOLUME_CLIP_CTRL), 1);
310fda9279dSmrg	PUSH_DATA (push, 0);
311fda9279dSmrg
312fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(TIC_ADDRESS_HIGH), 3);
313fda9279dSmrg	PUSH_DATA (push, (bo->offset + TIC_OFFSET) >> 32);
314fda9279dSmrg	PUSH_DATA (push, (bo->offset + TIC_OFFSET));
315fda9279dSmrg	PUSH_DATA (push, 15);
316fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(TSC_ADDRESS_HIGH), 3);
317fda9279dSmrg	PUSH_DATA (push, (bo->offset + TSC_OFFSET) >> 32);
318fda9279dSmrg	PUSH_DATA (push, (bo->offset + TSC_OFFSET));
319fda9279dSmrg	PUSH_DATA (push, 0);
320fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(LINKED_TSC), 1);
321fda9279dSmrg	PUSH_DATA (push, 1);
322fda9279dSmrg	if (pNv->Architecture < NV_KEPLER) {
323fda9279dSmrg		BEGIN_NVC0(push, NVC0_3D(TEX_LIMITS(4)), 1);
324fda9279dSmrg		PUSH_DATA (push, 0x54);
325fda9279dSmrg		BEGIN_NIC0(push, NVC0_3D(BIND_TIC(4)), 2);
326fda9279dSmrg		PUSH_DATA (push, (0 << 9) | (0 << 1) | NVC0_3D_BIND_TIC_ACTIVE);
327fda9279dSmrg		PUSH_DATA (push, (1 << 9) | (1 << 1) | NVC0_3D_BIND_TIC_ACTIVE);
328fda9279dSmrg	} else {
329fda9279dSmrg		BEGIN_NVC0(push, NVC0_3D(CB_SIZE), 6);
330fda9279dSmrg		PUSH_DATA (push, 256);
331fda9279dSmrg		PUSH_DATA (push, (bo->offset + TB_OFFSET) >> 32);
332fda9279dSmrg		PUSH_DATA (push, (bo->offset + TB_OFFSET));
333fda9279dSmrg		PUSH_DATA (push, 0);
334fda9279dSmrg		PUSH_DATA (push, 0x00000000);
335fda9279dSmrg		PUSH_DATA (push, 0x00000001);
336fda9279dSmrg		BEGIN_NVC0(push, NVC0_3D(CB_BIND(4)), 1);
337fda9279dSmrg		PUSH_DATA (push, 0x11);
338cd34e0e1Smrg		BEGIN_NVC0(push, NVE4_3D(TEX_CB_INDEX), 1);
339fda9279dSmrg		PUSH_DATA (push, 1);
340fda9279dSmrg	}
341fda9279dSmrg
342cd34e0e1Smrg	if (pNv->Architecture < NV_MAXWELL) {
343cd34e0e1Smrg		BEGIN_NVC0(push, NVC0_3D(VERTEX_QUARANTINE_ADDRESS_HIGH), 3);
344cd34e0e1Smrg		PUSH_DATA (push, (bo->offset + MISC_OFFSET) >> 32);
345cd34e0e1Smrg		PUSH_DATA (push, (bo->offset + MISC_OFFSET));
346cd34e0e1Smrg		PUSH_DATA (push, 1);
347cd34e0e1Smrg	} else {
348cd34e0e1Smrg		/* Use new TIC format. Not strictly necessary for GM20x+ */
349cd34e0e1Smrg		IMMED_NVC0(push, SUBC_3D(0x0f10), 1);
350cd34e0e1Smrg		if (pNv->dev->chipset >= 0x120) {
351cd34e0e1Smrg			/* Use center sample locations. */
352cd34e0e1Smrg			BEGIN_NVC0(push, SUBC_3D(0x11e0), 4);
353cd34e0e1Smrg			PUSH_DATA (push, 0x88888888);
354cd34e0e1Smrg			PUSH_DATA (push, 0x88888888);
355cd34e0e1Smrg			PUSH_DATA (push, 0x88888888);
356cd34e0e1Smrg			PUSH_DATA (push, 0x88888888);
357cd34e0e1Smrg		}
358cd34e0e1Smrg	}
359fda9279dSmrg
360fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(CODE_ADDRESS_HIGH), 2);
361fda9279dSmrg	PUSH_DATA (push, (bo->offset + CODE_OFFSET) >> 32);
362fda9279dSmrg	PUSH_DATA (push, (bo->offset + CODE_OFFSET));
363fda9279dSmrg	if (pNv->Architecture < NV_KEPLER) {
364fda9279dSmrg		NVC0PushProgram(pNv, PVP_PASS, NVC0VP_Transform2);
365fda9279dSmrg		NVC0PushProgram(pNv, PFP_S, NVC0FP_Source);
366fda9279dSmrg		NVC0PushProgram(pNv, PFP_C, NVC0FP_Composite);
367fda9279dSmrg		NVC0PushProgram(pNv, PFP_CCA, NVC0FP_CAComposite);
368fda9279dSmrg		NVC0PushProgram(pNv, PFP_CCASA, NVC0FP_CACompositeSrcAlpha);
369fda9279dSmrg		NVC0PushProgram(pNv, PFP_S_A8, NVC0FP_Source_A8);
370fda9279dSmrg		NVC0PushProgram(pNv, PFP_C_A8, NVC0FP_Composite_A8);
371fda9279dSmrg		NVC0PushProgram(pNv, PFP_NV12, NVC0FP_NV12);
372fda9279dSmrg
373fda9279dSmrg		BEGIN_NVC0(push, NVC0_3D(MEM_BARRIER), 1);
374fda9279dSmrg		PUSH_DATA (push, 0x1111);
375fda9279dSmrg	} else
37616ee1e9aSmrg	if (pNv->dev->chipset < 0xf0 && pNv->dev->chipset != 0xea) {
377fda9279dSmrg		NVC0PushProgram(pNv, PVP_PASS, NVE0VP_Transform2);
378fda9279dSmrg		NVC0PushProgram(pNv, PFP_S, NVE0FP_Source);
379fda9279dSmrg		NVC0PushProgram(pNv, PFP_C, NVE0FP_Composite);
380fda9279dSmrg		NVC0PushProgram(pNv, PFP_CCA, NVE0FP_CAComposite);
381fda9279dSmrg		NVC0PushProgram(pNv, PFP_CCASA, NVE0FP_CACompositeSrcAlpha);
382fda9279dSmrg		NVC0PushProgram(pNv, PFP_S_A8, NVE0FP_Source_A8);
383fda9279dSmrg		NVC0PushProgram(pNv, PFP_C_A8, NVE0FP_Composite_A8);
384fda9279dSmrg		NVC0PushProgram(pNv, PFP_NV12, NVE0FP_NV12);
385cd34e0e1Smrg	} else
386cd34e0e1Smrg	if (pNv->dev->chipset < 0x110) {
387fda9279dSmrg		NVC0PushProgram(pNv, PVP_PASS, NVF0VP_Transform2);
388fda9279dSmrg		NVC0PushProgram(pNv, PFP_S, NVF0FP_Source);
389fda9279dSmrg		NVC0PushProgram(pNv, PFP_C, NVF0FP_Composite);
390fda9279dSmrg		NVC0PushProgram(pNv, PFP_CCA, NVF0FP_CAComposite);
391fda9279dSmrg		NVC0PushProgram(pNv, PFP_CCASA, NVF0FP_CACompositeSrcAlpha);
392fda9279dSmrg		NVC0PushProgram(pNv, PFP_S_A8, NVF0FP_Source_A8);
393fda9279dSmrg		NVC0PushProgram(pNv, PFP_C_A8, NVF0FP_Composite_A8);
394fda9279dSmrg		NVC0PushProgram(pNv, PFP_NV12, NVF0FP_NV12);
395cd34e0e1Smrg	} else {
396cd34e0e1Smrg		NVC0PushProgram(pNv, PVP_PASS, NV110VP_Transform2);
397cd34e0e1Smrg		NVC0PushProgram(pNv, PFP_S, NV110FP_Source);
398cd34e0e1Smrg		NVC0PushProgram(pNv, PFP_C, NV110FP_Composite);
399cd34e0e1Smrg		NVC0PushProgram(pNv, PFP_CCA, NV110FP_CAComposite);
400cd34e0e1Smrg		NVC0PushProgram(pNv, PFP_CCASA, NV110FP_CACompositeSrcAlpha);
401cd34e0e1Smrg		NVC0PushProgram(pNv, PFP_S_A8, NV110FP_Source_A8);
402cd34e0e1Smrg		NVC0PushProgram(pNv, PFP_C_A8, NV110FP_Composite_A8);
403cd34e0e1Smrg		NVC0PushProgram(pNv, PFP_NV12, NV110FP_NV12);
404fda9279dSmrg	}
405fda9279dSmrg
406fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(SP_SELECT(1)), 4);
407fda9279dSmrg	PUSH_DATA (push, NVC0_3D_SP_SELECT_PROGRAM_VP_B |
408fda9279dSmrg			 NVC0_3D_SP_SELECT_ENABLE);
409fda9279dSmrg	PUSH_DATA (push, PVP_PASS);
410fda9279dSmrg	PUSH_DATA (push, 0x00000000);
411fda9279dSmrg	PUSH_DATA (push, 8);
412fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(VERT_COLOR_CLAMP_EN), 1);
413fda9279dSmrg	PUSH_DATA (push, 1);
414fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(CB_SIZE), 3);
415fda9279dSmrg	PUSH_DATA (push, 256);
416fda9279dSmrg	PUSH_DATA (push, (bo->offset + PVP_DATA) >> 32);
417fda9279dSmrg	PUSH_DATA (push, (bo->offset + PVP_DATA));
418fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(CB_BIND(0)), 1);
419fda9279dSmrg	PUSH_DATA (push, 0x01);
420fda9279dSmrg
421fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(SP_SELECT(5)), 4);
422fda9279dSmrg	PUSH_DATA (push, NVC0_3D_SP_SELECT_PROGRAM_FP |
423fda9279dSmrg			 NVC0_3D_SP_SELECT_ENABLE);
424fda9279dSmrg	PUSH_DATA (push, PFP_S);
425fda9279dSmrg	PUSH_DATA (push, 0x00000000);
426fda9279dSmrg	PUSH_DATA (push, 8);
427fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(FRAG_COLOR_CLAMP_EN), 1);
428fda9279dSmrg	PUSH_DATA (push, 0x11111111);
429fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(CB_SIZE), 3);
430fda9279dSmrg	PUSH_DATA (push, 256);
431fda9279dSmrg	PUSH_DATA (push, (bo->offset + PFP_DATA) >> 32);
432fda9279dSmrg	PUSH_DATA (push, (bo->offset + PFP_DATA));
433fda9279dSmrg	BEGIN_NVC0(push, NVC0_3D(CB_BIND(4)), 1);
434fda9279dSmrg	PUSH_DATA (push, 0x01);
435fda9279dSmrg
436fda9279dSmrg	return TRUE;
437fda9279dSmrg}
438fda9279dSmrg
439