5 #include "nv_include.h"
7 typedef struct nv10_exa_state {
11 PictTransformPtr transform;
16 static nv10_exa_state_t state;
18 static int NV10TexFormat(int ExaFormat)
20 struct {int exa;int hw;} tex_format[] =
22 {PICT_a8r8g8b8, NV10_TCL_PRIMITIVE_3D_TX_FORMAT_FORMAT_R8G8B8A8},
23 {PICT_a1r5g5b5, NV10_TCL_PRIMITIVE_3D_TX_FORMAT_FORMAT_R5G5B5A1},
24 {PICT_a4r4g4b4, NV10_TCL_PRIMITIVE_3D_TX_FORMAT_FORMAT_R4G4B4A4},
25 {PICT_a8, NV10_TCL_PRIMITIVE_3D_TX_FORMAT_FORMAT_A8_RECT}
26 // FIXME other formats
30 for(i=0;i<sizeof(tex_format)/sizeof(tex_format[0]);i++)
32 if(tex_format[i].exa==ExaFormat)
33 return tex_format[i].hw;
39 static int NV10DstFormat(int ExaFormat)
41 struct {int exa;int hw;} dst_format[] =
43 {PICT_a8r8g8b8, 0x108},
44 {PICT_x8r8g8b8, 0x108}, // FIXME that one might need more
46 // FIXME other formats
50 for(i=0;i<sizeof(dst_format)/sizeof(dst_format[0]);i++)
52 if(dst_format[i].exa==ExaFormat)
53 return dst_format[i].hw;
59 static Bool NV10CheckTexture(PicturePtr Picture)
61 int w = Picture->pDrawable->width;
62 int h = Picture->pDrawable->height;
64 if ((w > 2046) || (h>2046))
66 if (!NV10TexFormat(Picture->format))
68 if (Picture->filter != PictFilterNearest && Picture->filter != PictFilterBilinear)
70 if (Picture->repeat != RepeatNone)
75 static Bool NV10CheckBuffer(PicturePtr Picture)
77 int w = Picture->pDrawable->width;
78 int h = Picture->pDrawable->height;
80 if ((w > 4096) || (h>4096))
82 if (!NV10DstFormat(Picture->format))
87 static Bool NV10CheckComposite(int op,
88 PicturePtr pSrcPicture,
89 PicturePtr pMaskPicture,
90 PicturePtr pDstPicture)
92 // XXX A8 + A8 special case "TO BE DONE LATER"
93 /* if ((!pMaskPicture) &&
94 (pSrcPicture->format == PICT_a8) &&
95 (pDstPicture->format == PICT_a8) )
98 if (!NV10CheckBuffer(pDstPicture))
100 if (!NV10CheckTexture(pSrcPicture))
102 if ((pMaskPicture)&&(!NV10CheckTexture(pMaskPicture)))
108 static void NV10SetTexture(NVPtr pNv,int unit,PicturePtr Pict,PixmapPtr pixmap)
110 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_TX_OFFSET(unit), 1 );
111 NVDmaNext (pNv, NVAccelGetPixmapOffset(pixmap));
113 int log2w = (int)log2(Pict->pDrawable->width);
114 int log2h = (int)log2(Pict->pDrawable->height);
115 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_TX_FORMAT(unit), 1 );
116 NVDmaNext (pNv, (NV10_TCL_PRIMITIVE_3D_TX_FORMAT_WRAP_T_CLAMP_TO_EDGE<<28) |
117 (NV10_TCL_PRIMITIVE_3D_TX_FORMAT_WRAP_S_CLAMP_TO_EDGE<<24) |
120 (1<<12) | /* lod == 1 */
121 (1<<11) | /* enable NPOT */
122 (NV10TexFormat(Pict->format)<<7) |
126 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_TX_ENABLE(unit), 1 );
129 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_TX_NPOT_PITCH(unit), 1);
130 NVDmaNext (pNv, exaGetPixmapPitch(pixmap) << 16);
132 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_TX_NPOT_SIZE(unit), 1);
133 NVDmaNext (pNv, (Pict->pDrawable->width<<16) | Pict->pDrawable->height); /* FIXME alignment restrictions, should be even at least */
135 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_TX_FILTER(unit), 1);
136 if (Pict->filter == PictFilterNearest)
137 NVDmaNext (pNv, (NV10_TCL_PRIMITIVE_3D_TX_FILTER_MAG_FILTER_NEAREST<<28) |
138 (NV10_TCL_PRIMITIVE_3D_TX_FILTER_MIN_FILTER_NEAREST<<24));
140 NVDmaNext (pNv, (NV10_TCL_PRIMITIVE_3D_TX_FILTER_MAG_FILTER_LINEAR<<28) |
141 (NV10_TCL_PRIMITIVE_3D_TX_FILTER_MIN_FILTER_LINEAR<<24));
143 state.unit[unit].width = (float)pixmap->drawable.width;
144 state.unit[unit].height = (float)pixmap->drawable.height;
145 state.unit[unit].transform = Pict->transform;
148 static void NV10SetBuffer(NVPtr pNv,PicturePtr Pict,PixmapPtr pixmap)
151 int w = Pict->pDrawable->width;
152 int h = Pict->pDrawable->height;
154 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_BUFFER_FORMAT, 4);
155 NVDmaNext (pNv, NV10DstFormat(Pict->format));
156 NVDmaNext (pNv, ((uint32_t)exaGetPixmapPitch(pixmap) << 16) |(uint32_t)exaGetPixmapPitch(pixmap));
157 NVDmaNext (pNv, NVAccelGetPixmapOffset(pixmap));
159 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_VIEWPORT_HORIZ, 2);
160 NVDmaNext (pNv, (w<<16)|x);
161 NVDmaNext (pNv, (h<<16)|y);
162 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_VIEWPORT_CLIP_MODE, 1); /* clip_mode */
164 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_VIEWPORT_CLIP_HORIZ(0), 1);
165 NVDmaNext (pNv, ((w-1+x)<<16)|x|0x08000800);
166 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_VIEWPORT_CLIP_VERT(0), 1);
167 NVDmaNext (pNv, ((h-1+y)<<16)|y|0x08000800);
169 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_PROJECTION_MATRIX(0), 16);
172 NVDmaFloat(pNv, 1.0f);
174 NVDmaFloat(pNv, 0.0f);
176 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_DEPTH_RANGE_NEAR, 2);
179 NVDmaFloat (pNv, 16777216.0);
181 NVDmaFloat (pNv, 65536.0);
183 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_VIEWPORT_SCALE_X, 4);
184 NVDmaFloat (pNv, (w * 0.5) - 2048.0);
185 NVDmaFloat (pNv, (h * 0.5) - 2048.0);
187 NVDmaFloat (pNv, 16777215.0 * 0.5);
189 NVDmaFloat (pNv, 65535.0 * 0.5);
194 static void NV10SetPictOp(NVPtr pNv,int op)
196 struct {int src;int dst;} pictops[] =
198 {0x0000,0x0000}, // PictOpClear
199 {0x0001,0x0000}, // PictOpSrc
200 {0x0000,0x0001}, // PictOpDst
201 {0x0001,0x0303}, // PictOpOver
202 {0x0305,0x0001}, // PictOpOverReverse
203 {0x0304,0x0000}, // PictOpIn
204 {0x0000,0x0302}, // PictOpInReverse
205 {0x0305,0x0000}, // PictOpOut
206 {0x0000,0x0303}, // PictOpOutReverse
207 {0x0304,0x0303}, // PictOpAtop
208 {0x0305,0x0302}, // PictOpAtopReverse
209 {0x0305,0x0303}, // PictOpXor
210 {0x0001,0x0001}, // PictOpAdd
213 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_BLEND_FUNC_SRC, 2);
214 NVDmaNext (pNv, pictops[op].src);
215 NVDmaNext (pNv, pictops[op].dst);
218 static Bool NV10PrepareComposite(int op,
219 PicturePtr pSrcPicture,
220 PicturePtr pMaskPicture,
221 PicturePtr pDstPicture,
226 ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum];
227 NVPtr pNv = NVPTR(pScrn);
230 NV10SetBuffer(pNv,pDstPicture,pDst);
233 NV10SetTexture(pNv,0,pSrcPicture,pSrc);
235 /* Set mask format */
237 NV10SetTexture(pNv,1,pMaskPicture,pMask);
239 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_BEGIN_END, 1);
240 NVDmaNext (pNv, 8); /* GL_QUADS + 1 */
243 NV10SetPictOp(pNv, op);
245 state.have_mask=(pMaskPicture!=NULL);
249 static inline void NV10Vertex(NVPtr pNv,float vx,float vy,float tx,float ty)
251 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_VERTEX_TX0_2F_S, 2);
254 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_VERTEX_POS_3F_X, 3);
257 NVDmaFloat(pNv, 0.f);
260 static inline void NV10MVertex(NVPtr pNv,float vx,float vy,float t0x,float t0y,float t1x,float t1y)
262 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_VERTEX_TX0_2F_S, 2);
263 NVDmaFloat(pNv, t0x);
264 NVDmaFloat(pNv, t0y);
265 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_VERTEX_TX1_2F_S, 2);
266 NVDmaFloat(pNv, t1x);
267 NVDmaFloat(pNv, t1y);
268 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_VERTEX_POS_3F_X, 3);
271 NVDmaFloat(pNv, 0.f);
274 #define xFixedToFloat(v) \
275 ((float)xFixedToInt((v)) + ((float)xFixedFrac(v) / 65536.0))
278 NV10EXATransformCoord(PictTransformPtr t, int x, int y, float sx, float sy,
279 float *x_ret, float *y_ret)
284 v.vector[0] = IntToxFixed(x);
285 v.vector[1] = IntToxFixed(y);
286 v.vector[2] = xFixed1;
287 PictureTransformPoint(t, &v);
288 *x_ret = xFixedToFloat(v.vector[0]) / sx;
289 *y_ret = xFixedToFloat(v.vector[1]) / sy;
291 *x_ret = (float)x / sx;
292 *y_ret = (float)y / sy;
297 static void NV10Composite(PixmapPtr pDst,
307 ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum];
308 NVPtr pNv = NVPTR(pScrn);
309 float sX0, sX1, sY0, sY1;
310 float mX0, mX1, mY0, mY1;
312 NV10EXATransformCoord(state.unit[0].transform, srcX, srcY,
314 state.unit[0].height, &sX0, &sY0);
315 NV10EXATransformCoord(state.unit[0].transform,
316 srcX + width, srcY + height,
318 state.unit[0].height, &sX1, &sY1);
320 if (state.have_mask) {
321 NV10EXATransformCoord(state.unit[1].transform, maskX, maskY,
323 state.unit[1].height, &mX0, &mY0);
324 NV10EXATransformCoord(state.unit[1].transform,
325 maskX + width, maskY + height,
327 state.unit[1].height, &mX1, &mY1);
328 NV10MVertex(pNv , dstX , dstY,sX0 , sY0 , mX0 , mY0);
329 NV10MVertex(pNv , dstX + width , dstY,sX1 , sY0 , mX1 , mY0);
330 NV10MVertex(pNv , dstX + width , dstY + height,sX1 , sY1 , mX1 , mY1);
331 NV10MVertex(pNv , dstX , dstY + height,sX0 , sY1 , mX0 , mY1);
333 NV10Vertex(pNv , dstX , dstY , sX0 , sY0);
334 NV10Vertex(pNv , dstX + width , dstY , sX1 , sY0);
335 NV10Vertex(pNv , dstX + width , dstY + height , sX1 , sY1);
336 NV10Vertex(pNv , dstX , dstY + height , sX0 , sY1);
342 static void NV10DoneComposite (PixmapPtr pDst)
344 ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum];
345 NVPtr pNv = NVPTR(pScrn);
347 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_BEGIN_END, 1);
348 NVDmaNext (pNv, 0); /* STOP */
350 exaMarkSync(pDst->drawable.pScreen);
355 NVAccelInitNV10TCL(ScrnInfoPtr pScrn)
357 NVPtr pNv = NVPTR(pScrn);
358 static int have_object = FALSE;
359 uint32_t class = 0, chipset;
362 chipset = (nvReadMC(pNv, 0) >> 20) & 0xff;
363 if ( ((chipset & 0xf0) != NV_ARCH_10) &&
364 ((chipset & 0xf0) != NV_ARCH_20) )
368 class = NV11_TCL_PRIMITIVE_3D;
369 else if (chipset>=0x17)
370 class = NV17_TCL_PRIMITIVE_3D;
371 else if (chipset>=0x11)
372 class = NV11_TCL_PRIMITIVE_3D;
374 class = NV10_TCL_PRIMITIVE_3D;
377 if (!NVDmaCreateContextObject(pNv, Nv3D, class))
382 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_SET_DMA_NOTIFY, 1);
383 NVDmaNext (pNv, NvNullObject);
385 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_SET_DMA_IN_MEMORY0, 2);
386 NVDmaNext (pNv, NvDmaFB);
387 NVDmaNext (pNv, NvDmaTT);
389 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_SET_DMA_IN_MEMORY2, 2);
390 NVDmaNext (pNv, NvDmaFB);
391 NVDmaNext (pNv, NvDmaFB);
393 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_NOP, 1);
396 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_VIEWPORT_HORIZ, 2);
400 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_VIEWPORT_CLIP_HORIZ(0), 1);
401 NVDmaNext (pNv, (0x7ff<<16)|0x800);
402 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_VIEWPORT_CLIP_VERT(0), 1);
403 NVDmaNext (pNv, (0x7ff<<16)|0x800);
406 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_VIEWPORT_CLIP_HORIZ(i), 1);
408 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_VIEWPORT_CLIP_VERT(i), 1);
412 NVDmaStart(pNv, Nv3D, 0x290, 1);
413 NVDmaNext (pNv, (0x10<<16)|1);
414 NVDmaStart(pNv, Nv3D, 0x3f4, 1);
417 // NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_NOTIFY, 1);
418 // NVDmaNext (pNv, 0);
419 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_NOP, 1);
423 NVDmaStart(pNv, Nv3D, 0x120, 3);
428 NVDmaStart(pNv, NvImageBlit, 0x120, 3);
433 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_NOP, 1);
437 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_NOP, 1);
441 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_FOG_ENABLE, 1);
443 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_ALPHA_FUNC_ENABLE, 1);
445 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_ALPHA_FUNC_FUNC, 2);
446 NVDmaNext (pNv, 0x207);
448 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_TX_ENABLE(0), 2);
451 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_RC_IN_ALPHA(0), 12);
452 NVDmaNext (pNv, 0x30141010);
454 NVDmaNext (pNv, 0x20040000);
458 NVDmaNext (pNv, 0x00000c00);
460 NVDmaNext (pNv, 0x00000c00);
461 NVDmaNext (pNv, 0x18000000);
462 NVDmaNext (pNv, 0x300e0300);
463 NVDmaNext (pNv, 0x0c091c80);
464 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_BLEND_FUNC_ENABLE, 1);
466 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_DITHER_ENABLE, 2);
469 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_LINE_SMOOTH_ENABLE, 1);
471 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_VERTEX_WEIGHT_ENABLE, 2);
474 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_BLEND_FUNC_SRC, 4);
478 NVDmaNext (pNv, 0x8006);
479 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_STENCIL_MASK, 8);
480 NVDmaNext (pNv, 0xff);
481 NVDmaNext (pNv, 0x207);
483 NVDmaNext (pNv, 0xff);
484 NVDmaNext (pNv, 0x1e00);
485 NVDmaNext (pNv, 0x1e00);
486 NVDmaNext (pNv, 0x1e00);
487 NVDmaNext (pNv, 0x1d01);
488 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_NORMALIZE_ENABLE, 1);
490 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_FOG_ENABLE, 2);
493 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_LIGHT_MODEL, 1);
495 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_COLOR_CONTROL, 1);
497 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_ENABLED_LIGHTS, 1);
499 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_POLYGON_OFFSET_POINT_ENABLE, 3);
503 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_DEPTH_FUNC, 1);
504 NVDmaNext (pNv, 0x201);
505 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_DEPTH_WRITE_ENABLE, 1);
507 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_DEPTH_TEST_ENABLE, 1);
509 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_POLYGON_OFFSET_FACTOR, 2);
512 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_POINT_SIZE, 1);
514 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_POINT_PARAMETERS_ENABLE, 2);
517 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_LINE_WIDTH, 1);
519 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_LINE_SMOOTH_ENABLE, 1);
521 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_POLYGON_MODE_FRONT, 2);
522 NVDmaNext (pNv, 0x1b02);
523 NVDmaNext (pNv, 0x1b02);
524 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_CULL_FACE, 2);
525 NVDmaNext (pNv, 0x405);
526 NVDmaNext (pNv, 0x901);
527 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_POLYGON_SMOOTH_ENABLE, 1);
529 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_CULL_FACE_ENABLE, 1);
531 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_CLIP_PLANE_ENABLE(0), 8);
535 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_FOG_EQUATION_CONSTANT, 3);
536 NVDmaNext (pNv, 0x3fc00000); /* -1.50 */
537 NVDmaNext (pNv, 0xbdb8aa0a); /* -0.09 */
538 NVDmaNext (pNv, 0); /* 0.00 */
540 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_NOP, 1);
543 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_FOG_MODE, 2);
544 NVDmaNext (pNv, 0x802);
546 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_VIEW_MATRIX_ENABLE, 1);
548 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_COLOR_MASK, 1);
549 NVDmaNext (pNv, 0x01010101);
551 /* Set vertex component */
552 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_VERTEX_COL_4F_R, 4);
553 NVDmaFloat (pNv, 0.6);
554 NVDmaFloat (pNv, 0.4);
555 NVDmaFloat (pNv, 0.2);
556 NVDmaFloat (pNv, 1.0);
557 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_VERTEX_COL2_3F_R, 3);
561 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_VERTEX_NOR_3F_X, 3);
564 NVDmaFloat (pNv, 1.0);
565 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_VERTEX_TX0_4F_S, 4);
566 NVDmaFloat (pNv, 0.0);
567 NVDmaFloat (pNv, 0.0);
568 NVDmaFloat (pNv, 0.0);
569 NVDmaFloat (pNv, 1.0);
570 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_VERTEX_TX1_4F_S, 4);
571 NVDmaFloat (pNv, 0.0);
572 NVDmaFloat (pNv, 0.0);
573 NVDmaFloat (pNv, 0.0);
574 NVDmaFloat (pNv, 1.0);
575 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_VERTEX_FOG_1F, 1);
576 NVDmaFloat (pNv, 0.0);
577 NVDmaStart(pNv, Nv3D, NV10_TCL_PRIMITIVE_3D_EDGEFLAG_ENABLE, 1);