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