merge current trunk into vbo branch
[mesa.git] / src / mesa / drivers / dri / sis / sis_clear.c
index e170faac39901f973b3bbaafe5a041543d3c61c2..fb92d06c7355db63087531a0da379d5ec12e4abc 100644 (file)
@@ -78,7 +78,7 @@ sisUpdateZStencilPattern( sisContextPtr smesa, GLclampd z, GLint stencil )
    switch (smesa->zFormat)
    {
    case SiS_ZFORMAT_Z16:
-      zPattern = FLOAT_TO_USHORT(z);
+      CLAMPED_FLOAT_TO_USHORT(zPattern, z);
       zPattern |= zPattern << 16;
       break;
    case SiS_ZFORMAT_S8Z24:
@@ -95,27 +95,18 @@ 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 )
 {
-  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)
@@ -133,7 +124,8 @@ sisDDClear( GLcontext * ctx, GLbitfield mask, GLboolean all,
    if ((smesa->current.hwCapEnable2 & (MASK_AlphaMaskWriteEnable |
       MASK_ColorMaskWriteEnable) &&
       (mask & (BUFFER_BIT_BACK_LEFT | BUFFER_BIT_FRONT_LEFT)) != 0) ||
-      (ctx->Stencil.WriteMask[0] < 0xff && (mask & BUFFER_BIT_STENCIL) != 0) )
+      ((ctx->Stencil.WriteMask[0] & 0xff) != 0xff && 
+       (mask & BUFFER_BIT_STENCIL) != 0) )
    {
       mask = sis_3D_Clear( ctx, mask, x1, y1, width1, height1 );
    }
@@ -144,7 +136,7 @@ sisDDClear( GLcontext * ctx, GLbitfield mask, GLboolean all,
    }
 
    if (mask & (BUFFER_BIT_DEPTH | BUFFER_BIT_STENCIL)) {
-      if (smesa->depth.offset != NULL)
+      if (smesa->depth.offset != 0)
          sis_clear_z_stencil_buffer( ctx, mask, x1, y1, width1, height1 );
       mask &= ~(BUFFER_BIT_DEPTH | BUFFER_BIT_STENCIL);
    }
@@ -152,7 +144,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);
 }
 
 
