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