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