Disable polygon stipple - it seems to break if certain specific stipple

patterns are used, including the one generated by conform.
This commit is contained in:
Keith Whitwell 2005-05-25 10:17:19 +00:00
parent 8286abd798
commit 49109d01c0
2 changed files with 56 additions and 55 deletions

View File

@ -63,7 +63,7 @@ enum VIACHIPTAGS {
#define VIA_FALLBACK_BLEND_FUNC 0x400
#define VIA_FALLBACK_USER_DISABLE 0x800
#define VIA_FALLBACK_PROJ_TEXTURE 0x1000
#define VIA_FALLBACK_STIPPLE 0x2000
#define VIA_FALLBACK_POLY_STIPPLE 0x2000
#define VIA_DMA_BUFSIZ 4096
#define VIA_DMA_HIGHWATER (VIA_DMA_BUFSIZ - 128)

View File

@ -463,6 +463,7 @@ void viaEmitState(struct via_context *vmesa)
for (j = 0; j < table->Size; j++) {
OUT_RING( tableF[j] );
}
ADVANCE_RING();
}
@ -470,52 +471,42 @@ void viaEmitState(struct via_context *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 = &ctx->PolygonStipple[0];
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<<j))
k |= 1 << (31-j);
OUT_RING( k );
}
OUT_RING( HC_HEADER2 );
OUT_RING( (HC_ParaType_NotTex << 16) );
OUT_RING( (HC_SubA_HSPXYOS << 24) |
(((31 - vmesa->drawX) & 0x1f) << HC_HSPXOS_SHIFT));
(((32- vmesa->drawXoff) & 0x1f) << HC_HSPXOS_SHIFT));
OUT_RING( (HC_SubA_HSPXYOS << 24) |
(((31 - vmesa->drawX) & 0x1f) << HC_HSPXOS_SHIFT));
(((32 - vmesa->drawXoff) & 0x1f) << HC_HSPXOS_SHIFT));
ADVANCE_RING();
}
#endif
vmesa->newEmitState = 0;
}
@ -658,29 +649,32 @@ static void viaRenderMode(GLcontext *ctx, GLenum mode)
static void viaDrawBuffer(GLcontext *ctx, GLenum mode)
{
struct via_context *vmesa = VIA_CONTEXT(ctx);
struct via_context *vmesa = VIA_CONTEXT(ctx);
if (VIA_DEBUG & (DEBUG_DRI|DEBUG_STATE))
fprintf(stderr, "%s in\n", __FUNCTION__);
if (VIA_DEBUG & (DEBUG_DRI|DEBUG_STATE))
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;
}
if (!ctx->DrawBuffer)
return;
viaXMesaWindowMoved(vmesa);
switch ( ctx->DrawBuffer->_ColorDrawBufferMask[0] ) {
case BUFFER_BIT_FRONT_LEFT:
VIA_FLUSH_DMA(vmesa);
vmesa->drawBuffer = vmesa->readBuffer = &vmesa->front;
FALLBACK(vmesa, VIA_FALLBACK_DRAW_BUFFER, GL_FALSE);
break;
case BUFFER_BIT_BACK_LEFT:
VIA_FLUSH_DMA(vmesa);
vmesa->drawBuffer = vmesa->readBuffer = &vmesa->back;
FALLBACK(vmesa, VIA_FALLBACK_DRAW_BUFFER, GL_FALSE);
break;
default:
FALLBACK(vmesa, VIA_FALLBACK_DRAW_BUFFER, GL_TRUE);
return;
}
viaXMesaWindowMoved(vmesa);
/* We want to update the s/w rast state too so that viaSetBuffer()
* gets called.
@ -1328,12 +1322,19 @@ static void viaChoosePolygonState(GLcontext *ctx)
{
struct via_context *vmesa = VIA_CONTEXT(ctx);
#if 0
/* Polygon stipple is broken - see via_state.c
*/
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;