static void copy_pv( GLcontext *ctx, GLuint edst, GLuint esrc ) { tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx ); tdfxVertex *dst = fxMesa->verts + edst; tdfxVertex *src = fxMesa->verts + esrc; *(GLuint *)&dst->color = *(GLuint *)&src->color; }
static void tdfxDDDepthFunc( GLcontext *ctx, GLenum func ) { tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx ); FLUSH_BATCH( fxMesa ); fxMesa->new_state |= TDFX_NEW_DEPTH; }
void tdfxCheckTexSizes( GLcontext *ctx ) { TNLcontext *tnl = TNL_CONTEXT(ctx); tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx ); if (!setup_tab[fxMesa->SetupIndex].check_tex_sizes(ctx)) { GLuint ind = fxMesa->SetupIndex |= (TDFX_PTEX_BIT|TDFX_RGBA_BIT); /* Tdfx handles projective textures nicely; just have to change * up to the new vertex format. */ if (setup_tab[ind].vertex_format != fxMesa->vertexFormat) { FLUSH_BATCH(fxMesa); fxMesa->dirty |= TDFX_UPLOAD_VERTEX_LAYOUT; fxMesa->vertexFormat = setup_tab[ind].vertex_format; /* This is required as we have just changed the vertex * format, so the interp and copy routines must also change. * In the unfilled and twosided cases we are using the * swrast_setup ones anyway, so leave them in place. */ if (!(ctx->_TriangleCaps & (DD_TRI_LIGHT_TWOSIDE|DD_TRI_UNFILLED))) { tnl->Driver.Render.Interp = setup_tab[fxMesa->SetupIndex].interp; tnl->Driver.Render.CopyPV = setup_tab[fxMesa->SetupIndex].copy_pv; } } } }
static void tdfxDDStencilMask( GLcontext *ctx, GLuint mask ) { tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); FLUSH_BATCH( fxMesa ); fxMesa->new_state |= TDFX_NEW_STENCIL; }
static void tdfxDDFrontFace( GLcontext *ctx, GLenum mode ) { tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx ); FLUSH_BATCH( fxMesa ); fxMesa->new_state |= TDFX_NEW_CULL; }
static void tdfxDDDepthMask( GLcontext *ctx, GLboolean flag ) { tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx ); FLUSH_BATCH( fxMesa ); fxMesa->new_state |= TDFX_NEW_DEPTH; }
static void tdfxDDClearDepth( GLcontext *ctx, GLclampd d ) { tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx ); FLUSH_BATCH( fxMesa ); fxMesa->new_state |= TDFX_NEW_DEPTH; }
static void tdfxDDFogfv( GLcontext *ctx, GLenum pname, const GLfloat *param ) { tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); FLUSH_BATCH( fxMesa ); fxMesa->new_state |= TDFX_NEW_FOG; switch (pname) { case GL_FOG_COORDINATE_SOURCE_EXT: { GLenum p = (GLenum)*param; if (p == GL_FOG_COORDINATE_EXT) { _swrast_allow_vertex_fog(ctx, GL_TRUE); _swrast_allow_pixel_fog(ctx, GL_FALSE); _tnl_allow_vertex_fog( ctx, GL_TRUE); _tnl_allow_pixel_fog( ctx, GL_FALSE); } else { _swrast_allow_vertex_fog(ctx, GL_FALSE); _swrast_allow_pixel_fog(ctx, GL_TRUE); _tnl_allow_vertex_fog( ctx, GL_FALSE); _tnl_allow_pixel_fog( ctx, GL_TRUE); } break; } default: ; } }
static void tdfxDDAlphaFunc( GLcontext *ctx, GLenum func, GLfloat ref ) { tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx ); FLUSH_BATCH( fxMesa ); fxMesa->new_state |= TDFX_NEW_ALPHA; }
static void tdfxDDScissor(GLcontext * ctx, GLint x, GLint y, GLsizei w, GLsizei h) { tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); FLUSH_BATCH( fxMesa ); fxMesa->new_state |= TDFX_NEW_CLIP; }
static void tdfxDDColorMask( GLcontext *ctx, GLboolean r, GLboolean g, GLboolean b, GLboolean a ) { tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); FLUSH_BATCH( fxMesa ); if ( fxMesa->Color.ColorMask[RCOMP] != r || fxMesa->Color.ColorMask[GCOMP] != g || fxMesa->Color.ColorMask[BCOMP] != b || fxMesa->Color.ColorMask[ACOMP] != a ) { fxMesa->Color.ColorMask[RCOMP] = r; fxMesa->Color.ColorMask[GCOMP] = g; fxMesa->Color.ColorMask[BCOMP] = b; fxMesa->Color.ColorMask[ACOMP] = a; fxMesa->dirty |= TDFX_UPLOAD_COLOR_MASK; if (ctx->Visual.redBits < 8) { /* Can't do RGB colormasking in 16bpp mode. */ /* We can completely ignore the alpha mask. */ FALLBACK( fxMesa, TDFX_FALLBACK_COLORMASK, (r != g || g != b) ); } } }
/* XXX support for separate read/draw buffers hasn't been tested */ static void tdfxDDDrawBuffer( GLcontext *ctx, GLenum mode ) { tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); if ( TDFX_DEBUG & DEBUG_VERBOSE_API ) { fprintf( stderr, "%s()\n", __FUNCTION__ ); } FLUSH_BATCH( fxMesa ); if (ctx->DrawBuffer->_NumColorDrawBuffers > 1) { FALLBACK( fxMesa, TDFX_FALLBACK_DRAW_BUFFER, GL_TRUE ); return; } switch ( ctx->DrawBuffer->_ColorDrawBufferIndexes[0] ) { case BUFFER_FRONT_LEFT: fxMesa->DrawBuffer = fxMesa->ReadBuffer = GR_BUFFER_FRONTBUFFER; fxMesa->new_state |= TDFX_NEW_RENDER; FALLBACK( fxMesa, TDFX_FALLBACK_DRAW_BUFFER, GL_FALSE ); break; case BUFFER_BACK_LEFT: fxMesa->DrawBuffer = fxMesa->ReadBuffer = GR_BUFFER_BACKBUFFER; fxMesa->new_state |= TDFX_NEW_RENDER; FALLBACK( fxMesa, TDFX_FALLBACK_DRAW_BUFFER, GL_FALSE ); break; case -1: FX_grColorMaskv( ctx, false4 ); FALLBACK( fxMesa, TDFX_FALLBACK_DRAW_BUFFER, GL_FALSE ); break; default: FALLBACK( fxMesa, TDFX_FALLBACK_DRAW_BUFFER, GL_TRUE ); break; } }
static void tdfxEndQuery(GLcontext *ctx, struct gl_query_object *q) { tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); FxI32 total_pixels; FxI32 z_fail_pixels; if (q->Target == GL_SAMPLES_PASSED_ARB) { LOCK_HARDWARE(fxMesa); fxMesa->Glide.grFinish(); fxMesa->Glide.grGet(GR_STATS_PIXELS_DEPTHFUNC_FAIL, sizeof(FxI32), &z_fail_pixels); fxMesa->Glide.grGet(GR_STATS_PIXELS_IN, sizeof(FxI32), &total_pixels); q->Result = total_pixels - z_fail_pixels; /* Apparently, people have seen z_fail_pixels > total_pixels under * some conditions on some 3Dfx hardware. The occlusion query spec * requires that we clamp to 0. */ if (q->Result < 0) { q->Result = 0; } q->Ready = GL_TRUE; UNLOCK_HARDWARE(fxMesa); } }
static void tdfxDDViewport( GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h ) { tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); FLUSH_BATCH( fxMesa ); fxMesa->new_state |= TDFX_NEW_VIEWPORT; }
static void tdfxDDInvalidateState( GLcontext *ctx, GLuint new_state ) { _swrast_InvalidateState( ctx, new_state ); _swsetup_InvalidateState( ctx, new_state ); _vbo_InvalidateState( ctx, new_state ); _tnl_InvalidateState( ctx, new_state ); TDFX_CONTEXT(ctx)->new_gl_state |= new_state; }
static void tdfxDDShadeModel( GLcontext *ctx, GLenum mode ) { tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); /* FIXME: Can we implement native flat shading? */ FLUSH_BATCH( fxMesa ); fxMesa->new_state |= TDFX_NEW_TEXTURE; }
void tdfxFreeVB( GLcontext *ctx ) { tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); if (fxMesa->verts) { ALIGN_FREE(fxMesa->verts); fxMesa->verts = 0; } }
static void tdfxDDStencilOp( GLcontext *ctx, GLenum sfail, GLenum zfail, GLenum zpass ) { tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); FLUSH_BATCH( fxMesa ); fxMesa->new_state |= TDFX_NEW_STENCIL; }
static void tdfxUpdateFogAttrib( GLcontext *ctx ) { tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); GrFogMode_t mode; GrColor_t color; if ( TDFX_DEBUG & DEBUG_VERBOSE_API ) { fprintf( stderr, "%s()\n", __FUNCTION__ ); } if ( ctx->Fog.Enabled ) { if (ctx->Fog.FogCoordinateSource == GL_FOG_COORDINATE_EXT) { mode = GR_FOG_WITH_TABLE_ON_FOGCOORD_EXT; } else { mode = GR_FOG_WITH_TABLE_ON_Q; } } else { mode = GR_FOG_DISABLE; } color = TDFXPACKCOLOR888((GLubyte)(ctx->Fog.Color[0]*255.0F), (GLubyte)(ctx->Fog.Color[1]*255.0F), (GLubyte)(ctx->Fog.Color[2]*255.0F)); if ( fxMesa->Fog.Mode != mode ) { fxMesa->Fog.Mode = mode; fxMesa->dirty |= TDFX_UPLOAD_FOG_MODE; fxMesa->dirty |= TDFX_UPLOAD_VERTEX_LAYOUT;/*JJJ*/ } if ( fxMesa->Fog.Color != color ) { fxMesa->Fog.Color = color; fxMesa->dirty |= TDFX_UPLOAD_FOG_COLOR; } if ( fxMesa->Fog.TableMode != ctx->Fog.Mode || fxMesa->Fog.Density != ctx->Fog.Density || fxMesa->Fog.Near != ctx->Fog.Start || fxMesa->Fog.Far != ctx->Fog.End ) { switch( ctx->Fog.Mode ) { case GL_EXP: fxMesa->Glide.guFogGenerateExp( fxMesa->Fog.Table, ctx->Fog.Density ); break; case GL_EXP2: fxMesa->Glide.guFogGenerateExp2( fxMesa->Fog.Table, ctx->Fog.Density); break; case GL_LINEAR: fxMesa->Glide.guFogGenerateLinear( fxMesa->Fog.Table, ctx->Fog.Start, ctx->Fog.End ); break; } fxMesa->Fog.TableMode = ctx->Fog.Mode; fxMesa->Fog.Density = ctx->Fog.Density; fxMesa->Fog.Near = ctx->Fog.Start; fxMesa->Fog.Far = ctx->Fog.End; fxMesa->dirty |= TDFX_UPLOAD_FOG_TABLE; } }
static void tdfxDDStencilFuncSeparate( GLcontext *ctx, GLenum face, GLenum func, GLint ref, GLuint mask ) { tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); FLUSH_BATCH( fxMesa ); fxMesa->new_state |= TDFX_NEW_STENCIL; }
static void tdfxDDBlendEquationSeparate( GLcontext *ctx, GLenum modeRGB, GLenum modeA ) { tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx ); assert( modeRGB == modeA ); FLUSH_BATCH( fxMesa ); fxMesa->new_state |= TDFX_NEW_ALPHA; }
static void tdfxDDViewport( GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h ) { tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); /* update size of Mesa/software ancillary buffers */ _mesa_ResizeBuffersMESA(); FLUSH_BATCH( fxMesa ); fxMesa->new_state |= TDFX_NEW_VIEWPORT; }
static void tdfxFlush( GLcontext *ctx ) { tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); FLUSH_BATCH( fxMesa ); LOCK_HARDWARE( fxMesa ); fxMesa->Glide.grFlush(); UNLOCK_HARDWARE( fxMesa ); }
/* Return uptodate buffer size information. */ static void tdfxDDGetBufferSize( GLframebuffer *buffer, GLuint *width, GLuint *height ) { GET_CURRENT_CONTEXT(ctx); tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); LOCK_HARDWARE( fxMesa ); *width = fxMesa->width; *height = fxMesa->height; UNLOCK_HARDWARE( fxMesa ); }
static void copy_pv_extras( GLcontext *ctx, GLuint dst, GLuint src ) { struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; if (VB->ColorPtr[1]) { COPY_4FV( GET_COLOR(VB->ColorPtr[1], dst), GET_COLOR(VB->ColorPtr[1], src) ); } setup_tab[TDFX_CONTEXT(ctx)->SetupIndex].copy_pv(ctx, dst, src); }
static void tdfxDDLightModelfv( GLcontext *ctx, GLenum pname, const GLfloat *param ) { tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); if ( pname == GL_LIGHT_MODEL_COLOR_CONTROL ) { FALLBACK( fxMesa, TDFX_FALLBACK_SPECULAR, (ctx->Light.Enabled && ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR )); } }
static void tdfxUpdateLine( GLcontext *ctx ) { tdfxContextPtr fxMesa = TDFX_CONTEXT( ctx ); if ( TDFX_DEBUG & DEBUG_VERBOSE_API ) { fprintf( stderr, "%s()\n", __FUNCTION__ ); } FLUSH_BATCH( fxMesa ); fxMesa->dirty |= TDFX_UPLOAD_LINE; }
static void tdfxDDPolygonStipple( GLcontext *ctx, const GLubyte *mask ) { tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); const GLubyte *m = mask; GLubyte q[4]; int i,j,k; GLboolean allBitsSet; /* int active = (ctx->Polygon.StippleFlag && */ /* fxMesa->reduced_prim == GL_TRIANGLES); */ FLUSH_BATCH(fxMesa); fxMesa->Stipple.Pattern = 0xffffffff; fxMesa->dirty |= TDFX_UPLOAD_STIPPLE; fxMesa->new_state |= TDFX_NEW_STIPPLE; /* Check if the stipple pattern is fully opaque. If so, use software * rendering. This basically a trick to make sure the OpenGL conformance * test passes. */ allBitsSet = GL_TRUE; for (i = 0; i < 32; i++) { if (((GLuint *) mask)[i] != 0xffffffff) { allBitsSet = GL_FALSE; break; } } if (allBitsSet) { fxMesa->haveHwStipple = GL_FALSE; return; } q[0] = mask[0]; q[1] = mask[4]; q[2] = mask[8]; q[3] = mask[12]; for (k = 0 ; k < 8 ; k++) for (j = 0 ; j < 4; j++) for (i = 0 ; i < 4 ; i++,m++) { if (*m != q[j]) { fxMesa->haveHwStipple = GL_FALSE; return; } } fxMesa->haveHwStipple = GL_TRUE; fxMesa->Stipple.Pattern = ( (q[0] << 0) | (q[1] << 8) | (q[2] << 16) | (q[3] << 24) ); }
static void tdfxDDClearColor( GLcontext *ctx, const GLfloat color[4] ) { tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); GLubyte c[4]; FLUSH_BATCH( fxMesa ); CLAMPED_FLOAT_TO_UBYTE(c[0], color[0]); CLAMPED_FLOAT_TO_UBYTE(c[1], color[1]); CLAMPED_FLOAT_TO_UBYTE(c[2], color[2]); CLAMPED_FLOAT_TO_UBYTE(c[3], color[3]); fxMesa->Color.ClearColor = TDFXPACKCOLOR888( c[0], c[1], c[2] ); fxMesa->Color.ClearAlpha = c[3]; }
static void tdfxBeginQuery(GLcontext *ctx, struct gl_query_object *q) { tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); (void) q; if (q->Target == GL_SAMPLES_PASSED_ARB) { LOCK_HARDWARE(fxMesa); fxMesa->Glide.grFinish(); fxMesa->Glide.grReset(GR_STATS_PIXELS); UNLOCK_HARDWARE(fxMesa); } }