X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fdri%2Funichrome%2Fvia_state.c;h=840e4e42da95d887e462da971b8bd155fff62ccf;hb=c7e46c1857b744a35c086dddb651f38df948a5fa;hp=5fcc60d27497c634885ee8ec08fb42ae5f26dd94;hpb=8e039bf40af71b574bf409b9e145f98a4ce3fe70;p=mesa.git diff --git a/src/mesa/drivers/dri/unichrome/via_state.c b/src/mesa/drivers/dri/unichrome/via_state.c index 5fcc60d2749..840e4e42da9 100644 --- a/src/mesa/drivers/dri/unichrome/via_state.c +++ b/src/mesa/drivers/dri/unichrome/via_state.c @@ -24,23 +24,23 @@ #include -#include "glheader.h" -#include "buffers.h" -#include "context.h" -#include "macros.h" -#include "colormac.h" -#include "enums.h" -#include "dd.h" - -#include "mm.h" +#include "main/glheader.h" +#include "main/context.h" +#include "main/macros.h" +#include "main/colormac.h" +#include "main/enums.h" +#include "main/dd.h" +#include "main/mm.h" + #include "via_context.h" #include "via_state.h" #include "via_tex.h" #include "via_tris.h" #include "via_ioctl.h" +#include "via_3d_reg.h" #include "swrast/swrast.h" -#include "array_cache/acache.h" +#include "vbo/vbo.h" #include "tnl/tnl.h" #include "swrast_setup/swrast_setup.h" @@ -66,17 +66,26 @@ static GLuint ROP[16] = { HC_HROP_WHITE /* GL_SET 1 */ }; +/* + * Compute the 'S5.5' lod bias factor from the floating point OpenGL bias. + */ +static GLuint viaComputeLodBias(GLfloat bias) +{ + int b = (int) (bias * 32.0); + if (b > 511) + b = 511; + else if (b < -512) + b = -512; + return (GLuint) b; +} - -void viaEmitState(viaContextPtr vmesa) +void viaEmitState(struct via_context *vmesa) { GLcontext *ctx = vmesa->glCtx; GLuint i = 0; GLuint j = 0; RING_VARS; - if (VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__); - viaCheckDma(vmesa, 0x110); BEGIN_RING(5); @@ -95,27 +104,23 @@ void viaEmitState(viaContextPtr vmesa) pitch = vmesa->depth.pitch; BEGIN_RING(6); - OUT_RING( ((HC_SubA_HZWBBasL << 24) | (offset & 0xFFFFFF)) ); - OUT_RING( ((HC_SubA_HZWBBasH << 24) | ((offset & 0xFF000000) >> 24)) ); - OUT_RING( ((HC_SubA_HZWBType << 24) | HC_HDBLoc_Local | HC_HZONEasFF_MASK | - format | pitch) ); - OUT_RING( ((HC_SubA_HZWTMD << 24) | vmesa->regHZWTMD) ); - OUT_RING( ((HC_SubA_HSTREF << 24) | vmesa->regHSTREF) ); - OUT_RING( ((HC_SubA_HSTMD << 24) | vmesa->regHSTMD) ); + OUT_RING( (HC_SubA_HZWBBasL << 24) | (offset & 0xFFFFFF) ); + OUT_RING( (HC_SubA_HZWBBasH << 24) | ((offset & 0xFF000000) >> 24) ); + OUT_RING( (HC_SubA_HZWBType << 24) | HC_HDBLoc_Local | HC_HZONEasFF_MASK | + format | pitch ); + OUT_RING( (HC_SubA_HZWTMD << 24) | vmesa->regHZWTMD ); + OUT_RING( (HC_SubA_HSTREF << 24) | vmesa->regHSTREF ); + OUT_RING( (HC_SubA_HSTMD << 24) | vmesa->regHSTMD ); ADVANCE_RING(); } else if (vmesa->hasDepth) { GLuint pitch, format, offset; if (vmesa->depthBits == 16) { - /* We haven't support 16bit depth yet */ format = HC_HZWBFM_16; - /*format = HC_HZWBFM_32;*/ - if (VIA_DEBUG) fprintf(stderr, "z format = 16\n"); } else { format = HC_HZWBFM_32; - if (VIA_DEBUG) fprintf(stderr, "z format = 32\n"); } @@ -123,60 +128,54 @@ void viaEmitState(viaContextPtr vmesa) pitch = vmesa->depth.pitch; BEGIN_RING(4); - OUT_RING( ((HC_SubA_HZWBBasL << 24) | (offset & 0xFFFFFF)) ); - OUT_RING( ((HC_SubA_HZWBBasH << 24) | ((offset & 0xFF000000) >> 24)) ); - OUT_RING( ((HC_SubA_HZWBType << 24) | HC_HDBLoc_Local | HC_HZONEasFF_MASK | - format | pitch) ); - OUT_RING( ((HC_SubA_HZWTMD << 24) | vmesa->regHZWTMD) ); + OUT_RING( (HC_SubA_HZWBBasL << 24) | (offset & 0xFFFFFF) ); + OUT_RING( (HC_SubA_HZWBBasH << 24) | ((offset & 0xFF000000) >> 24) ); + OUT_RING( (HC_SubA_HZWBType << 24) | HC_HDBLoc_Local | HC_HZONEasFF_MASK | + format | pitch ); + OUT_RING( (HC_SubA_HZWTMD << 24) | vmesa->regHZWTMD ); ADVANCE_RING(); } if (ctx->Color.AlphaEnabled) { BEGIN_RING(1); - OUT_RING( ((HC_SubA_HATMD << 24) | vmesa->regHATMD) ); + OUT_RING( (HC_SubA_HATMD << 24) | vmesa->regHATMD ); ADVANCE_RING(); i++; } if (ctx->Color.BlendEnabled) { BEGIN_RING(11); - OUT_RING( ((HC_SubA_HABLCsat << 24) | vmesa->regHABLCsat) ); - OUT_RING( ((HC_SubA_HABLCop << 24) | vmesa->regHABLCop) ); - OUT_RING( ((HC_SubA_HABLAsat << 24) | vmesa->regHABLAsat) ); - OUT_RING( ((HC_SubA_HABLAop << 24) | vmesa->regHABLAop) ); - OUT_RING( ((HC_SubA_HABLRCa << 24) | vmesa->regHABLRCa) ); - OUT_RING( ((HC_SubA_HABLRFCa << 24) | vmesa->regHABLRFCa) ); - OUT_RING( ((HC_SubA_HABLRCbias << 24) | vmesa->regHABLRCbias) ); - OUT_RING( ((HC_SubA_HABLRCb << 24) | vmesa->regHABLRCb) ); - OUT_RING( ((HC_SubA_HABLRFCb << 24) | vmesa->regHABLRFCb) ); - OUT_RING( ((HC_SubA_HABLRAa << 24) | vmesa->regHABLRAa) ); - OUT_RING( ((HC_SubA_HABLRAb << 24) | vmesa->regHABLRAb) ); + OUT_RING( (HC_SubA_HABLCsat << 24) | vmesa->regHABLCsat ); + OUT_RING( (HC_SubA_HABLCop << 24) | vmesa->regHABLCop ); + OUT_RING( (HC_SubA_HABLAsat << 24) | vmesa->regHABLAsat ); + OUT_RING( (HC_SubA_HABLAop << 24) | vmesa->regHABLAop ); + OUT_RING( (HC_SubA_HABLRCa << 24) | vmesa->regHABLRCa ); + OUT_RING( (HC_SubA_HABLRFCa << 24) | vmesa->regHABLRFCa ); + OUT_RING( (HC_SubA_HABLRCbias << 24) | vmesa->regHABLRCbias ); + OUT_RING( (HC_SubA_HABLRCb << 24) | vmesa->regHABLRCb ); + OUT_RING( (HC_SubA_HABLRFCb << 24) | vmesa->regHABLRFCb ); + OUT_RING( (HC_SubA_HABLRAa << 24) | vmesa->regHABLRAa ); + OUT_RING( (HC_SubA_HABLRAb << 24) | vmesa->regHABLRAb ); ADVANCE_RING(); } if (ctx->Fog.Enabled) { BEGIN_RING(3); - OUT_RING( ((HC_SubA_HFogLF << 24) | vmesa->regHFogLF) ); - OUT_RING( ((HC_SubA_HFogCL << 24) | vmesa->regHFogCL) ); - OUT_RING( ((HC_SubA_HFogCH << 24) | vmesa->regHFogCH) ); + OUT_RING( (HC_SubA_HFogLF << 24) | vmesa->regHFogLF ); + OUT_RING( (HC_SubA_HFogCL << 24) | vmesa->regHFogCL ); + OUT_RING( (HC_SubA_HFogCH << 24) | vmesa->regHFogCH ); ADVANCE_RING(); } - if (0 && ctx->Line.StippleFlag) { - BEGIN_RING(2); - OUT_RING( ((HC_SubA_HLP << 24) | ctx->Line.StipplePattern) ); - OUT_RING( ((HC_SubA_HLPRF << 24) | ctx->Line.StippleFactor) ); - ADVANCE_RING(); - } - else { + if (ctx->Line.StippleFlag) { BEGIN_RING(2); - OUT_RING( ((HC_SubA_HLP << 24) | 0xFFFF) ); - OUT_RING( ((HC_SubA_HLPRF << 24) | 0x1) ); + OUT_RING( (HC_SubA_HLP << 24) | ctx->Line.StipplePattern ); + OUT_RING( (HC_SubA_HLPRF << 24) | ctx->Line.StippleFactor ); ADVANCE_RING(); } BEGIN_RING(1); - OUT_RING( ((HC_SubA_HPixGC << 24) | 0x0) ); + OUT_RING( (HC_SubA_HPixGC << 24) | 0x0 ); ADVANCE_RING(); QWORD_PAD_RING(); @@ -194,34 +193,23 @@ void viaEmitState(viaContextPtr vmesa) OUT_RING( HC_HEADER2 ); OUT_RING( (HC_ParaType_Tex << 16) | (HC_SubType_TexGeneral << 24) ); - if (ctx->Texture._EnabledUnits > 1) { - if (VIA_DEBUG) fprintf(stderr, "multi texture\n"); - nDummyValue = (HC_SubA_HTXSMD << 24) | (1 << 3); - - /* Clear cache flag never set: - */ - if (0) { - OUT_RING( nDummyValue | HC_HTXCHCLR_MASK ); - OUT_RING( nDummyValue ); - } - else { - OUT_RING( nDummyValue ); - OUT_RING( nDummyValue ); - } + if (texUnit0->Enabled && texUnit1->Enabled) { + nDummyValue = (HC_SubA_HTXSMD << 24) | (1 << 3); } else { - if (VIA_DEBUG) fprintf(stderr, "single texture\n"); nDummyValue = (HC_SubA_HTXSMD << 24) | 0; - - if (0) { - OUT_RING( nDummyValue | HC_HTXCHCLR_MASK ); - OUT_RING( nDummyValue ); - } - else { - OUT_RING( nDummyValue ); - OUT_RING( nDummyValue ); - } } + + if (vmesa->clearTexCache) { + vmesa->clearTexCache = 0; + OUT_RING( nDummyValue | HC_HTXCHCLR_MASK ); + OUT_RING( nDummyValue ); + } + else { + OUT_RING( nDummyValue ); + OUT_RING( nDummyValue ); + } + OUT_RING( HC_HEADER2 ); OUT_RING( HC_ParaType_NotTex << 16 ); OUT_RING( (HC_SubA_HEnable << 24) | vmesa->regEnable ); @@ -231,11 +219,10 @@ void viaEmitState(viaContextPtr vmesa) if (texUnit0->Enabled) { struct gl_texture_object *texObj = texUnit0->_Current; - viaTextureObjectPtr t = (viaTextureObjectPtr)texObj->DriverData; + struct via_texture_object *t = (struct via_texture_object *)texObj; GLuint numLevels = t->lastLevel - t->firstLevel + 1; - if (VIA_DEBUG) { + if (VIA_DEBUG & DEBUG_STATE) { fprintf(stderr, "texture0 enabled\n"); - fprintf(stderr, "texture level %d\n", t->actualLevel); } if (numLevels == 8) { BEGIN_RING(27); @@ -320,24 +307,29 @@ void viaEmitState(viaContextPtr vmesa) ADVANCE_RING(); } - BEGIN_RING(12); - OUT_RING( (HC_SubA_HTXnTB << 24) | vmesa->regHTXnTB_0 ); - OUT_RING( (HC_SubA_HTXnMPMD << 24) | vmesa->regHTXnMPMD_0 ); - OUT_RING( (HC_SubA_HTXnTBLCsat << 24) | vmesa->regHTXnTBLCsat_0 ); - OUT_RING( (HC_SubA_HTXnTBLCop << 24) | vmesa->regHTXnTBLCop_0 ); - OUT_RING( (HC_SubA_HTXnTBLMPfog << 24) | vmesa->regHTXnTBLMPfog_0 ); - OUT_RING( (HC_SubA_HTXnTBLAsat << 24) | vmesa->regHTXnTBLAsat_0 ); - OUT_RING( (HC_SubA_HTXnTBLRCb << 24) | vmesa->regHTXnTBLRCb_0 ); - OUT_RING( (HC_SubA_HTXnTBLRAa << 24) | vmesa->regHTXnTBLRAa_0 ); - OUT_RING( (HC_SubA_HTXnTBLRFog << 24) | vmesa->regHTXnTBLRFog_0 ); - OUT_RING( (HC_SubA_HTXnTBLRCa << 24) | vmesa->regHTXnTBLRCa_0 ); - OUT_RING( (HC_SubA_HTXnTBLRCc << 24) | vmesa->regHTXnTBLRCc_0 ); - OUT_RING( (HC_SubA_HTXnTBLRCbias << 24) | vmesa->regHTXnTBLRCbias_0 ); + BEGIN_RING(14); + OUT_RING( (HC_SubA_HTXnTB << 24) | vmesa->regHTXnTB[0] ); + OUT_RING( (HC_SubA_HTXnMPMD << 24) | vmesa->regHTXnMPMD[0] ); + OUT_RING( (HC_SubA_HTXnTBLCsat << 24) | vmesa->regHTXnTBLCsat[0] ); + OUT_RING( (HC_SubA_HTXnTBLCop << 24) | vmesa->regHTXnTBLCop[0] ); + OUT_RING( (HC_SubA_HTXnTBLMPfog << 24) | vmesa->regHTXnTBLMPfog[0] ); + OUT_RING( (HC_SubA_HTXnTBLAsat << 24) | vmesa->regHTXnTBLAsat[0] ); + OUT_RING( (HC_SubA_HTXnTBLRCb << 24) | vmesa->regHTXnTBLRCb[0] ); + OUT_RING( (HC_SubA_HTXnTBLRAa << 24) | vmesa->regHTXnTBLRAa[0] ); + OUT_RING( (HC_SubA_HTXnTBLRFog << 24) | vmesa->regHTXnTBLRFog[0] ); + OUT_RING( (HC_SubA_HTXnTBLRCa << 24) | vmesa->regHTXnTBLRCa[0] ); + OUT_RING( (HC_SubA_HTXnTBLRCc << 24) | vmesa->regHTXnTBLRCc[0] ); + OUT_RING( (HC_SubA_HTXnTBLRCbias << 24) | vmesa->regHTXnTBLRCbias[0] ); + OUT_RING( (HC_SubA_HTXnTBC << 24) | vmesa->regHTXnTBC[0] ); + OUT_RING( (HC_SubA_HTXnTRAH << 24) | vmesa->regHTXnTRAH[0] ); +/* OUT_RING( (HC_SubA_HTXnCLODu << 24) | vmesa->regHTXnCLOD[0] ); */ ADVANCE_RING(); + /* KW: This test never succeeds: + */ if (t->regTexFM == HC_HTXnFM_Index8) { - struct gl_color_table *table = &texObj->Palette; - GLfloat *tableF = (GLfloat *)table->Table; + const struct gl_color_table *table = &texObj->Palette; + const GLfloat *tableF = table->TableF; BEGIN_RING(2 + table->Size); OUT_RING( HC_HEADER2 ); @@ -353,16 +345,16 @@ void viaEmitState(viaContextPtr vmesa) if (texUnit1->Enabled) { struct gl_texture_object *texObj = texUnit1->_Current; - viaTextureObjectPtr t = (viaTextureObjectPtr)texObj->DriverData; + struct via_texture_object *t = (struct via_texture_object *)texObj; GLuint numLevels = t->lastLevel - t->firstLevel + 1; - if (VIA_DEBUG) { + int texunit = (texUnit0->Enabled ? 1 : 0); + if (VIA_DEBUG & DEBUG_STATE) { fprintf(stderr, "texture1 enabled\n"); - fprintf(stderr, "texture level %d\n", t->actualLevel); } if (numLevels == 8) { BEGIN_RING(27); OUT_RING( HC_HEADER2 ); - OUT_RING( (HC_ParaType_Tex << 16) | (1 << 24) ); + OUT_RING( (HC_ParaType_Tex << 16) | (texunit << 24) ); OUT_RING( t->regTexFM ); OUT_RING( (HC_SubA_HTXnL0OS << 24) | ((t->lastLevel) << HC_HTXnLVmax_SHIFT) | t->firstLevel ); @@ -394,7 +386,7 @@ void viaEmitState(viaContextPtr vmesa) else if (numLevels > 1) { BEGIN_RING(12 + numLevels * 2); OUT_RING( HC_HEADER2 ); - OUT_RING( (HC_ParaType_Tex << 16) | (1 << 24) ); + OUT_RING( (HC_ParaType_Tex << 16) | (texunit << 24) ); OUT_RING( t->regTexFM ); OUT_RING( (HC_SubA_HTXnL0OS << 24) | ((t->lastLevel) << HC_HTXnLVmax_SHIFT) | t->firstLevel ); @@ -428,7 +420,7 @@ void viaEmitState(viaContextPtr vmesa) else { BEGIN_RING(9); OUT_RING( HC_HEADER2 ); - OUT_RING( (HC_ParaType_Tex << 16) | (1 << 24) ); + OUT_RING( (HC_ParaType_Tex << 16) | (texunit << 24) ); OUT_RING( t->regTexFM ); OUT_RING( (HC_SubA_HTXnL0OS << 24) | ((t->lastLevel) << HC_HTXnLVmax_SHIFT) | t->firstLevel ); @@ -440,25 +432,33 @@ void viaEmitState(viaContextPtr vmesa) ADVANCE_RING(); } - BEGIN_RING(9); - OUT_RING( (HC_SubA_HTXnTB << 24) | vmesa->regHTXnTB_1 ); - OUT_RING( (HC_SubA_HTXnMPMD << 24) | vmesa->regHTXnMPMD_1 ); - OUT_RING( (HC_SubA_HTXnTBLCsat << 24) | vmesa->regHTXnTBLCsat_1 ); - OUT_RING( (HC_SubA_HTXnTBLCop << 24) | vmesa->regHTXnTBLCop_1 ); - OUT_RING( (HC_SubA_HTXnTBLMPfog << 24) | vmesa->regHTXnTBLMPfog_1 ); - OUT_RING( (HC_SubA_HTXnTBLAsat << 24) | vmesa->regHTXnTBLAsat_1 ); - OUT_RING( (HC_SubA_HTXnTBLRCb << 24) | vmesa->regHTXnTBLRCb_1 ); - OUT_RING( (HC_SubA_HTXnTBLRAa << 24) | vmesa->regHTXnTBLRAa_1 ); - OUT_RING( (HC_SubA_HTXnTBLRFog << 24) | vmesa->regHTXnTBLRFog_1 ); + BEGIN_RING(14); + OUT_RING( (HC_SubA_HTXnTB << 24) | vmesa->regHTXnTB[1] ); + OUT_RING( (HC_SubA_HTXnMPMD << 24) | vmesa->regHTXnMPMD[1] ); + OUT_RING( (HC_SubA_HTXnTBLCsat << 24) | vmesa->regHTXnTBLCsat[1] ); + OUT_RING( (HC_SubA_HTXnTBLCop << 24) | vmesa->regHTXnTBLCop[1] ); + OUT_RING( (HC_SubA_HTXnTBLMPfog << 24) | vmesa->regHTXnTBLMPfog[1] ); + OUT_RING( (HC_SubA_HTXnTBLAsat << 24) | vmesa->regHTXnTBLAsat[1] ); + OUT_RING( (HC_SubA_HTXnTBLRCb << 24) | vmesa->regHTXnTBLRCb[1] ); + OUT_RING( (HC_SubA_HTXnTBLRAa << 24) | vmesa->regHTXnTBLRAa[1] ); + OUT_RING( (HC_SubA_HTXnTBLRFog << 24) | vmesa->regHTXnTBLRFog[1] ); + OUT_RING( (HC_SubA_HTXnTBLRCa << 24) | vmesa->regHTXnTBLRCa[1] ); + OUT_RING( (HC_SubA_HTXnTBLRCc << 24) | vmesa->regHTXnTBLRCc[1] ); + OUT_RING( (HC_SubA_HTXnTBLRCbias << 24) | vmesa->regHTXnTBLRCbias[1] ); + OUT_RING( (HC_SubA_HTXnTBC << 24) | vmesa->regHTXnTBC[1] ); + OUT_RING( (HC_SubA_HTXnTRAH << 24) | vmesa->regHTXnTRAH[1] ); +/* OUT_RING( (HC_SubA_HTXnCLODu << 24) | vmesa->regHTXnCLOD[1] ); */ ADVANCE_RING(); + /* KW: This test never succeeds: + */ if (t->regTexFM == HC_HTXnFM_Index8) { - struct gl_color_table *table = &texObj->Palette; - GLfloat *tableF = (GLfloat *)table->Table; + const struct gl_color_table *table = &texObj->Palette; + const GLfloat *tableF = table->TableF; BEGIN_RING(2 + table->Size); OUT_RING( HC_HEADER2 ); - OUT_RING( (HC_ParaType_Palette << 16) | (1 << 24) ); + OUT_RING( (HC_ParaType_Palette << 16) | (texunit << 24) ); for (j = 0; j < table->Size; j++) { OUT_RING( tableF[j] ); } @@ -469,81 +469,76 @@ void viaEmitState(viaContextPtr vmesa) } } +#if 0 + /* Polygon stipple is broken - for certain stipple values, + * eg. 0xf0f0f0f0, the hardware will refuse to accept the stipple. + * Coincidentally, conform generates just such a stipple. + */ if (ctx->Polygon.StippleFlag) { - GLuint *stipple = &vmesa->stipple[0]; + GLuint *stipple = &ctx->PolygonStipple[0]; + __DRIdrawablePrivate *dPriv = vmesa->driDrawable; + struct via_renderbuffer *const vrb = + (struct via_renderbuffer *) dPriv->driverPrivate; + GLint i; BEGIN_RING(38); OUT_RING( HC_HEADER2 ); + OUT_RING( ((HC_ParaType_Palette << 16) | (HC_SubType_Stipple << 24)) ); - OUT_RING( stipple[31] ); - OUT_RING( stipple[30] ); - OUT_RING( stipple[29] ); - OUT_RING( stipple[28] ); - OUT_RING( stipple[27] ); - OUT_RING( stipple[26] ); - OUT_RING( stipple[25] ); - OUT_RING( stipple[24] ); - OUT_RING( stipple[23] ); - OUT_RING( stipple[22] ); - OUT_RING( stipple[21] ); - OUT_RING( stipple[20] ); - OUT_RING( stipple[19] ); - OUT_RING( stipple[18] ); - OUT_RING( stipple[17] ); - OUT_RING( stipple[16] ); - OUT_RING( stipple[15] ); - OUT_RING( stipple[14] ); - OUT_RING( stipple[13] ); - OUT_RING( stipple[12] ); - OUT_RING( stipple[11] ); - OUT_RING( stipple[10] ); - OUT_RING( stipple[9] ); - OUT_RING( stipple[8] ); - OUT_RING( stipple[7] ); - OUT_RING( stipple[6] ); - OUT_RING( stipple[5] ); - OUT_RING( stipple[4] ); - OUT_RING( stipple[3] ); - OUT_RING( stipple[2] ); - OUT_RING( stipple[1] ); - OUT_RING( stipple[0] ); + for (i = 31; i >= 0; i--) { + GLint j; + GLuint k = 0; + + /* Need to flip bits left to right: + */ + for (j = 0 ; j < 32; j++) + if (stipple[i] & (1<driDrawable->h & 0x1F))) ); - OUT_RING( ((HC_SubA_HSPXYOS << 24) | (0x20 - (vmesa->driDrawable->h & 0x1F))) ); + OUT_RING( (HC_SubA_HSPXYOS << 24) ); + OUT_RING( (HC_SubA_HSPXYOS << 24) ); + ADVANCE_RING(); } +#endif - if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__); - vmesa->newEmitState = 0; } -static __inline__ GLuint viaPackColor(GLuint format, - GLubyte r, GLubyte g, - GLubyte b, GLubyte a) +static INLINE GLuint viaPackColor(GLuint bpp, + GLubyte r, GLubyte g, + GLubyte b, GLubyte a) { - switch (format) { - case 0x10: + switch (bpp) { + case 16: return PACK_COLOR_565(r, g, b); - case 0x20: + case 32: return PACK_COLOR_8888(a, r, g, b); default: - if (VIA_DEBUG) fprintf(stderr, "unknown format %d\n", (int)format); - return PACK_COLOR_8888(a, r, g, b); + assert(0); + return 0; } } -static void viaBlendEquationSeparate(GLcontext *ctx, GLenum rgbMode, GLenum aMode) +static void viaBlendEquationSeparate(GLcontext *ctx, + GLenum rgbMode, + GLenum aMode) { - if (VIA_DEBUG) fprintf(stderr, "%s in\n", __FUNCTION__); + if (VIA_DEBUG & DEBUG_STATE) + fprintf(stderr, "%s in\n", __FUNCTION__); /* GL_EXT_blend_equation_separate not supported */ ASSERT(rgbMode == aMode); /* Can only do GL_ADD equation in hardware */ - FALLBACK(VIA_CONTEXT(ctx), VIA_FALLBACK_BLEND_EQ, rgbMode != GL_FUNC_ADD_EXT); + FALLBACK(VIA_CONTEXT(ctx), VIA_FALLBACK_BLEND_EQ, + rgbMode != GL_FUNC_ADD_EXT); /* BlendEquation sets ColorLogicOpEnabled in an unexpected * manner. @@ -551,14 +546,14 @@ static void viaBlendEquationSeparate(GLcontext *ctx, GLenum rgbMode, GLenum aMod FALLBACK(VIA_CONTEXT(ctx), VIA_FALLBACK_LOGICOP, (ctx->Color.ColorLogicOpEnabled && ctx->Color.LogicOp != GL_COPY)); - if (VIA_DEBUG) fprintf(stderr, "%s out\n", __FUNCTION__); } static void viaBlendFunc(GLcontext *ctx, GLenum sfactor, GLenum dfactor) { - viaContextPtr vmesa = VIA_CONTEXT(ctx); + struct via_context *vmesa = VIA_CONTEXT(ctx); GLboolean fallback = GL_FALSE; - if (VIA_DEBUG) fprintf(stderr, "%s in\n", __FUNCTION__); + if (VIA_DEBUG & DEBUG_STATE) + fprintf(stderr, "%s in\n", __FUNCTION__); switch (ctx->Color.BlendSrcRGB) { case GL_SRC_ALPHA_SATURATE: @@ -584,7 +579,6 @@ static void viaBlendFunc(GLcontext *ctx, GLenum sfactor, GLenum dfactor) } FALLBACK(vmesa, VIA_FALLBACK_BLEND_FUNC, fallback); - if (VIA_DEBUG) fprintf(stderr, "%s out\n", __FUNCTION__); } /* Shouldn't be called as the extension is disabled. @@ -609,32 +603,33 @@ static void viaBlendFuncSeparate(GLcontext *ctx, GLenum sfactorRGB, static void viaScissor(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h) { - viaContextPtr vmesa = VIA_CONTEXT(ctx); + struct via_context *vmesa = VIA_CONTEXT(ctx); if (!vmesa->driDrawable) return; - if (VIA_DEBUG) - fprintf(stderr, "%s %d,%d %dx%d, drawH %d\n", __FUNCTION__, x,y,w,h, vmesa->driDrawable->h); + if (VIA_DEBUG & DEBUG_STATE) + fprintf(stderr, "%s %d,%d %dx%d, drawH %d\n", __FUNCTION__, + x,y,w,h, vmesa->driDrawable->h); - if (ctx->Scissor.Enabled) { + if (vmesa->scissor) { VIA_FLUSH_DMA(vmesa); /* don't pipeline cliprect changes */ } vmesa->scissorRect.x1 = x; - vmesa->scissorRect.y1 = vmesa->driDrawable->h - (y + h); + vmesa->scissorRect.y1 = vmesa->driDrawable->h - y - h; vmesa->scissorRect.x2 = x + w; vmesa->scissorRect.y2 = vmesa->driDrawable->h - y; - if (VIA_DEBUG) fprintf(stderr, "%s out\n", __FUNCTION__); } static void viaEnable(GLcontext *ctx, GLenum cap, GLboolean state) { - viaContextPtr vmesa = VIA_CONTEXT(ctx); + struct via_context *vmesa = VIA_CONTEXT(ctx); switch (cap) { case GL_SCISSOR_TEST: VIA_FLUSH_DMA(vmesa); + vmesa->scissor = state; break; default: break; @@ -653,39 +648,42 @@ static void viaRenderMode(GLcontext *ctx, GLenum mode) static void viaDrawBuffer(GLcontext *ctx, GLenum mode) { - viaContextPtr vmesa = VIA_CONTEXT(ctx); - if (VIA_DEBUG) fprintf(stderr, "%s in\n", __FUNCTION__); - if (mode == GL_FRONT) { - VIA_FLUSH_DMA(vmesa); - vmesa->drawBuffer = vmesa->readBuffer = &vmesa->front; - FALLBACK(vmesa, VIA_FALLBACK_DRAW_BUFFER, GL_FALSE); - return; - } - else if (mode == GL_BACK) { - VIA_FLUSH_DMA(vmesa); - vmesa->drawBuffer = vmesa->readBuffer = &vmesa->back; - FALLBACK(vmesa, VIA_FALLBACK_DRAW_BUFFER, GL_FALSE); - return; - } - else { - FALLBACK(vmesa, VIA_FALLBACK_DRAW_BUFFER, GL_TRUE); - return; - } + struct via_context *vmesa = VIA_CONTEXT(ctx); - viaXMesaWindowMoved(vmesa); + if (VIA_DEBUG & (DEBUG_DRI|DEBUG_STATE)) + fprintf(stderr, "%s in\n", __FUNCTION__); - /* We want to update the s/w rast state too so that viaSetBuffer() - * gets called. - */ - _swrast_DrawBuffer(ctx, mode); + if (!ctx->DrawBuffer) + return; + + if (ctx->DrawBuffer->_NumColorDrawBuffers != 1) { + FALLBACK(vmesa, VIA_FALLBACK_DRAW_BUFFER, GL_TRUE); + return; + } + + switch ( ctx->DrawBuffer->_ColorDrawBufferIndexes[0] ) { + case BUFFER_FRONT_LEFT: + VIA_FLUSH_DMA(vmesa); + vmesa->drawBuffer = &vmesa->front; + FALLBACK(vmesa, VIA_FALLBACK_DRAW_BUFFER, GL_FALSE); + break; + case BUFFER_BACK_LEFT: + VIA_FLUSH_DMA(vmesa); + vmesa->drawBuffer = &vmesa->back; + FALLBACK(vmesa, VIA_FALLBACK_DRAW_BUFFER, GL_FALSE); + break; + default: + FALLBACK(vmesa, VIA_FALLBACK_DRAW_BUFFER, GL_TRUE); + return; + } - if (VIA_DEBUG) fprintf(stderr, "%s out\n", __FUNCTION__); + viaXMesaWindowMoved(vmesa); } static void viaClearColor(GLcontext *ctx, const GLfloat color[4]) { - viaContextPtr vmesa = VIA_CONTEXT(ctx); + struct via_context *vmesa = VIA_CONTEXT(ctx); GLubyte pcolor[4]; CLAMPED_FLOAT_TO_UBYTE(pcolor[0], color[0]); CLAMPED_FLOAT_TO_UBYTE(pcolor[1], color[1]); @@ -694,7 +692,6 @@ static void viaClearColor(GLcontext *ctx, const GLfloat color[4]) vmesa->ClearColor = viaPackColor(vmesa->viaScreen->bitsPerPixel, pcolor[0], pcolor[1], pcolor[2], pcolor[3]); - } #define WRITEMASK_ALPHA_SHIFT 31 @@ -706,9 +703,9 @@ static void viaColorMask(GLcontext *ctx, GLboolean r, GLboolean g, GLboolean b, GLboolean a) { - viaContextPtr vmesa = VIA_CONTEXT( ctx ); + struct via_context *vmesa = VIA_CONTEXT( ctx ); - if (VIA_DEBUG) + if (VIA_DEBUG & DEBUG_STATE) fprintf(stderr, "%s r(%d) g(%d) b(%d) a(%d)\n", __FUNCTION__, r, g, b, a); vmesa->ClearMask = (((!r) << WRITEMASK_RED_SHIFT) | @@ -718,26 +715,23 @@ static void viaColorMask(GLcontext *ctx, } -/* ============================================================= - */ - -/* Using drawXoff like this is incorrect outside of locked regions. - * This hardware just isn't capable of private back buffers without +/* This hardware just isn't capable of private back buffers without * glitches and/or a hefty locking scheme. */ void viaCalcViewport(GLcontext *ctx) { - viaContextPtr vmesa = VIA_CONTEXT(ctx); + struct via_context *vmesa = VIA_CONTEXT(ctx); + __DRIdrawablePrivate *dPriv = vmesa->driDrawable; + struct via_renderbuffer *const vrb = + (struct via_renderbuffer *) dPriv->driverPrivate; const GLfloat *v = ctx->Viewport._WindowMap.m; GLfloat *m = vmesa->ViewportMatrix.m; - /* See also via_translate_vertex. - */ m[MAT_SX] = v[MAT_SX]; - m[MAT_TX] = v[MAT_TX] + SUBPIXEL_X + vmesa->drawXoff; + m[MAT_TX] = v[MAT_TX] + vrb->drawX + SUBPIXEL_X; m[MAT_SY] = - v[MAT_SY]; - m[MAT_TY] = - v[MAT_TY] + vmesa->driDrawable->h + SUBPIXEL_Y; + m[MAT_TY] = - v[MAT_TY] + vrb->drawY + SUBPIXEL_Y + vrb->drawH; m[MAT_SZ] = v[MAT_SZ] * (1.0 / vmesa->depth_max); m[MAT_TZ] = v[MAT_TZ] * (1.0 / vmesa->depth_max); } @@ -746,8 +740,6 @@ static void viaViewport(GLcontext *ctx, GLint x, GLint y, GLsizei width, GLsizei height) { - /* update size of Mesa/software ancillary buffers */ - _mesa_ResizeBuffersMESA(); viaCalcViewport(ctx); } @@ -757,51 +749,10 @@ static void viaDepthRange(GLcontext *ctx, viaCalcViewport(ctx); } -#if 0 -static void -flip_bytes( GLubyte *p, GLuint n ) -{ - register GLuint i, a, b; - - for (i=0;i> 1) | - ((b & 0x20) >> 3) | - ((b & 0x40) >> 5) | - ((b & 0x80) >> 7); - p[i] = (GLubyte) a; - } -} -#endif - -static void viaPolygonStipple( GLcontext *ctx, const GLubyte *mask ) -{ - viaContextPtr vmesa = VIA_CONTEXT(ctx); - GLubyte *s = (GLubyte *)vmesa->stipple; - int i; - - /* Fallback for the CLE266 case. Stipple works on the CLE266, but - * the stipple x/y offset registers don't seem to be respected, - * meaning that when drawXoff != 0, the stipple is rotated left or - * right by a few pixels, giving incorrect results. - */ - if (vmesa->viaScreen->deviceID == VIA_CLE266) { - FALLBACK( vmesa, VIA_FALLBACK_STIPPLE, ctx->Polygon.StippleFlag); - } else { - for (i=0;i<128;i++) - s[i] = mask[i]; - } -} - void viaInitState(GLcontext *ctx) { - viaContextPtr vmesa = VIA_CONTEXT(ctx); + struct via_context *vmesa = VIA_CONTEXT(ctx); - vmesa->regCmdA = HC_ACMD_HCmdA; vmesa->regCmdB = HC_ACMD_HCmdB; vmesa->regEnable = HC_HenCW_MASK; @@ -827,10 +778,10 @@ void viaInitState(GLcontext *ctx) /** * Convert S and T texture coordinate wrap modes to hardware bits. */ -static u_int32_t +static uint32_t get_wrap_mode( GLenum sWrap, GLenum tWrap ) { - u_int32_t v = 0; + uint32_t v = 0; switch( sWrap ) { @@ -862,205 +813,164 @@ get_wrap_mode( GLenum sWrap, GLenum tWrap ) return v; } - -static void viaChooseTextureState(GLcontext *ctx) +static uint32_t +get_minmag_filter( GLenum min, GLenum mag ) { - viaContextPtr vmesa = VIA_CONTEXT(ctx); - struct gl_texture_unit *texUnit0 = &ctx->Texture.Unit[0]; - struct gl_texture_unit *texUnit1 = &ctx->Texture.Unit[1]; - /*=* John Sheng [2003.7.18] texture combine *=*/ + uint32_t v = 0; - if (VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__); - if (texUnit0->_ReallyEnabled || texUnit1->_ReallyEnabled) { - if (VIA_DEBUG) { - fprintf(stderr, "Texture._ReallyEnabled - in\n"); - fprintf(stderr, "texUnit0->_ReallyEnabled = %x\n",texUnit0->_ReallyEnabled); - } + switch (min) { + case GL_NEAREST: + v = HC_HTXnFLSs_Nearest | + HC_HTXnFLTs_Nearest; + break; + case GL_LINEAR: + v = HC_HTXnFLSs_Linear | + HC_HTXnFLTs_Linear; + break; + case GL_NEAREST_MIPMAP_NEAREST: + v = HC_HTXnFLSs_Nearest | + HC_HTXnFLTs_Nearest; + v |= HC_HTXnFLDs_Nearest; + break; + case GL_LINEAR_MIPMAP_NEAREST: + v = HC_HTXnFLSs_Linear | + HC_HTXnFLTs_Linear; + v |= HC_HTXnFLDs_Nearest; + break; + case GL_NEAREST_MIPMAP_LINEAR: + v = HC_HTXnFLSs_Nearest | + HC_HTXnFLTs_Nearest; + v |= HC_HTXnFLDs_Linear; + break; + case GL_LINEAR_MIPMAP_LINEAR: + v = HC_HTXnFLSs_Linear | + HC_HTXnFLTs_Linear; + v |= HC_HTXnFLDs_Linear; + break; + default: + break; + } + + switch (mag) { + case GL_LINEAR: + v |= HC_HTXnFLSe_Linear | + HC_HTXnFLTe_Linear; + break; + case GL_NEAREST: + v |= HC_HTXnFLSe_Nearest | + HC_HTXnFLTe_Nearest; + break; + default: + break; + } - if (VIA_DEBUG) { - struct gl_texture_object *texObj0 = texUnit0->_Current; - struct gl_texture_object *texObj1 = texUnit1->_Current; + return v; +} - fprintf(stderr, "env mode: 0x%04x / 0x%04x\n", texUnit0->EnvMode, texUnit1->EnvMode); - if ( (texObj0 != NULL) && (texObj0->Image[0][0] != NULL) ) - fprintf(stderr, "format 0: 0x%04x\n", texObj0->Image[0][0]->Format); - - if ( (texObj1 != NULL) && (texObj1->Image[0][0] != NULL) ) - fprintf(stderr, "format 1: 0x%04x\n", texObj1->Image[0][0]->Format); - } +static GLboolean viaChooseTextureState(GLcontext *ctx) +{ + struct via_context *vmesa = VIA_CONTEXT(ctx); + struct gl_texture_unit *texUnit0 = &ctx->Texture.Unit[0]; + struct gl_texture_unit *texUnit1 = &ctx->Texture.Unit[1]; + if (texUnit0->_ReallyEnabled || texUnit1->_ReallyEnabled) { + vmesa->regEnable |= HC_HenTXMP_MASK | HC_HenTXCH_MASK | HC_HenTXPP_MASK; if (texUnit0->_ReallyEnabled) { struct gl_texture_object *texObj = texUnit0->_Current; - struct gl_texture_image *texImage = texObj->Image[0][0]; - - if (VIA_DEBUG) fprintf(stderr, "texUnit0->_ReallyEnabled\n"); - if (texImage->Border) { - FALLBACK(vmesa, VIA_FALLBACK_TEXTURE, GL_TRUE); - return; - } - - vmesa->regEnable |= HC_HenTXMP_MASK | HC_HenTXCH_MASK | HC_HenTXPP_MASK; - switch (texObj->MinFilter) { - case GL_NEAREST: - vmesa->regHTXnTB_0 = HC_HTXnFLSs_Nearest | - HC_HTXnFLTs_Nearest; - break; - case GL_LINEAR: - vmesa->regHTXnTB_0 = HC_HTXnFLSs_Linear | - HC_HTXnFLTs_Linear; - break; - case GL_NEAREST_MIPMAP_NEAREST: - vmesa->regHTXnTB_0 = HC_HTXnFLSs_Nearest | - HC_HTXnFLTs_Nearest; - vmesa->regHTXnTB_0 |= HC_HTXnFLDs_Nearest; - break; - case GL_LINEAR_MIPMAP_NEAREST: - vmesa->regHTXnTB_0 = HC_HTXnFLSs_Linear | - HC_HTXnFLTs_Linear; - vmesa->regHTXnTB_0 |= HC_HTXnFLDs_Nearest; - break; - case GL_NEAREST_MIPMAP_LINEAR: - vmesa->regHTXnTB_0 = HC_HTXnFLSs_Nearest | - HC_HTXnFLTs_Nearest; - vmesa->regHTXnTB_0 |= HC_HTXnFLDs_Linear; - break; - case GL_LINEAR_MIPMAP_LINEAR: - vmesa->regHTXnTB_0 = HC_HTXnFLSs_Linear | - HC_HTXnFLTs_Linear; - vmesa->regHTXnTB_0 |= HC_HTXnFLDs_Linear; - break; - default: - break; - } + vmesa->regHTXnTB[0] = get_minmag_filter( texObj->MinFilter, + texObj->MagFilter ); - switch (texObj->MagFilter) { - case GL_LINEAR: - vmesa->regHTXnTB_0 |= HC_HTXnFLSe_Linear | - HC_HTXnFLTe_Linear; - break; - case GL_NEAREST: - vmesa->regHTXnTB_0 |= HC_HTXnFLSe_Nearest | - HC_HTXnFLTe_Nearest; - break; - default: - break; - } - - vmesa->regHTXnMPMD_0 &= ~(HC_HTXnMPMD_SMASK | HC_HTXnMPMD_TMASK); - vmesa->regHTXnMPMD_0 |= get_wrap_mode( texObj->WrapS, + vmesa->regHTXnMPMD[0] &= ~(HC_HTXnMPMD_SMASK | HC_HTXnMPMD_TMASK); + vmesa->regHTXnMPMD[0] |= get_wrap_mode( texObj->WrapS, texObj->WrapT ); - if (VIA_DEBUG) fprintf(stderr, "texUnit0->EnvMode %x\n",texUnit0->EnvMode); + vmesa->regHTXnTB[0] &= ~(HC_HTXnTB_TBC_S | HC_HTXnTB_TBC_T); + if (texObj->Image[0][texObj->BaseLevel]->Border > 0) { + vmesa->regHTXnTB[0] |= (HC_HTXnTB_TBC_S | HC_HTXnTB_TBC_T); + vmesa->regHTXnTBC[0] = + PACK_COLOR_888(FLOAT_TO_UBYTE(texObj->BorderColor[0]), + FLOAT_TO_UBYTE(texObj->BorderColor[1]), + FLOAT_TO_UBYTE(texObj->BorderColor[2])); + vmesa->regHTXnTRAH[0] = FLOAT_TO_UBYTE(texObj->BorderColor[3]); + } - viaTexCombineState( vmesa, texUnit0->_CurrentCombine, 0 ); + if (texUnit0->LodBias != 0.0f) { + GLuint b = viaComputeLodBias(texUnit0->LodBias); + vmesa->regHTXnTB[0] &= ~HC_HTXnFLDs_MASK; + vmesa->regHTXnTB[0] |= HC_HTXnFLDs_ConstLOD; + vmesa->regHTXnCLOD[0] = (b&0x1f) | (((~b)&0x1f)<<10); /* FIXME */ + } + + if (!viaTexCombineState( vmesa, texUnit0->_CurrentCombine, 0 )) { + if (VIA_DEBUG & DEBUG_TEXTURE) + fprintf(stderr, "viaTexCombineState failed for unit 0\n"); + return GL_FALSE; + } } if (texUnit1->_ReallyEnabled) { struct gl_texture_object *texObj = texUnit1->_Current; - struct gl_texture_image *texImage = texObj->Image[0][0]; - if (texImage->Border) { - FALLBACK(vmesa, VIA_FALLBACK_TEXTURE, GL_TRUE); - return; - } + vmesa->regHTXnTB[1] = get_minmag_filter( texObj->MinFilter, + texObj->MagFilter ); + vmesa->regHTXnMPMD[1] &= ~(HC_HTXnMPMD_SMASK | HC_HTXnMPMD_TMASK); + vmesa->regHTXnMPMD[1] |= get_wrap_mode( texObj->WrapS, + texObj->WrapT ); - switch (texObj->MinFilter) { - case GL_NEAREST: - vmesa->regHTXnTB_1 = HC_HTXnFLSs_Nearest | - HC_HTXnFLTs_Nearest; - break; - case GL_LINEAR: - vmesa->regHTXnTB_1 = HC_HTXnFLSs_Linear | - HC_HTXnFLTs_Linear; - break; - case GL_NEAREST_MIPMAP_NEAREST: - vmesa->regHTXnTB_1 = HC_HTXnFLSs_Nearest | - HC_HTXnFLTs_Nearest; - vmesa->regHTXnTB_1 |= HC_HTXnFLDs_Nearest; - break ; - case GL_LINEAR_MIPMAP_NEAREST: - vmesa->regHTXnTB_1 = HC_HTXnFLSs_Linear | - HC_HTXnFLTs_Linear; - vmesa->regHTXnTB_1 |= HC_HTXnFLDs_Nearest; - break ; - case GL_NEAREST_MIPMAP_LINEAR: - vmesa->regHTXnTB_1 = HC_HTXnFLSs_Nearest | - HC_HTXnFLTs_Nearest; - vmesa->regHTXnTB_1 |= HC_HTXnFLDs_Linear; - break ; - case GL_LINEAR_MIPMAP_LINEAR: - vmesa->regHTXnTB_1 = HC_HTXnFLSs_Linear | - HC_HTXnFLTs_Linear; - vmesa->regHTXnTB_1 |= HC_HTXnFLDs_Linear; - break ; - default: - break; + vmesa->regHTXnTB[1] &= ~(HC_HTXnTB_TBC_S | HC_HTXnTB_TBC_T); + if (texObj->Image[0][texObj->BaseLevel]->Border > 0) { + vmesa->regHTXnTB[1] |= (HC_HTXnTB_TBC_S | HC_HTXnTB_TBC_T); + vmesa->regHTXnTBC[1] = + PACK_COLOR_888(FLOAT_TO_UBYTE(texObj->BorderColor[0]), + FLOAT_TO_UBYTE(texObj->BorderColor[1]), + FLOAT_TO_UBYTE(texObj->BorderColor[2])); + vmesa->regHTXnTRAH[1] = FLOAT_TO_UBYTE(texObj->BorderColor[3]); } - switch(texObj->MagFilter) { - case GL_NEAREST: - vmesa->regHTXnTB_1 |= HC_HTXnFLSs_Nearest | - HC_HTXnFLTs_Nearest; - break; - case GL_LINEAR: - vmesa->regHTXnTB_1 |= HC_HTXnFLSs_Linear | - HC_HTXnFLTs_Linear; - break; - default: - break; + + if (texUnit1->LodBias != 0.0f) { + GLuint b = viaComputeLodBias(texUnit1->LodBias); + vmesa->regHTXnTB[1] &= ~HC_HTXnFLDs_MASK; + vmesa->regHTXnTB[1] |= HC_HTXnFLDs_ConstLOD; + vmesa->regHTXnCLOD[1] = (b&0x1f) | (((~b)&0x1f)<<10); /* FIXME */ } - - vmesa->regHTXnMPMD_1 &= ~(HC_HTXnMPMD_SMASK | HC_HTXnMPMD_TMASK); - vmesa->regHTXnMPMD_1 |= get_wrap_mode( texObj->WrapS, - texObj->WrapT ); - viaTexCombineState( vmesa, texUnit1->_CurrentCombine, 1 ); + if (!viaTexCombineState( vmesa, texUnit1->_CurrentCombine, 1 )) { + if (VIA_DEBUG & DEBUG_TEXTURE) + fprintf(stderr, "viaTexCombineState failed for unit 1\n"); + return GL_FALSE; + } } - - if (VIA_DEBUG) { - fprintf( stderr, "Csat_0 / Cop_0 = 0x%08x / 0x%08x\n", - vmesa->regHTXnTBLCsat_0, vmesa->regHTXnTBLCop_0 ); - fprintf( stderr, "Asat_0 = 0x%08x\n", - vmesa->regHTXnTBLAsat_0 ); - fprintf( stderr, "RCb_0 / RAa_0 = 0x%08x / 0x%08x\n", - vmesa->regHTXnTBLRCb_0, vmesa->regHTXnTBLRAa_0 ); - fprintf( stderr, "RCa_0 / RCc_0 = 0x%08x / 0x%08x\n", - vmesa->regHTXnTBLRCa_0, vmesa->regHTXnTBLRCc_0 ); - fprintf( stderr, "RCbias_0 = 0x%08x\n", - vmesa->regHTXnTBLRCbias_0 ); - } } else { - vmesa->regEnable &= (~(HC_HenTXMP_MASK | HC_HenTXCH_MASK | HC_HenTXPP_MASK)); + vmesa->regEnable &= ~(HC_HenTXMP_MASK | HC_HenTXCH_MASK | + HC_HenTXPP_MASK); } - if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__); + return GL_TRUE; } static void viaChooseColorState(GLcontext *ctx) { - viaContextPtr vmesa = VIA_CONTEXT(ctx); + struct via_context *vmesa = VIA_CONTEXT(ctx); GLenum s = ctx->Color.BlendSrcRGB; GLenum d = ctx->Color.BlendDstRGB; /* The HW's blending equation is: * (Ca * FCa + Cbias + Cb * FCb) << Cshift */ - if (VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__); if (ctx->Color.BlendEnabled) { vmesa->regEnable |= HC_HenABL_MASK; /* Ca -- always from source color. */ - vmesa->regHABLCsat = HC_HABLCsat_MASK | HC_HABLCa_OPC | - HC_HABLCa_Csrc; + vmesa->regHABLCsat = HC_HABLCsat_MASK | HC_HABLCa_OPC | HC_HABLCa_Csrc; /* Aa -- always from source alpha. */ - vmesa->regHABLAsat = HC_HABLAsat_MASK | HC_HABLAa_OPA | - HC_HABLAa_Asrc; + vmesa->regHABLAsat = HC_HABLAsat_MASK | HC_HABLAa_OPA | HC_HABLAa_Asrc; /* FCa -- depend on following condition. * FAa -- depend on following condition. */ @@ -1122,8 +1032,10 @@ static void viaChooseColorState(GLcontext *ctx) if (vmesa->viaScreen->bitsPerPixel == 16) { /* (1, 1, 1, 1) */ - vmesa->regHABLCsat |= HC_HABLFCa_InvOPC | HC_HABLFCa_HABLRCa; - vmesa->regHABLAsat |= HC_HABLFAa_InvOPA | HC_HABLFAa_HABLFRA; + vmesa->regHABLCsat |= (HC_HABLFCa_InvOPC | + HC_HABLFCa_HABLRCa); + vmesa->regHABLAsat |= (HC_HABLFAa_InvOPA | + HC_HABLFAa_HABLFRA); vmesa->regHABLRFCa = 0x0; vmesa->regHABLRAa = 0x0; } @@ -1160,15 +1072,18 @@ static void viaChooseColorState(GLcontext *ctx) * So (f, f, f, 1) = (0, 0, 0, 1) */ vmesa->regHABLCsat |= HC_HABLFCa_OPC | HC_HABLFCa_HABLRCa; - vmesa->regHABLAsat |= HC_HABLFAa_InvOPA | HC_HABLFAa_HABLFRA; + vmesa->regHABLAsat |= (HC_HABLFAa_InvOPA | + HC_HABLFAa_HABLFRA); vmesa->regHABLRFCa = 0x0; vmesa->regHABLRAa = 0x0; } else { /* (f, f, f, 1), f = min(As, 1 - Ad) */ - vmesa->regHABLCsat |= HC_HABLFCa_OPC | HC_HABLFCa_mimAsrcInvAdst; - vmesa->regHABLAsat |= HC_HABLFAa_InvOPA | HC_HABLFAa_HABLFRA; + vmesa->regHABLCsat |= (HC_HABLFCa_OPC | + HC_HABLFCa_mimAsrcInvAdst); + vmesa->regHABLAsat |= (HC_HABLFAa_InvOPA | + HC_HABLFAa_HABLFRA); vmesa->regHABLRFCa = 0x0; vmesa->regHABLRAa = 0x0; } @@ -1299,7 +1214,7 @@ static void viaChooseColorState(GLcontext *ctx) if (ctx->Color.AlphaEnabled) { vmesa->regEnable |= HC_HenAT_MASK; - vmesa->regHATMD = (((GLchan)ctx->Color.AlphaRef) & 0xFF) | + vmesa->regHATMD = FLOAT_TO_UBYTE(ctx->Color.AlphaRef) | ((ctx->Color.AlphaFunc - GL_NEVER) << 8); } else { @@ -1315,35 +1230,28 @@ static void viaChooseColorState(GLcontext *ctx) } } + + vmesa->regEnable &= ~HC_HenDT_MASK; + if (ctx->Color.ColorLogicOpEnabled) vmesa->regHROP = ROP[ctx->Color.LogicOp & 0xF]; else vmesa->regHROP = HC_HROP_P; - if (vmesa->viaScreen->bitsPerPixel == 32) { - vmesa->regHFBBMSKL = PACK_COLOR_888(ctx->Color.ColorMask[0], - ctx->Color.ColorMask[1], - ctx->Color.ColorMask[2]); - vmesa->regHROP |= ctx->Color.ColorMask[3]; - } else { - GLushort color = PACK_COLOR_565(ctx->Color.ColorMask[0], - ctx->Color.ColorMask[1], - ctx->Color.ColorMask[2]); - vmesa->regHFBBMSKL = (color & 0xFF) << 16; - vmesa->regHROP |= (color & 0xFF00) >> 8; - } + vmesa->regHFBBMSKL = PACK_COLOR_888(ctx->Color.ColorMask[0], + ctx->Color.ColorMask[1], + ctx->Color.ColorMask[2]); + vmesa->regHROP |= ctx->Color.ColorMask[3]; if (ctx->Color.ColorMask[3]) vmesa->regEnable |= HC_HenAW_MASK; else vmesa->regEnable &= ~HC_HenAW_MASK; - - if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__); } static void viaChooseFogState(GLcontext *ctx) { - viaContextPtr vmesa = VIA_CONTEXT(ctx); + struct via_context *vmesa = VIA_CONTEXT(ctx); if (ctx->Fog.Enabled) { GLubyte r, g, b, a; @@ -1368,7 +1276,7 @@ static void viaChooseFogState(GLcontext *ctx) static void viaChooseDepthState(GLcontext *ctx) { - viaContextPtr vmesa = VIA_CONTEXT(ctx); + struct via_context *vmesa = VIA_CONTEXT(ctx); if (ctx->Depth.Test) { vmesa->regEnable |= HC_HenZT_MASK; if (ctx->Depth.Mask) @@ -1390,32 +1298,11 @@ static void viaChooseDepthState(GLcontext *ctx) } } -static void viaChooseLightState(GLcontext *ctx) -{ - viaContextPtr vmesa = VIA_CONTEXT(ctx); - - if (ctx->Light.ShadeModel == GL_SMOOTH) { - vmesa->regCmdA |= HC_HShading_Gouraud; - } - else { - vmesa->regCmdA &= ~HC_HShading_Gouraud; - } -} - static void viaChooseLineState(GLcontext *ctx) { - viaContextPtr vmesa = VIA_CONTEXT(ctx); + struct via_context *vmesa = VIA_CONTEXT(ctx); - if (ctx->Line.SmoothFlag) { - vmesa->regEnable |= HC_HenAA_MASK; - } - else { - if (!ctx->Polygon.SmoothFlag) { - vmesa->regEnable &= ~HC_HenAA_MASK; - } - } - - if (0 && ctx->Line.StippleFlag) { + if (ctx->Line.StippleFlag) { vmesa->regEnable |= HC_HenLP_MASK; vmesa->regHLP = ctx->Line.StipplePattern; vmesa->regHLPRF = ctx->Line.StippleFactor; @@ -1427,25 +1314,21 @@ static void viaChooseLineState(GLcontext *ctx) static void viaChoosePolygonState(GLcontext *ctx) { - viaContextPtr vmesa = VIA_CONTEXT(ctx); + struct via_context *vmesa = VIA_CONTEXT(ctx); - /* KW: FIXME: this should be in viaRasterPrimitive (somehow) +#if 0 + /* Polygon stipple is broken - see via_state.c */ - if (ctx->Polygon.SmoothFlag) { - vmesa->regEnable |= HC_HenAA_MASK; - } - else { - if (!ctx->Line.SmoothFlag) { - vmesa->regEnable &= ~HC_HenAA_MASK; - } - } - if (ctx->Polygon.StippleFlag) { vmesa->regEnable |= HC_HenSP_MASK; } else { vmesa->regEnable &= ~HC_HenSP_MASK; } +#else + FALLBACK(vmesa, VIA_FALLBACK_POLY_STIPPLE, + ctx->Polygon.StippleFlag); +#endif if (ctx->Polygon.CullFlag) { vmesa->regEnable |= HC_HenFBCull_MASK; @@ -1457,10 +1340,9 @@ static void viaChoosePolygonState(GLcontext *ctx) static void viaChooseStencilState(GLcontext *ctx) { - viaContextPtr vmesa = VIA_CONTEXT(ctx); - if (VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__); + struct via_context *vmesa = VIA_CONTEXT(ctx); - if (ctx->Stencil.Enabled) { + if (ctx->Stencil._Enabled) { GLuint temp; vmesa->regEnable |= HC_HenST_MASK; @@ -1538,23 +1420,14 @@ static void viaChooseStencilState(GLcontext *ctx) else { vmesa->regEnable &= ~HC_HenST_MASK; } - if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__); } static void viaChooseTriangle(GLcontext *ctx) { - viaContextPtr vmesa = VIA_CONTEXT(ctx); - if (VIA_DEBUG) { - fprintf(stderr, "%s - in\n", __FUNCTION__); - fprintf(stderr, "GL_CULL_FACE = %x\n", GL_CULL_FACE); - fprintf(stderr, "ctx->Polygon.CullFlag = %x\n", ctx->Polygon.CullFlag); - fprintf(stderr, "GL_FRONT = %x\n", GL_FRONT); - fprintf(stderr, "ctx->Polygon.CullFaceMode = %x\n", ctx->Polygon.CullFaceMode); - fprintf(stderr, "GL_CCW = %x\n", GL_CCW); - fprintf(stderr, "ctx->Polygon.FrontFace = %x\n", ctx->Polygon.FrontFace); - } + struct via_context *vmesa = VIA_CONTEXT(ctx); + if (ctx->Polygon.CullFlag == GL_TRUE) { switch (ctx->Polygon.CullFaceMode) { case GL_FRONT: @@ -1573,16 +1446,17 @@ static void viaChooseTriangle(GLcontext *ctx) return; } } - if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__); } void viaValidateState( GLcontext *ctx ) { - viaContextPtr vmesa = VIA_CONTEXT(ctx); - + struct via_context *vmesa = VIA_CONTEXT(ctx); + if (vmesa->newState & _NEW_TEXTURE) { - viaChooseTextureState(ctx); - viaUpdateTextureState(ctx); /* May modify vmesa->Fallback */ + GLboolean ok = (viaChooseTextureState(ctx) && + viaUpdateTextureState(ctx)); + + FALLBACK(vmesa, VIA_FALLBACK_TEXTURE, !ok); } if (vmesa->newState & _NEW_COLOR) @@ -1594,9 +1468,6 @@ void viaValidateState( GLcontext *ctx ) if (vmesa->newState & _NEW_FOG) viaChooseFogState(ctx); - if (vmesa->newState & _NEW_LIGHT) - viaChooseLightState(ctx); - if (vmesa->newState & _NEW_LINE) viaChooseLineState(ctx); @@ -1613,16 +1484,12 @@ void viaValidateState( GLcontext *ctx ) else vmesa->regEnable &= ~HC_HenCS_MASK; - /* CLE266 gets this wrong at least: Pixels which fail alpha test - * are incorrectly writen to the z buffer. This is a pretty big - * slowdown, it would be good to find out this wasn't necessary: - */ - if (vmesa->viaScreen->deviceID == VIA_CLE266) { - GLboolean fallback = (ctx->Color.AlphaEnabled && - ctx->Color.AlphaFunc != GL_ALWAYS && - ctx->Depth.Mask); - FALLBACK( vmesa, VIA_FALLBACK_ALPHATEST, fallback ); - } + if (ctx->Point.SmoothFlag || + ctx->Line.SmoothFlag || + ctx->Polygon.SmoothFlag) + vmesa->regEnable |= HC_HenAA_MASK; + else + vmesa->regEnable &= ~HC_HenAA_MASK; vmesa->newEmitState |= vmesa->newState; vmesa->newState = 0; @@ -1630,14 +1497,14 @@ void viaValidateState( GLcontext *ctx ) static void viaInvalidateState(GLcontext *ctx, GLuint newState) { - viaContextPtr vmesa = VIA_CONTEXT(ctx); + struct via_context *vmesa = VIA_CONTEXT(ctx); VIA_FINISH_PRIM( vmesa ); vmesa->newState |= newState; _swrast_InvalidateState(ctx, newState); _swsetup_InvalidateState(ctx, newState); - _ac_InvalidateState(ctx, newState); + _vbo_InvalidateState(ctx, newState); _tnl_InvalidateState(ctx, newState); } @@ -1659,21 +1526,7 @@ void viaInitStateFuncs(GLcontext *ctx) ctx->Driver.DepthRange = viaDepthRange; ctx->Driver.Viewport = viaViewport; ctx->Driver.Enable = viaEnable; - ctx->Driver.PolygonStipple = viaPolygonStipple; - /* Pixel path fallbacks. - */ - ctx->Driver.Accum = _swrast_Accum; - ctx->Driver.Bitmap = _swrast_Bitmap; - ctx->Driver.CopyPixels = _swrast_CopyPixels; - ctx->Driver.DrawPixels = _swrast_DrawPixels; - ctx->Driver.ReadPixels = _swrast_ReadPixels; + /* XXX this should go away */ ctx->Driver.ResizeBuffers = viaReAllocateBuffers; - - /* Swrast hooks for imaging extensions: - */ - ctx->Driver.CopyColorTable = _swrast_CopyColorTable; - ctx->Driver.CopyColorSubTable = _swrast_CopyColorSubTable; - ctx->Driver.CopyConvolutionFilter1D = _swrast_CopyConvolutionFilter1D; - ctx->Driver.CopyConvolutionFilter2D = _swrast_CopyConvolutionFilter2D; }