nv40_exa.c revision 16ee1e9a
1fda9279dSmrg/* 2fda9279dSmrg * Copyright 2007 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 25fda9279dSmrg#include "hwdefs/nv_object.xml.h" 26fda9279dSmrg#include "hwdefs/nv30-40_3d.xml.h" 27fda9279dSmrg#include "nv04_accel.h" 28fda9279dSmrg 29fda9279dSmrgtypedef struct nv_pict_surface_format { 30fda9279dSmrg int pict_fmt; 31fda9279dSmrg uint32_t card_fmt; 32fda9279dSmrg} nv_pict_surface_format_t; 33fda9279dSmrg 34fda9279dSmrgtypedef struct nv_pict_texture_format { 35fda9279dSmrg int pict_fmt; 36fda9279dSmrg uint32_t card_fmt; 37fda9279dSmrg uint32_t card_swz; 38fda9279dSmrg} nv_pict_texture_format_t; 39fda9279dSmrg 40fda9279dSmrgtypedef struct nv_pict_op { 41fda9279dSmrg Bool src_alpha; 42fda9279dSmrg Bool dst_alpha; 43fda9279dSmrg uint32_t src_card_op; 44fda9279dSmrg uint32_t dst_card_op; 45fda9279dSmrg} nv_pict_op_t; 46fda9279dSmrg 47fda9279dSmrgstatic nv_pict_surface_format_t 48fda9279dSmrgNV40SurfaceFormat[] = { 49fda9279dSmrg { PICT_a8r8g8b8 , NV30_3D_RT_FORMAT_COLOR_A8R8G8B8 }, 50fda9279dSmrg { PICT_x8r8g8b8 , NV30_3D_RT_FORMAT_COLOR_X8R8G8B8 }, 51fda9279dSmrg { PICT_r5g6b5 , NV30_3D_RT_FORMAT_COLOR_R5G6B5 }, 52fda9279dSmrg { PICT_a8 , NV30_3D_RT_FORMAT_COLOR_B8 }, 53fda9279dSmrg { -1, ~0 } 54fda9279dSmrg}; 55fda9279dSmrg 56fda9279dSmrgstatic nv_pict_surface_format_t * 57fda9279dSmrgNV40_GetPictSurfaceFormat(int format) 58fda9279dSmrg{ 59fda9279dSmrg int i = 0; 60fda9279dSmrg 61fda9279dSmrg while (NV40SurfaceFormat[i].pict_fmt != -1) { 62fda9279dSmrg if (NV40SurfaceFormat[i].pict_fmt == format) 63fda9279dSmrg return &NV40SurfaceFormat[i]; 64fda9279dSmrg i++; 65fda9279dSmrg } 66fda9279dSmrg 67fda9279dSmrg return NULL; 68fda9279dSmrg} 69fda9279dSmrg 70fda9279dSmrg#define _(r,tf,ts0x,ts0y,ts0z,ts0w,ts1x,ts1y,ts1z,ts1w) \ 71fda9279dSmrg { \ 72fda9279dSmrg PICT_##r, NV40_3D_TEX_FORMAT_FORMAT_##tf, \ 73fda9279dSmrg NV30_3D_TEX_SWIZZLE_S0_X_##ts0x | NV30_3D_TEX_SWIZZLE_S0_Y_##ts0y | \ 74fda9279dSmrg NV30_3D_TEX_SWIZZLE_S0_Z_##ts0z | NV30_3D_TEX_SWIZZLE_S0_W_##ts0w | \ 75fda9279dSmrg NV30_3D_TEX_SWIZZLE_S1_X_##ts1x | NV30_3D_TEX_SWIZZLE_S1_Y_##ts1y | \ 76fda9279dSmrg NV30_3D_TEX_SWIZZLE_S1_Z_##ts1z | NV30_3D_TEX_SWIZZLE_S1_W_##ts1w, \ 77fda9279dSmrg } 78fda9279dSmrgstatic nv_pict_texture_format_t 79fda9279dSmrgNV40TextureFormat[] = { 80fda9279dSmrg _(a8r8g8b8, A8R8G8B8, S1, S1, S1, S1, X, Y, Z, W), 81fda9279dSmrg _(x8r8g8b8, A8R8G8B8, S1, S1, S1, ONE, X, Y, Z, W), 82fda9279dSmrg _(x8b8g8r8, A8R8G8B8, S1, S1, S1, ONE, Z, Y, X, W), 83fda9279dSmrg _(a1r5g5b5, A1R5G5B5, S1, S1, S1, S1, X, Y, Z, W), 84fda9279dSmrg _(x1r5g5b5, A1R5G5B5, S1, S1, S1, ONE, X, Y, Z, W), 85fda9279dSmrg _( r5g6b5, R5G6B5, S1, S1, S1, S1, X, Y, Z, W), 86fda9279dSmrg _( a8, L8, ZERO, ZERO, ZERO, S1, X, X, X, X), 87fda9279dSmrg { -1, ~0, ~0 } 88fda9279dSmrg}; 89fda9279dSmrg#undef _ 90fda9279dSmrg 91fda9279dSmrgstatic nv_pict_texture_format_t * 92fda9279dSmrgNV40_GetPictTextureFormat(int format) 93fda9279dSmrg{ 94fda9279dSmrg int i = 0; 95fda9279dSmrg 96fda9279dSmrg while (NV40TextureFormat[i].pict_fmt != -1) { 97fda9279dSmrg if (NV40TextureFormat[i].pict_fmt == format) 98fda9279dSmrg return &NV40TextureFormat[i]; 99fda9279dSmrg i++; 100fda9279dSmrg } 101fda9279dSmrg 102fda9279dSmrg return NULL; 103fda9279dSmrg} 104fda9279dSmrg 105fda9279dSmrg#define SF(bf) (NV30_3D_BLEND_FUNC_SRC_RGB_##bf | \ 106fda9279dSmrg NV30_3D_BLEND_FUNC_SRC_ALPHA_##bf) 107fda9279dSmrg#define DF(bf) (NV30_3D_BLEND_FUNC_DST_RGB_##bf | \ 108fda9279dSmrg NV30_3D_BLEND_FUNC_DST_ALPHA_##bf) 109fda9279dSmrgstatic nv_pict_op_t 110fda9279dSmrgNV40PictOp[] = { 111fda9279dSmrg/* Clear */ { 0, 0, SF( ZERO), DF( ZERO) }, 112fda9279dSmrg/* Src */ { 0, 0, SF( ONE), DF( ZERO) }, 113fda9279dSmrg/* Dst */ { 0, 0, SF( ZERO), DF( ONE) }, 114fda9279dSmrg/* Over */ { 1, 0, SF( ONE), DF(ONE_MINUS_SRC_ALPHA) }, 115fda9279dSmrg/* OverReverse */ { 0, 1, SF(ONE_MINUS_DST_ALPHA), DF( ONE) }, 116fda9279dSmrg/* In */ { 0, 1, SF( DST_ALPHA), DF( ZERO) }, 117fda9279dSmrg/* InReverse */ { 1, 0, SF( ZERO), DF( SRC_ALPHA) }, 118fda9279dSmrg/* Out */ { 0, 1, SF(ONE_MINUS_DST_ALPHA), DF( ZERO) }, 119fda9279dSmrg/* OutReverse */ { 1, 0, SF( ZERO), DF(ONE_MINUS_SRC_ALPHA) }, 120fda9279dSmrg/* Atop */ { 1, 1, SF( DST_ALPHA), DF(ONE_MINUS_SRC_ALPHA) }, 121fda9279dSmrg/* AtopReverse */ { 1, 1, SF(ONE_MINUS_DST_ALPHA), DF( SRC_ALPHA) }, 122fda9279dSmrg/* Xor */ { 1, 1, SF(ONE_MINUS_DST_ALPHA), DF(ONE_MINUS_SRC_ALPHA) }, 123fda9279dSmrg/* Add */ { 0, 0, SF( ONE), DF( ONE) } 124fda9279dSmrg}; 125fda9279dSmrg 126fda9279dSmrgstatic nv_pict_op_t * 127fda9279dSmrgNV40_GetPictOpRec(int op) 128fda9279dSmrg{ 129fda9279dSmrg if (op >= PictOpSaturate) 130fda9279dSmrg return NULL; 131fda9279dSmrg return &NV40PictOp[op]; 132fda9279dSmrg} 133fda9279dSmrg 134fda9279dSmrgstatic void 135fda9279dSmrgNV40_SetupBlend(ScrnInfoPtr pScrn, nv_pict_op_t *blend, 136fda9279dSmrg PictFormatShort dest_format, Bool component_alpha) 137fda9279dSmrg{ 138fda9279dSmrg NVPtr pNv = NVPTR(pScrn); 139fda9279dSmrg struct nouveau_pushbuf *push = pNv->pushbuf; 140fda9279dSmrg uint32_t sblend, dblend; 141fda9279dSmrg 142fda9279dSmrg sblend = blend->src_card_op; 143fda9279dSmrg dblend = blend->dst_card_op; 144fda9279dSmrg 145fda9279dSmrg if (blend->dst_alpha) { 146fda9279dSmrg if (!PICT_FORMAT_A(dest_format)) { 147fda9279dSmrg if (sblend == SF(DST_ALPHA)) { 148fda9279dSmrg sblend = SF(ONE); 149fda9279dSmrg } else if (sblend == SF(ONE_MINUS_DST_ALPHA)) { 150fda9279dSmrg sblend = SF(ZERO); 151fda9279dSmrg } 152fda9279dSmrg } else if (dest_format == PICT_a8) { 153fda9279dSmrg if (sblend == SF(DST_ALPHA)) { 154fda9279dSmrg sblend = SF(DST_COLOR); 155fda9279dSmrg } else if (sblend == SF(ONE_MINUS_DST_ALPHA)) { 156fda9279dSmrg sblend = SF(ONE_MINUS_DST_COLOR); 157fda9279dSmrg } 158fda9279dSmrg } 159fda9279dSmrg } 160fda9279dSmrg 161fda9279dSmrg if (blend->src_alpha && (component_alpha || dest_format == PICT_a8)) { 162fda9279dSmrg if (dblend == DF(SRC_ALPHA)) { 163fda9279dSmrg dblend = DF(SRC_COLOR); 164fda9279dSmrg } else if (dblend == DF(ONE_MINUS_SRC_ALPHA)) { 165fda9279dSmrg dblend = DF(ONE_MINUS_SRC_COLOR); 166fda9279dSmrg } 167fda9279dSmrg } 168fda9279dSmrg 169fda9279dSmrg if (sblend == SF(ONE) && dblend == DF(ZERO)) { 170fda9279dSmrg BEGIN_NV04(push, NV30_3D(BLEND_FUNC_ENABLE), 1); 171fda9279dSmrg PUSH_DATA (push, 0); 172fda9279dSmrg } else { 173fda9279dSmrg BEGIN_NV04(push, NV30_3D(BLEND_FUNC_ENABLE), 5); 174fda9279dSmrg PUSH_DATA (push, 1); 175fda9279dSmrg PUSH_DATA (push, sblend); 176fda9279dSmrg PUSH_DATA (push, dblend); 177fda9279dSmrg PUSH_DATA (push, 0x00000000); 178fda9279dSmrg PUSH_DATA (push, NV40_3D_BLEND_EQUATION_ALPHA_FUNC_ADD | 179fda9279dSmrg NV40_3D_BLEND_EQUATION_RGB_FUNC_ADD); 180fda9279dSmrg } 181fda9279dSmrg} 182fda9279dSmrg 183fda9279dSmrgstatic Bool 184fda9279dSmrgNV40EXAPictSolid(NVPtr pNv, PicturePtr pPict, int unit) 185fda9279dSmrg{ 186fda9279dSmrg struct nouveau_pushbuf *push = pNv->pushbuf; 187fda9279dSmrg 188fda9279dSmrg PUSH_DATAu(push, pNv->scratch, SOLID(unit), 2); 189fda9279dSmrg PUSH_DATA (push, pPict->pSourcePict->solidFill.color); 190fda9279dSmrg PUSH_DATA (push, 0); 191fda9279dSmrg BEGIN_NV04(push, NV30_3D(TEX_OFFSET(unit)), 8); 192fda9279dSmrg PUSH_MTHDl(push, NV30_3D(TEX_OFFSET(unit)), pNv->scratch, SOLID(unit), 193fda9279dSmrg NOUVEAU_BO_VRAM | NOUVEAU_BO_RD); 194fda9279dSmrg PUSH_DATA (push, NV40_3D_TEX_FORMAT_FORMAT_A8R8G8B8 | 0x8000 | 195fda9279dSmrg NV40_3D_TEX_FORMAT_LINEAR | 196fda9279dSmrg NV30_3D_TEX_FORMAT_DIMS_2D | 197fda9279dSmrg NV30_3D_TEX_FORMAT_NO_BORDER | 198fda9279dSmrg (1 << NV40_3D_TEX_FORMAT_MIPMAP_COUNT__SHIFT) | 199fda9279dSmrg NV30_3D_TEX_FORMAT_DMA0); 200fda9279dSmrg PUSH_DATA (push, NV30_3D_TEX_WRAP_S_REPEAT | 201fda9279dSmrg NV30_3D_TEX_WRAP_T_REPEAT | 202fda9279dSmrg NV30_3D_TEX_WRAP_R_REPEAT); 203fda9279dSmrg PUSH_DATA (push, NV40_3D_TEX_ENABLE_ENABLE); 204fda9279dSmrg PUSH_DATA (push, 0x0000aae4); 205fda9279dSmrg PUSH_DATA (push, NV30_3D_TEX_FILTER_MIN_NEAREST | 206fda9279dSmrg NV30_3D_TEX_FILTER_MAG_NEAREST | 0x3fd6); 207fda9279dSmrg PUSH_DATA (push, 0x00010001); 208fda9279dSmrg PUSH_DATA (push, 0x00000000); 209fda9279dSmrg BEGIN_NV04(push, NV40_3D(TEX_SIZE1(unit)), 1); 210fda9279dSmrg PUSH_DATA (push, 0x00100040); 211fda9279dSmrg 212fda9279dSmrg BEGIN_NV04(push, NV30_3D(VP_UPLOAD_CONST_ID), 17); 213fda9279dSmrg PUSH_DATA (push, unit * 4); 214fda9279dSmrg PUSH_DATAf(push, 1.0); 215fda9279dSmrg PUSH_DATAf(push, 0.0); 216fda9279dSmrg PUSH_DATAf(push, 0.0); 217fda9279dSmrg PUSH_DATAf(push, 0.0); 218fda9279dSmrg PUSH_DATAf(push, 0.0); 219fda9279dSmrg PUSH_DATAf(push, 1.0); 220fda9279dSmrg PUSH_DATAf(push, 0.0); 221fda9279dSmrg PUSH_DATAf(push, 0.0); 222fda9279dSmrg PUSH_DATAf(push, 0.0); 223fda9279dSmrg PUSH_DATAf(push, 0.0); 224fda9279dSmrg PUSH_DATAf(push, 1.0); 225fda9279dSmrg PUSH_DATAf(push, 0.0); 226fda9279dSmrg PUSH_DATAf(push, 1.0); 227fda9279dSmrg PUSH_DATAf(push, 1.0); 228fda9279dSmrg PUSH_DATAf(push, 0.0); 229fda9279dSmrg PUSH_DATAf(push, 0.0); 230fda9279dSmrg return TRUE; 231fda9279dSmrg} 232fda9279dSmrg 233fda9279dSmrgstatic Bool 234fda9279dSmrgNV40EXAPictGradient(NVPtr pNv, PicturePtr pPict, int unit) 235fda9279dSmrg{ 236fda9279dSmrg return FALSE; 237fda9279dSmrg} 238fda9279dSmrg 239fda9279dSmrgstatic Bool 240fda9279dSmrgNV40EXAPictTexture(NVPtr pNv, PixmapPtr pPix, PicturePtr pPict, int unit) 241fda9279dSmrg{ 242fda9279dSmrg unsigned reloc = NOUVEAU_BO_VRAM | NOUVEAU_BO_GART | NOUVEAU_BO_WR; 243fda9279dSmrg struct nouveau_pushbuf *push = pNv->pushbuf; 244fda9279dSmrg struct nouveau_bo *bo = nouveau_pixmap_bo(pPix); 245fda9279dSmrg nv_pict_texture_format_t *fmt; 246fda9279dSmrg 247fda9279dSmrg fmt = NV40_GetPictTextureFormat(pPict->format); 248fda9279dSmrg if (!fmt) 249fda9279dSmrg return FALSE; 250fda9279dSmrg 251fda9279dSmrg BEGIN_NV04(push, NV30_3D(TEX_OFFSET(unit)), 8); 252fda9279dSmrg PUSH_MTHDl(push, NV30_3D(TEX_OFFSET(unit)), bo, 0, reloc); 253fda9279dSmrg PUSH_MTHDs(push, NV30_3D(TEX_FORMAT(unit)), bo, fmt->card_fmt | 254fda9279dSmrg NV40_3D_TEX_FORMAT_LINEAR | 255fda9279dSmrg NV30_3D_TEX_FORMAT_DIMS_2D | 0x8000 | 256fda9279dSmrg NV30_3D_TEX_FORMAT_NO_BORDER | 257fda9279dSmrg (1 << NV40_3D_TEX_FORMAT_MIPMAP_COUNT__SHIFT), 258fda9279dSmrg reloc | NOUVEAU_BO_OR, 259fda9279dSmrg NV30_3D_TEX_FORMAT_DMA0, NV30_3D_TEX_FORMAT_DMA1); 260fda9279dSmrg if (pPict->repeat) { 261fda9279dSmrg switch(pPict->repeatType) { 262fda9279dSmrg case RepeatPad: 263fda9279dSmrg PUSH_DATA (push, NV30_3D_TEX_WRAP_S_CLAMP_TO_EDGE | 264fda9279dSmrg NV30_3D_TEX_WRAP_T_CLAMP_TO_EDGE | 265fda9279dSmrg NV30_3D_TEX_WRAP_R_CLAMP_TO_EDGE); 266fda9279dSmrg break; 267fda9279dSmrg case RepeatReflect: 268fda9279dSmrg PUSH_DATA (push, NV30_3D_TEX_WRAP_S_MIRRORED_REPEAT | 269fda9279dSmrg NV30_3D_TEX_WRAP_T_MIRRORED_REPEAT | 270fda9279dSmrg NV30_3D_TEX_WRAP_R_MIRRORED_REPEAT); 271fda9279dSmrg break; 272fda9279dSmrg case RepeatNormal: 273fda9279dSmrg default: 274fda9279dSmrg PUSH_DATA (push, NV30_3D_TEX_WRAP_S_REPEAT | 275fda9279dSmrg NV30_3D_TEX_WRAP_T_REPEAT | 276fda9279dSmrg NV30_3D_TEX_WRAP_R_REPEAT); 277fda9279dSmrg break; 278fda9279dSmrg } 279fda9279dSmrg } else { 280fda9279dSmrg PUSH_DATA (push, NV30_3D_TEX_WRAP_S_CLAMP_TO_BORDER | 281fda9279dSmrg NV30_3D_TEX_WRAP_T_CLAMP_TO_BORDER | 282fda9279dSmrg NV30_3D_TEX_WRAP_R_CLAMP_TO_BORDER); 283fda9279dSmrg } 284fda9279dSmrg PUSH_DATA (push, NV40_3D_TEX_ENABLE_ENABLE); 285fda9279dSmrg PUSH_DATA (push, fmt->card_swz); 286fda9279dSmrg if (pPict->filter == PictFilterBilinear) { 287fda9279dSmrg PUSH_DATA (push, NV30_3D_TEX_FILTER_MIN_LINEAR | 288fda9279dSmrg NV30_3D_TEX_FILTER_MAG_LINEAR | 0x3fd6); 289fda9279dSmrg } else { 290fda9279dSmrg PUSH_DATA (push, NV30_3D_TEX_FILTER_MIN_NEAREST | 291fda9279dSmrg NV30_3D_TEX_FILTER_MAG_NEAREST | 0x3fd6); 292fda9279dSmrg } 293fda9279dSmrg PUSH_DATA (push, (pPix->drawable.width << 16) | pPix->drawable.height); 294fda9279dSmrg PUSH_DATA (push, 0); /* border ARGB */ 295fda9279dSmrg BEGIN_NV04(push, NV40_3D(TEX_SIZE1(unit)), 1); 296fda9279dSmrg PUSH_DATA (push, (1 << NV40_3D_TEX_SIZE1_DEPTH__SHIFT) | 297fda9279dSmrg (uint32_t)exaGetPixmapPitch(pPix)); 298fda9279dSmrg 299fda9279dSmrg BEGIN_NV04(push, NV30_3D(VP_UPLOAD_CONST_ID), 17); 300fda9279dSmrg PUSH_DATA (push, unit * 4); 301fda9279dSmrg if (pPict->transform) { 302fda9279dSmrg PUSH_DATAf(push, xFixedToFloat(pPict->transform->matrix[0][0])); 303fda9279dSmrg PUSH_DATAf(push, xFixedToFloat(pPict->transform->matrix[0][1])); 304fda9279dSmrg PUSH_DATAf(push, xFixedToFloat(pPict->transform->matrix[0][2])); 305fda9279dSmrg PUSH_DATAf(push, 0); 306fda9279dSmrg PUSH_DATAf(push, xFixedToFloat(pPict->transform->matrix[1][0])); 307fda9279dSmrg PUSH_DATAf(push, xFixedToFloat(pPict->transform->matrix[1][1])); 308fda9279dSmrg PUSH_DATAf(push, xFixedToFloat(pPict->transform->matrix[1][2])); 309fda9279dSmrg PUSH_DATAf(push, 0); 310fda9279dSmrg PUSH_DATAf(push, xFixedToFloat(pPict->transform->matrix[2][0])); 311fda9279dSmrg PUSH_DATAf(push, xFixedToFloat(pPict->transform->matrix[2][1])); 312fda9279dSmrg PUSH_DATAf(push, xFixedToFloat(pPict->transform->matrix[2][2])); 313fda9279dSmrg PUSH_DATAf(push, 0); 314fda9279dSmrg } else { 315fda9279dSmrg PUSH_DATAf(push, 1.0); 316fda9279dSmrg PUSH_DATAf(push, 0.0); 317fda9279dSmrg PUSH_DATAf(push, 0.0); 318fda9279dSmrg PUSH_DATAf(push, 0.0); 319fda9279dSmrg PUSH_DATAf(push, 0.0); 320fda9279dSmrg PUSH_DATAf(push, 1.0); 321fda9279dSmrg PUSH_DATAf(push, 0.0); 322fda9279dSmrg PUSH_DATAf(push, 0.0); 323fda9279dSmrg PUSH_DATAf(push, 0.0); 324fda9279dSmrg PUSH_DATAf(push, 0.0); 325fda9279dSmrg PUSH_DATAf(push, 1.0); 326fda9279dSmrg PUSH_DATAf(push, 0.0); 327fda9279dSmrg } 328fda9279dSmrg PUSH_DATAf(push, 1.0 / pPix->drawable.width); 329fda9279dSmrg PUSH_DATAf(push, 1.0 / pPix->drawable.height); 330fda9279dSmrg PUSH_DATAf(push, 0.0); 331fda9279dSmrg PUSH_DATAf(push, 1.0); 332fda9279dSmrg 333fda9279dSmrg return TRUE; 334fda9279dSmrg} 335fda9279dSmrg 336fda9279dSmrgstatic Bool 337fda9279dSmrgNV40EXAPicture(NVPtr pNv, PixmapPtr ppix, PicturePtr ppict, int unit) 338fda9279dSmrg{ 339fda9279dSmrg if (ppict->pDrawable) 340fda9279dSmrg return NV40EXAPictTexture(pNv, ppix, ppict, unit); 341fda9279dSmrg 342fda9279dSmrg switch (ppict->pSourcePict->type) { 343fda9279dSmrg case SourcePictTypeSolidFill: 344fda9279dSmrg return NV40EXAPictSolid(pNv, ppict, unit); 345fda9279dSmrg case SourcePictTypeLinear: 346fda9279dSmrg return NV40EXAPictGradient(pNv, ppict, unit); 347fda9279dSmrg default: 348fda9279dSmrg break; 349fda9279dSmrg } 350fda9279dSmrg 351fda9279dSmrg return FALSE; 352fda9279dSmrg} 353fda9279dSmrg 354fda9279dSmrgstatic Bool 355fda9279dSmrgNV40_SetupSurface(ScrnInfoPtr pScrn, PixmapPtr pPix, PictFormatShort format) 356fda9279dSmrg{ 357fda9279dSmrg NVPtr pNv = NVPTR(pScrn); 358fda9279dSmrg struct nouveau_pushbuf *push = pNv->pushbuf; 359fda9279dSmrg struct nouveau_bo *bo = nouveau_pixmap_bo(pPix); 360fda9279dSmrg nv_pict_surface_format_t *fmt; 361fda9279dSmrg 362fda9279dSmrg fmt = NV40_GetPictSurfaceFormat(format); 363fda9279dSmrg if (!fmt) { 364fda9279dSmrg ErrorF("AIII no format\n"); 365fda9279dSmrg return FALSE; 366fda9279dSmrg } 367fda9279dSmrg 368fda9279dSmrg BEGIN_NV04(push, NV30_3D(RT_FORMAT), 3); 369fda9279dSmrg PUSH_DATA (push, NV30_3D_RT_FORMAT_TYPE_LINEAR | 370fda9279dSmrg NV30_3D_RT_FORMAT_ZETA_Z24S8 | fmt->card_fmt); 371fda9279dSmrg PUSH_DATA (push, exaGetPixmapPitch(pPix)); 372fda9279dSmrg PUSH_MTHDl(push, NV30_3D(COLOR0_OFFSET), bo, 0, 373fda9279dSmrg NOUVEAU_BO_VRAM | NOUVEAU_BO_RDWR); 374fda9279dSmrg return TRUE; 375fda9279dSmrg} 376fda9279dSmrg 377fda9279dSmrgstatic Bool 378fda9279dSmrgNV40EXACheckCompositeTexture(PicturePtr pPict, PicturePtr pdPict, int op) 379fda9279dSmrg{ 380fda9279dSmrg nv_pict_texture_format_t *fmt; 381fda9279dSmrg int w = 1, h = 1; 382fda9279dSmrg 383fda9279dSmrg if (pPict->pDrawable) { 384fda9279dSmrg w = pPict->pDrawable->width; 385fda9279dSmrg h = pPict->pDrawable->height; 386fda9279dSmrg } else { 387fda9279dSmrg switch (pPict->pSourcePict->type) { 388fda9279dSmrg case SourcePictTypeSolidFill: 389fda9279dSmrg break; 390fda9279dSmrg default: 391fda9279dSmrg NOUVEAU_FALLBACK("gradient\n"); 392fda9279dSmrg } 393fda9279dSmrg } 394fda9279dSmrg 395fda9279dSmrg if ((w > 4096) || (h > 4096)) 396fda9279dSmrg NOUVEAU_FALLBACK("picture too large, %dx%d\n", w, h); 397fda9279dSmrg 398fda9279dSmrg fmt = NV40_GetPictTextureFormat(pPict->format); 399fda9279dSmrg if (!fmt) 400fda9279dSmrg NOUVEAU_FALLBACK("picture format 0x%08x not supported\n", 401fda9279dSmrg pPict->format); 402fda9279dSmrg 403fda9279dSmrg if (pPict->filter != PictFilterNearest && 404fda9279dSmrg pPict->filter != PictFilterBilinear) 405fda9279dSmrg NOUVEAU_FALLBACK("filter 0x%x not supported\n", pPict->filter); 406fda9279dSmrg 407fda9279dSmrg /* Opengl and Render disagree on what should be sampled outside an XRGB 408fda9279dSmrg * texture (with no repeating). Opengl has a hardcoded alpha value of 409fda9279dSmrg * 1.0, while render expects 0.0. We assume that clipping is done for 410fda9279dSmrg * untranformed sources. 411fda9279dSmrg */ 412fda9279dSmrg if (NV40PictOp[op].src_alpha && !pPict->repeat && 413fda9279dSmrg pPict->transform && (PICT_FORMAT_A(pPict->format) == 0) 414fda9279dSmrg && (PICT_FORMAT_A(pdPict->format) != 0)) 415fda9279dSmrg NOUVEAU_FALLBACK("REPEAT_NONE unsupported for XRGB source\n"); 416fda9279dSmrg 417fda9279dSmrg return TRUE; 418fda9279dSmrg} 419fda9279dSmrg 420fda9279dSmrgBool 421fda9279dSmrgNV40EXACheckComposite(int op, PicturePtr psPict, 422fda9279dSmrg PicturePtr pmPict, 423fda9279dSmrg PicturePtr pdPict) 424fda9279dSmrg{ 425fda9279dSmrg nv_pict_surface_format_t *fmt; 426fda9279dSmrg nv_pict_op_t *opr; 427fda9279dSmrg 428fda9279dSmrg opr = NV40_GetPictOpRec(op); 429fda9279dSmrg if (!opr) 430fda9279dSmrg NOUVEAU_FALLBACK("unsupported blend op 0x%x\n", op); 431fda9279dSmrg 432fda9279dSmrg fmt = NV40_GetPictSurfaceFormat(pdPict->format); 433fda9279dSmrg if (!fmt) 434fda9279dSmrg NOUVEAU_FALLBACK("dst picture format 0x%08x not supported\n", 435fda9279dSmrg pdPict->format); 436fda9279dSmrg 437fda9279dSmrg if (!NV40EXACheckCompositeTexture(psPict, pdPict, op)) 438fda9279dSmrg NOUVEAU_FALLBACK("src picture\n"); 439fda9279dSmrg if (pmPict) { 440fda9279dSmrg if (pmPict->componentAlpha && 441fda9279dSmrg PICT_FORMAT_RGB(pmPict->format) && 442fda9279dSmrg opr->src_alpha && opr->src_card_op != SF(ZERO)) 443fda9279dSmrg NOUVEAU_FALLBACK("mask CA + SA\n"); 444fda9279dSmrg if (!NV40EXACheckCompositeTexture(pmPict, pdPict, op)) 445fda9279dSmrg NOUVEAU_FALLBACK("mask picture\n"); 446fda9279dSmrg } 447fda9279dSmrg 448fda9279dSmrg return TRUE; 449fda9279dSmrg} 450fda9279dSmrg 451fda9279dSmrgBool 452fda9279dSmrgNV40EXAPrepareComposite(int op, PicturePtr psPict, 453fda9279dSmrg PicturePtr pmPict, 454fda9279dSmrg PicturePtr pdPict, 455fda9279dSmrg PixmapPtr psPix, 456fda9279dSmrg PixmapPtr pmPix, 457fda9279dSmrg PixmapPtr pdPix) 458fda9279dSmrg{ 459fda9279dSmrg ScrnInfoPtr pScrn = xf86ScreenToScrn(pdPix->drawable.pScreen); 460fda9279dSmrg NVPtr pNv = NVPTR(pScrn); 461fda9279dSmrg nv_pict_op_t *blend = NV40_GetPictOpRec(op); 462fda9279dSmrg struct nouveau_pushbuf *push = pNv->pushbuf; 463fda9279dSmrg uint32_t fragprog; 464fda9279dSmrg 465fda9279dSmrg if (!PUSH_SPACE(push, 128)) 466fda9279dSmrg NOUVEAU_FALLBACK("space\n"); 467fda9279dSmrg PUSH_RESET(push); 468fda9279dSmrg 469fda9279dSmrg NV40_SetupBlend(pScrn, blend, pdPict->format, 470fda9279dSmrg (pmPict && pmPict->componentAlpha && 471fda9279dSmrg PICT_FORMAT_RGB(pmPict->format))); 472fda9279dSmrg 473fda9279dSmrg if (!NV40_SetupSurface(pScrn, pdPix, pdPict->format) || 474fda9279dSmrg !NV40EXAPicture(pNv, psPix, psPict, 0)) 475fda9279dSmrg return FALSE; 476fda9279dSmrg 477fda9279dSmrg if (pmPict) { 478fda9279dSmrg if (!NV40EXAPicture(pNv, pmPix, pmPict, 1)) 479fda9279dSmrg return FALSE; 480fda9279dSmrg 481fda9279dSmrg if (pdPict->format == PICT_a8) { 482fda9279dSmrg fragprog = PFP_C_A8; 483fda9279dSmrg } else 484fda9279dSmrg if (pmPict->componentAlpha && PICT_FORMAT_RGB(pmPict->format)) { 485fda9279dSmrg if (blend->src_alpha) 486fda9279dSmrg fragprog = PFP_CCASA; 487fda9279dSmrg else 488fda9279dSmrg fragprog = PFP_CCA; 489fda9279dSmrg } else { 490fda9279dSmrg fragprog = PFP_C; 491fda9279dSmrg } 492fda9279dSmrg } else { 493fda9279dSmrg if (pdPict->format == PICT_a8) 494fda9279dSmrg fragprog = PFP_S_A8; 495fda9279dSmrg else 496fda9279dSmrg fragprog = PFP_S; 497fda9279dSmrg } 498fda9279dSmrg 499fda9279dSmrg BEGIN_NV04(push, NV30_3D(FP_ACTIVE_PROGRAM), 1); 500fda9279dSmrg PUSH_MTHD (push, NV30_3D(FP_ACTIVE_PROGRAM), pNv->scratch, fragprog, 501fda9279dSmrg NOUVEAU_BO_VRAM | NOUVEAU_BO_RD | NOUVEAU_BO_LOW | 502fda9279dSmrg NOUVEAU_BO_OR, 503fda9279dSmrg NV30_3D_FP_ACTIVE_PROGRAM_DMA0, 504fda9279dSmrg NV30_3D_FP_ACTIVE_PROGRAM_DMA1); 505fda9279dSmrg BEGIN_NV04(push, NV30_3D(FP_CONTROL), 1); 506fda9279dSmrg PUSH_DATA (push, 0x02000000); 507fda9279dSmrg 508fda9279dSmrg /* Appears to be some kind of cache flush, needed here at least 509fda9279dSmrg * sometimes.. funky text rendering otherwise :) 510fda9279dSmrg */ 511fda9279dSmrg BEGIN_NV04(push, NV40_3D(TEX_CACHE_CTL), 1); 512fda9279dSmrg PUSH_DATA (push, 2); 513fda9279dSmrg BEGIN_NV04(push, NV40_3D(TEX_CACHE_CTL), 1); 514fda9279dSmrg PUSH_DATA (push, 1); 515fda9279dSmrg 516fda9279dSmrg nouveau_pushbuf_bufctx(push, pNv->bufctx); 517fda9279dSmrg if (nouveau_pushbuf_validate(push)) { 518fda9279dSmrg nouveau_pushbuf_bufctx(push, NULL); 519fda9279dSmrg return FALSE; 520fda9279dSmrg } 521fda9279dSmrg 522fda9279dSmrg return TRUE; 523fda9279dSmrg} 524fda9279dSmrg 525fda9279dSmrgstatic __inline__ void 526fda9279dSmrgPUSH_VTX2s(struct nouveau_pushbuf *push, 527fda9279dSmrg int x1, int y1, int x2, int y2, int dx, int dy) 528fda9279dSmrg{ 529fda9279dSmrg BEGIN_NV04(push, NV30_3D(VTX_ATTR_2I(8)), 2); 530fda9279dSmrg PUSH_DATA (push, ((y1 & 0xffff) << 16) | (x1 & 0xffff)); 531fda9279dSmrg PUSH_DATA (push, ((y2 & 0xffff) << 16) | (x2 & 0xffff)); 532fda9279dSmrg BEGIN_NV04(push, NV30_3D(VTX_ATTR_2I(0)), 1); 533fda9279dSmrg PUSH_DATA (push, ((dy & 0xffff) << 16) | (dx & 0xffff)); 534fda9279dSmrg} 535fda9279dSmrg 536fda9279dSmrgvoid 537fda9279dSmrgNV40EXAComposite(PixmapPtr pdPix, 538fda9279dSmrg int sx, int sy, int mx, int my, int dx, int dy, int w, int h) 539fda9279dSmrg{ 540fda9279dSmrg ScrnInfoPtr pScrn = xf86ScreenToScrn(pdPix->drawable.pScreen); 541fda9279dSmrg NVPtr pNv = NVPTR(pScrn); 542fda9279dSmrg struct nouveau_pushbuf *push = pNv->pushbuf; 543fda9279dSmrg 544fda9279dSmrg if (!PUSH_SPACE(push, 64)) 545fda9279dSmrg return; 546fda9279dSmrg 547fda9279dSmrg /* We're drawing a triangle, we need to scissor it to a quad. */ 548fda9279dSmrg /* The scissors are here for a good reason, we don't get the full 549fda9279dSmrg * image, but just a part. 550fda9279dSmrg */ 551fda9279dSmrg /* Handling the cliprects is done for us already. */ 552fda9279dSmrg BEGIN_NV04(push, NV30_3D(SCISSOR_HORIZ), 2); 553fda9279dSmrg PUSH_DATA (push, (w << 16) | dx); 554fda9279dSmrg PUSH_DATA (push, (h << 16) | dy); 555fda9279dSmrg BEGIN_NV04(push, NV30_3D(VERTEX_BEGIN_END), 1); 556fda9279dSmrg PUSH_DATA (push, NV30_3D_VERTEX_BEGIN_END_TRIANGLES); 557fda9279dSmrg PUSH_VTX2s(push, sx, sy + (h * 2), mx, my + (h * 2), dx, dy + (h * 2)); 558fda9279dSmrg PUSH_VTX2s(push, sx, sy, mx, my, dx, dy); 559fda9279dSmrg PUSH_VTX2s(push, sx + (w * 2), sy, mx + (w * 2), my, dx + (w * 2), dy); 560fda9279dSmrg BEGIN_NV04(push, NV30_3D(VERTEX_BEGIN_END), 1); 561fda9279dSmrg PUSH_DATA (push, NV30_3D_VERTEX_BEGIN_END_STOP); 562fda9279dSmrg} 563fda9279dSmrg 564fda9279dSmrgvoid 565fda9279dSmrgNV40EXADoneComposite(PixmapPtr pdPix) 566fda9279dSmrg{ 567fda9279dSmrg ScrnInfoPtr pScrn = xf86ScreenToScrn(pdPix->drawable.pScreen); 568fda9279dSmrg nouveau_pushbuf_bufctx(NVPTR(pScrn)->pushbuf, NULL); 569fda9279dSmrg} 570fda9279dSmrg 571fda9279dSmrg#define NV30_3D_CHIPSET_4X_MASK 0x00000baf 572fda9279dSmrg#define NV44TCL_CHIPSET_4X_MASK 0x00005450 573fda9279dSmrgBool 574fda9279dSmrgNVAccelInitNV40TCL(ScrnInfoPtr pScrn) 575fda9279dSmrg{ 576fda9279dSmrg NVPtr pNv = NVPTR(pScrn); 577fda9279dSmrg struct nouveau_pushbuf *push = pNv->pushbuf; 578fda9279dSmrg struct nv04_fifo *fifo = pNv->channel->data; 579fda9279dSmrg uint32_t class = 0, chipset; 580fda9279dSmrg int i; 581fda9279dSmrg 582fda9279dSmrg NVXVComputeBicubicFilter(pNv->scratch, XV_TABLE, XV_TABLE_SIZE); 583fda9279dSmrg 584fda9279dSmrg chipset = pNv->dev->chipset; 585fda9279dSmrg if ((chipset & 0xf0) == NV_ARCH_40) { 586fda9279dSmrg chipset &= 0xf; 587fda9279dSmrg if (NV30_3D_CHIPSET_4X_MASK & (1<<chipset)) 588fda9279dSmrg class = NV40_3D_CLASS; 589fda9279dSmrg else if (NV44TCL_CHIPSET_4X_MASK & (1<<chipset)) 590fda9279dSmrg class = NV44_3D_CLASS; 591fda9279dSmrg else { 592fda9279dSmrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 593fda9279dSmrg "NV40EXA: Unknown chipset NV4%1x\n", chipset); 594fda9279dSmrg return FALSE; 595fda9279dSmrg } 596fda9279dSmrg } else if ( (chipset & 0xf0) == 0x60) { 597fda9279dSmrg class = NV44_3D_CLASS; 598fda9279dSmrg } else 599fda9279dSmrg return TRUE; 600fda9279dSmrg 601fda9279dSmrg if (nouveau_object_new(pNv->channel, Nv3D, class, NULL, 0, &pNv->Nv3D)) 602fda9279dSmrg return FALSE; 603fda9279dSmrg 604fda9279dSmrg if (!PUSH_SPACE(push, 256)) 605fda9279dSmrg return FALSE; 606fda9279dSmrg 607fda9279dSmrg BEGIN_NV04(push, NV01_SUBC(3D, OBJECT), 1); 608fda9279dSmrg PUSH_DATA (push, pNv->Nv3D->handle); 609fda9279dSmrg BEGIN_NV04(push, NV30_3D(DMA_NOTIFY), 1); 610fda9279dSmrg PUSH_DATA (push, pNv->notify0->handle); 611fda9279dSmrg BEGIN_NV04(push, NV30_3D(DMA_TEXTURE0), 2); 612fda9279dSmrg PUSH_DATA (push, fifo->vram); 613fda9279dSmrg PUSH_DATA (push, fifo->gart); 614fda9279dSmrg BEGIN_NV04(push, NV30_3D(DMA_COLOR0), 2); 615fda9279dSmrg PUSH_DATA (push, fifo->vram); 616fda9279dSmrg PUSH_DATA (push, fifo->vram); 617fda9279dSmrg 618fda9279dSmrg /* voodoo */ 619fda9279dSmrg BEGIN_NV04(push, SUBC_3D(0x1ea4), 3); 620fda9279dSmrg PUSH_DATA (push, 0x00000010); 621fda9279dSmrg PUSH_DATA (push, 0x01000100); 622fda9279dSmrg PUSH_DATA (push, 0xff800006); 623fda9279dSmrg BEGIN_NV04(push, SUBC_3D(0x1fc4), 1); 624fda9279dSmrg PUSH_DATA (push, 0x06144321); 625fda9279dSmrg BEGIN_NV04(push, SUBC_3D(0x1fc8), 2); 626fda9279dSmrg PUSH_DATA (push, 0xedcba987); 627fda9279dSmrg PUSH_DATA (push, 0x00000021); 628fda9279dSmrg BEGIN_NV04(push, SUBC_3D(0x1fd0), 1); 629fda9279dSmrg PUSH_DATA (push, 0x00171615); 630fda9279dSmrg BEGIN_NV04(push, SUBC_3D(0x1fd4), 1); 631fda9279dSmrg PUSH_DATA (push, 0x001b1a19); 632fda9279dSmrg BEGIN_NV04(push, SUBC_3D(0x1ef8), 1); 633fda9279dSmrg PUSH_DATA (push, 0x0020ffff); 634fda9279dSmrg BEGIN_NV04(push, SUBC_3D(0x1d64), 1); 635fda9279dSmrg PUSH_DATA (push, 0x00d30000); 63616ee1e9aSmrg BEGIN_NV04(push, NV30_3D(ENGINE), 1); 63716ee1e9aSmrg PUSH_DATA (push, NV30_3D_ENGINE_FP); 638fda9279dSmrg 639fda9279dSmrg /* This removes the the stair shaped tearing that i get. */ 640fda9279dSmrg /* Verified on one G70 card that it doesn't cause regressions for people without the problem. */ 641fda9279dSmrg /* The blob sets this up by default for NV43. */ 64216ee1e9aSmrg BEGIN_NV04(push, NV30_3D(FP_REG_CONTROL), 1); 643fda9279dSmrg PUSH_DATA (push, 0x0000000F); 644fda9279dSmrg 645fda9279dSmrg BEGIN_NV04(push, NV30_3D(VIEWPORT_TRANSLATE_X), 8); 646fda9279dSmrg PUSH_DATAf(push, 0.0); 647fda9279dSmrg PUSH_DATAf(push, 0.0); 648fda9279dSmrg PUSH_DATAf(push, 0.0); 649fda9279dSmrg PUSH_DATAf(push, 0.0); 650fda9279dSmrg PUSH_DATAf(push, 1.0); 651fda9279dSmrg PUSH_DATAf(push, 1.0); 652fda9279dSmrg PUSH_DATAf(push, 1.0); 653fda9279dSmrg PUSH_DATAf(push, 0.0); 654fda9279dSmrg 655fda9279dSmrg /* default 3D state */ 656fda9279dSmrg /*XXX: replace with the same state that the DRI emits on startup */ 657fda9279dSmrg BEGIN_NV04(push, NV30_3D(STENCIL_ENABLE(0)), 1); 658fda9279dSmrg PUSH_DATA (push, 0); 659fda9279dSmrg BEGIN_NV04(push, NV30_3D(STENCIL_ENABLE(1)), 1); 660fda9279dSmrg PUSH_DATA (push, 0); 661fda9279dSmrg BEGIN_NV04(push, NV30_3D(ALPHA_FUNC_ENABLE), 1); 662fda9279dSmrg PUSH_DATA (push, 0); 663fda9279dSmrg BEGIN_NV04(push, NV30_3D(DEPTH_WRITE_ENABLE), 2); 664fda9279dSmrg PUSH_DATA (push, 0); 665fda9279dSmrg PUSH_DATA (push, 0); 666fda9279dSmrg BEGIN_NV04(push, NV30_3D(COLOR_MASK), 1); 667fda9279dSmrg PUSH_DATA (push, 0x01010101); /* TR,TR,TR,TR */ 668fda9279dSmrg BEGIN_NV04(push, NV30_3D(CULL_FACE_ENABLE), 1); 669fda9279dSmrg PUSH_DATA (push, 0); 670fda9279dSmrg BEGIN_NV04(push, NV30_3D(BLEND_FUNC_ENABLE), 1); 671fda9279dSmrg PUSH_DATA (push, 0); 672fda9279dSmrg BEGIN_NV04(push, NV30_3D(COLOR_LOGIC_OP_ENABLE), 2); 673fda9279dSmrg PUSH_DATA (push, 0); 674fda9279dSmrg PUSH_DATA (push, NV30_3D_COLOR_LOGIC_OP_OP_COPY); 675fda9279dSmrg BEGIN_NV04(push, NV30_3D(DITHER_ENABLE), 1); 676fda9279dSmrg PUSH_DATA (push, 0); 677fda9279dSmrg BEGIN_NV04(push, NV30_3D(SHADE_MODEL), 1); 678fda9279dSmrg PUSH_DATA (push, NV30_3D_SHADE_MODEL_SMOOTH); 679fda9279dSmrg BEGIN_NV04(push, NV30_3D(POLYGON_OFFSET_FACTOR),2); 680fda9279dSmrg PUSH_DATAf(push, 0.0); 681fda9279dSmrg PUSH_DATAf(push, 0.0); 682fda9279dSmrg BEGIN_NV04(push, NV30_3D(POLYGON_MODE_FRONT), 2); 683fda9279dSmrg PUSH_DATA (push, NV30_3D_POLYGON_MODE_FRONT_FILL); 684fda9279dSmrg PUSH_DATA (push, NV30_3D_POLYGON_MODE_BACK_FILL); 685fda9279dSmrg BEGIN_NV04(push, NV30_3D(POLYGON_STIPPLE_PATTERN(0)), 0x20); 686fda9279dSmrg for (i=0;i<0x20;i++) 687fda9279dSmrg PUSH_DATA (push, 0xFFFFFFFF); 688fda9279dSmrg for (i=0;i<16;i++) { 689fda9279dSmrg BEGIN_NV04(push, NV30_3D(TEX_ENABLE(i)), 1); 690fda9279dSmrg PUSH_DATA (push, 0); 691fda9279dSmrg } 692fda9279dSmrg 69316ee1e9aSmrg BEGIN_NV04(push, NV30_3D(DEPTH_CONTROL), 1); 694fda9279dSmrg PUSH_DATA (push, 0x110); 695fda9279dSmrg 696fda9279dSmrg BEGIN_NV04(push, NV30_3D(RT_ENABLE), 1); 697fda9279dSmrg PUSH_DATA (push, NV30_3D_RT_ENABLE_COLOR0); 698fda9279dSmrg 699fda9279dSmrg BEGIN_NV04(push, NV30_3D(RT_HORIZ), 2); 700fda9279dSmrg PUSH_DATA (push, (4096 << 16)); 701fda9279dSmrg PUSH_DATA (push, (4096 << 16)); 702fda9279dSmrg BEGIN_NV04(push, NV30_3D(SCISSOR_HORIZ), 2); 703fda9279dSmrg PUSH_DATA (push, (4096 << 16)); 704fda9279dSmrg PUSH_DATA (push, (4096 << 16)); 705fda9279dSmrg BEGIN_NV04(push, NV30_3D(VIEWPORT_HORIZ), 2); 706fda9279dSmrg PUSH_DATA (push, (4096 << 16)); 707fda9279dSmrg PUSH_DATA (push, (4096 << 16)); 708fda9279dSmrg BEGIN_NV04(push, NV30_3D(VIEWPORT_CLIP_HORIZ(0)), 2); 709fda9279dSmrg PUSH_DATA (push, (4095 << 16)); 710fda9279dSmrg PUSH_DATA (push, (4095 << 16)); 711fda9279dSmrg 712fda9279dSmrg BEGIN_NV04(push, NV30_3D(VP_UPLOAD_FROM_ID), 1); 713fda9279dSmrg PUSH_DATA (push, 0); 714fda9279dSmrg BEGIN_NV04(push, NV30_3D(VP_UPLOAD_INST(0)), 4); 715fda9279dSmrg PUSH_DATA (push, 0x401f9c6c); /* mov o[hpos], a[0] */ 716fda9279dSmrg PUSH_DATA (push, 0x0040000d); 717fda9279dSmrg PUSH_DATA (push, 0x8106c083); 718fda9279dSmrg PUSH_DATA (push, 0x6041ef80); 719fda9279dSmrg BEGIN_NV04(push, NV30_3D(VP_UPLOAD_INST(0)), 4); 720fda9279dSmrg PUSH_DATA (push, 0x00001c6c); /* mov r0.xyw, a[8].xyww */ 721fda9279dSmrg PUSH_DATA (push, 0x0040080f); 722fda9279dSmrg PUSH_DATA (push, 0x8106c083); 723fda9279dSmrg PUSH_DATA (push, 0x6041affc); 724fda9279dSmrg BEGIN_NV04(push, NV30_3D(VP_UPLOAD_INST(0)), 4); 725fda9279dSmrg PUSH_DATA (push, 0x00009c6c); /* dp3 r1.x, r0.xyw, c[0].xyz */ 726fda9279dSmrg PUSH_DATA (push, 0x0140000f); 727fda9279dSmrg PUSH_DATA (push, 0x808680c3); 728fda9279dSmrg PUSH_DATA (push, 0x60410ffc); 729fda9279dSmrg BEGIN_NV04(push, NV30_3D(VP_UPLOAD_INST(0)), 4); 730fda9279dSmrg PUSH_DATA (push, 0x00009c6c); /* dp3 r1.y, r0.xyw, c[1].xyz */ 731fda9279dSmrg PUSH_DATA (push, 0x0140100f); 732fda9279dSmrg PUSH_DATA (push, 0x808680c3); 733fda9279dSmrg PUSH_DATA (push, 0x60408ffc); 734fda9279dSmrg BEGIN_NV04(push, NV30_3D(VP_UPLOAD_INST(0)), 4); 735fda9279dSmrg PUSH_DATA (push, 0x00009c6c); /* dp3 r1.w, r0.xyw, c[2].xyz */ 736fda9279dSmrg PUSH_DATA (push, 0x0140200f); 737fda9279dSmrg PUSH_DATA (push, 0x808680c3); 738fda9279dSmrg PUSH_DATA (push, 0x60402ffc); 739fda9279dSmrg BEGIN_NV04(push, NV30_3D(VP_UPLOAD_INST(0)), 4); 740fda9279dSmrg PUSH_DATA (push, 0x401f9c6c); /* mul o[tex0].xyw, r1, c[3] */ 741fda9279dSmrg PUSH_DATA (push, 0x0080300d); 742fda9279dSmrg PUSH_DATA (push, 0x8286c0c3); 743fda9279dSmrg PUSH_DATA (push, 0x6041af9c); 744fda9279dSmrg BEGIN_NV04(push, NV30_3D(VP_UPLOAD_INST(0)), 4); 745fda9279dSmrg PUSH_DATA (push, 0x00001c6c); /* mov r0.xyw, a[9].xyww */ 746fda9279dSmrg PUSH_DATA (push, 0x0040090f); 747fda9279dSmrg PUSH_DATA (push, 0x8106c083); 748fda9279dSmrg PUSH_DATA (push, 0x6041affc); 749fda9279dSmrg BEGIN_NV04(push, NV30_3D(VP_UPLOAD_INST(0)), 4); 750fda9279dSmrg PUSH_DATA (push, 0x00009c6c); /* dp3 r1.x, r0.xyw, c[4].xyz */ 751fda9279dSmrg PUSH_DATA (push, 0x0140400f); 752fda9279dSmrg PUSH_DATA (push, 0x808680c3); 753fda9279dSmrg PUSH_DATA (push, 0x60410ffc); 754fda9279dSmrg BEGIN_NV04(push, NV30_3D(VP_UPLOAD_INST(0)), 4); 755fda9279dSmrg PUSH_DATA (push, 0x00009c6c); /* dp3 r1.y, r0.xyw, c[5].xyz */ 756fda9279dSmrg PUSH_DATA (push, 0x0140500f); 757fda9279dSmrg PUSH_DATA (push, 0x808680c3); 758fda9279dSmrg PUSH_DATA (push, 0x60408ffc); 759fda9279dSmrg BEGIN_NV04(push, NV30_3D(VP_UPLOAD_INST(0)), 4); 760fda9279dSmrg PUSH_DATA (push, 0x00009c6c); /* dp3 r1.w, r0.xyw, c[6].xyz */ 761fda9279dSmrg PUSH_DATA (push, 0x0140600f); 762fda9279dSmrg PUSH_DATA (push, 0x808680c3); 763fda9279dSmrg PUSH_DATA (push, 0x60402ffc); 764fda9279dSmrg BEGIN_NV04(push, NV30_3D(VP_UPLOAD_INST(0)), 4); 765fda9279dSmrg PUSH_DATA (push, 0x401f9c6c); /* exit mul o[tex1].xyw, r1, c[4] */ 766fda9279dSmrg PUSH_DATA (push, 0x0080700d); 767fda9279dSmrg PUSH_DATA (push, 0x8286c0c3); 768fda9279dSmrg PUSH_DATA (push, 0x6041afa1); 769fda9279dSmrg BEGIN_NV04(push, NV30_3D(VP_UPLOAD_INST(0)), 4); 770fda9279dSmrg PUSH_DATA (push, 0x00000000); /* exit */ 771fda9279dSmrg PUSH_DATA (push, 0x00000000); 772fda9279dSmrg PUSH_DATA (push, 0x00000000); 773fda9279dSmrg PUSH_DATA (push, 0x00000001); 774fda9279dSmrg BEGIN_NV04(push, NV30_3D(VP_START_FROM_ID), 1); 775fda9279dSmrg PUSH_DATA (push, 0); 776fda9279dSmrg BEGIN_NV04(push, NV40_3D(VP_ATTRIB_EN), 2); 777fda9279dSmrg PUSH_DATA (push, 0x00000309); 778fda9279dSmrg PUSH_DATA (push, 0x0000c001); 779fda9279dSmrg 780fda9279dSmrg PUSH_DATAu(push, pNv->scratch, PFP_PASS, 1 * 4); 781fda9279dSmrg PUSH_DATAs(push, 0x01403e81); /* mov r0, a[col0] */ 782fda9279dSmrg PUSH_DATAs(push, 0x1c9dc801); 783fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 784fda9279dSmrg PUSH_DATAs(push, 0x3fe1c800); 785fda9279dSmrg 786fda9279dSmrg PUSH_DATAu(push, pNv->scratch, PFP_S, 2 * 4); 787fda9279dSmrg PUSH_DATAs(push, 0x18009e00); /* txp r0, a[tex0], t[0] */ 788fda9279dSmrg PUSH_DATAs(push, 0x1c9dc801); 789fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 790fda9279dSmrg PUSH_DATAs(push, 0x3fe1c800); 791fda9279dSmrg PUSH_DATAs(push, 0x01401e81); /* mov r0, r0 */ 792fda9279dSmrg PUSH_DATAs(push, 0x1c9dc800); 793fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 794fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 795fda9279dSmrg 796fda9279dSmrg PUSH_DATAu(push, pNv->scratch, PFP_S_A8, 2 * 4); 797fda9279dSmrg PUSH_DATAs(push, 0x18009000); /* txp r0.w, a[tex0], t[0] */ 798fda9279dSmrg PUSH_DATAs(push, 0x1c9dc801); 799fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 800fda9279dSmrg PUSH_DATAs(push, 0x3fe1c800); 801fda9279dSmrg PUSH_DATAs(push, 0x01401e81); /* mov r0, r0.w */ 802fda9279dSmrg PUSH_DATAs(push, 0x1c9dfe00); 803fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 804fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 805fda9279dSmrg 806fda9279dSmrg PUSH_DATAu(push, pNv->scratch, PFP_C, 3 * 4); 807fda9279dSmrg PUSH_DATAs(push, 0x1802b102); /* txpc0 r1.w, a[tex1], t[1] */ 808fda9279dSmrg PUSH_DATAs(push, 0x1c9dc801); 809fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 810fda9279dSmrg PUSH_DATAs(push, 0x3fe1c800); 811fda9279dSmrg PUSH_DATAs(push, 0x18009e00); /* txp r0 (ne0.w), a[tex0], t[0] */ 812fda9279dSmrg PUSH_DATAs(push, 0x1ff5c801); 813fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 814fda9279dSmrg PUSH_DATAs(push, 0x3fe1c800); 815fda9279dSmrg PUSH_DATAs(push, 0x02001e81); /* mul r0, r0, r1.w */ 816fda9279dSmrg PUSH_DATAs(push, 0x1c9dc800); 817fda9279dSmrg PUSH_DATAs(push, 0x0001fe04); 818fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 819fda9279dSmrg 820fda9279dSmrg PUSH_DATAu(push, pNv->scratch, PFP_C_A8, 3 * 4); 821fda9279dSmrg PUSH_DATAs(push, 0x1802b102); /* txpc0 r1.w, a[tex1], t[1] */ 822fda9279dSmrg PUSH_DATAs(push, 0x1c9dc801); 823fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 824fda9279dSmrg PUSH_DATAs(push, 0x3fe1c800); 825fda9279dSmrg PUSH_DATAs(push, 0x18009000); /* txp r0.w (ne0.w), a[tex0], t[0] */ 826fda9279dSmrg PUSH_DATAs(push, 0x1ff5c801); 827fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 828fda9279dSmrg PUSH_DATAs(push, 0x3fe1c800); 829fda9279dSmrg PUSH_DATAs(push, 0x02001e81); /* mul r0, r0.w, r1.w */ 830fda9279dSmrg PUSH_DATAs(push, 0x1c9dfe00); 831fda9279dSmrg PUSH_DATAs(push, 0x0001fe04); 832fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 833fda9279dSmrg 834fda9279dSmrg PUSH_DATAu(push, pNv->scratch, PFP_CCA, 3 * 4); 835fda9279dSmrg PUSH_DATAs(push, 0x18009f00); /* txpc0 r0, a[tex0], t[0] */ 836fda9279dSmrg PUSH_DATAs(push, 0x1c9dc801); 837fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 838fda9279dSmrg PUSH_DATAs(push, 0x3fe1c800); 839fda9279dSmrg PUSH_DATAs(push, 0x1802be02); /* txp r1 (ne0), a[tex1], t[1] */ 840fda9279dSmrg PUSH_DATAs(push, 0x1c95c801); 841fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 842fda9279dSmrg PUSH_DATAs(push, 0x3fe1c800); 843fda9279dSmrg PUSH_DATAs(push, 0x02001e81); /* mul r0, r0, r1 */ 844fda9279dSmrg PUSH_DATAs(push, 0x1c9dc800); 845fda9279dSmrg PUSH_DATAs(push, 0x0001c804); 846fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 847fda9279dSmrg 848fda9279dSmrg PUSH_DATAu(push, pNv->scratch, PFP_CCASA, 3 * 4); 849fda9279dSmrg PUSH_DATAs(push, 0x18009102); /* txpc0 r1.w, a[tex0], t[0] */ 850fda9279dSmrg PUSH_DATAs(push, 0x1c9dc801); 851fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 852fda9279dSmrg PUSH_DATAs(push, 0x3fe1c800); 853fda9279dSmrg PUSH_DATAs(push, 0x1802be00); /* txp r0 (ne0.w), a[tex1], t[1] */ 854fda9279dSmrg PUSH_DATAs(push, 0x1ff5c801); 855fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 856fda9279dSmrg PUSH_DATAs(push, 0x3fe1c800); 857fda9279dSmrg PUSH_DATAs(push, 0x02001e81); /* mul r0, r1.w, r0 */ 858fda9279dSmrg PUSH_DATAs(push, 0x1c9dfe04); 859fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 860fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 861fda9279dSmrg 862fda9279dSmrg PUSH_DATAu(push, pNv->scratch, PFP_NV12_BILINEAR, 8 * 4); 863fda9279dSmrg PUSH_DATAs(push, 0x17028200); /* texr r0.x, a[tex0], t[1] */ 864fda9279dSmrg PUSH_DATAs(push, 0x1c9dc801); 865fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 866fda9279dSmrg PUSH_DATAs(push, 0x3fe1c800); 867fda9279dSmrg PUSH_DATAs(push, 0x04000e02); /* madr r1.xyz, r0.x, imm.x, imm.yzww */ 868fda9279dSmrg PUSH_DATAs(push, 0x1c9c0000); 869fda9279dSmrg PUSH_DATAs(push, 0x00000002); 870fda9279dSmrg PUSH_DATAs(push, 0x0001f202); 871fda9279dSmrg PUSH_DATAs(push, 0x3f9507c8); /* { 1.16, -0.87, 0.53, -1.08 } */ 872fda9279dSmrg PUSH_DATAs(push, 0xbf5ee393); 873fda9279dSmrg PUSH_DATAs(push, 0x3f078fef); 874fda9279dSmrg PUSH_DATAs(push, 0xbf8a6762); 875fda9279dSmrg PUSH_DATAs(push, 0x1704ac80); /* texr r0.yz, a[tex1], t[2] */ 876fda9279dSmrg PUSH_DATAs(push, 0x1c9dc801); 877fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 878fda9279dSmrg PUSH_DATAs(push, 0x3fe1c800); 879fda9279dSmrg PUSH_DATAs(push, 0x04000e02); /* madr r1.xyz, r0.y, imm, r1 */ 880fda9279dSmrg PUSH_DATAs(push, 0x1c9cab00); 881fda9279dSmrg PUSH_DATAs(push, 0x0001c802); 882fda9279dSmrg PUSH_DATAs(push, 0x0001c804); 883fda9279dSmrg PUSH_DATAs(push, 0x00000000); /* { 0.00, -0.39, 2.02, 0.00 } */ 884fda9279dSmrg PUSH_DATAs(push, 0xbec890d6); 885fda9279dSmrg PUSH_DATAs(push, 0x40011687); 886fda9279dSmrg PUSH_DATAs(push, 0x00000000); 887fda9279dSmrg PUSH_DATAs(push, 0x04000e81); /* madr r0.xyz, r0.z, imm, r1 */ 888fda9279dSmrg PUSH_DATAs(push, 0x1c9d5500); 889fda9279dSmrg PUSH_DATAs(push, 0x0001c802); 890fda9279dSmrg PUSH_DATAs(push, 0x0001c804); 891fda9279dSmrg PUSH_DATAs(push, 0x3fcc432d); /* { 1.60, -0.81, 0.00, 0.00 } */ 892fda9279dSmrg PUSH_DATAs(push, 0xbf501a37); 893fda9279dSmrg PUSH_DATAs(push, 0x00000000); 894fda9279dSmrg PUSH_DATAs(push, 0x00000000); 895fda9279dSmrg 896fda9279dSmrg 897fda9279dSmrg PUSH_DATAu(push, pNv->scratch, PFP_NV12_BICUBIC, 29 * 4); 898fda9279dSmrg PUSH_DATAs(push, 0x01008600); /* movr r0.xy, a[tex0] */ 899fda9279dSmrg PUSH_DATAs(push, 0x1c9dc801); 900fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 901fda9279dSmrg PUSH_DATAs(push, 0x3fe1c800); 902fda9279dSmrg PUSH_DATAs(push, 0x03000800); /* addr r0.z, r0.y, imm.x */ 903fda9279dSmrg PUSH_DATAs(push, 0x1c9caa00); 904fda9279dSmrg PUSH_DATAs(push, 0x00000002); 905fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 906fda9279dSmrg PUSH_DATAs(push, 0x3f000000); /* { 0.50, 0.00, 0.00, 0.00 } */ 907fda9279dSmrg PUSH_DATAs(push, 0x00000000); 908fda9279dSmrg PUSH_DATAs(push, 0x00000000); 909fda9279dSmrg PUSH_DATAs(push, 0x00000000); 910fda9279dSmrg PUSH_DATAs(push, 0x03000202); /* addr r1.x, r0, imm.x */ 911fda9279dSmrg PUSH_DATAs(push, 0x1c9dc800); 912fda9279dSmrg PUSH_DATAs(push, 0x00000002); 913fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 914fda9279dSmrg PUSH_DATAs(push, 0x3f000000); /* { 0.50, 0.00, 0.00, 0.00 } */ 915fda9279dSmrg PUSH_DATAs(push, 0x00000000); 916fda9279dSmrg PUSH_DATAs(push, 0x00000000); 917fda9279dSmrg PUSH_DATAs(push, 0x00000000); 918fda9279dSmrg PUSH_DATAs(push, 0x17000f82); /* texrc0 r1.xyz, r0.z, t[0] */ 919fda9279dSmrg PUSH_DATAs(push, 0x1c9d5400); 920fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 921fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 922fda9279dSmrg PUSH_DATAs(push, 0x02001404); /* mulr r2.yw, r1.xxyy, imm.xxyy */ 923fda9279dSmrg PUSH_DATAs(push, 0x1c9ca104); 924fda9279dSmrg PUSH_DATAs(push, 0x0000a002); 925fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 926fda9279dSmrg PUSH_DATAs(push, 0xbf800000); /* { -1.00, 1.00, 0.00, 0.00 } */ 927fda9279dSmrg PUSH_DATAs(push, 0x3f800000); 928fda9279dSmrg PUSH_DATAs(push, 0x00000000); 929fda9279dSmrg PUSH_DATAs(push, 0x00000000); 930fda9279dSmrg PUSH_DATAs(push, 0x17000e86); /* texr r3.xyz, r1, t[0] */ 931fda9279dSmrg PUSH_DATAs(push, 0x1c9dc804); 932fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 933fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 934fda9279dSmrg PUSH_DATAs(push, 0x02000a04); /* mulr r2.xz, r3.xxyy, imm.xxyy */ 935fda9279dSmrg PUSH_DATAs(push, 0x1c9ca10c); 936fda9279dSmrg PUSH_DATAs(push, 0x0000a002); 937fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 938fda9279dSmrg PUSH_DATAs(push, 0xbf800000); /* { -1.00, 1.00, 0.00, 0.00 } */ 939fda9279dSmrg PUSH_DATAs(push, 0x3f800000); 940fda9279dSmrg PUSH_DATAs(push, 0x00000000); 941fda9279dSmrg PUSH_DATAs(push, 0x00000000); 942fda9279dSmrg PUSH_DATAs(push, 0x03001e04); /* addr r2, r0.xyxy, r2 */ 943fda9279dSmrg PUSH_DATAs(push, 0x1c9c8800); 944fda9279dSmrg PUSH_DATAs(push, 0x0001c808); 945fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 946fda9279dSmrg PUSH_DATAs(push, 0x17020402); /* texr r1.y, r2.zwzz, -t[1] */ 947fda9279dSmrg PUSH_DATAs(push, 0x1c9d5c08); 948fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 949fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 950fda9279dSmrg PUSH_DATAs(push, 0x04400282); /* madh r1.x, -r1.z, r1.y, r1.y */ 951fda9279dSmrg PUSH_DATAs(push, 0x1c9f5504); 952fda9279dSmrg PUSH_DATAs(push, 0x0000aa04); 953fda9279dSmrg PUSH_DATAs(push, 0x0000aa04); 954fda9279dSmrg PUSH_DATAs(push, 0x17020400); /* texr r0.y, r2.xwxw, -t[1] */ 955fda9279dSmrg PUSH_DATAs(push, 0x1c9d9808); 956fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 957fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 958fda9279dSmrg PUSH_DATAs(push, 0x04401080); /* madh r0.w, -r1.z, r0.y, r0.y */ 959fda9279dSmrg PUSH_DATAs(push, 0x1c9f5504); 960fda9279dSmrg PUSH_DATAs(push, 0x0000aa00); 961fda9279dSmrg PUSH_DATAs(push, 0x0000aa00); 962fda9279dSmrg PUSH_DATAs(push, 0x17020200); /* texr r0.x, r2.zyxy, t[1] */ 963fda9279dSmrg PUSH_DATAs(push, 0x1c9c8c08); 964fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 965fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 966fda9279dSmrg PUSH_DATAs(push, 0x04400282); /* madh r1.x, r1.z, r0, r1 */ 967fda9279dSmrg PUSH_DATAs(push, 0x1c9d5504); 968fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 969fda9279dSmrg PUSH_DATAs(push, 0x0001c904); 970fda9279dSmrg PUSH_DATAs(push, 0x17020200); /* texr r0.x (NE0.z), r2, t[1] */ 971fda9279dSmrg PUSH_DATAs(push, 0x1555c808); 972fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 973fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 974fda9279dSmrg PUSH_DATAs(push, 0x04400280); /* madh r0.x, r1.z, r0, r0.w */ 975fda9279dSmrg PUSH_DATAs(push, 0x1c9d5504); 976fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 977fda9279dSmrg PUSH_DATAs(push, 0x0001ff00); 978fda9279dSmrg PUSH_DATAs(push, 0x04401080); /* madh r0.w, -r3.z, r1.x, r1.x */ 979fda9279dSmrg PUSH_DATAs(push, 0x1c9f550c); 980fda9279dSmrg PUSH_DATAs(push, 0x00000104); 981fda9279dSmrg PUSH_DATAs(push, 0x00000104); 982fda9279dSmrg PUSH_DATAs(push, 0x1704ac80); /* texr r0.yz, a[tex1], t[2] */ 983fda9279dSmrg PUSH_DATAs(push, 0x1c9dc801); 984fda9279dSmrg PUSH_DATAs(push, 0x0001c800); 985fda9279dSmrg PUSH_DATAs(push, 0x3fe1c800); 986fda9279dSmrg PUSH_DATAs(push, 0x04400280); /* madh r0.x, r3.z, r0, r0.w */ 987fda9279dSmrg PUSH_DATAs(push, 0x1c9d550c); 988fda9279dSmrg PUSH_DATAs(push, 0x0001c900); 989fda9279dSmrg PUSH_DATAs(push, 0x0001ff00); 990fda9279dSmrg PUSH_DATAs(push, 0x04400e82); /* madh r1.xyz, r0.x, imm.x, imm.yzww */ 991fda9279dSmrg PUSH_DATAs(push, 0x1c9c0100); 992fda9279dSmrg PUSH_DATAs(push, 0x00000002); 993fda9279dSmrg PUSH_DATAs(push, 0x0001f202); 994fda9279dSmrg PUSH_DATAs(push, 0x3f9507c8); /* { 1.16, -0.87, 0.53, -1.08 } */ 995fda9279dSmrg PUSH_DATAs(push, 0xbf5ee393); 996fda9279dSmrg PUSH_DATAs(push, 0x3f078fef); 997fda9279dSmrg PUSH_DATAs(push, 0xbf8a6762); 998fda9279dSmrg PUSH_DATAs(push, 0x04400e82); /* madh r1.xyz, r0.y, imm, r1 */ 999fda9279dSmrg PUSH_DATAs(push, 0x1c9cab00); 1000fda9279dSmrg PUSH_DATAs(push, 0x0001c802); 1001fda9279dSmrg PUSH_DATAs(push, 0x0001c904); 1002fda9279dSmrg PUSH_DATAs(push, 0x00000000); /* { 0.00, -0.39, 2.02, 0.00 } */ 1003fda9279dSmrg PUSH_DATAs(push, 0xbec890d6); 1004fda9279dSmrg PUSH_DATAs(push, 0x40011687); 1005fda9279dSmrg PUSH_DATAs(push, 0x00000000); 1006fda9279dSmrg PUSH_DATAs(push, 0x04400e81); /* madh r0.xyz, r0.z, imm, r1 */ 1007fda9279dSmrg PUSH_DATAs(push, 0x1c9d5500); 1008fda9279dSmrg PUSH_DATAs(push, 0x0001c802); 1009fda9279dSmrg PUSH_DATAs(push, 0x0001c904); 1010fda9279dSmrg PUSH_DATAs(push, 0x3fcc432d); /* { 1.60, -0.81, 0.00, 0.00 } */ 1011fda9279dSmrg PUSH_DATAs(push, 0xbf501a37); 1012fda9279dSmrg PUSH_DATAs(push, 0x00000000); 1013fda9279dSmrg PUSH_DATAs(push, 0x00000000); 1014fda9279dSmrg return TRUE; 1015fda9279dSmrg} 1016