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

Reply via email to