Attached is the patch I made to make more cliprects when > 2048. It dosen't have any code to move the 3d-viewport, I'm still looking into how that will work.
Where can I find docs on debuging the client GL driver? Just using ddd didn't work and gave me a broken bt. __________________________________ Do you Yahoo!? Friends. Fun. Try the all-new Yahoo! Messenger. http://messenger.yahoo.com/
Index: src/mesa/drivers/dri/r200/r200_lock.c =================================================================== RCS file: /cvs/mesa/Mesa/src/mesa/drivers/dri/r200/r200_lock.c,v retrieving revision 1.6 diff -u -r1.6 r200_lock.c --- a/src/mesa/drivers/dri/r200/r200_lock.c 21 Mar 2004 17:05:03 -0000 1.6 +++ b/src/mesa/drivers/dri/r200/r200_lock.c 27 May 2004 11:58:14 -0000 @@ -65,8 +65,78 @@ } R200_STATECHANGE( rmesa, ctx ); - rmesa->hw.ctx.cmd[CTX_RB3D_COLOROFFSET] = rmesa->state.color.drawOffset - + rmesa->r200Screen->fbLocation; +{ + drm_clip_rect_t *n; + int i; + printf ("Here are the %d old ClipRects\n", rmesa->numClipRects); + for ( i = 0 ; i < rmesa->numClipRects ; i++ ) + { + printf ("pClipRects[%d].x1 = %d\n", i, rmesa->pClipRects[i].x1); + printf ("pClipRects[%d].y1 = %d\n", i, rmesa->pClipRects[i].y1); + printf ("pClipRects[%d].x2 = %d\n", i, rmesa->pClipRects[i].x2); + printf ("pClipRects[%d].y2 = %d\n", i, rmesa->pClipRects[i].y2); + } + for ( i = 0 ; i < rmesa->numClipRects ; i++ ) + { + if ( rmesa->pClipRects[i].x2 - rmesa->pClipRects[i].x1 > 2048 ) + { + /* + * FIXME: This should be done in groups to prevent memory + * fragmentation. + */ + n = MALLOC( rmesa->numClipRects++ * + sizeof(drm_clip_rect_t) ); + MEMCPY( n, rmesa->pClipRects, + ( rmesa->numClipRects - 1 ) * + sizeof(drm_clip_rect_t) ); + FREE( rmesa->pClipRects ); + rmesa->pClipRects = n; + rmesa->pClipRects[rmesa->numClipRects - 1].y1 = + rmesa->pClipRects[i].y1; + rmesa->pClipRects[rmesa->numClipRects - 1].x2 = + rmesa->pClipRects[i].x2; + rmesa->pClipRects[rmesa->numClipRects - 1].y2 = + rmesa->pClipRects[i].y2; + rmesa->pClipRects[i].x2 -= 2049; + rmesa->pClipRects[rmesa->numClipRects - 1].x1 = + rmesa->pClipRects[i].x2 + 1; + } + if ( rmesa->pClipRects[i].y2 - rmesa->pClipRects[i].y1 > 2048 ) + { + n = MALLOC( rmesa->numClipRects++ * + sizeof(drm_clip_rect_t) ); + MEMCPY( n, rmesa->pClipRects, + ( rmesa->numClipRects - 1 ) * + sizeof(drm_clip_rect_t) ); + FREE( rmesa->pClipRects ); + rmesa->pClipRects = n; + rmesa->pClipRects[rmesa->numClipRects - 1].x1 = + rmesa->pClipRects[i].x1; + rmesa->pClipRects[rmesa->numClipRects - 1].x2 = + rmesa->pClipRects[i].x2; + rmesa->pClipRects[rmesa->numClipRects - 1].y2 = + rmesa->pClipRects[i].y2; + rmesa->pClipRects[i].y2 -= 2049; + rmesa->pClipRects[rmesa->numClipRects - 1].y1 = + rmesa->pClipRects[i].y2 + 1; + } + } + printf ("Here are the %d new ClipRects\n", rmesa->numClipRects); + for ( i = 0 ; i < rmesa->numClipRects ; i++ ) + { + printf ("pClipRects[%d].x1 = %d\n", i, rmesa->pClipRects[i].x1); + printf ("pClipRects[%d].y1 = %d\n", i, rmesa->pClipRects[i].y1); + printf ("pClipRects[%d].x2 = %d\n", i, rmesa->pClipRects[i].x2); + printf ("pClipRects[%d].y2 = %d\n", i, rmesa->pClipRects[i].y2); + } + rmesa->hw.ctx.cmd[CTX_RB3D_COLOROFFSET] = + ((rmesa->state.color.drawOffset + + rmesa->r200Screen->fbLocation + + /* (xmax / 2048) * xmin + */ + /* (ymax / 2048) * ymin * FBWid + */ + 0) + /* & R200_COLOROFFSET_MASK */); +} while (0); rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] = rmesa->state.color.drawPitch; }