mesa: Remove obsolete Windows gldirect and ICD drivers
[mesa.git] / src / mesa / drivers / dri / r128 / r128_ioctl.c
index 150d62577ed1ae07132831bd6cd4590f560e6bad..950e1d4fbd5dfc9a07606ccd0b643fe7477d15b6 100644 (file)
@@ -1,4 +1,3 @@
-/* $XFree86: xc/lib/GL/mesa/src/drv/r128/r128_ioctl.c,v 1.10 2002/12/16 16:18:53 dawes Exp $ */
 /**************************************************************************
 
 Copyright 1999, 2000 ATI Technologies Inc. and Precision Insight, Inc.,
@@ -37,8 +36,8 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "r128_context.h"
 #include "r128_state.h"
 #include "r128_ioctl.h"
-#include "imports.h"
-#include "macros.h"
+#include "main/imports.h"
+#include "main/macros.h"
 
 #include "swrast/swrast.h"
 
@@ -231,7 +230,7 @@ static int r128WaitForFrameCompletion( r128ContextPtr rmesa )
    int wait = 0;
 
    while ( 1 ) {
-      u_int32_t frame = read_MMIO_LE32( R128MMIO, R128_LAST_FRAME_REG );
+      uint32_t frame = read_MMIO_LE32( R128MMIO, R128_LAST_FRAME_REG );
 
       if ( rmesa->sarea->last_frame - frame <= R128_MAX_OUTSTANDING ) {
         break;
@@ -249,7 +248,7 @@ static int r128WaitForFrameCompletion( r128ContextPtr rmesa )
 
 /* Copy the back color buffer to the front color buffer.
  */
-void r128CopyBuffer( const __DRIdrawablePrivate *dPriv )
+void r128CopyBuffer( __DRIdrawable *dPriv )
 {
    r128ContextPtr rmesa;
    GLint nbox, i, ret;
@@ -282,7 +281,7 @@ void r128CopyBuffer( const __DRIdrawablePrivate *dPriv )
    }
 
    UNLOCK_HARDWARE( rmesa );
-   driWaitForVBlank( dPriv, &rmesa->vbl_seq, rmesa->vblank_flags, &missed_target );
+   driWaitForVBlank( dPriv, &missed_target );
    LOCK_HARDWARE( rmesa );
 
    nbox = dPriv->numClipRects; /* must be in locked region */
@@ -328,7 +327,7 @@ void r128CopyBuffer( const __DRIdrawablePrivate *dPriv )
 #endif
 }
 
-void r128PageFlip( const __DRIdrawablePrivate *dPriv )
+void r128PageFlip( __DRIdrawable *dPriv )
 {
    r128ContextPtr rmesa;
    GLint ret;
@@ -359,7 +358,7 @@ void r128PageFlip( const __DRIdrawablePrivate *dPriv )
    }
 
    UNLOCK_HARDWARE( rmesa );
-   driWaitForVBlank( dPriv, &rmesa->vbl_seq, rmesa->vblank_flags, &missed_target );
+   driWaitForVBlank( dPriv, &missed_target );
    LOCK_HARDWARE( rmesa );
 
    /* The kernel will have been initialized to perform page flipping
@@ -399,15 +398,16 @@ 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( struct gl_context *ctx, GLbitfield mask )
 {
    r128ContextPtr rmesa = R128_CONTEXT(ctx);
-   __DRIdrawablePrivate *dPriv = rmesa->driDrawable;
+   __DRIdrawable *dPriv = rmesa->driDrawable;
    drm_r128_clear_t clear;
    GLuint flags = 0;
    GLint i;
    GLint ret;
+   GLuint depthmask = 0;
+   GLint cx, cy, cw, ch;
 
    if ( R128_DEBUG & DEBUG_VERBOSE_API ) {
       fprintf( stderr, "%s:\n", __FUNCTION__ );
@@ -438,24 +438,32 @@ static void r128Clear( GLcontext *ctx, GLbitfield mask, GLboolean all,
 
    if ( ( mask & BUFFER_BIT_DEPTH ) && ctx->Depth.Mask ) {
       flags |= R128_DEPTH;
+      /* if we're at 16 bits, extra plane mask won't hurt */
+      depthmask |= 0x00ffffff;
       mask &= ~BUFFER_BIT_DEPTH;
    }
-#if 0
-   /* FIXME: Add stencil support */
-   if ( mask & BUFFER_BIT_STENCIL ) {
-      flags |= DRM_R128_DEPTH_BUFFER;
+
+   if ( mask & BUFFER_BIT_STENCIL &&
+       (ctx->Visual.stencilBits > 0 && ctx->Visual.depthBits == 24) ) {
+      flags |= R128_DEPTH;
+      depthmask |= ctx->Stencil.WriteMask[0] << 24;
       mask &= ~BUFFER_BIT_STENCIL;
    }
-#endif
 
    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 ) {
@@ -468,7 +476,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;
@@ -490,6 +499,7 @@ static void r128Clear( GLcontext *ctx, GLbitfield mask, GLboolean all,
               n++;
            }
         } else {
+            /* clear whole window */
            for ( ; i < nr ; i++ ) {
               *b++ = box[i];
               n++;
@@ -511,7 +521,7 @@ static void r128Clear( GLcontext *ctx, GLbitfield mask, GLboolean all,
          clear.clear_color = rmesa->ClearColor;
          clear.clear_depth = rmesa->ClearDepth;
          clear.color_mask = rmesa->setup.plane_3d_mask_c;
-         clear.depth_mask = ~0;
+         clear.depth_mask = depthmask;
 
          ret = drmCommandWrite( rmesa->driFd, DRM_R128_CLEAR,
                                 &clear, sizeof(clear) );
@@ -529,7 +539,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 );
 }
 
 
@@ -539,7 +549,7 @@ static void r128Clear( GLcontext *ctx, GLbitfield mask, GLboolean all,
 
 void r128WriteDepthSpanLocked( r128ContextPtr rmesa,
                               GLuint n, GLint x, GLint y,
-                              const GLdepth depth[],
+                              const GLuint depth[],
                               const GLubyte mask[] )
 {
    drm_clip_rect_t *pbox = rmesa->pClipRects;
@@ -602,7 +612,7 @@ void r128WriteDepthSpanLocked( r128ContextPtr rmesa,
 
 void r128WriteDepthPixelsLocked( r128ContextPtr rmesa, GLuint n,
                                 const GLint x[], const GLint y[],
-                                const GLdepth depth[],
+                                const GLuint depth[],
                                 const GLubyte mask[] )
 {
    drm_clip_rect_t *pbox = rmesa->pClipRects;