static void uploadTextureEnv( tdfxContextPtr fxMesa ) { if (TDFX_IS_NAPALM(fxMesa)) { int unit; for (unit = 0; unit < TDFX_NUM_TMU; unit++) { #if 0 printf("upload env %d\n", unit); printf(" cSourceA = %s\t", texSource(fxMesa->TexCombineExt[unit].Color.SourceA)); printf(" cModeA = %s\n", texMode(fxMesa->TexCombineExt[unit].Color.ModeA)); printf(" cSourceB = %s\t", texSource(fxMesa->TexCombineExt[unit].Color.SourceB)); printf(" cModeB = %s\n", texMode(fxMesa->TexCombineExt[unit].Color.ModeB)); printf(" cSourceC = %s\t", texSource(fxMesa->TexCombineExt[unit].Color.SourceC)); printf(" cInvertC = %s\n", texInvert(fxMesa->TexCombineExt[unit].Color.InvertC)); printf(" cSourceD = %s\t", texSource(fxMesa->TexCombineExt[unit].Color.SourceD)); printf(" cInvertD = %s\n", texInvert(fxMesa->TexCombineExt[unit].Color.InvertD)); printf(" cShift = %d\t", fxMesa->TexCombineExt[unit].Color.Shift); printf(" cInvert = %d\n", fxMesa->TexCombineExt[unit].Color.Invert); printf(" aSourceA = %s\t", texSource(fxMesa->TexCombineExt[unit].Alpha.SourceA)); printf(" aModeA = %s\n", texMode(fxMesa->TexCombineExt[unit].Alpha.ModeA)); printf(" aSourceB = %s\t", texSource(fxMesa->TexCombineExt[unit].Alpha.SourceB)); printf(" aModeB = %s\n", texMode(fxMesa->TexCombineExt[unit].Alpha.ModeB)); printf(" aSourceC = %s\t", texSource(fxMesa->TexCombineExt[unit].Alpha.SourceC)); printf(" aInvertC = %s\n", texInvert(fxMesa->TexCombineExt[unit].Alpha.InvertC)); printf(" aSourceD = %s\t", texSource(fxMesa->TexCombineExt[unit].Alpha.SourceD)); printf(" aInvertD = %s\n", texInvert(fxMesa->TexCombineExt[unit].Alpha.InvertD)); printf(" aShift = %d\t", fxMesa->TexCombineExt[unit].Alpha.Shift); printf(" aInvert = %d\n", fxMesa->TexCombineExt[unit].Alpha.Invert); printf(" Color = 0x%08x\n", fxMesa->TexCombineExt[unit].EnvColor); #endif fxMesa->Glide.grTexColorCombineExt(TDFX_TMU0 + unit, fxMesa->TexCombineExt[unit].Color.SourceA, fxMesa->TexCombineExt[unit].Color.ModeA, fxMesa->TexCombineExt[unit].Color.SourceB, fxMesa->TexCombineExt[unit].Color.ModeB, fxMesa->TexCombineExt[unit].Color.SourceC, fxMesa->TexCombineExt[unit].Color.InvertC, fxMesa->TexCombineExt[unit].Color.SourceD, fxMesa->TexCombineExt[unit].Color.InvertD, fxMesa->TexCombineExt[unit].Color.Shift, fxMesa->TexCombineExt[unit].Color.Invert); fxMesa->Glide.grTexAlphaCombineExt(TDFX_TMU0 + unit, fxMesa->TexCombineExt[unit].Alpha.SourceA, fxMesa->TexCombineExt[unit].Alpha.ModeA, fxMesa->TexCombineExt[unit].Alpha.SourceB, fxMesa->TexCombineExt[unit].Alpha.ModeB, fxMesa->TexCombineExt[unit].Alpha.SourceC, fxMesa->TexCombineExt[unit].Alpha.InvertC, fxMesa->TexCombineExt[unit].Alpha.SourceD, fxMesa->TexCombineExt[unit].Alpha.InvertD, fxMesa->TexCombineExt[unit].Alpha.Shift, fxMesa->TexCombineExt[unit].Alpha.Invert); fxMesa->Glide.grConstantColorValueExt(TDFX_TMU0 + unit, fxMesa->TexCombineExt[unit].EnvColor); } } else { /* Voodoo3 */ int unit; for (unit = 0; unit < TDFX_NUM_TMU; unit++) { struct tdfx_texcombine *comb = &fxMesa->TexCombine[unit]; fxMesa->Glide.grTexCombine(TDFX_TMU0 + unit, comb->FunctionRGB, comb->FactorRGB, comb->FunctionAlpha, comb->FactorAlpha, comb->InvertRGB, comb->InvertAlpha); } } }
void tdfxEmitHwStateLocked( tdfxContextPtr fxMesa ) { if ( !fxMesa->dirty ) return; if ( fxMesa->dirty & TDFX_UPLOAD_COLOR_COMBINE ) { if (TDFX_IS_NAPALM(fxMesa)) { fxMesa->Glide.grColorCombineExt(fxMesa->ColorCombineExt.SourceA, fxMesa->ColorCombineExt.ModeA, fxMesa->ColorCombineExt.SourceB, fxMesa->ColorCombineExt.ModeB, fxMesa->ColorCombineExt.SourceC, fxMesa->ColorCombineExt.InvertC, fxMesa->ColorCombineExt.SourceD, fxMesa->ColorCombineExt.InvertD, fxMesa->ColorCombineExt.Shift, fxMesa->ColorCombineExt.Invert); } else { /* Voodoo 3 */ fxMesa->Glide.grColorCombine( fxMesa->ColorCombine.Function, fxMesa->ColorCombine.Factor, fxMesa->ColorCombine.Local, fxMesa->ColorCombine.Other, fxMesa->ColorCombine.Invert ); } fxMesa->dirty &= ~TDFX_UPLOAD_COLOR_COMBINE; } if ( fxMesa->dirty & TDFX_UPLOAD_ALPHA_COMBINE ) { if (TDFX_IS_NAPALM(fxMesa)) { fxMesa->Glide.grAlphaCombineExt(fxMesa->AlphaCombineExt.SourceA, fxMesa->AlphaCombineExt.ModeA, fxMesa->AlphaCombineExt.SourceB, fxMesa->AlphaCombineExt.ModeB, fxMesa->AlphaCombineExt.SourceC, fxMesa->AlphaCombineExt.InvertC, fxMesa->AlphaCombineExt.SourceD, fxMesa->AlphaCombineExt.InvertD, fxMesa->AlphaCombineExt.Shift, fxMesa->AlphaCombineExt.Invert); } else { /* Voodoo 3 */ fxMesa->Glide.grAlphaCombine( fxMesa->AlphaCombine.Function, fxMesa->AlphaCombine.Factor, fxMesa->AlphaCombine.Local, fxMesa->AlphaCombine.Other, fxMesa->AlphaCombine.Invert ); } fxMesa->dirty &= ~TDFX_UPLOAD_ALPHA_COMBINE; } if ( fxMesa->dirty & TDFX_UPLOAD_RENDER_BUFFER ) { fxMesa->Glide.grRenderBuffer( fxMesa->DrawBuffer ); fxMesa->dirty &= ~TDFX_UPLOAD_RENDER_BUFFER; } if ( fxMesa->dirty & TDFX_UPLOAD_STIPPLE) { fxMesa->Glide.grStipplePattern( fxMesa->Stipple.Pattern ); fxMesa->Glide.grStippleMode( fxMesa->Stipple.Mode ); fxMesa->dirty &= ~TDFX_UPLOAD_STIPPLE; } if ( fxMesa->dirty & TDFX_UPLOAD_ALPHA_TEST ) { fxMesa->Glide.grAlphaTestFunction( fxMesa->Color.AlphaFunc ); fxMesa->dirty &= ~TDFX_UPLOAD_ALPHA_TEST; } if ( fxMesa->dirty & TDFX_UPLOAD_ALPHA_REF ) { fxMesa->Glide.grAlphaTestReferenceValue( fxMesa->Color.AlphaRef ); fxMesa->dirty &= ~TDFX_UPLOAD_ALPHA_REF; } if ( fxMesa->dirty & TDFX_UPLOAD_BLEND_FUNC ) { if (fxMesa->Glide.grAlphaBlendFunctionExt) { fxMesa->Glide.grAlphaBlendFunctionExt( fxMesa->Color.BlendSrcRGB, fxMesa->Color.BlendDstRGB, fxMesa->Color.BlendEqRGB, fxMesa->Color.BlendSrcA, fxMesa->Color.BlendDstA, fxMesa->Color.BlendEqA ); } else { fxMesa->Glide.grAlphaBlendFunction( fxMesa->Color.BlendSrcRGB, fxMesa->Color.BlendDstRGB, fxMesa->Color.BlendSrcA, fxMesa->Color.BlendDstA ); } fxMesa->dirty &= ~TDFX_UPLOAD_BLEND_FUNC; } if ( fxMesa->dirty & TDFX_UPLOAD_DEPTH_MODE ) { fxMesa->Glide.grDepthBufferMode( fxMesa->Depth.Mode ); fxMesa->dirty &= ~TDFX_UPLOAD_DEPTH_MODE; } if ( fxMesa->dirty & TDFX_UPLOAD_DEPTH_BIAS ) { fxMesa->Glide.grDepthBiasLevel( fxMesa->Depth.Bias ); fxMesa->dirty &= ~TDFX_UPLOAD_DEPTH_BIAS; } if ( fxMesa->dirty & TDFX_UPLOAD_DEPTH_FUNC ) { fxMesa->Glide.grDepthBufferFunction( fxMesa->Depth.Func ); fxMesa->dirty &= ~TDFX_UPLOAD_DEPTH_FUNC; } if ( fxMesa->dirty & TDFX_UPLOAD_DEPTH_MASK ) { fxMesa->Glide.grDepthMask( fxMesa->Depth.Mask ); fxMesa->dirty &= ~TDFX_UPLOAD_DEPTH_MASK; } if ( fxMesa->dirty & TDFX_UPLOAD_DITHER) { fxMesa->Glide.grDitherMode( fxMesa->Color.Dither ); } if ( fxMesa->dirty & TDFX_UPLOAD_FOG_MODE ) { fxMesa->Glide.grFogMode( fxMesa->Fog.Mode ); fxMesa->dirty &= ~TDFX_UPLOAD_FOG_MODE; } if ( fxMesa->dirty & TDFX_UPLOAD_FOG_COLOR ) { fxMesa->Glide.grFogColorValue( fxMesa->Fog.Color ); fxMesa->dirty &= ~TDFX_UPLOAD_FOG_COLOR; } if ( fxMesa->dirty & TDFX_UPLOAD_FOG_TABLE ) { fxMesa->Glide.grFogTable( fxMesa->Fog.Table ); fxMesa->dirty &= ~TDFX_UPLOAD_FOG_TABLE; } if ( fxMesa->dirty & TDFX_UPLOAD_CULL ) { fxMesa->Glide.grCullMode( fxMesa->CullMode ); fxMesa->dirty &= ~TDFX_UPLOAD_CULL; } if ( fxMesa->dirty & TDFX_UPLOAD_CLIP ) { tdfxUploadClipping( fxMesa ); fxMesa->dirty &= ~TDFX_UPLOAD_CLIP; } if ( fxMesa->dirty & TDFX_UPLOAD_COLOR_MASK ) { if ( fxMesa->Glide.grColorMaskExt && fxMesa->glCtx->Visual.redBits == 8) { fxMesa->Glide.grColorMaskExt( fxMesa->Color.ColorMask[RCOMP], fxMesa->Color.ColorMask[GCOMP], fxMesa->Color.ColorMask[BCOMP], fxMesa->Color.ColorMask[ACOMP] ); } else { fxMesa->Glide.grColorMask( fxMesa->Color.ColorMask[RCOMP] || fxMesa->Color.ColorMask[GCOMP] || fxMesa->Color.ColorMask[BCOMP], /*fxMesa->Color.ColorMask[ACOMP]*/GL_FALSE/*[dBorca] no-no*/ ); } fxMesa->dirty &= ~TDFX_UPLOAD_COLOR_MASK; } if ( fxMesa->dirty & TDFX_UPLOAD_CONSTANT_COLOR ) { fxMesa->Glide.grConstantColorValue( fxMesa->Color.MonoColor ); fxMesa->dirty &= ~TDFX_UPLOAD_CONSTANT_COLOR; } if ( fxMesa->dirty & TDFX_UPLOAD_LINE ) { if (fxMesa->glCtx->Line.SmoothFlag && fxMesa->glCtx->Line.Width == 1.0) fxMesa->Glide.grEnable(GR_AA_ORDERED); else fxMesa->Glide.grDisable(GR_AA_ORDERED); fxMesa->dirty &= ~TDFX_UPLOAD_LINE; } if ( fxMesa->dirty & TDFX_UPLOAD_STENCIL ) { if (fxMesa->glCtx->Stencil.Enabled) { fxMesa->Glide.grEnable(GR_STENCIL_MODE_EXT); fxMesa->Glide.grStencilOp(fxMesa->Stencil.FailFunc, fxMesa->Stencil.ZFailFunc, fxMesa->Stencil.ZPassFunc); fxMesa->Glide.grStencilFunc(fxMesa->Stencil.Function, fxMesa->Stencil.RefValue, fxMesa->Stencil.ValueMask); fxMesa->Glide.grStencilMask(fxMesa->Stencil.WriteMask); } else { fxMesa->Glide.grDisable(GR_STENCIL_MODE_EXT); } fxMesa->dirty &= ~TDFX_UPLOAD_STENCIL; } if ( fxMesa->dirty & TDFX_UPLOAD_VERTEX_LAYOUT ) { fxMesa->Glide.grGlideSetVertexLayout( fxMesa->layout[fxMesa->vertexFormat] ); /* [dborca] enable fogcoord */ fxMesa->Glide.grVertexLayout(GR_PARAM_FOG_EXT, TDFX_FOG_OFFSET, fxMesa->Fog.Mode == GR_FOG_WITH_TABLE_ON_FOGCOORD_EXT); fxMesa->dirty &= ~TDFX_UPLOAD_VERTEX_LAYOUT; } if ( fxMesa->dirty & TDFX_UPLOAD_TEXTURE_ENV ) { uploadTextureEnv(fxMesa); fxMesa->dirty &= ~TDFX_UPLOAD_TEXTURE_ENV; } if ( fxMesa->dirty & TDFX_UPLOAD_TEXTURE_PARAMS ) { uploadTextureParams(fxMesa); fxMesa->dirty &= ~TDFX_UPLOAD_TEXTURE_PARAMS; } if ( fxMesa->dirty & TDFX_UPLOAD_TEXTURE_PALETTE ) { if (fxMesa->TexPalette.Data) { fxMesa->Glide.grTexDownloadTable(fxMesa->TexPalette.Type, fxMesa->TexPalette.Data); } fxMesa->dirty &= ~TDFX_UPLOAD_TEXTURE_PALETTE; } if ( fxMesa->dirty & TDFX_UPLOAD_TEXTURE_SOURCE ) { uploadTextureSource(fxMesa); fxMesa->dirty &= ~TDFX_UPLOAD_TEXTURE_SOURCE; } if ( fxMesa->dirty & TDFX_UPLOAD_TEXTURE_IMAGES ) { uploadTextureImages(fxMesa); fxMesa->dirty &= ~TDFX_UPLOAD_TEXTURE_IMAGES; } fxMesa->dirty = 0; }
static void tdfxUpdateAlphaMode( GLcontext *ctx ) { tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx); GrCmpFnc_t func; GrAlphaBlendFnc_t srcRGB, dstRGB, srcA, dstA; GrAlphaBlendOp_t eqRGB, eqA; GrAlpha_t ref = (GLint) (ctx->Color.AlphaRef * 255.0); GLboolean isNapalm = TDFX_IS_NAPALM(fxMesa); GLboolean have32bpp = (ctx->Visual.greenBits == 8); GLboolean haveAlpha = fxMesa->haveHwAlpha; if ( TDFX_DEBUG & DEBUG_VERBOSE_API ) { fprintf( stderr, "%s()\n", __FUNCTION__ ); } if ( ctx->Color.AlphaEnabled ) { func = ctx->Color.AlphaFunc - GL_NEVER + GR_CMP_NEVER; } else { func = GR_CMP_ALWAYS; } if ( ctx->Color.BlendEnabled && (fxMesa->Fallback & TDFX_FALLBACK_BLEND) == 0 ) { switch ( ctx->Color.BlendSrcRGB ) { case GL_ZERO: srcRGB = GR_BLEND_ZERO; break; case GL_ONE: srcRGB = GR_BLEND_ONE; break; case GL_DST_COLOR: srcRGB = GR_BLEND_DST_COLOR; break; case GL_ONE_MINUS_DST_COLOR: srcRGB = GR_BLEND_ONE_MINUS_DST_COLOR; break; case GL_SRC_ALPHA: srcRGB = GR_BLEND_SRC_ALPHA; break; case GL_ONE_MINUS_SRC_ALPHA: srcRGB = GR_BLEND_ONE_MINUS_SRC_ALPHA; break; case GL_DST_ALPHA: srcRGB = haveAlpha ? GR_BLEND_DST_ALPHA : GR_BLEND_ONE/*JJJ*/; break; case GL_ONE_MINUS_DST_ALPHA: srcRGB = haveAlpha ? GR_BLEND_ONE_MINUS_DST_ALPHA : GR_BLEND_ZERO/*JJJ*/; break; case GL_SRC_ALPHA_SATURATE: srcRGB = GR_BLEND_ALPHA_SATURATE; break; case GL_SRC_COLOR: if (isNapalm) { srcRGB = GR_BLEND_SAME_COLOR_EXT; break; } case GL_ONE_MINUS_SRC_COLOR: if (isNapalm) { srcRGB = GR_BLEND_ONE_MINUS_SAME_COLOR_EXT; break; } default: srcRGB = GR_BLEND_ONE; } switch ( ctx->Color.BlendSrcA ) { case GL_ZERO: srcA = GR_BLEND_ZERO; break; case GL_ONE: srcA = GR_BLEND_ONE; break; case GL_SRC_COLOR: case GL_SRC_ALPHA: srcA = have32bpp ? GR_BLEND_SRC_ALPHA : GR_BLEND_ONE/*JJJ*/; break; case GL_ONE_MINUS_SRC_COLOR: case GL_ONE_MINUS_SRC_ALPHA: srcA = have32bpp ? GR_BLEND_ONE_MINUS_SRC_ALPHA : GR_BLEND_ONE/*JJJ*/; break; case GL_DST_COLOR: case GL_DST_ALPHA: srcA = (have32bpp && haveAlpha) ? GR_BLEND_DST_ALPHA : GR_BLEND_ONE/*JJJ*/; break; case GL_ONE_MINUS_DST_COLOR: case GL_ONE_MINUS_DST_ALPHA: srcA = (have32bpp && haveAlpha) ? GR_BLEND_ONE_MINUS_DST_ALPHA : GR_BLEND_ZERO/*JJJ*/; break; case GL_SRC_ALPHA_SATURATE: srcA = GR_BLEND_ONE; break; default: srcA = GR_BLEND_ONE; } switch ( ctx->Color.BlendDstRGB ) { case GL_ZERO: dstRGB = GR_BLEND_ZERO; break; case GL_ONE: dstRGB = GR_BLEND_ONE; break; case GL_SRC_COLOR: dstRGB = GR_BLEND_SRC_COLOR; break; case GL_ONE_MINUS_SRC_COLOR: dstRGB = GR_BLEND_ONE_MINUS_SRC_COLOR; break; case GL_SRC_ALPHA: dstRGB = GR_BLEND_SRC_ALPHA; break; case GL_ONE_MINUS_SRC_ALPHA: dstRGB = GR_BLEND_ONE_MINUS_SRC_ALPHA; break; case GL_DST_ALPHA: dstRGB = haveAlpha ? GR_BLEND_DST_ALPHA : GR_BLEND_ONE/*JJJ*/; break; case GL_ONE_MINUS_DST_ALPHA: dstRGB = haveAlpha ? GR_BLEND_ONE_MINUS_DST_ALPHA : GR_BLEND_ZERO/*JJJ*/; break; case GL_DST_COLOR: if (isNapalm) { dstRGB = GR_BLEND_SAME_COLOR_EXT; break; } case GL_ONE_MINUS_DST_COLOR: if (isNapalm) { dstRGB = GR_BLEND_ONE_MINUS_SAME_COLOR_EXT; break; } default: dstRGB = GR_BLEND_ZERO; } switch ( ctx->Color.BlendDstA ) { case GL_ZERO: dstA = GR_BLEND_ZERO; break; case GL_ONE: dstA = GR_BLEND_ONE; break; case GL_SRC_COLOR: case GL_SRC_ALPHA: dstA = have32bpp ? GR_BLEND_SRC_ALPHA : GR_BLEND_ZERO/*JJJ*/; break; case GL_ONE_MINUS_SRC_COLOR: case GL_ONE_MINUS_SRC_ALPHA: dstA = have32bpp ? GR_BLEND_ONE_MINUS_SRC_ALPHA : GR_BLEND_ZERO/*JJJ*/; break; case GL_DST_COLOR: case GL_DST_ALPHA: dstA = have32bpp ? GR_BLEND_DST_ALPHA : GR_BLEND_ONE/*JJJ*/; break; case GL_ONE_MINUS_DST_COLOR: case GL_ONE_MINUS_DST_ALPHA: dstA = have32bpp ? GR_BLEND_ONE_MINUS_DST_ALPHA : GR_BLEND_ZERO/*JJJ*/; break; default: dstA = GR_BLEND_ZERO; } switch ( ctx->Color.BlendEquationRGB ) { case GL_FUNC_SUBTRACT: eqRGB = GR_BLEND_OP_SUB; break; case GL_FUNC_REVERSE_SUBTRACT: eqRGB = GR_BLEND_OP_REVSUB; break; case GL_FUNC_ADD: default: eqRGB = GR_BLEND_OP_ADD; break; } switch ( ctx->Color.BlendEquationA ) { case GL_FUNC_SUBTRACT: eqA = GR_BLEND_OP_SUB; break; case GL_FUNC_REVERSE_SUBTRACT: eqA = GR_BLEND_OP_REVSUB; break; case GL_FUNC_ADD: default: eqA = GR_BLEND_OP_ADD; break; } } else { /* blend disabled */ srcRGB = GR_BLEND_ONE; dstRGB = GR_BLEND_ZERO; eqRGB = GR_BLEND_OP_ADD; srcA = GR_BLEND_ONE; dstA = GR_BLEND_ZERO; eqA = GR_BLEND_OP_ADD; } if ( fxMesa->Color.AlphaFunc != func ) { fxMesa->Color.AlphaFunc = func; fxMesa->dirty |= TDFX_UPLOAD_ALPHA_TEST; } if ( fxMesa->Color.AlphaRef != ref ) { fxMesa->Color.AlphaRef = ref; fxMesa->dirty |= TDFX_UPLOAD_ALPHA_REF; } if ( fxMesa->Color.BlendSrcRGB != srcRGB || fxMesa->Color.BlendDstRGB != dstRGB || fxMesa->Color.BlendEqRGB != eqRGB || fxMesa->Color.BlendSrcA != srcA || fxMesa->Color.BlendDstA != dstA || fxMesa->Color.BlendEqA != eqA ) { fxMesa->Color.BlendSrcRGB = srcRGB; fxMesa->Color.BlendDstRGB = dstRGB; fxMesa->Color.BlendEqRGB = eqRGB; fxMesa->Color.BlendSrcA = srcA; fxMesa->Color.BlendDstA = dstA; fxMesa->Color.BlendEqA = eqA; fxMesa->dirty |= TDFX_UPLOAD_BLEND_FUNC; } }