dri: use BorderColor instead of _BorderChan
[mesa.git] / src / mesa / drivers / dri / r200 / r200_ioctl.c
index 04a00b71518e7c8ab281f19ee38edd226b419bee..0741e57af717dcfd599f5e21f08d7ddb53225f2b 100644 (file)
@@ -1,4 +1,3 @@
-/* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_ioctl.c,v 1.4 2002/12/17 00:32:56 dawes Exp $ */
 /*
 Copyright (C) The Weather Channel, Inc.  2002.  All Rights Reserved.
 
@@ -36,10 +35,10 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include <sched.h>
 #include <errno.h>
 
-#include "glheader.h"
-#include "imports.h"
-#include "macros.h"
-#include "context.h"
+#include "main/glheader.h"
+#include "main/imports.h"
+#include "main/macros.h"
+#include "main/context.h"
 #include "swrast/swrast.h"
 
 #include "r200_context.h"
@@ -49,9 +48,9 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "r200_sanity.h"
 #include "radeon_reg.h"
 
+#include "drirenderbuffer.h"
 #include "vblank.h"
 
-
 #define R200_TIMEOUT             512
 #define R200_IDLE_RETRY           16
 
@@ -288,7 +287,7 @@ void r200ReleaseDmaRegion( r200ContextPtr rmesa,
       rmesa->dma.nr_released_bufs++;
    }
 
-   region->buf = 0;
+   region->buf = NULL;
    region->start = 0;
 }
 
@@ -330,15 +329,6 @@ void r200AllocDmaRegion( r200ContextPtr rmesa,
    assert( rmesa->dma.current.ptr <= rmesa->dma.current.end );
 }
 
-void r200AllocDmaRegionVerts( r200ContextPtr rmesa, 
-                               struct r200_dma_region *region,
-                               int numverts,
-                               int vertsize,
-                               int alignment )
-{
-   r200AllocDmaRegion( rmesa, region, vertsize * numverts, alignment );
-}
-
 /* ================================================================
  * SwapBuffers with client-side throttling
  */
