Get PolygonStipple working.. (or seemingly too). It seems to do the right

things now given the demos I've used and passes glean's paths test.
This commit is contained in:
Alan Hourihane 2005-01-14 13:10:50 +00:00
parent 38595eda39
commit 42cfcce8d4
3 changed files with 10 additions and 44 deletions

View file

@ -303,8 +303,6 @@ struct via_context_t {
GLuint swap_count;
GLuint swap_missed_count;
GLuint stipple[32];
PFNGLXGETUSTPROC get_ust;
};

View file

@ -542,18 +542,8 @@ static void via_emit_cliprect(viaContextPtr vmesa,
vb[4] = ((HC_SubA_HDBBasL << 24) | (offset & 0xFFFFFF));
vb[5] = ((HC_SubA_HDBBasH << 24) | ((offset & 0xFF000000)) >> 24);
/* HSPXYOS seems to be ignored on CLE266, don't emit. This is
* required for hardware stipple conformance (as long as we still
* have drawXoff).
*/
if (vmesa->viaScreen->deviceID == VIA_CLE266) {
vb[6] = HC_DUMMY;
vb[7] = ((HC_SubA_HDBFM << 24) | HC_HDBLoc_Local | format | pitch);
}
else {
vb[6] = ((HC_SubA_HDBFM << 24) | HC_HDBLoc_Local | format | pitch);
vb[7] = ((HC_SubA_HSPXYOS << 24) | ((32 - vmesa->drawXoff) << HC_HSPXOS_SHIFT));
}
vb[6] = ((HC_SubA_HSPXYOS << 24) | ((31 - vmesa->drawXoff) << HC_HSPXOS_SHIFT));
vb[7] = ((HC_SubA_HDBFM << 24) | HC_HDBLoc_Local | format | pitch);
}

View file

@ -466,7 +466,7 @@ void viaEmitState(viaContextPtr vmesa)
}
if (ctx->Polygon.StippleFlag) {
GLuint *stipple = &vmesa->stipple[0];
GLuint *stipple = &ctx->PolygonStipple[0];
BEGIN_RING(38);
OUT_RING( HC_HEADER2 );
@ -505,8 +505,8 @@ void viaEmitState(viaContextPtr vmesa)
OUT_RING( stipple[0] );
OUT_RING( HC_HEADER2 );
OUT_RING( (HC_ParaType_NotTex << 16) );
OUT_RING( ((HC_SubA_HSPXYOS << 24) | (0x20 - (vmesa->driDrawable->h & 0x1F))) );
OUT_RING( ((HC_SubA_HSPXYOS << 24) | (0x20 - (vmesa->driDrawable->h & 0x1F))) );
OUT_RING( ((HC_SubA_HSPXYOS << 24) | (((31 - vmesa->drawX) & 0x1f) << HC_HSPXOS_SHIFT)));
OUT_RING( ((HC_SubA_HSPXYOS << 24) | (((31 - vmesa->drawX) & 0x1f) << HC_HSPXOS_SHIFT)));
ADVANCE_RING();
}
@ -776,25 +776,6 @@ flip_bytes( GLubyte *p, GLuint n )
}
#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);
@ -1424,13 +1405,11 @@ static void viaChoosePolygonState(GLcontext *ctx)
}
}
if (vmesa->viaScreen->deviceID != VIA_CLE266) {
if (ctx->Polygon.StippleFlag) {
vmesa->regEnable |= HC_HenSP_MASK;
}
else {
vmesa->regEnable &= ~HC_HenSP_MASK;
}
if (ctx->Polygon.StippleFlag) {
vmesa->regEnable |= HC_HenSP_MASK;
}
else {
vmesa->regEnable &= ~HC_HenSP_MASK;
}
if (ctx->Polygon.CullFlag) {
@ -1634,7 +1613,6 @@ void viaInitStateFuncs(GLcontext *ctx)
ctx->Driver.DepthRange = viaDepthRange;
ctx->Driver.Viewport = viaViewport;
ctx->Driver.Enable = viaEnable;
ctx->Driver.PolygonStipple = viaPolygonStipple;
/* Pixel path fallbacks.
*/