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;
}