-#endif
-}
-
-static const GLenum reducedPrim[GL_POLYGON + 1] = {
- GL_POINTS,
- GL_LINES,
- GL_LINES,
- GL_LINES,
- GL_TRIANGLES,
- GL_TRIANGLES,
- GL_TRIANGLES,
- GL_TRIANGLES,
- GL_TRIANGLES,
- GL_TRIANGLES
-};
-
-
-static void emit_all_state(viaContextPtr vmesa)
-{
- GLcontext *ctx = vmesa->glCtx;
- GLuint *vb = viaCheckDma(vmesa, 0x110);
- GLuint i = 0;
- GLuint j = 0;
-#ifdef DEBUG
- if (VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__);
-#endif
-#ifdef PERFORMANCE_MEASURE
- if (VIA_PERFORMANCE) P_M;
-#endif
-
- *vb++ = HC_HEADER2;
- *vb++ = (HC_ParaType_NotTex << 16);
- *vb++ = ((HC_SubA_HEnable << 24) | vmesa->regEnable);
- *vb++ = ((HC_SubA_HFBBMSKL << 24) | vmesa->regHFBBMSKL);
- *vb++ = ((HC_SubA_HROP << 24) | vmesa->regHROP);
- i += 5;
-
- if (vmesa->hasDepth && vmesa->hasStencil) {
- GLuint pitch, format, offset;
-
- format = HC_HZWBFM_24;
-
- offset = vmesa->depth.offset;
- pitch = vmesa->depth.pitch;
-
- *vb++ = ((HC_SubA_HZWBBasL << 24) | (offset & 0xFFFFFF));
-
- *vb++ = ((HC_SubA_HZWBBasH << 24) | ((offset & 0xFF000000) >> 24));
- *vb++ = ((HC_SubA_HZWBType << 24) | HC_HDBLoc_Local | HC_HZONEasFF_MASK |
- format | pitch);
- *vb++ = ((HC_SubA_HZWTMD << 24) | vmesa->regHZWTMD);
- /* set stencil */
- *vb++ = ((HC_SubA_HSTREF << 24) | vmesa->regHSTREF);
- *vb++ = ((HC_SubA_HSTMD << 24) | vmesa->regHSTMD);
-
- i += 6;
- }
- 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;*/
-#ifdef DEBUG
- if (VIA_DEBUG) fprintf(stderr, "z format = 16\n");
-#endif
- }
- else {
- format = HC_HZWBFM_32;
-#ifdef DEBUG
- if (VIA_DEBUG) fprintf(stderr, "z format = 32\n");
-#endif
- }
-
-
- offset = vmesa->depth.offset;
- pitch = vmesa->depth.pitch;
-
- *vb++ = ((HC_SubA_HZWBBasL << 24) | (offset & 0xFFFFFF));
-
- *vb++ = ((HC_SubA_HZWBBasH << 24) | ((offset & 0xFF000000) >> 24));
- *vb++ = ((HC_SubA_HZWBType << 24) | HC_HDBLoc_Local | HC_HZONEasFF_MASK |
- format | pitch);
- *vb++ = ((HC_SubA_HZWTMD << 24) | vmesa->regHZWTMD);
- i += 4;
- }
- else if (vmesa->hasStencil) {
- GLuint pitch, format, offset;
-
- format = HC_HZWBFM_24;
-
- offset = vmesa->depth.offset;
- pitch = vmesa->depth.pitch;
-
- *vb++ = ((HC_SubA_HZWBBasL << 24) | (offset & 0xFFFFFF));
-
- *vb++ = ((HC_SubA_HZWBBasH << 24) | ((offset & 0xFF000000) >> 24));
- *vb++ = ((HC_SubA_HZWBType << 24) | HC_HDBLoc_Local | HC_HZONEasFF_MASK |
- format | pitch);
- *vb++ = ((HC_SubA_HZWTMD << 24) | vmesa->regHZWTMD);
- /* set stencil */
- *vb++ = ((HC_SubA_HSTREF << 24) | vmesa->regHSTREF);
- *vb++ = ((HC_SubA_HSTMD << 24) | vmesa->regHSTMD);
-
- i += 6;
- }
-
- if (ctx->Color.AlphaEnabled) {
- *vb++ = ((HC_SubA_HATMD << 24) | vmesa->regHATMD);
- i++;
- }
-
- if (ctx->Color.BlendEnabled) {
- *vb++ = ((HC_SubA_HABLCsat << 24) | vmesa->regHABLCsat);
- *vb++ = ((HC_SubA_HABLCop << 24) | vmesa->regHABLCop);
- *vb++ = ((HC_SubA_HABLAsat << 24) | vmesa->regHABLAsat);
- *vb++ = ((HC_SubA_HABLAop << 24) | vmesa->regHABLAop);
- *vb++ = ((HC_SubA_HABLRCa << 24) | vmesa->regHABLRCa);
- *vb++ = ((HC_SubA_HABLRFCa << 24) | vmesa->regHABLRFCa);
- *vb++ = ((HC_SubA_HABLRCbias << 24) | vmesa->regHABLRCbias);
- *vb++ = ((HC_SubA_HABLRCb << 24) | vmesa->regHABLRCb);
- *vb++ = ((HC_SubA_HABLRFCb << 24) | vmesa->regHABLRFCb);
- *vb++ = ((HC_SubA_HABLRAa << 24) | vmesa->regHABLRAa);
- *vb++ = ((HC_SubA_HABLRAb << 24) | vmesa->regHABLRAb);
- i += 11;
- }
-
- if (ctx->Fog.Enabled) {
- *vb++ = ((HC_SubA_HFogLF << 24) | vmesa->regHFogLF);
- *vb++ = ((HC_SubA_HFogCL << 24) | vmesa->regHFogCL);
- *vb++ = ((HC_SubA_HFogCH << 24) | vmesa->regHFogCH);
- i += 3;
- }
-
- if (ctx->Line.StippleFlag) {
- *vb++ = ((HC_SubA_HLP << 24) | ctx->Line.StipplePattern);
- *vb++ = ((HC_SubA_HLPRF << 24) | ctx->Line.StippleFactor);
- }
- else {
- *vb++ = ((HC_SubA_HLP << 24) | 0xFFFF);
- *vb++ = ((HC_SubA_HLPRF << 24) | 0x1);
- }
-
- i += 2;
-
- *vb++ = ((HC_SubA_HPixGC << 24) | 0x0);
- i++;
-
- if (i & 0x1) {
- *vb++ = HC_DUMMY;
- i++;
- }
-
- if (ctx->Texture.Unit[0]._ReallyEnabled) {
-
- struct gl_texture_unit *texUnit0 = &ctx->Texture.Unit[0];
- struct gl_texture_unit *texUnit1 = &ctx->Texture.Unit[1];
-
- {
- viaTextureObjectPtr t = (viaTextureObjectPtr)texUnit0->_Current->DriverData;
- GLuint nDummyValue = 0;
-
- *vb++ = HC_HEADER2;
- *vb++ = (HC_ParaType_Tex << 16) | (HC_SubType_TexGeneral << 24);
-
- if (ctx->Texture.Unit[1]._ReallyEnabled) {
-#ifdef DEBUG
- if (VIA_DEBUG) fprintf(stderr, "multi texture\n");
-#endif
- nDummyValue = (HC_SubA_HTXSMD << 24) | (1 << 3);
-
- if (t && t->needClearCache) {
- *vb++ = nDummyValue | HC_HTXCHCLR_MASK;
- *vb++ = nDummyValue;
- }
- else {
- *vb++ = nDummyValue;
- *vb++ = nDummyValue;
- }
- }
- else {
-#ifdef DEBUG
- if (VIA_DEBUG) fprintf(stderr, "single texture\n");
-#endif
- nDummyValue = (HC_SubA_HTXSMD << 24) | 0;
-
- if (t && t->needClearCache) {
- *vb++ = nDummyValue | HC_HTXCHCLR_MASK;
- *vb++ = nDummyValue;
- }
- else {
- *vb++ = nDummyValue;
- *vb++ = nDummyValue;
- }
- }
- *vb++ = HC_HEADER2;
- *vb++ = HC_ParaType_NotTex << 16;
- *vb++ = (HC_SubA_HEnable << 24) | vmesa->regEnable;
- *vb++ = (HC_SubA_HEnable << 24) | vmesa->regEnable;
- i += 8;
- }
-
- if (texUnit0->Enabled) {
- struct gl_texture_object *texObj = texUnit0->_Current;
- viaTextureObjectPtr t = (viaTextureObjectPtr)texObj->DriverData;
- GLuint numLevels = t->lastLevel - t->firstLevel + 1;
- GLuint nDummyValue = 0;
-#ifdef DEBUG
- if (VIA_DEBUG) {
- fprintf(stderr, "texture0 enabled\n");
- fprintf(stderr, "texture level %d\n", t->actualLevel);
- }
-#endif
- if (numLevels == 8) {
- nDummyValue = t->regTexFM;
- *vb++ = HC_HEADER2;
- *vb++ = (HC_ParaType_Tex << 16) | (0 << 24);
- *vb++ = t->regTexFM;
- *vb++ = (HC_SubA_HTXnL0OS << 24) |
- ((t->actualLevel) << HC_HTXnLVmax_SHIFT);
- *vb++ = t->regTexWidthLog2[0];
- *vb++ = t->regTexWidthLog2[1];
- *vb++ = t->regTexHeightLog2[0];
- *vb++ = t->regTexHeightLog2[1];
- *vb++ = t->regTexBaseH[0];
- *vb++ = t->regTexBaseH[1];
- *vb++ = t->regTexBaseH[2];
-
- *vb++ = t->regTexBaseAndPitch[0].baseL;
- *vb++ = t->regTexBaseAndPitch[0].pitchLog2;
- *vb++ = t->regTexBaseAndPitch[1].baseL;
- *vb++ = t->regTexBaseAndPitch[1].pitchLog2;
- *vb++ = t->regTexBaseAndPitch[2].baseL;
- *vb++ = t->regTexBaseAndPitch[2].pitchLog2;
- *vb++ = t->regTexBaseAndPitch[3].baseL;
- *vb++ = t->regTexBaseAndPitch[3].pitchLog2;
- *vb++ = t->regTexBaseAndPitch[4].baseL;
- *vb++ = t->regTexBaseAndPitch[4].pitchLog2;
- *vb++ = t->regTexBaseAndPitch[5].baseL;
- *vb++ = t->regTexBaseAndPitch[5].pitchLog2;
- *vb++ = t->regTexBaseAndPitch[6].baseL;
- *vb++ = t->regTexBaseAndPitch[6].pitchLog2;
- *vb++ = t->regTexBaseAndPitch[7].baseL;
- *vb++ = t->regTexBaseAndPitch[7].pitchLog2;
- i += 27;
- }
- else if (numLevels > 1) {
- nDummyValue = t->regTexFM;
- *vb++ = HC_HEADER2;
- *vb++ = (HC_ParaType_Tex << 16) | (0 << 24);
- *vb++ = t->regTexFM;
- *vb++ = (HC_SubA_HTXnL0OS << 24) |
- ((t->actualLevel) << HC_HTXnLVmax_SHIFT);
- *vb++ = t->regTexWidthLog2[0];
- *vb++ = t->regTexHeightLog2[0];
-
- if (numLevels > 6) {
- *vb++ = t->regTexWidthLog2[1];
- *vb++ = t->regTexHeightLog2[1];
- i += 2;
- }
-
- *vb++ = t->regTexBaseH[0];
-
- if (numLevels > 3) {
- *vb++ = t->regTexBaseH[1];
- i++;
- }
- if (numLevels > 6) {
- *vb++ = t->regTexBaseH[2];
- i++;
- }
- if (numLevels > 9) {
- *vb++ = t->regTexBaseH[3];
- i++;
- }
-
- i += 7;
-
- for (j = 0; j < numLevels; j++) {
- *vb++ = t->regTexBaseAndPitch[j].baseL;
- *vb++ = t->regTexBaseAndPitch[j].pitchLog2;
- i += 2;
- }
- }
- else {
- nDummyValue = t->regTexFM;
- *vb++ = HC_HEADER2;
- *vb++ = (HC_ParaType_Tex << 16) | (0 << 24);
- *vb++ = t->regTexFM;
- *vb++ = (HC_SubA_HTXnL0OS << 24) |
- ((t->actualLevel) << HC_HTXnLVmax_SHIFT);
- *vb++ = t->regTexWidthLog2[0];
- *vb++ = t->regTexHeightLog2[0];
- *vb++ = t->regTexBaseH[0];
- *vb++ = t->regTexBaseAndPitch[0].baseL;
- *vb++ = t->regTexBaseAndPitch[0].pitchLog2;
- i += 9;
- }
-
- *vb++ = (HC_SubA_HTXnTB << 24) | vmesa->regHTXnTB_0;
- *vb++ = (HC_SubA_HTXnMPMD << 24) | vmesa->regHTXnMPMD_0;
- *vb++ = (HC_SubA_HTXnTBLCsat << 24) | vmesa->regHTXnTBLCsat_0;
- *vb++ = (HC_SubA_HTXnTBLCop << 24) | vmesa->regHTXnTBLCop_0;
- *vb++ = (HC_SubA_HTXnTBLMPfog << 24) | vmesa->regHTXnTBLMPfog_0;
- *vb++ = (HC_SubA_HTXnTBLAsat << 24) | vmesa->regHTXnTBLAsat_0;
- *vb++ = (HC_SubA_HTXnTBLRCb << 24) | vmesa->regHTXnTBLRCb_0;
- *vb++ = (HC_SubA_HTXnTBLRAa << 24) | vmesa->regHTXnTBLRAa_0;
- *vb++ = (HC_SubA_HTXnTBLRFog << 24) | vmesa->regHTXnTBLRFog_0;
- i += 9;
- /*=* John Sheng [2003.7.18] texture combine */
- *vb++ = (HC_SubA_HTXnTBLRCa << 24) | vmesa->regHTXnTBLRCa_0;
- *vb++ = (HC_SubA_HTXnTBLRCc << 24) | vmesa->regHTXnTBLRCc_0;
- *vb++ = (HC_SubA_HTXnTBLRCbias << 24) | vmesa->regHTXnTBLRCbias_0;
- i += 3;
-
- if (t->regTexFM == HC_HTXnFM_Index8) {
- struct gl_color_table *table = &texObj->Palette;
- GLfloat *tableF = (GLfloat *)table->Table;
-
- *vb++ = HC_HEADER2;
- *vb++ = (HC_ParaType_Palette << 16) | (0 << 24);
- i += 2;
- for (j = 0; j < table->Size; j++) {
- *vb++ = tableF[j];
- i++;
- }
- }
- if (i & 0x1) {
- *vb++ = HC_DUMMY;
- i++;
- }
- }
-
- if (texUnit1->Enabled) {
- struct gl_texture_object *texObj = texUnit1->_Current;
- viaTextureObjectPtr t = (viaTextureObjectPtr)texObj->DriverData;
- GLuint numLevels = t->lastLevel - t->firstLevel + 1;
- GLuint nDummyValue = 0;
-#ifdef DEBUG
- if (VIA_DEBUG) {
- fprintf(stderr, "texture1 enabled\n");
- fprintf(stderr, "texture level %d\n", t->actualLevel);
- }
-#endif
- if (numLevels == 8) {
- nDummyValue = t->regTexFM;
- *vb++ = HC_HEADER2;
- *vb++ = (HC_ParaType_Tex << 16) | (1 << 24);
- *vb++ = t->regTexFM;
- *vb++ = (HC_SubA_HTXnL0OS << 24) |
- ((t->actualLevel) << HC_HTXnLVmax_SHIFT);
- *vb++ = t->regTexWidthLog2[0];
- *vb++ = t->regTexWidthLog2[1];
- *vb++ = t->regTexHeightLog2[0];
- *vb++ = t->regTexHeightLog2[1];
- *vb++ = t->regTexBaseH[0];
- *vb++ = t->regTexBaseH[1];
- *vb++ = t->regTexBaseH[2];
-
- *vb++ = t->regTexBaseAndPitch[0].baseL;
- *vb++ = t->regTexBaseAndPitch[0].pitchLog2;
- *vb++ = t->regTexBaseAndPitch[1].baseL;
- *vb++ = t->regTexBaseAndPitch[1].pitchLog2;
- *vb++ = t->regTexBaseAndPitch[2].baseL;
- *vb++ = t->regTexBaseAndPitch[2].pitchLog2;
- *vb++ = t->regTexBaseAndPitch[3].baseL;
- *vb++ = t->regTexBaseAndPitch[3].pitchLog2;
- *vb++ = t->regTexBaseAndPitch[4].baseL;
- *vb++ = t->regTexBaseAndPitch[4].pitchLog2;
- *vb++ = t->regTexBaseAndPitch[5].baseL;
- *vb++ = t->regTexBaseAndPitch[5].pitchLog2;
- *vb++ = t->regTexBaseAndPitch[6].baseL;
- *vb++ = t->regTexBaseAndPitch[6].pitchLog2;
- *vb++ = t->regTexBaseAndPitch[7].baseL;
- *vb++ = t->regTexBaseAndPitch[7].pitchLog2;
- i += 27;
- }
- else if (numLevels > 1) {
- nDummyValue = t->regTexFM;
- *vb++ = HC_HEADER2;
- *vb++ = (HC_ParaType_Tex << 16) | (1 << 24);
- *vb++ = t->regTexFM;
- *vb++ = (HC_SubA_HTXnL0OS << 24) |
- ((t->actualLevel) << HC_HTXnLVmax_SHIFT);
- *vb++ = t->regTexWidthLog2[0];
- *vb++ = t->regTexHeightLog2[0];
-
- if (numLevels > 6) {
- *vb++ = t->regTexWidthLog2[1];
- *vb++ = t->regTexHeightLog2[1];
- i += 2;
- }
-
- *vb++ = t->regTexBaseH[0];
-
- if (numLevels > 3) {
- *vb++ = t->regTexBaseH[1];
- i++;
- }
- if (numLevels > 6) {
- *vb++ = t->regTexBaseH[2];
- i++;
- }
- if (numLevels > 9) {
- *vb++ = t->regTexBaseH[3];
- i++;
- }
-
- i += 7;
-
- for (j = 0; j < numLevels; j++) {
- *vb++ = t->regTexBaseAndPitch[j].baseL;
- *vb++ = t->regTexBaseAndPitch[j].pitchLog2;
- i += 2;
- }
- }
- else {
- nDummyValue = t->regTexFM;
- *vb++ = HC_HEADER2;
- *vb++ = (HC_ParaType_Tex << 16) | (1 << 24);
- *vb++ = t->regTexFM;
- *vb++ = (HC_SubA_HTXnL0OS << 24) |
- ((t->actualLevel) << HC_HTXnLVmax_SHIFT);
- *vb++ = t->regTexWidthLog2[0];
- *vb++ = t->regTexHeightLog2[0];
- *vb++ = t->regTexBaseH[0];
- *vb++ = t->regTexBaseAndPitch[0].baseL;
- *vb++ = t->regTexBaseAndPitch[0].pitchLog2;
- i += 9;
- }
-
- *vb++ = (HC_SubA_HTXnTB << 24) | vmesa->regHTXnTB_1;
- *vb++ = (HC_SubA_HTXnMPMD << 24) | vmesa->regHTXnMPMD_1;
- *vb++ = (HC_SubA_HTXnTBLCsat << 24) | vmesa->regHTXnTBLCsat_1;
- *vb++ = (HC_SubA_HTXnTBLCop << 24) | vmesa->regHTXnTBLCop_1;
- *vb++ = (HC_SubA_HTXnTBLMPfog << 24) | vmesa->regHTXnTBLMPfog_1;
- *vb++ = (HC_SubA_HTXnTBLAsat << 24) | vmesa->regHTXnTBLAsat_1;
- *vb++ = (HC_SubA_HTXnTBLRCb << 24) | vmesa->regHTXnTBLRCb_1;
- *vb++ = (HC_SubA_HTXnTBLRAa << 24) | vmesa->regHTXnTBLRAa_1;
- *vb++ = (HC_SubA_HTXnTBLRFog << 24) | vmesa->regHTXnTBLRFog_1;
- i += 9;
-
- if (t->regTexFM == HC_HTXnFM_Index8) {
- struct gl_color_table *table = &texObj->Palette;
- GLfloat *tableF = (GLfloat *)table->Table;
-
- *vb++ = HC_HEADER2;
- *vb++ = (HC_ParaType_Palette << 16) | (1 << 24);
- i += 2;
- for (j = 0; j < table->Size; j++) {
- *vb++ = tableF[j];
- i++;
- }
- }
- if (i & 0x1) {
- *vb++ = HC_DUMMY;
- i++;
- }
- }
- }
-
-
- if (ctx->Polygon.StippleFlag) {
- GLuint *stipple = &ctx->PolygonStipple[0];
-
- *vb++ = HC_HEADER2;
- *vb++ = ((HC_ParaType_Palette << 16) | (HC_SubType_Stipple << 24));
-
- *vb++ = stipple[31];
- *vb++ = stipple[30];
- *vb++ = stipple[29];
- *vb++ = stipple[28];
- *vb++ = stipple[27];
- *vb++ = stipple[26];
- *vb++ = stipple[25];
- *vb++ = stipple[24];
- *vb++ = stipple[23];
- *vb++ = stipple[22];
- *vb++ = stipple[21];
- *vb++ = stipple[20];
- *vb++ = stipple[19];
- *vb++ = stipple[18];
- *vb++ = stipple[17];
- *vb++ = stipple[16];
- *vb++ = stipple[15];
- *vb++ = stipple[14];
- *vb++ = stipple[13];
- *vb++ = stipple[12];
- *vb++ = stipple[11];
- *vb++ = stipple[10];
- *vb++ = stipple[9];
- *vb++ = stipple[8];
- *vb++ = stipple[7];
- *vb++ = stipple[6];
- *vb++ = stipple[5];
- *vb++ = stipple[4];
- *vb++ = stipple[3];
- *vb++ = stipple[2];
- *vb++ = stipple[1];
- *vb++ = stipple[0];
-
- *vb++ = HC_HEADER2;
- *vb++ = (HC_ParaType_NotTex << 16);
- *vb++ = ((HC_SubA_HSPXYOS << 24) | (0x20 - (vmesa->driDrawable->h & 0x1F)));
- *vb++ = ((HC_SubA_HSPXYOS << 24) | (0x20 - (vmesa->driDrawable->h & 0x1F)));
- i += 38;
- }
-
- vmesa->dmaLow += (i << 2);
-
- vmesa->dirty = 0;
-#ifdef DEBUG
- if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__);
-#endif