@@ -383,7 +373,7 @@ static void r200WaitIrq( r200ContextPtr rmesa )
    do {
       ret = drmCommandWrite( rmesa->dri.fd, DRM_RADEON_IRQ_WAIT,
                             &rmesa->iw, sizeof(rmesa->iw) );
-   } while (ret && (errno == EINTR || errno == EAGAIN));
+   } while (ret && (errno == EINTR || errno == EBUSY));
 
    if ( ret ) {
       fprintf( stderr, "%s: drmRadeonIrqWait: %d\n", __FUNCTION__, ret );
@@ -429,12 +419,14 @@ static void r200WaitForFrameCompletion( r200ContextPtr rmesa )
 
 /* Copy the back color buffer to the front color buffer.
  */
-void r200CopyBuffer( const __DRIdrawablePrivate *dPriv )
+void r200CopyBuffer( __DRIdrawablePrivate *dPriv,
+                     const drm_clip_rect_t      *rect)
 {
    r200ContextPtr rmesa;
    GLint nbox, i, ret;
    GLboolean   missed_target;
    int64_t ust;
+   __DRIscreenPrivate *psp = dPriv->driScreenPriv;
 
    assert(dPriv);
    assert(dPriv->driContextPriv);
@@ -455,9 +447,12 @@ void r200CopyBuffer( const __DRIdrawablePrivate *dPriv )
     * request at a time.
     */
    r200WaitForFrameCompletion( rmesa );
-   UNLOCK_HARDWARE( rmesa );
-   driWaitForVBlank( dPriv, & rmesa->vbl_seq, rmesa->vblank_flags, & missed_target );
-   LOCK_HARDWARE( rmesa );
+   if (!rect)
+   {
+       UNLOCK_HARDWARE( rmesa );
+       driWaitForVBlank( dPriv, & missed_target );
+       LOCK_HARDWARE( rmesa );
+   }
 
    nbox = dPriv->numClipRects; /* must be in locked region */
 
@@ -468,11 +463,32 @@ void r200CopyBuffer( const __DRIdrawablePrivate *dPriv )
       GLint n = 0;
 
       for ( ; i < nr ; i++ ) {
-        *b++ = box[i];
-        n++;
+
+         *b = box[i];
+
+         if (rect)
+         {
+            if (rect->x1 > b->x1)
+                b->x1 = rect->x1;
+            if (rect->y1 > b->y1)
+                b->y1 = rect->y1;
+            if (rect->x2 < b->x2)
+                b->x2 = rect->x2;
+            if (rect->y2 < b->y2)
+                b->y2 = rect->y2;
+
+            if (b->x1 >= b->x2 || b->y1 >= b->y2)
+                continue;
+         }
+
+         b++;
+         n++;
       }
       rmesa->sarea->nbox = n;
 
+      if (!n)
+        continue;
+
       ret = drmCommandNone( rmesa->dri.fd, DRM_RADEON_SWAP );
 
       if ( ret ) {
@@ -483,25 +499,29 @@ void r200CopyBuffer( const __DRIdrawablePrivate *dPriv )
    }
 
    UNLOCK_HARDWARE( rmesa );
-   rmesa->hw.all_dirty = GL_TRUE;
+   if (!rect)
+   {
+       rmesa->hw.all_dirty = GL_TRUE;
 
-   rmesa->swap_count++;
-   (*rmesa->get_ust)( & ust );
-   if ( missed_target ) {
-      rmesa->swap_missed_count++;
-      rmesa->swap_missed_ust = ust - rmesa->swap_ust;
-   }
+       rmesa->swap_count++;
+       (*psp->systemTime->getUST)( & ust );
+       if ( missed_target ) {
+          rmesa->swap_missed_count++;
+          rmesa->swap_missed_ust = ust - rmesa->swap_ust;
+       }
 
-   rmesa->swap_ust = ust;
+       rmesa->swap_ust = ust;
 
-   sched_yield();
+       sched_yield();
+   }
 }
 
-void r200PageFlip( const __DRIdrawablePrivate *dPriv )
+void r200PageFlip( __DRIdrawablePrivate *dPriv )
 {
    r200ContextPtr rmesa;
    GLint ret;
    GLboolean   missed_target;
+   __DRIscreenPrivate *psp = dPriv->driScreenPriv;
 
    assert(dPriv);
    assert(dPriv->driContextPriv);
@@ -537,10 +557,10 @@ void r200PageFlip( const __DRIdrawablePrivate *dPriv )
     */
    r200WaitForFrameCompletion( rmesa );
    UNLOCK_HARDWARE( rmesa );
-   driWaitForVBlank( dPriv, & rmesa->vbl_seq, rmesa->vblank_flags, & missed_target );
+   driWaitForVBlank( dPriv, & missed_target );
    if ( missed_target ) {
       rmesa->swap_missed_count++;
-      (void) (*rmesa->get_ust)( & rmesa->swap_missed_ust );
+      (void) (*psp->systemTime->getUST)( & rmesa->swap_missed_ust );
    }
    LOCK_HARDWARE( rmesa );
 
@@ -554,8 +574,9 @@ void r200PageFlip( const __DRIdrawablePrivate *dPriv )
    }
 
    rmesa->swap_count++;
-   (void) (*rmesa->get_ust)( & rmesa->swap_ust );
+   (void) (*psp->systemTime->getUST)( & rmesa->swap_ust );
 
+#if 000
    if ( rmesa->sarea->pfCurrentPage == 1 ) {
         rmesa->state.color.drawOffset = rmesa->r200Screen->frontOffset;
         rmesa->state.color.drawPitch  = rmesa->r200Screen->frontPitch;
@@ -568,24 +589,36 @@ void r200PageFlip( const __DRIdrawablePrivate *dPriv )
    rmesa->hw.ctx.cmd[CTX_RB3D_COLOROFFSET] = rmesa->state.color.drawOffset
                                           + rmesa->r200Screen->fbLocation;
    rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH]  = rmesa->state.color.drawPitch;
+   if (rmesa->sarea->tiling_enabled) {
+      rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] |= R200_COLOR_TILE_ENABLE;
+   }
+#else
+   /* Get ready for drawing next frame.  Update the renderbuffers'
+    * flippedOffset/Pitch fields so we draw into the right place.
+    */
+   driFlipRenderbuffers(rmesa->glCtx->WinSysDrawBuffer,
+                        rmesa->sarea->pfCurrentPage);
+
+
+   r200UpdateDrawBuffer(rmesa->glCtx);
+#endif
 }
 
 
 /* ================================================================
  * 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 )
 {
    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");
    }
 
    {
@@ -597,32 +630,32 @@ static void r200Clear( GLcontext *ctx, GLbitfield mask, GLboolean all,
 
    r200Flush( ctx );
 
-   if ( mask & DD_FRONT_LEFT_BIT ) {
+   if ( mask & BUFFER_BIT_FRONT_LEFT ) {
       flags |= RADEON_FRONT;
       color_mask = rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK];
-      mask &= ~DD_FRONT_LEFT_BIT;
+      mask &= ~BUFFER_BIT_FRONT_LEFT;
    }
 
-   if ( mask & DD_BACK_LEFT_BIT ) {
+   if ( mask & BUFFER_BIT_BACK_LEFT ) {
       flags |= RADEON_BACK;
       color_mask = rmesa->hw.msk.cmd[MSK_RB3D_PLANEMASK];
-      mask &= ~DD_BACK_LEFT_BIT;
+      mask &= ~BUFFER_BIT_BACK_LEFT;
    }
 
-   if ( mask & DD_DEPTH_BIT ) {
+   if ( mask & BUFFER_BIT_DEPTH ) {
       flags |= RADEON_DEPTH;
-      mask &= ~DD_DEPTH_BIT;
+      mask &= ~BUFFER_BIT_DEPTH;
    }
 
-   if ( (mask & DD_STENCIL_BIT) && rmesa->state.stencil.hwBuffer ) {
+   if ( (mask & BUFFER_BIT_STENCIL) && rmesa->state.stencil.hwBuffer ) {
       flags |= RADEON_STENCIL;
-      mask &= ~DD_STENCIL_BIT;
+      mask &= ~BUFFER_BIT_STENCIL;
    }
 
    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 );
    }
 
    if ( !flags ) 
@@ -630,7 +663,7 @@ static void r200Clear( GLcontext *ctx, GLbitfield mask, GLboolean all,
 
    if (rmesa->using_hyperz) {
       flags |= RADEON_USE_COMP_ZBUF;
-/*      if (rmesa->r200Screen->chipset & R200_CHIPSET_REAL_R200)
+/*      if (rmesa->r200Screen->chip_family == CHIP_FAMILY_R200)
         flags |= RADEON_USE_HIERZ; */
       if (!(rmesa->state.stencil.hwBuffer) ||
         ((flags & RADEON_DEPTH) && (flags & RADEON_STENCIL) &&
@@ -639,12 +672,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 ) {
@@ -686,7 +725,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;
@@ -708,6 +748,7 @@ static void r200Clear( GLcontext *ctx, GLbitfield mask, GLboolean all,
            n++;
         }
       } else {
+         /* clear whole window */
         for ( ; i < nr ; i++ ) {
            *b++ = box[i];
            n++;
@@ -820,7 +861,7 @@ void r200Finish( GLcontext *ctx )
  * the kernel data structures, and the current context to get the
  * device fd.
  */
-void *r200AllocateMemoryMESA(__DRInativeDisplay *dpy, int scrn, GLsizei size,
+void *r200AllocateMemoryMESA(__DRIscreen *screen, GLsizei size,
                             GLfloat readfreq, GLfloat writefreq, 
                             GLfloat priority)
 {
@@ -839,10 +880,7 @@ void *r200AllocateMemoryMESA(__DRInativeDisplay *dpy, int scrn, GLsizei size,
 
    if (getenv("R200_NO_ALLOC"))
       return NULL;
-   
-   if (rmesa->dri.drmMinor < 6) 
-      return NULL;
-      
+
    alloc.region = RADEON_MEM_REGION_GART;
    alloc.alignment = 0;
    alloc.size = size;
@@ -865,7 +903,7 @@ void *r200AllocateMemoryMESA(__DRInativeDisplay *dpy, int scrn, GLsizei size,
 
 
 /* Called via glXFreeMemoryMESA() */
-void r200FreeMemoryMESA(__DRInativeDisplay *dpy, int scrn, GLvoid *pointer)
+void r200FreeMemoryMESA(__DRIscreen *screen, GLvoid *pointer)
 {
    GET_CURRENT_CONTEXT(ctx);
    r200ContextPtr rmesa;
@@ -881,9 +919,6 @@ void r200FreeMemoryMESA(__DRInativeDisplay *dpy, int scrn, GLvoid *pointer)
       return;
    }
 
-   if (rmesa->dri.drmMinor < 6) 
-      return;
-
    region_offset = (char *)pointer - (char *)rmesa->r200Screen->gartTextures.map;
 
    if (region_offset < 0 || 
@@ -905,7 +940,7 @@ void r200FreeMemoryMESA(__DRInativeDisplay *dpy, int scrn, GLvoid *pointer)
 }
 
 /* Called via glXGetMemoryOffsetMESA() */
-GLuint r200GetMemoryOffsetMESA(__DRInativeDisplay *dpy, int scrn, const GLvoid *pointer)
+GLuint r200GetMemoryOffsetMESA(__DRIscreen *screen, const GLvoid *pointer)
 {
    GET_CURRENT_CONTEXT(ctx);
    r200ContextPtr rmesa;
@@ -919,9 +954,6 @@ GLuint r200GetMemoryOffsetMESA(__DRInativeDisplay *dpy, int scrn, const GLvoid *
    if (!r200IsGartMemory( rmesa, pointer, 0 ))
       return ~0;
 
-   if (rmesa->dri.drmMinor < 6) 
-      return ~0;
-
    card_offset = r200GartOffsetFromVirtual( rmesa, pointer );
 
    return card_offset - rmesa->r200Screen->gart_base;