rs690: fix r300 swtcl bug in DMA code.
authorDave Airlie <airlied@redhat.com>
Sat, 7 Mar 2009 06:23:40 +0000 (17:23 +1100)
committerDave Airlie <airlied@redhat.com>
Sat, 7 Mar 2009 06:23:40 +0000 (17:23 +1100)
When we finish emitting swtcl objects, we request space in the cmdbuf,
and flush if no space exists. However in this case we also flush
the DMA buffer we just put the vertices we wanted to send in.

This checks in advance if we have space in the buffer.

src/mesa/drivers/dri/radeon/radeon_dma.c

index 393b12182d57625bca331e6118bbbc0cd2c10411..92878a5c2e26b8a1bbebdc3d16a8135d077527a9 100644 (file)
@@ -275,7 +275,7 @@ void rcommon_flush_last_swtcl_prim( GLcontext *ctx  )
                
 
        if (RADEON_DEBUG & DEBUG_IOCTL)
-               fprintf(stderr, "%s\n", __FUNCTION__);
+               fprintf(stderr, "%s %p\n", __FUNCTION__, dma->current);
        dma->flush = NULL;
 
        if (dma->current) {
@@ -300,12 +300,19 @@ rcommonAllocDmaLowVerts( radeonContextPtr rmesa, int nverts, int vsize )
 {
        GLuint bytes = vsize * nverts;
        void *head;
-
+restart:
        if (!rmesa->dma.current || rmesa->dma.current_vertexptr + bytes > rmesa->dma.current->size) {
                 radeonRefillCurrentDmaRegion(rmesa, bytes);
        }
 
         if (!rmesa->dma.flush) {
+               /* make sure we have enough space to use this in cmdbuf */
+               rcommonEnsureCmdBufSpace(&rmesa->radeon,
+                             rmesa->hw.max_state_size + (12*sizeof(int)),
+                             __FUNCTION__);
+               /* if cmdbuf flushed DMA restart */
+               if (!rmesa->dma.current)
+                       goto restart;
                 rmesa->glCtx->Driver.NeedFlush |= FLUSH_STORED_VERTICES;
                 rmesa->dma.flush = rcommon_flush_last_swtcl_prim;
         }