1
/* -*- mode: c; c-basic-offset: 3 -*-
3
* Copyright 2000 VA Linux Systems Inc., Fremont, California.
7
* Permission is hereby granted, free of charge, to any person obtaining a
8
* copy of this software and associated documentation files (the "Software"),
9
* to deal in the Software without restriction, including without limitation
10
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
11
* and/or sell copies of the Software, and to permit persons to whom the
12
* Software is furnished to do so, subject to the following conditions:
14
* The above copyright notice and this permission notice (including the next
15
* paragraph) shall be included in all copies or substantial portions of the
18
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21
* VA LINUX SYSTEMS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
22
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
23
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_state.c,v 1.7 2002/10/30 12:52:00 alanh Exp $ */
30
* Gareth Hughes <gareth@valinux.com>, 29 Sep - 1 Oct 2000
33
* Gareth Hughes <gareth@valinux.com>
34
* Brian Paul <brianp@valinux.com>
35
* Keith Whitwell <keith@tungstengraphics.com> (port to 3.5)
40
#include "texformat.h"
43
#include "swrast/swrast.h"
44
#include "array_cache/acache.h"
46
#include "tnl/t_pipeline.h"
47
#include "swrast_setup/swrast_setup.h"
49
#include "tdfx_context.h"
50
#include "tdfx_state.h"
53
#include "tdfx_texman.h"
54
#include "tdfx_texstate.h"
55
#include "tdfx_tris.h"
56
#include "tdfx_render.h"
60
/* =============================================================
64
static void tdfxUpdateAlphaMode( GLcontext *ctx )
66
tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
68
GrAlphaBlendFnc_t srcRGB, dstRGB, srcA, dstA;
69
GrAlpha_t ref = ctx->Color.AlphaRef;
71
if ( TDFX_DEBUG & DEBUG_VERBOSE_API ) {
72
fprintf( stderr, "%s()\n", __FUNCTION__ );
75
if ( ctx->Color.AlphaEnabled ) {
76
switch ( ctx->Color.AlphaFunc ) {
93
func = GR_CMP_GREATER;
96
func = GR_CMP_NOTEQUAL;
100
func = GR_CMP_ALWAYS;
104
func = GR_CMP_ALWAYS;
107
if ( ctx->Color.BlendEnabled
108
&& (fxMesa->Fallback & TDFX_FALLBACK_BLEND) == 0 ) {
109
switch ( ctx->Color.BlendSrcRGB ) {
111
srcRGB = GR_BLEND_ZERO;
114
srcRGB = GR_BLEND_ONE;
117
srcRGB = GR_BLEND_DST_COLOR;
119
case GL_ONE_MINUS_DST_COLOR:
120
srcRGB = GR_BLEND_ONE_MINUS_DST_COLOR;
123
srcRGB = GR_BLEND_SRC_ALPHA;
125
case GL_ONE_MINUS_SRC_ALPHA:
126
srcRGB = GR_BLEND_ONE_MINUS_SRC_ALPHA;
129
srcRGB = GR_BLEND_DST_ALPHA;
131
case GL_ONE_MINUS_DST_ALPHA:
132
srcRGB = GR_BLEND_ONE_MINUS_DST_ALPHA;
134
case GL_SRC_ALPHA_SATURATE:
135
srcRGB = GR_BLEND_ALPHA_SATURATE;
138
srcRGB = GR_BLEND_ONE;
141
switch ( ctx->Color.BlendSrcA ) {
143
srcA = GR_BLEND_ZERO;
149
srcA = GR_BLEND_DST_ALPHA; /* Napalm only */
151
case GL_ONE_MINUS_DST_COLOR:
152
srcA = GR_BLEND_ONE_MINUS_DST_ALPHA; /* Napalm only */
155
srcA = GR_BLEND_SRC_ALPHA; /* Napalm only */
157
case GL_ONE_MINUS_SRC_ALPHA:
158
srcA = GR_BLEND_ONE_MINUS_SRC_ALPHA; /* Napalm only */
161
srcA = GR_BLEND_DST_ALPHA; /* Napalm only */
163
case GL_ONE_MINUS_DST_ALPHA:
164
srcA = GR_BLEND_ONE_MINUS_DST_ALPHA; /* Napalm only */
166
case GL_SRC_ALPHA_SATURATE:
173
switch ( ctx->Color.BlendDstRGB ) {
175
dstRGB = GR_BLEND_ZERO;
178
dstRGB = GR_BLEND_ONE;
181
dstRGB = GR_BLEND_SRC_COLOR;
183
case GL_ONE_MINUS_SRC_COLOR:
184
dstRGB = GR_BLEND_ONE_MINUS_SRC_COLOR;
187
dstRGB = GR_BLEND_SRC_ALPHA;
189
case GL_ONE_MINUS_SRC_ALPHA:
190
dstRGB = GR_BLEND_ONE_MINUS_SRC_ALPHA;
193
dstRGB = GR_BLEND_DST_ALPHA;
195
case GL_ONE_MINUS_DST_ALPHA:
196
dstRGB = GR_BLEND_ONE_MINUS_DST_ALPHA;
199
dstRGB = GR_BLEND_ZERO;
202
switch ( ctx->Color.BlendDstA ) {
204
dstA = GR_BLEND_ZERO;
210
dstA = GR_BLEND_SRC_ALPHA; /* Napalm only */
212
case GL_ONE_MINUS_SRC_COLOR:
213
dstA = GR_BLEND_ONE_MINUS_SRC_ALPHA; /* Napalm only */
216
dstA = GR_BLEND_SRC_ALPHA; /* Napalm only */
218
case GL_ONE_MINUS_SRC_ALPHA:
219
dstA = GR_BLEND_ONE_MINUS_SRC_ALPHA; /* Napalm only */
222
dstA = GR_BLEND_DST_ALPHA; /* Napalm only */
224
case GL_ONE_MINUS_DST_ALPHA:
225
dstA = GR_BLEND_ONE_MINUS_DST_ALPHA; /* Napalm only */
228
dstA = GR_BLEND_ZERO;
232
srcRGB = GR_BLEND_ONE;
233
dstRGB = GR_BLEND_ZERO;
235
dstA = GR_BLEND_ZERO;
238
if ( fxMesa->Color.AlphaFunc != func ) {
239
fxMesa->Color.AlphaFunc = func;
240
fxMesa->dirty |= TDFX_UPLOAD_ALPHA_TEST;
242
if ( fxMesa->Color.AlphaRef != ref ) {
243
fxMesa->Color.AlphaRef = ref;
244
fxMesa->dirty |= TDFX_UPLOAD_ALPHA_REF;
247
if ( fxMesa->Color.BlendSrcRGB != srcRGB ||
248
fxMesa->Color.BlendDstRGB != dstRGB ||
249
fxMesa->Color.BlendSrcA != srcA ||
250
fxMesa->Color.BlendDstA != dstA )
252
fxMesa->Color.BlendSrcRGB = srcRGB;
253
fxMesa->Color.BlendDstRGB = dstRGB;
254
fxMesa->Color.BlendSrcA = srcA;
255
fxMesa->Color.BlendDstA = dstA;
256
fxMesa->dirty |= TDFX_UPLOAD_BLEND_FUNC;
260
static void tdfxDDAlphaFunc( GLcontext *ctx, GLenum func, GLchan ref )
262
tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
264
FLUSH_BATCH( fxMesa );
265
fxMesa->new_state |= TDFX_NEW_ALPHA;
268
static void tdfxDDBlendEquation( GLcontext *ctx, GLenum mode )
270
tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
272
FLUSH_BATCH( fxMesa );
273
fxMesa->new_state |= TDFX_NEW_ALPHA;
276
static void tdfxDDBlendFunc( GLcontext *ctx, GLenum sfactor, GLenum dfactor )
278
tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
280
FLUSH_BATCH( fxMesa );
281
fxMesa->new_state |= TDFX_NEW_ALPHA;
284
* XXX - Voodoo5 seems to suffer from precision problems in some
285
* blend modes. To pass all the conformance tests we'd have to
286
* fall back to software for many modes. Revisit someday.
290
static void tdfxDDBlendFuncSeparate( GLcontext *ctx,
291
GLenum sfactorRGB, GLenum dfactorRGB,
292
GLenum sfactorA, GLenum dfactorA )
294
tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
296
FLUSH_BATCH( fxMesa );
297
fxMesa->new_state |= TDFX_NEW_ALPHA;
300
/* =============================================================
304
void tdfxUpdateStipple( GLcontext *ctx )
306
tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
307
GrStippleMode_t mode = GR_STIPPLE_DISABLE;
309
if ( TDFX_DEBUG & DEBUG_VERBOSE_API ) {
310
fprintf( stderr, "%s()\n", __FUNCTION__ );
313
FLUSH_BATCH( fxMesa );
315
if (ctx->Polygon.StippleFlag) {
316
mode = GR_STIPPLE_PATTERN;
319
if ( fxMesa->Stipple.Mode != mode ) {
320
fxMesa->Stipple.Mode = mode;
321
fxMesa->dirty |= TDFX_UPLOAD_STIPPLE;
326
/* =============================================================
330
static void tdfxUpdateZMode( GLcontext *ctx )
332
tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
337
if ( TDFX_DEBUG & DEBUG_VERBOSE_API )
338
fprintf( stderr, "%s()\n", __FUNCTION__ );
341
bias = (FxI32) (ctx->Polygon.OffsetUnits * TDFX_DEPTH_BIAS_SCALE);
343
if ( ctx->Depth.Test ) {
344
switch ( ctx->Depth.Func ) {
352
func = GR_CMP_LEQUAL;
358
func = GR_CMP_GEQUAL;
361
func = GR_CMP_GREATER;
364
func = GR_CMP_NOTEQUAL;
368
func = GR_CMP_ALWAYS;
372
if ( ctx->Depth.Mask ) {
380
/* depth testing disabled */
381
func = GR_CMP_ALWAYS; /* fragments always pass */
382
mask = FXFALSE; /* zbuffer is not touched */
385
fxMesa->Depth.Clear = (FxU32) (((1 << fxMesa->glCtx->Visual.depthBits) - 1)
388
if ( fxMesa->Depth.Bias != bias ) {
389
fxMesa->Depth.Bias = bias;
390
fxMesa->dirty |= TDFX_UPLOAD_DEPTH_BIAS;
392
if ( fxMesa->Depth.Func != func ) {
393
fxMesa->Depth.Func = func;
394
fxMesa->dirty |= TDFX_UPLOAD_DEPTH_FUNC | TDFX_UPLOAD_DEPTH_MASK;
396
if ( fxMesa->Depth.Mask != mask ) {
397
fxMesa->Depth.Mask = mask;
398
fxMesa->dirty |= TDFX_UPLOAD_DEPTH_MASK;
402
static void tdfxDDDepthFunc( GLcontext *ctx, GLenum func )
404
tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
406
FLUSH_BATCH( fxMesa );
407
fxMesa->new_state |= TDFX_NEW_DEPTH;
410
static void tdfxDDDepthMask( GLcontext *ctx, GLboolean flag )
412
tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
414
FLUSH_BATCH( fxMesa );
415
fxMesa->new_state |= TDFX_NEW_DEPTH;
418
static void tdfxDDClearDepth( GLcontext *ctx, GLclampd d )
420
tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
422
FLUSH_BATCH( fxMesa );
423
fxMesa->new_state |= TDFX_NEW_DEPTH;
428
/* =============================================================
433
/* Evaluate all stencil state and make the Glide calls.
435
static GrStencil_t convertGLStencilOp( GLenum op )
439
return GR_STENCILOP_KEEP;
441
return GR_STENCILOP_ZERO;
443
return GR_STENCILOP_REPLACE;
445
return GR_STENCILOP_INCR_CLAMP;
447
return GR_STENCILOP_DECR_CLAMP;
449
return GR_STENCILOP_INVERT;
450
case GL_INCR_WRAP_EXT:
451
return GR_STENCILOP_INCR_WRAP;
452
case GL_DECR_WRAP_EXT:
453
return GR_STENCILOP_DECR_WRAP;
455
_mesa_problem( NULL, "bad stencil op in convertGLStencilOp" );
457
return GR_STENCILOP_KEEP; /* never get, silence compiler warning */
461
static void tdfxUpdateStencil( GLcontext *ctx )
463
tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
465
if ( TDFX_DEBUG & DEBUG_VERBOSE_API ) {
466
fprintf( stderr, "%s()\n", __FUNCTION__ );
469
if (fxMesa->haveHwStencil) {
470
if (ctx->Stencil.Enabled) {
471
fxMesa->Stencil.Function = ctx->Stencil.Function - GL_NEVER;
472
fxMesa->Stencil.RefValue = ctx->Stencil.Ref;
473
fxMesa->Stencil.ValueMask = ctx->Stencil.ValueMask;
474
fxMesa->Stencil.WriteMask = ctx->Stencil.WriteMask;
475
fxMesa->Stencil.FailFunc = convertGLStencilOp(ctx->Stencil.FailFunc);
476
fxMesa->Stencil.ZFailFunc =convertGLStencilOp(ctx->Stencil.ZFailFunc);
477
fxMesa->Stencil.ZPassFunc =convertGLStencilOp(ctx->Stencil.ZPassFunc);
478
fxMesa->Stencil.Clear = ctx->Stencil.Clear & 0xff;
480
fxMesa->dirty |= TDFX_UPLOAD_STENCIL;
485
static void tdfxDDStencilFunc( GLcontext *ctx, GLenum func,
486
GLint ref, GLuint mask )
488
tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
490
FLUSH_BATCH( fxMesa );
491
fxMesa->new_state |= TDFX_NEW_STENCIL;
494
static void tdfxDDStencilMask( GLcontext *ctx, GLuint mask )
496
tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
498
FLUSH_BATCH( fxMesa );
499
fxMesa->new_state |= TDFX_NEW_STENCIL;
502
static void tdfxDDStencilOp( GLcontext *ctx, GLenum sfail,
503
GLenum zfail, GLenum zpass )
505
tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
507
FLUSH_BATCH( fxMesa );
508
fxMesa->new_state |= TDFX_NEW_STENCIL;
512
/* =============================================================
513
* Fog - orthographic fog still not working
516
static void tdfxUpdateFogAttrib( GLcontext *ctx )
518
tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
522
if ( TDFX_DEBUG & DEBUG_VERBOSE_API ) {
523
fprintf( stderr, "%s()\n", __FUNCTION__ );
526
if ( ctx->Fog.Enabled ) {
527
mode = GR_FOG_WITH_TABLE_ON_Q;
529
mode = GR_FOG_DISABLE;
532
color = TDFXPACKCOLOR888((GLubyte)(ctx->Fog.Color[0]*255.0F),
533
(GLubyte)(ctx->Fog.Color[1]*255.0F),
534
(GLubyte)(ctx->Fog.Color[2]*255.0F));
536
if ( fxMesa->Fog.Mode != mode ) {
537
fxMesa->Fog.Mode = mode;
538
fxMesa->dirty |= TDFX_UPLOAD_FOG_MODE;
540
if ( fxMesa->Fog.Color != color ) {
541
fxMesa->Fog.Color = color;
542
fxMesa->dirty |= TDFX_UPLOAD_FOG_COLOR;
544
if ( fxMesa->Fog.TableMode != ctx->Fog.Mode ||
545
fxMesa->Fog.Density != ctx->Fog.Density ||
546
fxMesa->Fog.Near != ctx->Fog.Start ||
547
fxMesa->Fog.Far != ctx->Fog.End )
549
switch( ctx->Fog.Mode ) {
551
fxMesa->Glide.guFogGenerateExp( fxMesa->Fog.Table, ctx->Fog.Density );
554
fxMesa->Glide.guFogGenerateExp2( fxMesa->Fog.Table, ctx->Fog.Density);
557
fxMesa->Glide.guFogGenerateLinear( fxMesa->Fog.Table,
558
ctx->Fog.Start, ctx->Fog.End );
562
fxMesa->Fog.TableMode = ctx->Fog.Mode;
563
fxMesa->Fog.Density = ctx->Fog.Density;
564
fxMesa->Fog.Near = ctx->Fog.Start;
565
fxMesa->Fog.Far = ctx->Fog.End;
566
fxMesa->dirty |= TDFX_UPLOAD_FOG_TABLE;
570
static void tdfxDDFogfv( GLcontext *ctx, GLenum pname, const GLfloat *param )
572
tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
574
FLUSH_BATCH( fxMesa );
575
fxMesa->new_state |= TDFX_NEW_FOG;
579
/* =============================================================
583
static int intersect_rect( XF86DRIClipRectPtr out,
584
const XF86DRIClipRectPtr a,
585
const XF86DRIClipRectPtr b)
588
if (b->x1 > out->x1) out->x1 = b->x1;
589
if (b->y1 > out->y1) out->y1 = b->y1;
590
if (b->x2 < out->x2) out->x2 = b->x2;
591
if (b->y2 < out->y2) out->y2 = b->y2;
592
if (out->x1 >= out->x2) return 0;
593
if (out->y1 >= out->y2) return 0;
599
* Examine XF86 cliprect list and scissor state to recompute our
602
void tdfxUpdateClipping( GLcontext *ctx )
604
tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
605
__DRIdrawablePrivate *dPriv = fxMesa->driDrawable;
607
if ( TDFX_DEBUG & DEBUG_VERBOSE_API ) {
608
fprintf( stderr, "%s()\n", __FUNCTION__ );
615
if ( dPriv->x != fxMesa->x_offset || dPriv->y != fxMesa->y_offset ||
616
dPriv->w != fxMesa->width || dPriv->h != fxMesa->height ) {
617
fxMesa->x_offset = dPriv->x;
618
fxMesa->y_offset = dPriv->y;
619
fxMesa->width = dPriv->w;
620
fxMesa->height = dPriv->h;
622
fxMesa->screen_height - fxMesa->y_offset - fxMesa->height;
623
tdfxUpdateViewport( ctx );
626
if (fxMesa->scissoredClipRects && fxMesa->pClipRects) {
627
free(fxMesa->pClipRects);
630
if (ctx->Scissor.Enabled) {
631
/* intersect OpenGL scissor box with all cliprects to make a new
634
XF86DRIClipRectRec scissor;
635
int x1 = ctx->Scissor.X + fxMesa->x_offset;
636
int y1 = fxMesa->screen_height - fxMesa->y_delta
637
- ctx->Scissor.Y - ctx->Scissor.Height;
638
int x2 = x1 + ctx->Scissor.Width;
639
int y2 = y1 + ctx->Scissor.Height;
640
scissor.x1 = MAX2(x1, 0);
641
scissor.y1 = MAX2(y1, 0);
642
scissor.x2 = MAX2(x2, 0);
643
scissor.y2 = MAX2(y2, 0);
645
assert(scissor.x2 >= scissor.x1);
646
assert(scissor.y2 >= scissor.y1);
648
fxMesa->pClipRects = malloc(dPriv->numClipRects
649
* sizeof(XF86DRIClipRectRec));
650
if (fxMesa->pClipRects) {
652
fxMesa->numClipRects = 0;
653
for (i = 0; i < dPriv->numClipRects; i++) {
654
if (intersect_rect(&fxMesa->pClipRects[fxMesa->numClipRects],
655
&scissor, &dPriv->pClipRects[i])) {
656
fxMesa->numClipRects++;
659
fxMesa->scissoredClipRects = GL_TRUE;
662
/* out of memory, forgo scissor */
663
fxMesa->numClipRects = dPriv->numClipRects;
664
fxMesa->pClipRects = dPriv->pClipRects;
665
fxMesa->scissoredClipRects = GL_FALSE;
669
fxMesa->numClipRects = dPriv->numClipRects;
670
fxMesa->pClipRects = dPriv->pClipRects;
671
fxMesa->scissoredClipRects = GL_FALSE;
674
fxMesa->dirty |= TDFX_UPLOAD_CLIP;
679
/* =============================================================
683
void tdfxUpdateCull( GLcontext *ctx )
685
tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
686
GrCullMode_t mode = GR_CULL_DISABLE;
688
/* KW: don't need to check raster_primitive here as we don't
689
* attempt to draw lines or points with triangles.
691
if ( ctx->Polygon.CullFlag ) {
692
switch ( ctx->Polygon.CullFaceMode ) {
694
if ( ctx->Polygon.FrontFace == GL_CCW ) {
695
mode = GR_CULL_POSITIVE;
697
mode = GR_CULL_NEGATIVE;
702
if ( ctx->Polygon.FrontFace == GL_CCW ) {
703
mode = GR_CULL_NEGATIVE;
705
mode = GR_CULL_POSITIVE;
709
case GL_FRONT_AND_BACK:
710
/* Handled as a fallback on triangles in tdfx_tris.c */
719
if ( fxMesa->CullMode != mode ) {
720
fxMesa->CullMode = mode;
721
fxMesa->dirty |= TDFX_UPLOAD_CULL;
725
static void tdfxDDCullFace( GLcontext *ctx, GLenum mode )
727
tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
729
FLUSH_BATCH( fxMesa );
730
fxMesa->new_state |= TDFX_NEW_CULL;
733
static void tdfxDDFrontFace( GLcontext *ctx, GLenum mode )
735
tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
737
FLUSH_BATCH( fxMesa );
738
fxMesa->new_state |= TDFX_NEW_CULL;
742
/* =============================================================
746
static void tdfxUpdateLine( GLcontext *ctx )
748
tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
750
if ( TDFX_DEBUG & DEBUG_VERBOSE_API ) {
751
fprintf( stderr, "%s()\n", __FUNCTION__ );
754
FLUSH_BATCH( fxMesa );
755
fxMesa->dirty |= TDFX_UPLOAD_LINE;
759
static void tdfxDDLineWidth( GLcontext *ctx, GLfloat width )
761
tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
762
FLUSH_BATCH( fxMesa );
763
fxMesa->new_state |= TDFX_NEW_LINE;
767
/* =============================================================
771
static void tdfxDDColorMask( GLcontext *ctx,
772
GLboolean r, GLboolean g,
773
GLboolean b, GLboolean a )
775
tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
777
FLUSH_BATCH( fxMesa );
779
if ( fxMesa->Color.ColorMask[RCOMP] != r ||
780
fxMesa->Color.ColorMask[GCOMP] != g ||
781
fxMesa->Color.ColorMask[BCOMP] != b ||
782
fxMesa->Color.ColorMask[ACOMP] != a ) {
783
fxMesa->Color.ColorMask[RCOMP] = r;
784
fxMesa->Color.ColorMask[GCOMP] = g;
785
fxMesa->Color.ColorMask[BCOMP] = b;
786
fxMesa->Color.ColorMask[ACOMP] = a;
787
fxMesa->dirty |= TDFX_UPLOAD_COLOR_MASK;
789
if (ctx->Visual.redBits < 8) {
790
/* Can't do RGB colormasking in 16bpp mode. */
791
/* We can completely ignore the alpha mask. */
792
FALLBACK( fxMesa, TDFX_FALLBACK_COLORMASK, (r != g || g != b) );
798
static void tdfxDDClearColor( GLcontext *ctx,
799
const GLchan color[4] )
801
tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
802
FLUSH_BATCH( fxMesa );
803
fxMesa->Color.ClearColor = TDFXPACKCOLOR888( color[0], color[1], color[2] );
804
fxMesa->Color.ClearAlpha = color[3];
808
/* =============================================================
812
static void tdfxDDLightModelfv( GLcontext *ctx, GLenum pname,
813
const GLfloat *param )
815
tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
817
if ( pname == GL_LIGHT_MODEL_COLOR_CONTROL ) {
818
FALLBACK( fxMesa, TDFX_FALLBACK_SPECULAR,
819
(ctx->Light.Enabled &&
820
ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR ));
824
static void tdfxDDShadeModel( GLcontext *ctx, GLenum mode )
826
tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
828
/* FIXME: Can we implement native flat shading? */
829
FLUSH_BATCH( fxMesa );
830
fxMesa->new_state |= TDFX_NEW_TEXTURE;
834
/* =============================================================
839
tdfxDDScissor(GLcontext * ctx, GLint x, GLint y, GLsizei w, GLsizei h)
841
tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
842
FLUSH_BATCH( fxMesa );
843
fxMesa->new_state |= TDFX_NEW_CLIP;
846
/* =============================================================
850
static void tdfxUpdateRenderAttrib( GLcontext *ctx )
852
tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
853
FLUSH_BATCH( fxMesa );
854
fxMesa->dirty |= TDFX_UPLOAD_RENDER_BUFFER;
857
/* =============================================================
861
void tdfxUpdateViewport( GLcontext *ctx )
863
tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
864
const GLfloat *v = ctx->Viewport._WindowMap.m;
865
GLfloat *m = fxMesa->hw_viewport;
867
m[MAT_SX] = v[MAT_SX];
868
m[MAT_TX] = v[MAT_TX] + fxMesa->x_offset + TRI_X_OFFSET;
869
m[MAT_SY] = v[MAT_SY];
870
m[MAT_TY] = v[MAT_TY] + fxMesa->y_delta + TRI_Y_OFFSET;
871
m[MAT_SZ] = v[MAT_SZ];
872
m[MAT_TZ] = v[MAT_TZ];
874
fxMesa->SetupNewInputs |= VERT_CLIP;
878
static void tdfxDDViewport( GLcontext *ctx, GLint x, GLint y,
879
GLsizei w, GLsizei h )
881
tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
882
FLUSH_BATCH( fxMesa );
883
fxMesa->new_state |= TDFX_NEW_VIEWPORT;
887
static void tdfxDDDepthRange( GLcontext *ctx, GLclampd nearVal, GLclampd farVal )
889
tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
890
FLUSH_BATCH( fxMesa );
891
fxMesa->new_state |= TDFX_NEW_VIEWPORT;
895
/* =============================================================
896
* State enable/disable
899
static void tdfxDDEnable( GLcontext *ctx, GLenum cap, GLboolean state )
901
tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx );
905
FLUSH_BATCH( fxMesa );
906
fxMesa->new_state |= TDFX_NEW_ALPHA;
910
FLUSH_BATCH( fxMesa );
911
fxMesa->new_state |= TDFX_NEW_ALPHA;
912
FALLBACK( fxMesa, TDFX_FALLBACK_LOGICOP,
913
(ctx->Color.ColorLogicOpEnabled &&
914
ctx->Color.LogicOp != GL_COPY));
918
FLUSH_BATCH( fxMesa );
919
fxMesa->new_state |= TDFX_NEW_CULL;
923
FLUSH_BATCH( fxMesa );
924
fxMesa->new_state |= TDFX_NEW_DEPTH;
928
FLUSH_BATCH( fxMesa );
930
fxMesa->Color.Dither = GR_DITHER_2x2;
932
fxMesa->Color.Dither = GR_DITHER_DISABLE;
934
fxMesa->dirty |= TDFX_UPLOAD_DITHER;
938
FLUSH_BATCH( fxMesa );
939
fxMesa->new_state |= TDFX_NEW_FOG;
942
case GL_COLOR_LOGIC_OP:
943
FALLBACK( fxMesa, TDFX_FALLBACK_LOGICOP,
944
(ctx->Color.ColorLogicOpEnabled &&
945
ctx->Color.LogicOp != GL_COPY));
949
FALLBACK( fxMesa, TDFX_FALLBACK_SPECULAR,
950
(ctx->Light.Enabled &&
951
ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR ));
955
FLUSH_BATCH( fxMesa );
956
fxMesa->new_state |= TDFX_NEW_LINE;
959
case GL_LINE_STIPPLE:
960
FALLBACK(fxMesa, TDFX_FALLBACK_LINE_STIPPLE, state);
963
case GL_POLYGON_STIPPLE:
965
fxMesa->new_state |= TDFX_NEW_STIPPLE;
968
case GL_SCISSOR_TEST:
969
FLUSH_BATCH( fxMesa );
970
fxMesa->new_state |= TDFX_NEW_CLIP;
973
case GL_STENCIL_TEST:
974
FLUSH_BATCH( fxMesa );
975
FALLBACK( fxMesa, TDFX_FALLBACK_STENCIL, state && !fxMesa->haveHwStencil);
980
FLUSH_BATCH( fxMesa );
981
FALLBACK( fxMesa, TDFX_FALLBACK_TEXTURE_1D_3D, state); /* wrong */
982
fxMesa->new_state |= TDFX_NEW_TEXTURE;
986
FLUSH_BATCH( fxMesa );
987
fxMesa->new_state |= TDFX_NEW_TEXTURE;
997
/* Set the buffer used for drawing */
998
/* XXX support for separate read/draw buffers hasn't been tested */
999
static void tdfxDDSetDrawBuffer( GLcontext *ctx, GLenum mode )
1001
tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
1003
if ( TDFX_DEBUG & DEBUG_VERBOSE_API ) {
1004
fprintf( stderr, "%s()\n", __FUNCTION__ );
1007
FLUSH_BATCH( fxMesa );
1011
fxMesa->DrawBuffer = fxMesa->ReadBuffer = GR_BUFFER_FRONTBUFFER;
1012
fxMesa->new_state |= TDFX_NEW_RENDER;
1013
FALLBACK( fxMesa, TDFX_FALLBACK_DRAW_BUFFER, GL_FALSE );
1017
fxMesa->DrawBuffer = fxMesa->ReadBuffer = GR_BUFFER_BACKBUFFER;
1018
fxMesa->new_state |= TDFX_NEW_RENDER;
1019
FALLBACK( fxMesa, TDFX_FALLBACK_DRAW_BUFFER, GL_FALSE );
1023
FX_grColorMaskv( ctx, false4 );
1024
FALLBACK( fxMesa, TDFX_FALLBACK_DRAW_BUFFER, GL_FALSE );
1028
FALLBACK( fxMesa, TDFX_FALLBACK_DRAW_BUFFER, GL_TRUE );
1035
/* =============================================================
1039
static void tdfxDDPolygonStipple( GLcontext *ctx, const GLubyte *mask )
1041
tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
1042
const GLubyte *m = mask;
1045
GLboolean allBitsSet;
1047
/* int active = (ctx->Polygon.StippleFlag && */
1048
/* fxMesa->reduced_prim == GL_TRIANGLES); */
1050
FLUSH_BATCH(fxMesa);
1051
fxMesa->Stipple.Pattern = 0xffffffff;
1052
fxMesa->dirty |= TDFX_UPLOAD_STIPPLE;
1053
fxMesa->new_state |= TDFX_NEW_STIPPLE;
1055
/* Check if the stipple pattern is fully opaque. If so, use software
1056
* rendering. This basically a trick to make sure the OpenGL conformance
1059
allBitsSet = GL_TRUE;
1060
for (i = 0; i < 32; i++) {
1061
if (((GLuint *) mask)[i] != 0xffffffff) {
1062
allBitsSet = GL_FALSE;
1067
fxMesa->haveHwStipple = GL_FALSE;
1076
for (k = 0 ; k < 8 ; k++)
1077
for (j = 0 ; j < 4; j++)
1078
for (i = 0 ; i < 4 ; i++,m++) {
1080
fxMesa->haveHwStipple = GL_FALSE;
1085
fxMesa->haveHwStipple = GL_TRUE;
1086
fxMesa->Stipple.Pattern = ( (q[0] << 0) |
1094
static void tdfxDDRenderMode( GLcontext *ctx, GLenum mode )
1096
tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
1097
FALLBACK( fxMesa, TDFX_FALLBACK_RENDER_MODE, (mode != GL_RENDER) );
1102
static void tdfxDDPrintState( const char *msg, GLuint flags )
1105
"%s: (0x%x) %s%s%s%s%s%s%s%s%s%s%s%s%s\n",
1108
(flags & TDFX_NEW_COLOR) ? "color, " : "",
1109
(flags & TDFX_NEW_ALPHA) ? "alpha, " : "",
1110
(flags & TDFX_NEW_DEPTH) ? "depth, " : "",
1111
(flags & TDFX_NEW_RENDER) ? "render, " : "",
1112
(flags & TDFX_NEW_FOG) ? "fog, " : "",
1113
(flags & TDFX_NEW_STENCIL) ? "stencil, " : "",
1114
(flags & TDFX_NEW_STIPPLE) ? "stipple, " : "",
1115
(flags & TDFX_NEW_CLIP) ? "clip, " : "",
1116
(flags & TDFX_NEW_VIEWPORT) ? "viewport, " : "",
1117
(flags & TDFX_NEW_CULL) ? "cull, " : "",
1118
(flags & TDFX_NEW_GLIDE) ? "glide, " : "",
1119
(flags & TDFX_NEW_TEXTURE) ? "texture, " : "",
1120
(flags & TDFX_NEW_CONTEXT) ? "context, " : "");
1125
void tdfxDDUpdateHwState( GLcontext *ctx )
1127
tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
1128
int new_state = fxMesa->new_state;
1130
if ( TDFX_DEBUG & DEBUG_VERBOSE_API ) {
1131
fprintf( stderr, "%s()\n", __FUNCTION__ );
1136
FLUSH_BATCH( fxMesa );
1138
fxMesa->new_state = 0;
1141
tdfxDDPrintState( "tdfxUpdateHwState", new_state );
1143
/* Update the various parts of the context's state.
1145
if ( new_state & TDFX_NEW_ALPHA ) {
1146
tdfxUpdateAlphaMode( ctx );
1149
if ( new_state & TDFX_NEW_DEPTH )
1150
tdfxUpdateZMode( ctx );
1152
if ( new_state & TDFX_NEW_FOG )
1153
tdfxUpdateFogAttrib( ctx );
1155
if ( new_state & TDFX_NEW_CLIP )
1156
tdfxUpdateClipping( ctx );
1158
if ( new_state & TDFX_NEW_STIPPLE )
1159
tdfxUpdateStipple( ctx );
1161
if ( new_state & TDFX_NEW_CULL )
1162
tdfxUpdateCull( ctx );
1164
if ( new_state & TDFX_NEW_LINE )
1165
tdfxUpdateLine( ctx );
1167
if ( new_state & TDFX_NEW_VIEWPORT )
1168
tdfxUpdateViewport( ctx );
1170
if ( new_state & TDFX_NEW_RENDER )
1171
tdfxUpdateRenderAttrib( ctx );
1173
if ( new_state & TDFX_NEW_STENCIL )
1174
tdfxUpdateStencil( ctx );
1176
if ( new_state & TDFX_NEW_TEXTURE ) {
1177
tdfxUpdateTextureState( ctx );
1179
else if ( new_state & TDFX_NEW_TEXTURE_BIND ) {
1180
tdfxUpdateTextureBinding( ctx );
1185
FxI32 bias = (FxI32) (ctx->Polygon.OffsetUnits * TDFX_DEPTH_BIAS_SCALE);
1187
if ( fxMesa->Depth.Bias != bias ) {
1188
fxMesa->Depth.Bias = bias;
1189
fxMesa->dirty |= TDFX_UPLOAD_DEPTH_BIAS;
1193
if ( fxMesa->dirty ) {
1194
LOCK_HARDWARE( fxMesa );
1195
tdfxEmitHwStateLocked( fxMesa );
1196
UNLOCK_HARDWARE( fxMesa );
1201
static void tdfxDDInvalidateState( GLcontext *ctx, GLuint new_state )
1203
_swrast_InvalidateState( ctx, new_state );
1204
_swsetup_InvalidateState( ctx, new_state );
1205
_ac_InvalidateState( ctx, new_state );
1206
_tnl_InvalidateState( ctx, new_state );
1207
TDFX_CONTEXT(ctx)->new_gl_state |= new_state;
1212
/* Initialize the context's Glide state mirror. These values will be
1213
* used as Glide function call parameters when the time comes.
1215
void tdfxInitState( tdfxContextPtr fxMesa )
1217
GLcontext *ctx = fxMesa->glCtx;
1220
fxMesa->ColorCombine.Function = GR_COMBINE_FUNCTION_LOCAL;
1221
fxMesa->ColorCombine.Factor = GR_COMBINE_FACTOR_NONE;
1222
fxMesa->ColorCombine.Local = GR_COMBINE_LOCAL_ITERATED;
1223
fxMesa->ColorCombine.Other = GR_COMBINE_OTHER_NONE;
1224
fxMesa->ColorCombine.Invert = FXFALSE;
1225
fxMesa->AlphaCombine.Function = GR_COMBINE_FUNCTION_LOCAL;
1226
fxMesa->AlphaCombine.Factor = GR_COMBINE_FACTOR_NONE;
1227
fxMesa->AlphaCombine.Local = GR_COMBINE_LOCAL_ITERATED;
1228
fxMesa->AlphaCombine.Other = GR_COMBINE_OTHER_NONE;
1229
fxMesa->AlphaCombine.Invert = FXFALSE;
1231
fxMesa->ColorCombineExt.SourceA = GR_CMBX_ITRGB;
1232
fxMesa->ColorCombineExt.ModeA = GR_FUNC_MODE_X;
1233
fxMesa->ColorCombineExt.SourceB = GR_CMBX_ZERO;
1234
fxMesa->ColorCombineExt.ModeB = GR_FUNC_MODE_ZERO;
1235
fxMesa->ColorCombineExt.SourceC = GR_CMBX_ZERO;
1236
fxMesa->ColorCombineExt.InvertC = FXTRUE;
1237
fxMesa->ColorCombineExt.SourceD = GR_CMBX_ZERO;
1238
fxMesa->ColorCombineExt.InvertD = FXFALSE;
1239
fxMesa->ColorCombineExt.Shift = 0;
1240
fxMesa->ColorCombineExt.Invert = FXFALSE;
1241
fxMesa->AlphaCombineExt.SourceA = GR_CMBX_ITALPHA;
1242
fxMesa->AlphaCombineExt.ModeA = GR_FUNC_MODE_X;
1243
fxMesa->AlphaCombineExt.SourceB = GR_CMBX_ZERO;
1244
fxMesa->AlphaCombineExt.ModeB = GR_FUNC_MODE_ZERO;
1245
fxMesa->AlphaCombineExt.SourceC = GR_CMBX_ZERO;
1246
fxMesa->AlphaCombineExt.InvertC = FXTRUE;
1247
fxMesa->AlphaCombineExt.SourceD = GR_CMBX_ZERO;
1248
fxMesa->AlphaCombineExt.InvertD = FXFALSE;
1249
fxMesa->AlphaCombineExt.Shift = 0;
1250
fxMesa->AlphaCombineExt.Invert = FXFALSE;
1252
fxMesa->sScale0 = fxMesa->tScale0 = 1.0;
1253
fxMesa->sScale1 = fxMesa->tScale1 = 1.0;
1255
fxMesa->TexPalette.Type = 0;
1256
fxMesa->TexPalette.Data = NULL;
1258
for ( i = 0 ; i < TDFX_NUM_TMU ; i++ ) {
1259
fxMesa->TexSource[i].StartAddress = 0;
1260
fxMesa->TexSource[i].EvenOdd = GR_MIPMAPLEVELMASK_EVEN;
1261
fxMesa->TexSource[i].Info = NULL;
1263
fxMesa->TexCombine[i].FunctionRGB = 0;
1264
fxMesa->TexCombine[i].FactorRGB = 0;
1265
fxMesa->TexCombine[i].FunctionAlpha = 0;
1266
fxMesa->TexCombine[i].FactorAlpha = 0;
1267
fxMesa->TexCombine[i].InvertRGB = FXFALSE;
1268
fxMesa->TexCombine[i].InvertAlpha = FXFALSE;
1270
fxMesa->TexCombineExt[i].Alpha.SourceA = 0;
1271
/* XXX more state to init here */
1272
fxMesa->TexCombineExt[i].Color.SourceA = 0;
1273
fxMesa->TexCombineExt[i].EnvColor = 0x0;
1275
fxMesa->TexParams[i].sClamp = GR_TEXTURECLAMP_WRAP;
1276
fxMesa->TexParams[i].tClamp = GR_TEXTURECLAMP_WRAP;
1277
fxMesa->TexParams[i].minFilt = GR_TEXTUREFILTER_POINT_SAMPLED;
1278
fxMesa->TexParams[i].magFilt = GR_TEXTUREFILTER_BILINEAR;
1279
fxMesa->TexParams[i].mmMode = GR_MIPMAP_DISABLE;
1280
fxMesa->TexParams[i].LODblend = FXFALSE;
1281
fxMesa->TexParams[i].LodBias = 0.0;
1283
fxMesa->TexState.EnvMode[i] = ~0;
1284
fxMesa->TexState.TexFormat[i] = ~0;
1285
fxMesa->TexState.Enabled = 0;
1288
if ( ctx->Visual.doubleBufferMode) {
1289
fxMesa->DrawBuffer = GR_BUFFER_BACKBUFFER;
1290
fxMesa->ReadBuffer = GR_BUFFER_BACKBUFFER;
1292
fxMesa->DrawBuffer = GR_BUFFER_FRONTBUFFER;
1293
fxMesa->ReadBuffer = GR_BUFFER_FRONTBUFFER;
1296
fxMesa->Color.ClearColor = 0x00000000;
1297
fxMesa->Color.ClearAlpha = 0x00;
1298
fxMesa->Color.ColorMask[RCOMP] = FXTRUE;
1299
fxMesa->Color.ColorMask[BCOMP] = FXTRUE;
1300
fxMesa->Color.ColorMask[GCOMP] = FXTRUE;
1301
fxMesa->Color.ColorMask[ACOMP] = FXTRUE;
1302
fxMesa->Color.MonoColor = 0xffffffff;
1304
fxMesa->Color.AlphaFunc = GR_CMP_ALWAYS;
1305
fxMesa->Color.AlphaRef = 0x00;
1306
fxMesa->Color.BlendSrcRGB = GR_BLEND_ONE;
1307
fxMesa->Color.BlendDstRGB = GR_BLEND_ZERO;
1308
fxMesa->Color.BlendSrcA = GR_BLEND_ONE;
1309
fxMesa->Color.BlendSrcA = GR_BLEND_ZERO;
1311
fxMesa->Color.Dither = GR_DITHER_2x2;
1313
if ( fxMesa->glCtx->Visual.depthBits > 0 ) {
1314
fxMesa->Depth.Mode = GR_DEPTHBUFFER_ZBUFFER;
1316
fxMesa->Depth.Mode = GR_DEPTHBUFFER_DISABLE;
1318
fxMesa->Depth.Bias = 0;
1319
fxMesa->Depth.Func = GR_CMP_LESS;
1320
fxMesa->Depth.Clear = 0; /* computed later */
1321
fxMesa->Depth.Mask = FXTRUE;
1324
fxMesa->Fog.Mode = GR_FOG_DISABLE;
1325
fxMesa->Fog.Color = 0x00000000;
1326
fxMesa->Fog.Table = NULL;
1327
fxMesa->Fog.Density = 1.0;
1328
fxMesa->Fog.Near = 1.0;
1329
fxMesa->Fog.Far = 1.0;
1331
fxMesa->Stencil.Function = GR_CMP_ALWAYS;
1332
fxMesa->Stencil.RefValue = 0;
1333
fxMesa->Stencil.ValueMask = 0xff;
1334
fxMesa->Stencil.WriteMask = 0xff;
1335
fxMesa->Stencil.FailFunc = 0;
1336
fxMesa->Stencil.ZFailFunc = 0;
1337
fxMesa->Stencil.ZPassFunc = 0;
1338
fxMesa->Stencil.Clear = 0;
1340
fxMesa->Stipple.Mode = GR_STIPPLE_DISABLE;
1341
fxMesa->Stipple.Pattern = 0xffffffff;
1343
fxMesa->Scissor.minX = 0;
1344
fxMesa->Scissor.minY = 0;
1345
fxMesa->Scissor.maxX = 0;
1346
fxMesa->Scissor.maxY = 0;
1348
fxMesa->Viewport.Mode = GR_WINDOW_COORDS;
1349
fxMesa->Viewport.X = 0;
1350
fxMesa->Viewport.Y = 0;
1351
fxMesa->Viewport.Width = 0;
1352
fxMesa->Viewport.Height = 0;
1353
fxMesa->Viewport.Near = 0.0;
1354
fxMesa->Viewport.Far = 0.0;
1356
fxMesa->CullMode = GR_CULL_DISABLE;
1358
fxMesa->Glide.ColorFormat = GR_COLORFORMAT_ABGR;
1359
fxMesa->Glide.Origin = GR_ORIGIN_LOWER_LEFT;
1360
fxMesa->Glide.Initialized = FXFALSE;
1365
void tdfxDDInitStateFuncs( GLcontext *ctx )
1367
tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);
1369
ctx->Driver.UpdateState = tdfxDDInvalidateState;
1372
/* State notification callbacks:
1374
ctx->Driver.ClearIndex = NULL;
1375
ctx->Driver.ClearColor = tdfxDDClearColor;
1376
ctx->Driver.SetDrawBuffer = tdfxDDSetDrawBuffer;
1378
ctx->Driver.IndexMask = NULL;
1379
ctx->Driver.ColorMask = tdfxDDColorMask;
1381
ctx->Driver.AlphaFunc = tdfxDDAlphaFunc;
1382
ctx->Driver.BlendEquation = tdfxDDBlendEquation;
1383
ctx->Driver.BlendFunc = tdfxDDBlendFunc;
1384
ctx->Driver.BlendFuncSeparate = tdfxDDBlendFuncSeparate;
1385
ctx->Driver.ClearDepth = tdfxDDClearDepth;
1386
ctx->Driver.ClearStencil = NULL;
1387
ctx->Driver.CullFace = tdfxDDCullFace;
1388
ctx->Driver.FrontFace = tdfxDDFrontFace;
1389
ctx->Driver.DepthFunc = tdfxDDDepthFunc;
1390
ctx->Driver.DepthMask = tdfxDDDepthMask;
1391
ctx->Driver.DepthRange = tdfxDDDepthRange;
1392
ctx->Driver.Enable = tdfxDDEnable;
1393
ctx->Driver.Fogfv = tdfxDDFogfv;
1394
ctx->Driver.Hint = NULL;
1395
ctx->Driver.Lightfv = NULL;
1396
ctx->Driver.LightModelfv = tdfxDDLightModelfv;
1397
ctx->Driver.LineStipple = NULL;
1398
ctx->Driver.LineWidth = tdfxDDLineWidth;
1399
ctx->Driver.PolygonStipple = tdfxDDPolygonStipple;
1400
ctx->Driver.RenderMode = tdfxDDRenderMode;
1401
ctx->Driver.Scissor = tdfxDDScissor;
1402
ctx->Driver.ShadeModel = tdfxDDShadeModel;
1404
ctx->Driver.BindTexture = tdfxDDBindTexture;
1405
ctx->Driver.DeleteTexture = tdfxDDDeleteTexture;
1406
ctx->Driver.TexEnv = tdfxDDTexEnv;
1407
ctx->Driver.TexParameter = tdfxDDTexParameter;
1408
ctx->Driver.ChooseTextureFormat = tdfxDDChooseTextureFormat;
1409
ctx->Driver.TexImage2D = tdfxDDTexImage2D;
1410
ctx->Driver.TexSubImage2D = tdfxDDTexSubImage2D;
1412
ctx->Driver.TexImage2D = _mesa_store_teximage2d;
1413
ctx->Driver.TexSubImage2D = _mesa_store_texsubimage2d;
1416
ctx->Driver.TexImage1D = _mesa_store_teximage1d;
1417
ctx->Driver.TexImage3D = _mesa_store_teximage3d;
1418
ctx->Driver.TexSubImage1D = _mesa_store_texsubimage1d;
1419
ctx->Driver.TexSubImage3D = _mesa_store_texsubimage3d;
1420
ctx->Driver.CopyTexImage1D = _swrast_copy_teximage1d;
1421
ctx->Driver.CopyTexImage2D = _swrast_copy_teximage2d;
1422
ctx->Driver.CopyTexSubImage1D = _swrast_copy_texsubimage1d;
1423
ctx->Driver.CopyTexSubImage2D = _swrast_copy_texsubimage2d;
1424
ctx->Driver.CopyTexSubImage3D = _swrast_copy_texsubimage3d;
1425
ctx->Driver.TestProxyTexImage = _mesa_test_proxy_teximage;
1427
/* ctx->Driver.GetTexImage = tdfxDDGetTexImage; */
1428
ctx->Driver.UpdateTexturePalette = tdfxDDTexturePalette;
1430
if ( fxMesa->haveHwStencil ) {
1431
ctx->Driver.StencilFunc = tdfxDDStencilFunc;
1432
ctx->Driver.StencilMask = tdfxDDStencilMask;
1433
ctx->Driver.StencilOp = tdfxDDStencilOp;
1435
ctx->Driver.StencilFunc = NULL;
1436
ctx->Driver.StencilMask = NULL;
1437
ctx->Driver.StencilOp = NULL;
1440
ctx->Driver.Viewport = tdfxDDViewport;
1443
/* Swrast hooks for imaging extensions:
1445
ctx->Driver.CopyColorTable = _swrast_CopyColorTable;
1446
ctx->Driver.CopyColorSubTable = _swrast_CopyColorSubTable;
1447
ctx->Driver.CopyConvolutionFilter1D = _swrast_CopyConvolutionFilter1D;
1448
ctx->Driver.CopyConvolutionFilter2D = _swrast_CopyConvolutionFilter2D;