@@ -213,13 +205,13 @@ sis_3D_Clear( GLcontext * ctx, GLbitfield mask,
 
    if (bClrStencil) {
       dwSten1 = STENCIL_FORMAT_8 | SiS_STENCIL_ALWAYS |
-         (ctx->Stencil.Clear << 8) | 0xff;
+         ((ctx->Stencil.Clear & 0xff) << 8) | 0xff;
       dwSten2 = SiS_SFAIL_REPLACE | SiS_SPASS_ZFAIL_REPLACE |
          SiS_SPASS_ZPASS_REPLACE;
       dwEnable1 = MASK_ZWriteEnable | MASK_StencilWriteEnable |
        MASK_StencilTestEnable;
       dwEnable2 |= MASK_ZMaskWriteEnable;
-      dwDepthMask |= ctx->Stencil.WriteMask[0] << 24;
+      dwDepthMask |= (ctx->Stencil.WriteMask[0] & 0xff) << 24;
    } else if (bClrDepth) {
       dwEnable1 = MASK_ZWriteEnable;
       dwEnable2 |= MASK_ZMaskWriteEnable;
@@ -331,51 +323,28 @@ sis_3D_Clear( GLcontext * ctx, GLbitfield mask,
       BUFFER_BIT_FRONT_LEFT);
 }
 
-static void
-sis_bitblt_clear_cmd( sisContextPtr smesa, ENGPACKET * pkt )
-{
-   GLint *lpdwDest, *lpdwSrc;
-   int i;
-
-   lpdwSrc = (GLint *) pkt + 1;
-   lpdwDest = (GLint *) (GET_IOBase (smesa) + REG_SRC_ADDR) + 1;
-
-   mWait3DCmdQueue (10);
-
-   *lpdwDest++ = *lpdwSrc++;
-   lpdwSrc++;
-   lpdwDest++;
-   for (i = 3; i < 8; i++) {
-      *lpdwDest++ = *lpdwSrc++;
-   }
-
-   MMIO(REG_CMD0, *(GLint *) & pkt->stdwCmd);
-   MMIO(REG_CommandQueue, -1);
-}
-
 static void
 sis_clear_color_buffer( GLcontext *ctx, GLenum mask, GLint x, GLint y,
                        GLint width, GLint height )
 {
    sisContextPtr smesa = SIS_CONTEXT(ctx);
-
    int count;
-   GLuint depth = smesa->bytesPerPixel;
    drm_clip_rect_t *pExtents = NULL;
    GLint xx, yy;
    GLint x0, y0, width0, height0;
 
-   ENGPACKET stEngPacket;
-
    /* Clear back buffer */
    if (mask & BUFFER_BIT_BACK_LEFT) {
-      smesa->cbClearPacket.stdwDestPos.wY = y;
-      smesa->cbClearPacket.stdwDestPos.wX = x;
-      smesa->cbClearPacket.stdwDim.wWidth = (GLshort) width;
-      smesa->cbClearPacket.stdwDim.wHeight = (GLshort) height;
-      smesa->cbClearPacket.dwFgRopColor = smesa->clearColorPattern;
-
-      sis_bitblt_clear_cmd( smesa, &smesa->cbClearPacket );
+      mWait3DCmdQueue (8);
+      MMIO(REG_SRC_PITCH, (smesa->bytesPerPixel == 4) ? 
+                          BLIT_DEPTH_32 : BLIT_DEPTH_16);
+      MMIO(REG_DST_X_Y, (x << 16) | y);
+      MMIO(REG_DST_ADDR, smesa->back.offset);
+      MMIO(REG_DST_PITCH_HEIGHT, (smesa->virtualY << 16) | smesa->back.pitch);
+      MMIO(REG_WIDTH_HEIGHT, (height << 16) | width);
+      MMIO(REG_PATFG, smesa->clearColorPattern);
+      MMIO(REG_BLIT_CMD, CMD_DIR_X_INC | CMD_DIR_Y_INC | CMD_ROP_PAT);
+      MMIO(REG_CommandQueue, -1);
    }
   
    if ((mask & BUFFER_BIT_FRONT_LEFT) == 0)
@@ -390,23 +359,6 @@ sis_clear_color_buffer( GLcontext *ctx, GLenum mask, GLint x, GLint y,
    pExtents = smesa->driDrawable->pClipRects;
    count = smesa->driDrawable->numClipRects;
 
-   memset( &stEngPacket, 0, sizeof (ENGPACKET) );
-
-   stEngPacket.dwSrcPitch = (depth == 2) ? 0x80000000 : 0xc0000000;
-   stEngPacket.dwDestBaseAddr = smesa->front.offset;
-   stEngPacket.wDestPitch = smesa->front.pitch;
-   /* TODO: set maximum value? */
-   stEngPacket.wDestHeight = smesa->virtualY;
-   stEngPacket.stdwCmd.cRop = 0xf0;
-   stEngPacket.dwFgRopColor = smesa->clearColorPattern;
-
-   /* for SGRAM Block Write Enable */
-   if (smesa->blockWrite)
-      stEngPacket.stdwCmd.cCmd0 = CMD0_PAT_FG_COLOR;
-   else
-      stEngPacket.stdwCmd.cCmd0 = 0;
-   stEngPacket.stdwCmd.cCmd1 = CMD1_DIR_X_INC | CMD1_DIR_Y_INC;
-
    while (count--) {
       GLint x2 = pExtents->x1 - smesa->driDrawable->x;
       GLint y2 = pExtents->y1 - smesa->driDrawable->y;
@@ -424,12 +376,16 @@ sis_clear_color_buffer( GLcontext *ctx, GLenum mask, GLint x, GLint y,
       if (width <= 0 || height <= 0)
        continue;
 
-      stEngPacket.stdwDestPos.wY = y;
-      stEngPacket.stdwDestPos.wX = x;
-      stEngPacket.stdwDim.wWidth = (GLshort)width;
-      stEngPacket.stdwDim.wHeight = (GLshort)height;
-
-      sis_bitblt_clear_cmd( smesa, &stEngPacket );
+      mWait3DCmdQueue (8);
+      MMIO(REG_SRC_PITCH, (smesa->bytesPerPixel == 4) ? 
+                          BLIT_DEPTH_32 : BLIT_DEPTH_16);
+      MMIO(REG_DST_X_Y, (x << 16) | y);
+      MMIO(REG_DST_ADDR, smesa->front.offset);
+      MMIO(REG_DST_PITCH_HEIGHT, (smesa->virtualY << 16) | smesa->front.pitch);
+      MMIO(REG_WIDTH_HEIGHT, (height << 16) | width);
+      MMIO(REG_PATFG, smesa->clearColorPattern);
+      MMIO(REG_BLIT_CMD, CMD_DIR_X_INC | CMD_DIR_Y_INC | CMD_ROP_PAT);
+      MMIO(REG_CommandQueue, -1);
    }
 }
 
@@ -438,14 +394,17 @@ sis_clear_z_stencil_buffer( GLcontext * ctx, GLbitfield mask,
                            GLint x, GLint y, GLint width, GLint height )
 {
    sisContextPtr smesa = SIS_CONTEXT(ctx);
-
-   /* TODO: consider alignment of width, height? */
-   smesa->zClearPacket.stdwDestPos.wY = y;
-   smesa->zClearPacket.stdwDestPos.wX = x;
-   smesa->zClearPacket.stdwDim.wWidth = (GLshort) width;
-   smesa->zClearPacket.stdwDim.wHeight = (GLshort) height;
-   smesa->zClearPacket.dwFgRopColor = smesa->clearZStencilPattern;
-
-   sis_bitblt_clear_cmd( smesa, &smesa->zClearPacket );
+   int cmd;
+
+   mWait3DCmdQueue (8);
+   MMIO(REG_SRC_PITCH, (smesa->zFormat == SiS_ZFORMAT_Z16) ?
+                       BLIT_DEPTH_16 : BLIT_DEPTH_32);
+   MMIO(REG_DST_X_Y, (x << 16) | y);
+   MMIO(REG_DST_ADDR, smesa->depth.offset);
+   MMIO(REG_DST_PITCH_HEIGHT, (smesa->virtualY << 16) | smesa->depth.pitch);
+   MMIO(REG_WIDTH_HEIGHT, (height << 16) | width);
+   MMIO(REG_PATFG, smesa->clearZStencilPattern);
+   MMIO(REG_BLIT_CMD, CMD_DIR_X_INC | CMD_DIR_Y_INC | CMD_ROP_PAT);
+   MMIO(REG_CommandQueue, -1);
 }