Initial multitexturing support. Old behaviour can be re-enabled by changing ifdefs...
[mesa.git] / src / mesa / drivers / dri / r300 / r300_ioctl.c
index 84b475d064cb4d3dbcab38824dfc87636ebd9ef1..31515c0609da69f0e7ba1901b4b3ad20ccb58720 100644 (file)
@@ -58,6 +58,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 #define CLEARBUFFER_COLOR      0x1
 #define CLEARBUFFER_DEPTH      0x2
+#define CLEARBUFFER_STENCIL    0x4
 
 static void r300ClearBuffer(r300ContextPtr r300, int flags, int buffer)
 {
@@ -205,8 +206,10 @@ static void r300ClearBuffer(r300ContextPtr r300, int flags, int buffer)
 
        R300_STATECHANGE(r300, zs);
        if (flags & CLEARBUFFER_DEPTH) {
-               r300->hw.zs.cmd[R300_ZS_CNTL_0] = 0x6; // test and write
-               r300->hw.zs.cmd[R300_ZS_CNTL_1] = (R300_ZS_ALWAYS<<R300_RB3D_ZS1_DEPTH_FUNC_SHIFT);
+               r300->hw.zs.cmd[R300_ZS_CNTL_0] &= R300_RB3D_STENCIL_ENABLE;
+               r300->hw.zs.cmd[R300_ZS_CNTL_0] |= 0x6; // test and write
+               r300->hw.zs.cmd[R300_ZS_CNTL_1] &= ~(R300_ZS_MASK << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT);
+               r300->hw.zs.cmd[R300_ZS_CNTL_1] |= (R300_ZS_ALWAYS<<R300_RB3D_ZS1_DEPTH_FUNC_SHIFT);
 /*
                R300_STATECHANGE(r300, zb);
                r300->hw.zb.cmd[R300_ZB_OFFSET] =
@@ -217,8 +220,27 @@ static void r300ClearBuffer(r300ContextPtr r300, int flags, int buffer)
                        r300->radeon.radeonScreen->depthPitch;
 */
        } else {
-               r300->hw.zs.cmd[R300_ZS_CNTL_0] = 0; // disable
-               r300->hw.zs.cmd[R300_ZS_CNTL_1] = 0;
+               r300->hw.zs.cmd[R300_ZS_CNTL_0] &= R300_RB3D_STENCIL_ENABLE;
+               r300->hw.zs.cmd[R300_ZS_CNTL_0] |= R300_RB3D_Z_DISABLED_1; // disable
+               r300->hw.zs.cmd[R300_ZS_CNTL_1] &= ~(R300_ZS_MASK << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT);
+       }
+       
+       R300_STATECHANGE(r300, zs);
+       if (flags & CLEARBUFFER_STENCIL) {
+               r300->hw.zs.cmd[R300_ZS_CNTL_0] &= ~R300_RB3D_STENCIL_ENABLE;
+               r300->hw.zs.cmd[R300_ZS_CNTL_0] |= R300_RB3D_STENCIL_ENABLE;
+               r300->hw.zs.cmd[R300_ZS_CNTL_1] &= 
+                   ~((R300_ZS_MASK << R300_RB3D_ZS1_FRONT_FUNC_SHIFT) | (R300_ZS_MASK << R300_RB3D_ZS1_BACK_FUNC_SHIFT));
+               r300->hw.zs.cmd[R300_ZS_CNTL_1] |= 
+                   (R300_ZS_ALWAYS<<R300_RB3D_ZS1_FRONT_FUNC_SHIFT) | 
+                   (R300_ZS_REPLACE<<R300_RB3D_ZS1_FRONT_FAIL_OP_SHIFT) |
+                   (R300_ZS_REPLACE<<R300_RB3D_ZS1_FRONT_ZPASS_OP_SHIFT) |
+                   (R300_ZS_REPLACE<<R300_RB3D_ZS1_FRONT_ZFAIL_OP_SHIFT) |
+                   (R300_ZS_ALWAYS<<R300_RB3D_ZS1_BACK_FUNC_SHIFT) |
+                   (R300_ZS_REPLACE<<R300_RB3D_ZS1_BACK_FAIL_OP_SHIFT) |
+                   (R300_ZS_REPLACE<<R300_RB3D_ZS1_BACK_ZPASS_OP_SHIFT) |
+                   (R300_ZS_REPLACE<<R300_RB3D_ZS1_BACK_ZFAIL_OP_SHIFT) ;
+               r300->hw.zs.cmd[R300_ZS_CNTL_2] = r300->state.stencil.clear;
        }
                        
        /* Make sure we have enough space */
@@ -281,7 +303,8 @@ static void r300Clear(GLcontext * ctx, GLbitfield mask, GLboolean all,
                if (dPriv->numClipRects == 0)
                        return;
        }
-#ifdef HAVE_ZBS
+
+#if 0  /* We shouldnt need this now */
        /* When unk42B4==0 z-bias is still on for vb mode with points ... */
        R300_STATECHANGE(r300, zbs);
        zbs[0]=r300->hw.zbs.cmd[R300_ZBS_T_FACTOR];
@@ -293,12 +316,12 @@ static void r300Clear(GLcontext * ctx, GLbitfield mask, GLboolean all,
        r300->hw.zbs.cmd[R300_ZBS_T_CONSTANT] =
        r300->hw.zbs.cmd[R300_ZBS_W_FACTOR] =
        r300->hw.zbs.cmd[R300_ZBS_W_CONSTANT] = r300PackFloat32(0.0);
-       
+#endif 
        /* Make sure z-bias isnt on */
        R300_STATECHANGE(r300, unk42B4);
        unk42B4=r300->hw.unk42B4.cmd[1];
-       r300->hw.unk42B4.cmd[1]=0;//3;
-#endif
+       r300->hw.unk42B4.cmd[1]=0;
+       
        if (mask & DD_FRONT_LEFT_BIT) {
                flags |= DD_FRONT_LEFT_BIT;
                mask &= ~DD_FRONT_LEFT_BIT;
@@ -313,6 +336,11 @@ static void r300Clear(GLcontext * ctx, GLbitfield mask, GLboolean all,
                bits |= CLEARBUFFER_DEPTH;
                mask &= ~DD_DEPTH_BIT;
        }
+       
+       if ( (mask & DD_STENCIL_BIT) && r300->state.stencil.hw_stencil) {
+               bits |= CLEARBUFFER_STENCIL;
+               mask &= ~DD_STENCIL_BIT;
+       }
 
        if (mask) {
                if (RADEON_DEBUG & DEBUG_FALLBACKS)
@@ -340,10 +368,11 @@ static void r300Clear(GLcontext * ctx, GLbitfield mask, GLboolean all,
         * but do keep it like this for now.
         */
        r300ResetHwState(r300);
-#ifdef HAVE_ZBS
+       
        R300_STATECHANGE(r300, unk42B4);
        r300->hw.unk42B4.cmd[1]=unk42B4;
        
+#if 0  /* We shouldnt need this now */
        /* Put real z-bias back */
        R300_STATECHANGE(r300, zbs);
        r300->hw.zbs.cmd[R300_ZBS_T_FACTOR] = zbs[0];
@@ -368,13 +397,13 @@ void r300Flush(GLcontext * ctx)
 
 void r300RefillCurrentDmaRegion(r300ContextPtr rmesa)
 {
-       struct r200_dma_buffer *dmabuf;
+       struct r300_dma_buffer *dmabuf;
        int fd = rmesa->radeon.dri.fd;
        int index = 0;
        int size = 0;
        drmDMAReq dma;
        int ret;
-
+       
        if (RADEON_DEBUG & (DEBUG_IOCTL | DEBUG_DMA))
                fprintf(stderr, "%s\n", __FUNCTION__);
 
@@ -401,19 +430,24 @@ void r300RefillCurrentDmaRegion(r300ContextPtr rmesa)
 
        LOCK_HARDWARE(&rmesa->radeon);  /* no need to validate */
 
-       while (1) {
-               ret = drmDMA(fd, &dma);
-               if (ret == 0)
-                       break;
+       ret = drmDMA(fd, &dma);
 
+       if (ret != 0) {
+               /* Try to release some buffers and wait until we can't get any more */
                if (rmesa->dma.nr_released_bufs) {
-                       r200FlushCmdBufLocked(rmesa, __FUNCTION__);
+                       r300FlushCmdBufLocked(rmesa, __FUNCTION__);
                }
 
-               if (rmesa->radeon.do_usleeps) {
+               if (RADEON_DEBUG & DEBUG_DMA)
+                       fprintf(stderr, "Waiting for buffers\n");
+
+               radeonWaitForIdleLocked(&rmesa->radeon);
+               ret = drmDMA(fd, &dma);
+
+               if (ret != 0) {
                        UNLOCK_HARDWARE(&rmesa->radeon);
-                       DO_USLEEP(1);
-                       LOCK_HARDWARE(&rmesa->radeon);
+                       fprintf(stderr, "Error: Could not get dma buffer... exiting\n");
+                       exit(-1);
                }
        }
 
@@ -451,13 +485,13 @@ void r300ReleaseDmaRegion(r300ContextPtr rmesa,
                if (RADEON_DEBUG & (DEBUG_IOCTL | DEBUG_DMA))
                        fprintf(stderr, "%s -- DISCARD BUF %d\n", __FUNCTION__,
                                region->buf->buf->idx);
-
                cmd =
                    (drm_radeon_cmd_header_t *) r300AllocCmdBuf(rmesa,
-                                                               sizeof(*cmd),
+                                                               sizeof(*cmd) / 4,
                                                                __FUNCTION__);
-               cmd->dma.cmd_type = RADEON_CMD_DMA_DISCARD;
+               cmd->dma.cmd_type = R300_CMD_DMA_DISCARD;
                cmd->dma.buf_idx = region->buf->buf->idx;
+               
                FREE(region->buf);
                rmesa->dma.nr_released_bufs++;
        }