Want to stop passing x/y/width/height to Clear() function.
authorBrian Paul <brian.paul@tungstengraphics.com>
Wed, 18 Oct 2006 20:02:42 +0000 (20:02 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Wed, 18 Oct 2006 20:02:42 +0000 (20:02 +0000)
The coordinates need to be computed after we've got the hw lock.
Code updated to:
1. Ignore all/x/y/width/height/ params passed to Clear func.
2. Pass 0,0,0,0,0 to _swrast_Clear() until they're totally removed.

15 files changed:
src/mesa/drivers/dri/ffb/ffb_clear.c
src/mesa/drivers/dri/i810/i810ioctl.c
src/mesa/drivers/dri/mach64/mach64_ioctl.c
src/mesa/drivers/dri/mga/mgaioctl.c
src/mesa/drivers/dri/r128/r128_ioctl.c
src/mesa/drivers/dri/r200/r200_ioctl.c
src/mesa/drivers/dri/r300/r300_ioctl.c
src/mesa/drivers/dri/radeon/radeon_ioctl.c
src/mesa/drivers/dri/s3v/s3v_state.c
src/mesa/drivers/dri/savage/savageioctl.c
src/mesa/drivers/dri/sis/sis6326_clear.c
src/mesa/drivers/dri/sis/sis_clear.c
src/mesa/drivers/dri/tdfx/tdfx_render.c
src/mesa/drivers/dri/trident/trident_state.c
src/mesa/drivers/dri/unichrome/via_ioctl.c

index c63179149a74fe7a963cdc2b7abe59056af51c5d..9cd5a12b7dc2098a252118b5e6efa1e208608eca 100644 (file)
@@ -123,16 +123,22 @@ CreatorComputePageFillFixups(struct ff_fixups *fixups,
 }
 
 static void
-ffb_do_clear(ffbContextPtr fmesa, __DRIdrawablePrivate *dPriv,
-            GLboolean all, GLint cx, GLint cy, GLint cwidth,
-            GLint cheight)
+ffb_do_clear(GLcontext *ctx, __DRIdrawablePrivate *dPriv)
 {
+       ffbContextPtr fmesa = FFB_CONTEXT(ctx);
        FFBDRIPtr gDRIPriv = (FFBDRIPtr) fmesa->driScreen->pDevPriv;
        ffb_fbcPtr ffb = fmesa->regs;
        drm_clip_rect_t *box = dPriv->pClipRects;
        int nc = dPriv->numClipRects;
+       GLint cx, cy, cw, ch;
+
+       /* compute region after locking: */
+       cx = ctx->DrawBuffer->_Xmin;
+       cy = ctx->DrawBuffer->_Ymin;
+       cw = ctx->DrawBuffer->_Xmax - cx;
+       ch = ctx->DrawBuffer->_Ymax - cy;
 
-       cy  = dPriv->h - cy - cheight;
+       cy  = dPriv->h - cy - ch;
        cx += dPriv->x;
        cy += dPriv->y;
 
@@ -145,25 +151,6 @@ ffb_do_clear(ffbContextPtr fmesa, __DRIdrawablePrivate *dPriv,
                int paligned_h, paligned_w = 0;
                int extra_work;
 
-               if (!all) {
-                       if (x < cx) {
-                               width -= cx - x;
-                               x = cx;
-                       }
-                       if (y < cy) {
-                               height -= cy - y;
-                               y = cy;
-                       }
-                       if (x + width > cx + cwidth)
-                               width = cx + cwidth - x;
-                       if (y + height > cy + cheight)
-                               height = cy + cheight - y;
-                       if (width <= 0)
-                               continue;
-                       if (height <= 0)
-                               continue;
-               }
-
                if (BOX_AREA(width, height) < gDRIPriv->fastfill_small_area) {
                        FFBFifo(fmesa, 5);
                        ffb->drawop = FFB_DRAWOP_RECTANGLE;
@@ -262,17 +249,15 @@ ffb_do_clear(ffbContextPtr fmesa, __DRIdrawablePrivate *dPriv,
        }
 }
 
-void ffbDDClear(GLcontext *ctx, GLbitfield mask, GLboolean all,
-               GLint cx, GLint cy, GLint cwidth, GLint cheight)
+void ffbDDClear(GLcontext *ctx, GLbitfield mask, GLboolean allFoo,
+               GLint cxFoo, GLint cyFoo, GLint cwidthFoo, GLint cheightFoo)
 {
        ffbContextPtr fmesa = FFB_CONTEXT(ctx);
        __DRIdrawablePrivate *dPriv = fmesa->driDrawable;
        unsigned int stcmask = BUFFER_BIT_STENCIL;
 
 #ifdef CLEAR_TRACE
-       fprintf(stderr, "ffbDDClear: mask(%08x) all(%d) "
-               "[x(%x)y(%x)w(%x)h(%x)]\n",
-               mask, (int) all, cx, cy, cwidth, cheight);
+       fprintf(stderr, "ffbDDClear: mask(%08x) \n", mask);
 #endif
        if (!(fmesa->ffb_sarea->flags & FFB_DRI_FFB2PLUS))
                stcmask = 0;
@@ -328,7 +313,7 @@ void ffbDDClear(GLcontext *ctx, GLbitfield mask, GLboolean all,
                        if (mask & stcmask)
                                ffb->consty = fmesa->clear_stencil;
 
-                       ffb_do_clear(fmesa, dPriv, all, cx, cy, cwidth, cheight);
+                       ffb_do_clear(ctx, dPriv);
 
                        FFBFifo(fmesa, 6);
                        ffb->ppc = fmesa->ppc;
@@ -349,6 +334,6 @@ void ffbDDClear(GLcontext *ctx, GLbitfield mask, GLboolean all,
        }
 
        if (mask) 
-               _swrast_Clear(ctx, mask, all, cx, cy, cwidth, cheight);
+               _swrast_Clear(ctx, mask, 0, 0, 0, 0, 0);
 }
 
index ba651555a67b73f3cdd283d4c03a561fcd3ea1f0..9e52d80a8b93a1b9c65f932a61317abbb02f7f77 100644 (file)
@@ -48,8 +48,8 @@ static drmBufPtr i810_get_buffer_ioctl( i810ContextPtr imesa )
 
 #define DEPTH_SCALE ((1<<16)-1)
 
-static void i810Clear( GLcontext *ctx, GLbitfield mask, GLboolean all,
-                      GLint cx, GLint cy, GLint cw, GLint ch ) 
+static void i810Clear( GLcontext *ctx, GLbitfield mask, GLboolean allFoo,
+                      GLint cxFoo, GLint cyFoo, GLint cwFoo, GLint chFoo ) 
 {
    i810ContextPtr imesa = I810_CONTEXT( ctx );
    __DRIdrawablePrivate *dPriv = imesa->driDrawable;
@@ -80,8 +80,16 @@ static void i810Clear( GLcontext *ctx, GLbitfield mask, GLboolean all,
    }
 
    if (clear.flags) {
+      GLint cx, cy, cw, ch;
+
       LOCK_HARDWARE( imesa );
 
+      /* compute region after locking: */
+      cx = ctx->DrawBuffer->_Xmin;
+      cy = ctx->DrawBuffer->_Ymin;
+      cw = ctx->DrawBuffer->_Xmax - cx;
+      ch = ctx->DrawBuffer->_Ymax - cy;
+
       /* flip top to bottom */
       cy = dPriv->h-cy-ch;
       cx += imesa->drawX;
@@ -94,7 +102,8 @@ static void i810Clear( GLcontext *ctx, GLbitfield mask, GLboolean all,
         drm_clip_rect_t *b = (drm_clip_rect_t *)imesa->sarea->boxes;
         int n = 0;
 
-        if (!all) {
+        if (cw != dPriv->w || ch != dPriv->h) {
+            /* clear sub region */
            for ( ; i < nr ; i++) {
               GLint x = box[i].x1;
               GLint y = box[i].y1;
@@ -116,6 +125,7 @@ static void i810Clear( GLcontext *ctx, GLbitfield mask, GLboolean all,
               n++;
            }
         } else {
+            /* clear whole buffer */
            for ( ; i < nr ; i++) {
               *b++ = box[i];
               n++;
@@ -132,7 +142,7 @@ static void i810Clear( GLcontext *ctx, GLbitfield mask, GLboolean all,
    }
 
    if (mask) 
-      _swrast_Clear( ctx, mask, all, cx, cy, cw, ch );
+      _swrast_Clear( ctx, mask, 0, 0, 0, 0, 0 );
 }
 
 
index 109da1b5824e4ef1571f2226063d46371cd82d53..30a45ad034cabca75d960d531d534195664bcd54 100644 (file)
@@ -665,8 +665,8 @@ void mach64PerformanceBoxesLocked( mach64ContextPtr mmesa )
  * Buffer clear
  */
 
-static void mach64DDClear( GLcontext *ctx, GLbitfield mask, GLboolean all,
-                          GLint cx, GLint cy, GLint cw, GLint ch )
+static void mach64DDClear( GLcontext *ctx, GLbitfield mask, GLboolean allFoo,
+                          GLint cxFoo, GLint cyFoo, GLint cwFoo, GLint chFoo )
 {
    mach64ContextPtr mmesa = MACH64_CONTEXT( ctx );
    __DRIdrawablePrivate *dPriv = mmesa->driDrawable;
@@ -674,10 +674,10 @@ static void mach64DDClear( GLcontext *ctx, GLbitfield mask, GLboolean all,
    GLuint flags = 0;
    GLint i;
    GLint ret;
+   GLint cx, cy, cw, ch;
 
    if ( MACH64_DEBUG & DEBUG_VERBOSE_API ) {
-      fprintf( stderr, "%s: all=%d %d,%d %dx%d\n",
-              __FUNCTION__, all, cx, cy, cw, ch );
+      fprintf( stderr, "mach64DDClear\n");
    }
 
 #if ENABLE_PERF_BOXES
@@ -713,14 +713,19 @@ static void mach64DDClear( GLcontext *ctx, GLbitfield mask, GLboolean all,
    }
 
    if ( mask )
-      _swrast_Clear( ctx, mask, all, cx, cy, cw, ch );
+      _swrast_Clear( ctx, mask, 0, 0, 0, 0, 0 );
 
    if ( !flags )
       return;
 
    LOCK_HARDWARE( mmesa );
 
-   /* This needs to be in the locked region, so updated drawable origin is used */
+   /* compute region after locking: */
+   cx = ctx->DrawBuffer->_Xmin;
+   cy = ctx->DrawBuffer->_Ymin;
+   cw = ctx->DrawBuffer->_Xmax - cx;
+   ch = ctx->DrawBuffer->_Ymax - cy;
+
    /* Flip top to bottom */
    cx += mmesa->drawX;
    cy  = mmesa->drawY + dPriv->h - cy - ch;
@@ -737,7 +742,8 @@ static void mach64DDClear( GLcontext *ctx, GLbitfield mask, GLboolean all,
       drm_clip_rect_t *b = mmesa->sarea->boxes;
       GLint n = 0;
 
-      if ( !all ) {
+      if (cw != dPriv->w || ch != dPriv->h) {
+         /* clear subregion */
         for ( ; i < nr ; i++ ) {
            GLint x = box[i].x1;
            GLint y = box[i].y1;
@@ -759,6 +765,7 @@ static void mach64DDClear( GLcontext *ctx, GLbitfield mask, GLboolean all,
            n++;
         }
       } else {
+         /* clear whole window */
         for ( ; i < nr ; i++ ) {
            *b++ = box[i];
            n++;
index 6e653f8c73debe54a4143c51b12482f68437d57e..c9fa9d1294064835ffde734a03b1fd38b39425b2 100644 (file)
@@ -204,8 +204,8 @@ drmBufPtr mga_get_buffer_ioctl( mgaContextPtr mmesa )
 
 
 static void
-mgaClear( GLcontext *ctx, GLbitfield mask, GLboolean all,
-            GLint cx, GLint cy, GLint cw, GLint ch )
+mgaClear( GLcontext *ctx, GLbitfield mask, GLboolean allFoo,
+          GLint cxFoo, GLint cyFoo, GLint cwFoo, GLint chFoo )
 {
    mgaContextPtr mmesa = MGA_CONTEXT(ctx);
    __DRIdrawablePrivate *dPriv = mmesa->driDrawable;
@@ -218,6 +218,7 @@ mgaClear( GLcontext *ctx, GLbitfield mask, GLboolean all,
    int i;
    static int nrclears;
    drm_mga_clear_t clear;
+   GLint cx, cy, cw, ch;
 
    FLUSH_BATCH( mmesa );
 
@@ -250,6 +251,12 @@ mgaClear( GLcontext *ctx, GLbitfield mask, GLboolean all,
    if ( flags ) {
       LOCK_HARDWARE( mmesa );
 
+      /* compute region after locking: */
+      cx = ctx->DrawBuffer->_Xmin;
+      cy = ctx->DrawBuffer->_Ymin;
+      cw = ctx->DrawBuffer->_Xmax - cx;
+      ch = ctx->DrawBuffer->_Ymax - cy;
+
       if ( mmesa->dirty_cliprects )
         mgaUpdateRects( mmesa, (MGA_FRONT | MGA_BACK) );
 
@@ -269,7 +276,8 @@ mgaClear( GLcontext *ctx, GLbitfield mask, GLboolean all,
         drm_clip_rect_t *b = mmesa->sarea->boxes;
         int n = 0;
 
-        if (!all) {
+        if (cw != dPriv->w || ch != dPriv->h) {
+            /* clear subregion */
            for ( ; i < nr ; i++) {
               GLint x = box[i].x1;
               GLint y = box[i].y1;
@@ -291,6 +299,7 @@ mgaClear( GLcontext *ctx, GLbitfield mask, GLboolean all,
               n++;
            }
         } else {
+            /* clear whole window */
            for ( ; i < nr ; i++) {
               *b++ = box[i];
               n++;
@@ -325,7 +334,7 @@ mgaClear( GLcontext *ctx, GLbitfield mask, GLboolean all,
    }
 
    if (mask) 
-      _swrast_Clear( ctx, mask, all, cx, cy, cw, ch );
+      _swrast_Clear( ctx, mask, 0, 0, 0, 0, 0 );
 }
 
 
index 3b34d9fbb2d107896a337734584914da17bd2dac..7dbb5e5ddab97640bfb61374c09a4fd53dd7d8ca 100644 (file)
@@ -399,8 +399,8 @@ void r128PageFlip( const __DRIdrawablePrivate *dPriv )
  * Buffer clear
  */
 
-static void r128Clear( GLcontext *ctx, GLbitfield mask, GLboolean all,
-                        GLint cx, GLint cy, GLint cw, GLint ch )
+static void r128Clear( GLcontext *ctx, GLbitfield mask, GLboolean allFoo,
+                       GLint cxFoo, GLint cyFoo, GLint cwFoo, GLint chFoo )
 {
    r128ContextPtr rmesa = R128_CONTEXT(ctx);
    __DRIdrawablePrivate *dPriv = rmesa->driDrawable;
@@ -409,6 +409,7 @@ static void r128Clear( GLcontext *ctx, GLbitfield mask, GLboolean all,
    GLint i;
    GLint ret;
    GLuint depthmask = 0;
+   GLint cx, cy, cw, ch;
 
    if ( R128_DEBUG & DEBUG_VERBOSE_API ) {
       fprintf( stderr, "%s:\n", __FUNCTION__ );
@@ -453,12 +454,18 @@ static void r128Clear( GLcontext *ctx, GLbitfield mask, GLboolean all,
 
    if ( flags ) {
 
+      LOCK_HARDWARE( rmesa );
+
+      /* compute region after locking: */
+      cx = ctx->DrawBuffer->_Xmin;
+      cy = ctx->DrawBuffer->_Ymin;
+      cw = ctx->DrawBuffer->_Xmax - cx;
+      ch = ctx->DrawBuffer->_Ymax - cy;
+
       /* Flip top to bottom */
       cx += dPriv->x;
       cy  = dPriv->y + dPriv->h - cy - ch;
 
-      LOCK_HARDWARE( rmesa );
-
       /* FIXME: Do we actually need this?
        */
       if ( rmesa->dirty & ~R128_UPLOAD_CLIPRECTS ) {
@@ -471,7 +478,8 @@ static void r128Clear( GLcontext *ctx, GLbitfield mask, GLboolean all,
         drm_clip_rect_t *b = rmesa->sarea->boxes;
         GLint n = 0;
 
-        if ( !all ) {
+        if (cw != dPriv->w || ch != dPriv->h) {
+            /* clear subregion */
            for ( ; i < nr ; i++ ) {
               GLint x = box[i].x1;
               GLint y = box[i].y1;
@@ -493,6 +501,7 @@ static void r128Clear( GLcontext *ctx, GLbitfield mask, GLboolean all,
               n++;
            }
         } else {
+            /* clear whole window */
            for ( ; i < nr ; i++ ) {
               *b++ = box[i];
               n++;
@@ -532,7 +541,7 @@ static void r128Clear( GLcontext *ctx, GLbitfield mask, GLboolean all,
    }
 
    if ( mask )
-      _swrast_Clear( ctx, mask, all, cx, cy, cw, ch );
+      _swrast_Clear( ctx, mask, 0, 0, 0, 0, 0 );
 }
 
 
index 650d7cfdf2bc0e0f1a23d510a2f7e4c0e020b0da..efa0b64ed2557b2875e43fc0bfdde354d0d616a8 100644 (file)
@@ -605,18 +605,18 @@ void r200PageFlip( const __DRIdrawablePrivate *dPriv )
 /* ================================================================
  * Buffer clear
  */
-static void r200Clear( GLcontext *ctx, GLbitfield mask, GLboolean all,
-                        GLint cx, GLint cy, GLint cw, GLint ch )
+static void r200Clear( GLcontext *ctx, GLbitfield mask, GLboolean allFoo,
+                       GLint cxFoo, GLint cyFoo, GLint cwFoo, GLint chFoo )
 {
    r200ContextPtr rmesa = R200_CONTEXT(ctx);
    __DRIdrawablePrivate *dPriv = rmesa->dri.drawable;
    GLuint flags = 0;
    GLuint color_mask = 0;
    GLint ret, i;
+   GLint cx, cy, cw, ch;
 
    if ( R200_DEBUG & DEBUG_IOCTL ) {
-      fprintf( stderr, "%s:  all=%d cx=%d cy=%d cw=%d ch=%d\n",
-              __FUNCTION__, all, cx, cy, cw, ch );
+      fprintf( stderr, "r200Clear\n");
    }
 
    {
@@ -653,7 +653,7 @@ static void r200Clear( GLcontext *ctx, GLbitfield mask, GLboolean all,
    if ( mask ) {
       if (R200_DEBUG & DEBUG_FALLBACKS)
         fprintf(stderr, "%s: swrast clear, mask: %x\n", __FUNCTION__, mask);
-      _swrast_Clear( ctx, mask, all, cx, cy, cw, ch );
+      _swrast_Clear( ctx, mask, 0, 0, 0, 0, 0 );
    }
 
    if ( !flags ) 
@@ -670,12 +670,18 @@ static void r200Clear( GLcontext *ctx, GLbitfield mask, GLboolean all,
       }
    }
 
+   LOCK_HARDWARE( rmesa );
+
+   /* compute region after locking: */
+   cx = ctx->DrawBuffer->_Xmin;
+   cy = ctx->DrawBuffer->_Ymin;
+   cw = ctx->DrawBuffer->_Xmax - cx;
+   ch = ctx->DrawBuffer->_Ymax - cy;
+
    /* Flip top to bottom */
    cx += dPriv->x;
    cy  = dPriv->y + dPriv->h - cy - ch;
 
-   LOCK_HARDWARE( rmesa );
-
    /* Throttle the number of clear ioctls we do.
     */
    while ( 1 ) {
@@ -717,7 +723,8 @@ static void r200Clear( GLcontext *ctx, GLbitfield mask, GLboolean all,
       drm_radeon_clear_rect_t depth_boxes[RADEON_NR_SAREA_CLIPRECTS];
       GLint n = 0;
 
-      if ( !all ) {
+      if (cw != dPriv->w || ch != dPriv->h) {
+         /* clear subregion */
         for ( ; i < nr ; i++ ) {
            GLint x = box[i].x1;
            GLint y = box[i].y1;
@@ -739,6 +746,7 @@ static void r200Clear( GLcontext *ctx, GLbitfield mask, GLboolean all,
            n++;
         }
       } else {
+         /* clear whole window */
         for ( ; i < nr ; i++ ) {
            *b++ = box[i];
            n++;
index d0d2def8648c5a4088cb9bedd1beeec075f229ce..7775ca96e4b856a3194e168d3923aab03b1f2e11 100644 (file)
@@ -477,8 +477,8 @@ static void r300EmitClearState(GLcontext * ctx)
 /**
  * Buffer clear
  */
-static void r300Clear(GLcontext * ctx, GLbitfield mask, GLboolean all,
-                     GLint cx, GLint cy, GLint cw, GLint ch)
+static void r300Clear(GLcontext * ctx, GLbitfield mask, GLboolean allFoo,
+                     GLint cxFoo, GLint cyFoo, GLint cwFoo, GLint chFoo)
 {
        r300ContextPtr r300 = R300_CONTEXT(ctx);
        __DRIdrawablePrivate *dPriv = r300->radeon.dri.drawable;
@@ -487,8 +487,7 @@ static void r300Clear(GLcontext * ctx, GLbitfield mask, GLboolean all,
        int swapped;
 
        if (RADEON_DEBUG & DEBUG_IOCTL)
-               fprintf(stderr, "%s:  all=%d cx=%d cy=%d cw=%d ch=%d\n",
-                       __FUNCTION__, all, cx, cy, cw, ch);
+               fprintf(stderr, "r300Clear\n");
 
        {
                LOCK_HARDWARE(&r300->radeon);
@@ -521,7 +520,7 @@ static void r300Clear(GLcontext * ctx, GLbitfield mask, GLboolean all,
                if (RADEON_DEBUG & DEBUG_FALLBACKS)
                        fprintf(stderr, "%s: swrast clear, mask: %x\n",
                                __FUNCTION__, mask);
-               _swrast_Clear(ctx, mask, all, cx, cy, cw, ch);
+               _swrast_Clear(ctx, mask, 0, 0, 0, 0, 0);
        }
 
        swapped = r300->radeon.doPageFlip && (r300->radeon.sarea->pfCurrentPage == 1);
index aee849e13bfbe0cd32cbee07a6eaf64568dfe466..d9eec622f34cd15068295dd27fb5ee2ac82d100d 100644 (file)
@@ -1021,8 +1021,8 @@ void radeonPageFlip( const __DRIdrawablePrivate *dPriv )
  */
 #define RADEON_MAX_CLEARS      256
 
-static void radeonClear( GLcontext *ctx, GLbitfield mask, GLboolean all,
-                        GLint cx, GLint cy, GLint cw, GLint ch )
+static void radeonClear( GLcontext *ctx, GLbitfield mask, GLboolean allFoo,
+                        GLint cxFoo, GLint cyFoo, GLint cwFoo, GLint chFoo )
 {
    radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
    __DRIdrawablePrivate *dPriv = rmesa->dri.drawable;
@@ -1031,10 +1031,10 @@ static void radeonClear( GLcontext *ctx, GLbitfield mask, GLboolean all,
    GLuint flags = 0;
    GLuint color_mask = 0;
    GLint ret, i;
+   GLint cx, cy, cw, ch;
 
    if ( RADEON_DEBUG & DEBUG_IOCTL ) {
-      fprintf( stderr, "%s:  all=%d cx=%d cy=%d cw=%d ch=%d\n",
-              __FUNCTION__, all, cx, cy, cw, ch );
+      fprintf( stderr, "radeonClear\n");
    }
 
    {
@@ -1071,7 +1071,7 @@ static void radeonClear( GLcontext *ctx, GLbitfield mask, GLboolean all,
    if ( mask ) {
       if (RADEON_DEBUG & DEBUG_FALLBACKS)
         fprintf(stderr, "%s: swrast clear, mask: %x\n", __FUNCTION__, mask);
-      _swrast_Clear( ctx, mask, all, cx, cy, cw, ch );
+      _swrast_Clear( ctx, mask, 0, 0, 0, 0, 0 );
    }
 
    if ( !flags ) 
@@ -1094,6 +1094,12 @@ static void radeonClear( GLcontext *ctx, GLbitfield mask, GLboolean all,
 
    LOCK_HARDWARE( rmesa );
 
+   /* compute region after locking: */
+   cx = ctx->DrawBuffer->_Xmin;
+   cy = ctx->DrawBuffer->_Ymin;
+   cw = ctx->DrawBuffer->_Xmax - cx;
+   ch = ctx->DrawBuffer->_Ymax - cy;
+
    /* Throttle the number of clear ioctls we do.
     */
    while ( 1 ) {
@@ -1132,7 +1138,8 @@ static void radeonClear( GLcontext *ctx, GLbitfield mask, GLboolean all,
       drm_radeon_clear_rect_t depth_boxes[RADEON_NR_SAREA_CLIPRECTS];
       GLint n = 0;
 
-      if ( !all ) {
+      if (cw != dPriv->w || ch != dPriv->h) {
+         /* clear subregion */
         for ( ; i < nr ; i++ ) {
            GLint x = box[i].x1;
            GLint y = box[i].y1;
@@ -1154,6 +1161,7 @@ static void radeonClear( GLcontext *ctx, GLbitfield mask, GLboolean all,
            n++;
         }
       } else {
+         /* clear whole buffer */
         for ( ; i < nr ; i++ ) {
            *b++ = box[i];
            n++;
index e692f20e8a93182dfb6919f0105b3d119ced2cde..4f412edf0947902838db93a09b44fe23ad9e5d34 100644 (file)
@@ -73,11 +73,17 @@ static void s3vDDBlendFunc( GLcontext *ctx, GLenum sfactor, GLenum dfactor )
  * Buffer clear
  */
 
-static void s3vDDClear( GLcontext *ctx, GLbitfield mask, GLboolean all,
-                              GLint cx, GLint cy, GLint cw, GLint ch )
+static void s3vDDClear( GLcontext *ctx, GLbitfield mask, GLboolean allFoo,
+                        GLint cxFoo, GLint cyFoo, GLint cwFoo, GLint chFoo )
 {
        s3vContextPtr vmesa = S3V_CONTEXT(ctx);
        unsigned int _stride;
+        GLint cx = ctx->DrawBuffer->_Xmin;
+        GLint cy = ctx->DrawBuffer->_Ymin;
+        GLint cw = ctx->DrawBuffer->_Xmax - cx;
+        GLint ch = ctx->DrawBuffer->_Ymax - cy;
+
+        /* XXX FIX ME: the cx,cy,cw,ch vars are currently ignored! */
 
        vmesa->restore_primitive = -1;
 
@@ -120,7 +126,7 @@ static void s3vDDClear( GLcontext *ctx, GLbitfield mask, GLboolean all,
        if (mask & BUFFER_BIT_DEPTH) { /* depth */
                DEBUG(("BUFFER_BIT_DEPTH\n"));
                
-               _stride = ((cw+31)&~31) * 2;
+               _stride = ((cw+31)&~31) * 2; /* XXX cw or Buffer->Width??? */
 
                DMAOUT_CHECK(BITBLT_SRC_BASE, 15);
                        DMAOUT(0);
@@ -157,7 +163,7 @@ static void s3vDDClear( GLcontext *ctx, GLbitfield mask, GLboolean all,
        if ( mask )
                DEBUG(("still masked ;3(\n")); */ /* yes */
 #else
-      _swrast_Clear( ctx, mask, all, cx, cy, cw, ch );
+      _swrast_Clear( ctx, mask, 0, 0, 0, 0, 0 );
 #endif
 }
 
index 244959d64f951408bff505251a37f55cb08a2cae..7513a07e8523557b8b1b865dae4ff96094ad5a64 100644 (file)
@@ -327,11 +327,17 @@ static GLuint savageIntersectClipRects(drm_clip_rect_t *dest,
 }
 
 
-static void savageDDClear( GLcontext *ctx, GLbitfield mask, GLboolean all,
-                          GLint cx, GLint cy, GLint cw, GLint ch ) 
+static void savageDDClear( GLcontext *ctx, GLbitfield mask, GLboolean allFoo,
+                          GLint cxFoo, GLint cyFoo, GLint cwFoo, GLint chFoo ) 
 {
-  savageContextPtr imesa = SAVAGE_CONTEXT( ctx );
+   savageContextPtr imesa = SAVAGE_CONTEXT( ctx );
    GLuint colorMask, depthMask, clearColor, clearDepth, flags;
+   GLint cx = ctx->DrawBuffer->_Xmin;
+   GLint cy = ctx->DrawBuffer->_Ymin;
+   GLint cw = ctx->DrawBuffer->_Xmax - cx;
+   GLint ch = ctx->DrawBuffer->_Ymax - cy;
+
+   /* XXX FIX ME: the cx,cy,cw,ch vars are currently ignored! */
 
    if (SAVAGE_DEBUG & DEBUG_VERBOSE_MSG)
        fprintf (stderr, "%s\n", __FUNCTION__);
@@ -420,7 +426,7 @@ static void savageDDClear( GLcontext *ctx, GLbitfield mask, GLboolean all,
    }
 
    if (mask) 
-      _swrast_Clear( ctx, mask, all, cx, cy, cw, ch );
+      _swrast_Clear( ctx, mask, 0, 0, 0, 0, 0 );
 }
 
 /*
index be5addb7cf2a65b2df544b440c5622d37a9710a2..d8f39b31c7d4bdd0bbfa4884f7f98b7eb6d55a7f 100644 (file)
@@ -69,25 +69,19 @@ sis6326UpdateZPattern(sisContextPtr smesa, GLclampd z)
 }
 
 void
-sis6326DDClear(GLcontext *ctx, GLbitfield mask, GLboolean all,
-       GLint x, GLint y, GLint width, GLint height)
+sis6326DDClear(GLcontext *ctx, GLbitfield mask, GLboolean allFoo,
+               GLint xFoo, GLint yFoo, GLint widthFoo, GLint heightFoo)
 {
    sisContextPtr smesa = SIS_CONTEXT(ctx);
    GLint x1, y1, width1, height1;
 
-   if (all) {
-      GLframebuffer *buffer = ctx->DrawBuffer;
-
-      x1 = 0;
-      y1 = 0;
-      width1 = buffer->Width;
-      height1 = buffer->Height;
-   } else {
-      x1 = x;
-      y1 = Y_FLIP(y+height-1);
-      width1 = width;
-      height1 = height;
-   }
+   /* get region after locking: */
+   x1 = ctx->DrawBuffer->_Xmin;
+   y1 = ctx->DrawBuffer->_Ymin;
+   width1 = ctx->DrawBuffer->_Xmax - x1;
+   height1 = ctx->DrawBuffer->_Ymax - y1;
+   y1 = Y_FLIP(y1 + height1 - 1);
+
    /* XXX: Scissoring */
    
    fprintf(stderr, "Clear\n");
@@ -116,7 +110,7 @@ sis6326DDClear(GLcontext *ctx, GLbitfield mask, GLboolean all,
    UNLOCK_HARDWARE();
 
    if (mask != 0)
-      _swrast_Clear(ctx, mask, all, x1, y1, width, height);
+      _swrast_Clear(ctx, mask, 0, 0, 0, 0, 0);
 }
 
 
index 637d502381e82c17b3114981fdfead24eeb11bcf..64b68708717c22f1b737fda66ff6b2c526c88848 100644 (file)
@@ -95,27 +95,19 @@ sisUpdateZStencilPattern( sisContextPtr smesa, GLclampd z, GLint stencil )
 }
 
 void
-sisDDClear( GLcontext * ctx, GLbitfield mask, GLboolean all,
-           GLint x, GLint y, GLint width, GLint height )
+sisDDClear( GLcontext * ctx, GLbitfield mask, GLboolean allFoo,
+           GLint xFoo, GLint yFoo, GLint widthFoo, GLint heightFoo )
 {
-  sisContextPtr smesa = SIS_CONTEXT(ctx);
-
-  GLint x1, y1, width1, height1;
+   sisContextPtr smesa = SIS_CONTEXT(ctx);
 
-   if (all) {
-      GLframebuffer *buffer = ctx->DrawBuffer;
+   GLint x1, y1, width1, height1;
 
-      x1 = 0;
-      y1 = 0;
-      width1 = buffer->Width;
-      height1 = buffer->Height;
-   } else {
-      x1 = x;
-      y1 = Y_FLIP(y+height-1);
-      width1 = width;            
-      height1 = height;
-   }
-   /* XXX: Scissoring */
+   /* get region after locking: */
+   x1 = ctx->DrawBuffer->_Xmin;
+   y1 = ctx->DrawBuffer->_Ymin;
+   width1 = ctx->DrawBuffer->_Xmax - x1;
+   height1 = ctx->DrawBuffer->_Ymax - y1;
+   y1 = Y_FLIP(y1 + height1 - 1);
 
    /* Mask out any non-existent buffers */
    if (ctx->Visual.depthBits == 0 || !ctx->Depth.Mask)
@@ -153,7 +145,7 @@ sisDDClear( GLcontext * ctx, GLbitfield mask, GLboolean all,
    UNLOCK_HARDWARE();
 
    if (mask != 0)
-      _swrast_Clear( ctx, mask, all, x1, y1, width, height );
+      _swrast_Clear( ctx, mask, 0, 0, 0, 0, 0);
 }
 
 
index a30ec78a5581df87f05042d12eb53758f37663ff..3301d948e115c190dae013327bd34cee88b141e9 100644 (file)
@@ -47,8 +47,8 @@
 /* Clear the color and/or depth buffers.
  */
 static void tdfxClear( GLcontext *ctx,
-                        GLbitfield mask, GLboolean all,
-                        GLint x, GLint y, GLint width, GLint height )
+                       GLbitfield mask, GLboolean all,
+                       GLint xFoo, GLint yFoo, GLint widthFoo, GLint heightFoo)
 {
    tdfxContextPtr fxMesa = (tdfxContextPtr) ctx->DriverCtx;
    GLbitfield softwareMask = mask & (BUFFER_BIT_ACCUM);
@@ -56,8 +56,7 @@ static void tdfxClear( GLcontext *ctx,
       fxMesa->haveHwStencil ? fxMesa->glCtx->Visual.stencilBits : 0;
 
    if ( TDFX_DEBUG & DEBUG_VERBOSE_API ) {
-      fprintf( stderr, "%s( %d, %d, %d, %d )\n",
-              __FUNCTION__, (int) x, (int) y, (int) width, (int) height );
+      fprintf( stderr, "tdfxClear(0x%x)\n", mask);
    }
 
    /* Need this check to respond to glScissor and clipping updates */
@@ -313,7 +312,7 @@ static void tdfxClear( GLcontext *ctx,
    }
 
    if (softwareMask)
-      _swrast_Clear( ctx, softwareMask, all, x, y, width, height );
+      _swrast_Clear( ctx, softwareMask, 0, 0, 0, 0, 0);
 }
 
 
index 3f9ad79732fe7d70f7909f6b9159a2ffaee69b4b..a9be50688b3f3791de529b8af43b820d68aff31f 100644 (file)
@@ -151,13 +151,14 @@ void tridentCopyBuffer( const __DRIdrawablePrivate *dPriv )
 
 
 static void tridentDDClear( GLcontext *ctx, GLbitfield mask, GLboolean all,
-                              GLint cx, GLint cy, GLint cw, GLint ch )
+                            GLint cxFoo, GLint cyFoo, GLint cwFoo, GLint chFoo)
 {
    tridentContextPtr tmesa = TRIDENT_CONTEXT(ctx);
    unsigned char *MMIO = tmesa->tridentScreen->mmio.map;
    int busy;
    GLuint flags = 0;
    GLint i;
+   GLint cx, cy, cw, ch;
 
 #define DRM_TRIDENT_FRONT      0x01
 #define DRM_TRIDENT_BACK       0x02
@@ -183,6 +184,12 @@ static void tridentDDClear( GLcontext *ctx, GLbitfield mask, GLboolean all,
 
    LOCK_HARDWARE(tmesa);
 
+   /* get region after locking: */
+   cx = ctx->DrawBuffer->_Xmin;
+   cy = ctx->DrawBuffer->_Ymin;
+   cw = ctx->DrawBuffer->_Xmax - cx;
+   ch = ctx->DrawBuffer->_Ymax - cy;
+
    if ( flags ) {
    
       cx += tmesa->drawX;
@@ -290,7 +297,7 @@ if (flags & DRM_TRIDENT_FRONT) {
    UNLOCK_HARDWARE(tmesa);
 
    if ( mask )
-      _swrast_Clear( ctx, mask, all, cx, cy, cw, ch );
+      _swrast_Clear( ctx, mask, 0, 0, 0, 0, 0);
 }
 
 static void tridentDDShadeModel( GLcontext *ctx, GLenum mode )
index c8c6dc0193318c18ab5d7dd97acc97344132d160..86077bc4d4eb177f9cc7d640c9b968b515b2c7e6 100644 (file)
@@ -203,7 +203,7 @@ static void viaFillBuffer(struct via_context *vmesa,
 
 
 static void viaClear(GLcontext *ctx, GLbitfield mask, GLboolean all,
-                     GLint cx, GLint cy, GLint cw, GLint ch)
+                     GLint cxFoo, GLint cyFoo, GLint cwFoo, GLint chFoo)
 {
    struct via_context *vmesa = VIA_CONTEXT(ctx);
    __DRIdrawablePrivate *dPriv = vmesa->driDrawable;
@@ -261,9 +261,16 @@ static void viaClear(GLcontext *ctx, GLbitfield mask, GLboolean all,
    if (flag) {
       drm_clip_rect_t *boxes, *tmp_boxes = 0;
       int nr = 0;
+      GLint cx, cy, cw, ch;
 
       LOCK_HARDWARE(vmesa);
            
+      /* get region after locking: */
+      cx = ctx->DrawBuffer->_Xmin;
+      cy = ctx->DrawBuffer->_Ymin;
+      cw = ctx->DrawBuffer->_Xmax - cx;
+      ch = ctx->DrawBuffer->_Ymax - cy;
+
       /* flip top to bottom */
       cy = dPriv->h - cy - ch;
       cx += vmesa->drawX + vmesa->drawXoff;
@@ -328,7 +335,7 @@ static void viaClear(GLcontext *ctx, GLbitfield mask, GLboolean all,
    }
    
    if (mask)
-      _swrast_Clear(ctx, mask, all, cx, cy, cw, ch);
+      _swrast_Clear(ctx, mask, 0, 0, 0, 0, 0);
 }