Index: savagestate.c =================================================================== RCS file: /cvs/mesa/Mesa/src/mesa/drivers/dri/savage/savagestate.c,v retrieving revision 1.17 diff -u -p -r1.17 savagestate.c --- savagestate.c 8 Oct 2004 00:31:51 -0000 1.17 +++ savagestate.c 29 Oct 2004 17:47:53 -0000 @@ -606,19 +606,17 @@ static void savageDDDepthMask_s3d(GLcont static void savageDDScissor( GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h ) -{ +{ savageContextPtr imesa = SAVAGE_CONTEXT(ctx); - imesa->scissor_rect.x1 = MAX2(imesa->drawX+x,imesa->draw_rect.x1); - imesa->scissor_rect.y1 = MAX2(imesa->drawY+imesa->driDrawable->h -(y+h), - imesa->draw_rect.y1); - imesa->scissor_rect.x2 = MIN2(imesa->drawX+x+w,imesa->draw_rect.x2); - imesa->scissor_rect.y2 = MIN2(imesa->drawY+imesa->driDrawable->h - y, - imesa->draw_rect.y2); - + imesa->scissor_rect.x1 = x; + imesa->scissor_rect.y1 = imesa->driDrawable->h - (y + h); + imesa->scissor_rect.x2 = x + w; + imesa->scissor_rect.y2 = imesa->driDrawable->h - y; + imesa->scissorChanged=GL_TRUE; - imesa->dirty |= SAVAGE_UPLOAD_CLIPRECTS; + imesa->dirty |= SAVAGE_UPLOAD_CTX; } @@ -1146,7 +1144,8 @@ static void savageDDEnable_s4(GLcontext break; case GL_SCISSOR_TEST: imesa->scissor = state; - imesa->dirty |= SAVAGE_UPLOAD_CLIPRECTS; + imesa->scissorChanged = GL_TRUE; + imesa->dirty |= SAVAGE_UPLOAD_CTX; break; case GL_STENCIL_TEST: imesa->dirty |= SAVAGE_UPLOAD_CTX; @@ -1438,6 +1437,17 @@ static void savageEmitChangedRegChunk (s } } } + +static void screenScissorRect(savageContextPtr imesa, + drm_clip_rect_t *rect) + +{ + rect->x1 = MAX2(imesa->drawX+imesa->scissor_rect.x1,imesa->draw_rect.x1); + rect->y1 = MAX2(imesa->drawY+imesa->scissor_rect.y1,imesa->draw_rect.y1); + rect->x2 = MIN2(imesa->drawX+imesa->scissor_rect.x2,imesa->draw_rect.x2); + rect->y2 = MIN2(imesa->drawY+imesa->scissor_rect.y2,imesa->draw_rect.y2); +} + static void savageUpdateRegister_s4(savageContextPtr imesa) { uint32_t *pBCIBase; @@ -1449,10 +1459,13 @@ static void savageUpdateRegister_s4(sava { if(imesa->scissor) { - imesa->regs.s4.drawCtrl0.ni.scissorXStart = imesa->scissor_rect.x1; - imesa->regs.s4.drawCtrl0.ni.scissorYStart = imesa->scissor_rect.y1; - imesa->regs.s4.drawCtrl1.ni.scissorXEnd = imesa->scissor_rect.x2-1; - imesa->regs.s4.drawCtrl1.ni.scissorYEnd = imesa->scissor_rect.y2-1; + drm_clip_rect_t scissor_rect; + screenScissorRect(imesa, &scissor_rect); + + imesa->regs.s4.drawCtrl0.ni.scissorXStart = scissor_rect.x1; + imesa->regs.s4.drawCtrl0.ni.scissorYStart = scissor_rect.y1; + imesa->regs.s4.drawCtrl1.ni.scissorXEnd = scissor_rect.x2-1; + imesa->regs.s4.drawCtrl1.ni.scissorYEnd = scissor_rect.y2-1; } else { @@ -1486,14 +1499,17 @@ static void savageUpdateRegister_s3d(sav { if(imesa->scissor) { + drm_clip_rect_t scissor_rect; + screenScissorRect(imesa, &scissor_rect); + imesa->regs.s3d.scissorsStart.ni.scissorXStart = - imesa->scissor_rect.x1; + scissor_rect.x1; imesa->regs.s3d.scissorsStart.ni.scissorYStart = - imesa->scissor_rect.y1; + scissor_rect.y1; imesa->regs.s3d.scissorsEnd.ni.scissorXEnd = - imesa->scissor_rect.x2-1; + scissor_rect.x2-1; imesa->regs.s3d.scissorsEnd.ni.scissorYEnd = - imesa->scissor_rect.y2-1; + scissor_rect.y2-1; } else { @@ -1801,8 +1817,6 @@ void savageDDRenderStart(GLcontext *ctx) if (nbox) { imesa->currentClip = nbox; - /* set scissor to the first clip box*/ - savageDDScissor(ctx,pbox->x1,pbox->y1,pbox->x2,pbox->y2); /*savageDDUpdateHwState(ctx);*/ /* update to hardware register*/ }