Fixed initialization of draw destination to front buffer on single

buffered visuals. Also don't change span draw/read buffers in
savageDDDrawBuffer. Now glean's polygon offset test works (and PASSes
with fixed point depth buffer) with single buffered visuals without
winding up in an infinite loop.
This commit is contained in:
Felix Kuehling 2005-01-23 01:46:14 +00:00
parent 3b50f00433
commit 8736c228cb

View file

@ -660,18 +660,14 @@ static void savageDDDrawBuffer(GLcontext *ctx, GLenum mode )
switch ( ctx->Color._DrawDestMask[0] ) {
case DD_FRONT_LEFT_BIT:
imesa->IsDouble = GL_FALSE;
imesa->drawMap = (char *)imesa->apertureBase[TARGET_FRONT];
imesa->readMap = (char *)imesa->apertureBase[TARGET_FRONT];
imesa->regs.s4.destCtrl.ni.offset = imesa->savageScreen->frontOffset>>11;
imesa->NotFirstFrame = GL_FALSE;
savageXMesaSetFrontClipRects( imesa );
FALLBACK( ctx, SAVAGE_FALLBACK_DRAW_BUFFER, GL_FALSE );
break;
case DD_BACK_LEFT_BIT:
imesa->IsDouble = GL_TRUE;
imesa->drawMap = (char *)imesa->apertureBase[TARGET_BACK];
imesa->readMap = (char *)imesa->apertureBase[TARGET_BACK];
imesa->regs.s4.destCtrl.ni.offset = imesa->savageScreen->backOffset>>11;
imesa->NotFirstFrame = GL_FALSE;
savageXMesaSetBackClipRects( imesa );
@ -1779,66 +1775,40 @@ void savageDDInitState( savageContextPtr imesa ) {
/*fprintf(stderr,"DBflag:%d\n",imesa->glCtx->Visual->DBflag);*/
/* zbufoffset and destctrl have the same position and layout on
* savage4 and savage3d. */
imesa->regs.s4.destCtrl.ni.offset = imesa->savageScreen->backOffset>>11;
if(imesa->savageScreen->cpp == 2)
{
if (imesa->glCtx->Visual.doubleBufferMode) {
imesa->IsDouble = GL_TRUE;
imesa->toggle = TARGET_BACK;
imesa->regs.s4.destCtrl.ni.offset =
imesa->savageScreen->backOffset>>11;
} else {
imesa->IsDouble = GL_FALSE;
imesa->toggle = TARGET_FRONT;
imesa->regs.s4.destCtrl.ni.offset =
imesa->savageScreen->frontOffset>>11;
}
if(imesa->savageScreen->cpp == 2) {
imesa->regs.s4.destCtrl.ni.dstPixFmt = 0;
imesa->regs.s4.destCtrl.ni.dstWidthInTile =
(imesa->savageScreen->width+63)>>6;
}
else
{
} else {
imesa->regs.s4.destCtrl.ni.dstPixFmt = 1;
imesa->regs.s4.destCtrl.ni.dstWidthInTile =
(imesa->savageScreen->width+31)>>5;
}
imesa->IsDouble = GL_TRUE;
imesa->drawMap = (char *)imesa->apertureBase[imesa->toggle];
imesa->readMap = (char *)imesa->apertureBase[imesa->toggle];
imesa->NotFirstFrame = GL_FALSE;
imesa->regs.s4.zBufOffset.ni.offset=imesa->savageScreen->depthOffset>>11;
if(imesa->savageScreen->zpp == 2)
{
if(imesa->savageScreen->zpp == 2) {
imesa->regs.s4.zBufOffset.ni.zBufWidthInTiles =
(imesa->savageScreen->width+63)>>6;
imesa->regs.s4.zBufOffset.ni.zDepthSelect = 0;
}
else
{
} else {
imesa->regs.s4.zBufOffset.ni.zBufWidthInTiles =
(imesa->savageScreen->width+31)>>5;
imesa->regs.s4.zBufOffset.ni.zDepthSelect = 1;
}
if (imesa->glCtx->Color._DrawDestMask[0] == DD_BACK_LEFT_BIT) {
if(imesa->IsFullScreen)
{
imesa->toggle = TARGET_BACK;
imesa->drawMap = (char *)imesa->apertureBase[imesa->toggle];
imesa->readMap = (char *)imesa->apertureBase[imesa->toggle];
}
else
{
imesa->drawMap = (char *)imesa->apertureBase[TARGET_BACK];
imesa->readMap = (char *)imesa->apertureBase[TARGET_BACK];
}
} else {
if(imesa->IsFullScreen)
{
imesa->toggle = TARGET_BACK;
imesa->drawMap = (char *)imesa->apertureBase[imesa->toggle];
imesa->readMap = (char *)imesa->apertureBase[imesa->toggle];
}
else
{
imesa->drawMap = (char *)imesa->apertureBase[TARGET_BACK];
imesa->readMap = (char *)imesa->apertureBase[TARGET_BACK];
}
}
memcpy (imesa->oldRegs.ui, imesa->regs.ui, SAVAGE_NR_REGS*sizeof(u_int32_t));