Fix some wrapping bugs in the last commit. Probably there are more
authorKeith Whitwell <keith@tungstengraphics.com>
Wed, 29 Dec 2004 21:17:06 +0000 (21:17 +0000)
committerKeith Whitwell <keith@tungstengraphics.com>
Wed, 29 Dec 2004 21:17:06 +0000 (21:17 +0000)
remaining.

src/mesa/drivers/dri/unichrome/via_context.c
src/mesa/drivers/dri/unichrome/via_context.h
src/mesa/drivers/dri/unichrome/via_ioctl.c
src/mesa/drivers/dri/unichrome/via_ioctl.h
src/mesa/drivers/dri/unichrome/via_render.c
src/mesa/drivers/dri/unichrome/via_state.c
src/mesa/drivers/dri/unichrome/via_state.h
src/mesa/drivers/dri/unichrome/via_tris.c

index b6c2c37aeddc7e0b5d863351b336597d7a8a17bb..b3cc66f087c30d6f501cc832ff09f6e7a9d3f4ed 100644 (file)
@@ -681,7 +681,7 @@ void viaGetLock(viaContextPtr vmesa, GLuint flags)
 
     if (vmesa->sarea->ctxOwner != vmesa->hHWContext) {
        vmesa->sarea->ctxOwner = vmesa->hHWContext;
-       vmesa->newState = ~0;
+       vmesa->newEmitState = ~0;
     }
 
     if (vmesa->lastStamp != dPriv->lastStamp) {
index 995e20698ec877f7206097242ff53d1d8a9eb5e4..7cac40ed54842f931d709bee5cff1f04781cc25a 100644 (file)
@@ -123,6 +123,7 @@ struct via_context_t {
     /* State for via_vb.c and via_tris.c.
      */
     GLuint newState;            /* _NEW_* flags */
+    GLuint newEmitState;            /* _NEW_* flags */
     GLuint setupNewInputs;
     GLuint setupIndex;
     GLuint renderIndex;
index 55220f18f6f2f39b085c83d0642db4f9936fe91d..256349a12f27a5a00a29a7b27cc5559db1769952 100644 (file)
@@ -32,6 +32,7 @@ v * copy of this software and associated documentation files (the "Software"),
 
 #include "mm.h"
 #include "via_context.h"
+#include "via_tris.h"
 #include "via_ioctl.h"
 #include "via_state.h"
 
@@ -678,33 +679,36 @@ void viaFlushDmaLocked(viaContextPtr vmesa, GLuint flags)
     */
    vmesa->dmaLow = 0;
    vmesa->dmaCliprectAddr = 0;
-   viaValidateState(vmesa->glCtx);
+   vmesa->newEmitState = ~0;
 }
 
-void viaWrapPrimitive( viaContextPtr vmesa )
+static void viaWrapPrimitive( viaContextPtr vmesa )
 {
+   GLenum renderPrimitive = vmesa->renderPrimitive;
+   GLenum hwPrimitive = vmesa->hwPrimitive;
+
    if (VIA_DEBUG) fprintf(stderr, "%s\n", __FUNCTION__);
-   viaFinishPrimitive( vmesa );
    
-   LOCK_HARDWARE(vmesa); 
-   viaFlushDmaLocked(vmesa, 0);
-   UNLOCK_HARDWARE(vmesa);
+   if (vmesa->dmaLastPrim)
+      viaFinishPrimitive( vmesa );
+   
+   viaFlushDma(vmesa);
+
+   if (renderPrimitive != GL_POLYGON + 1)
+      viaRasterPrimitive( vmesa->glCtx,
+                         renderPrimitive,
+                         hwPrimitive );
 
-   viaRasterPrimitive( vmesa->glCtx,
-                      vmesa->renderPrimitive,
-                      vmesa->hwPrimitive );
 }
 
 void viaFlushDma(viaContextPtr vmesa)
 {
    if (vmesa->dmaLow) {
-      if (vmesa->dmaLastPrim)
-        viaWrapPrimitive(vmesa); 
-      else {      
-        LOCK_HARDWARE(vmesa); 
-        viaFlushDmaLocked(vmesa, 0);
-        UNLOCK_HARDWARE(vmesa);
-      }
+      assert(!vmesa->dmaLastPrim);
+
+      LOCK_HARDWARE(vmesa); 
+      viaFlushDmaLocked(vmesa, 0);
+      UNLOCK_HARDWARE(vmesa);
    }
 }
 
@@ -739,6 +743,7 @@ void viaInitIoctlFuncs(GLcontext *ctx)
 
 GLuint *viaAllocDmaFunc(viaContextPtr vmesa, int bytes, const char *func, int line)
 {
+   assert(!vmesa->dmaLastPrim);
    if (vmesa->dmaLow + bytes > VIA_DMA_HIGHWATER) {
       if (VIA_DEBUG) fprintf(stderr, "buffer overflow in check dma = %d + %d = %d\n", 
                             vmesa->dmaLow, bytes, vmesa->dmaLow + bytes);
@@ -748,8 +753,21 @@ GLuint *viaAllocDmaFunc(viaContextPtr vmesa, int bytes, const char *func, int li
    {
       GLuint *start = (GLuint *)(vmesa->dma + vmesa->dmaLow);
       vmesa->dmaLow += bytes;
-      if (VIA_DEBUG && (vmesa->dmaLow & 0x4))
-        fprintf(stderr, "%s/%d: alloc 0x%x --> dmaLow 0x%x\n", func, line, bytes, vmesa->dmaLow);
+      return start;
+   }
+}
+
+
+GLuint *viaExtendPrimitive(viaContextPtr vmesa, int bytes)
+{
+   assert(vmesa->dmaLastPrim);
+   if (vmesa->dmaLow + bytes > VIA_DMA_HIGHWATER) {
+      viaWrapPrimitive(vmesa);
+   }
+
+   {
+      GLuint *start = (GLuint *)(vmesa->dma + vmesa->dmaLow);
+      vmesa->dmaLow += bytes;
       return start;
    }
 }
index ddb75ba6b819cd7019d422c366dbe19d53398ca1..b5dd9a8e5cbe6ab120a8861465977d62b83481aa 100644 (file)
@@ -49,6 +49,7 @@ void viaCheckDma(viaContextPtr vmesa, GLuint bytes);
 } while (0)
     
 
+GLuint *viaExtendPrimitive(viaContextPtr vmesa, int bytes);
 GLuint *viaAllocDmaFunc(viaContextPtr vmesa, int bytes, const char *func, int line);
 #define viaAllocDma( v, b ) viaAllocDmaFunc(v, b, __FUNCTION__, __LINE__)
 
index 0b4f512b26f64af1c3d0e6743d134dbcc4826258..8e4efd220f90eed96e97d3e0568e6a5367718c1e 100644 (file)
@@ -70,7 +70,7 @@
     (VIA_DMA_BUF_SZ - 512) / (vmesa->vertexSize * 4)
 
 #define ALLOC_VERTS( nr ) \
-    viaAllocDma( vmesa, (nr) * vmesa->vertexSize * 4)
+    viaExtendPrimitive( vmesa, (nr) * vmesa->vertexSize * 4)
 
 #define EMIT_VERTS(ctx, j, nr, buf) \
     via_emit_contiguous_verts(ctx, j, (j) + (nr), buf)
index ef3846106d05fecf9eb31e71306c5321e21fafd6..547bf8b7ff7d1d4ce908e338ba502ae3974ad7ae 100644 (file)
@@ -69,7 +69,7 @@ static GLuint ROP[16] = {
 
 
 
-static void via_emit_state(viaContextPtr vmesa)
+void viaEmitState(viaContextPtr vmesa)
 {
    GLcontext *ctx = vmesa->glCtx;
    GLuint i = 0;
@@ -516,6 +516,8 @@ static void via_emit_state(viaContextPtr vmesa)
    }
    
    if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__);
+
+   vmesa->newEmitState = 0;
 }
 
 
@@ -1548,9 +1550,7 @@ void viaValidateState( GLcontext *ctx )
         viaChooseStencilState(ctx);
     
     if (!vmesa->Fallback) {
-       viaChooseVertexState(ctx);
-       viaChooseRenderState(ctx);
-       via_emit_state(vmesa);
+       vmesa->newEmitState |= vmesa->newState;
        vmesa->newState = 0;
     }
             
index da69d303a0b00fa303017ae83aa8e19abaec082a..2603c1587192fd98479c3d149a8e79bca25f70c2 100644 (file)
@@ -31,6 +31,7 @@ extern void viaInitState(GLcontext *ctx);
 extern void viaInitStateFuncs(GLcontext *ctx);
 extern void viaCalcViewport(GLcontext *ctx);
 extern void viaValidateState(GLcontext *ctx);
+extern void viaEmitState(viaContextPtr vmesa);
 
 extern void viaFallback(viaContextPtr vmesa, GLuint bit, GLboolean mode);
 #define FALLBACK(vmesa, bit, mode) viaFallback(vmesa, bit, mode)
index 4d2092f36111516dc1814e6338ab5d60075deb3a..862c827300f47e3a037cb61301cf5bf3e8d67e05 100644 (file)
@@ -40,6 +40,7 @@
 #include "via_context.h"
 #include "via_tris.h"
 #include "via_state.h"
+#include "via_span.h"
 #include "via_vb.h"
 #include "via_ioctl.h"
 
@@ -74,7 +75,7 @@ static void __inline__ via_draw_triangle(viaContextPtr vmesa,
                                          viaVertexPtr v2)
 {
     GLuint vertsize = vmesa->vertexSize;
-    GLuint *vb = viaAllocDma(vmesa, 3 * 4 * vertsize);
+    GLuint *vb = viaExtendPrimitive(vmesa, 3 * 4 * vertsize);
 /*     fprintf(stderr, "%s: %p %p %p\n", __FUNCTION__, v0, v1, v2); */
     COPY_DWORDS(vb, vertsize, v0);
     COPY_DWORDS(vb, vertsize, v1);
@@ -89,7 +90,7 @@ static void __inline__ via_draw_quad(viaContextPtr vmesa,
                                      viaVertexPtr v3)
 {
     GLuint vertsize = vmesa->vertexSize;
-    GLuint *vb = viaAllocDma(vmesa, 6 * 4 * vertsize);
+    GLuint *vb = viaExtendPrimitive(vmesa, 6 * 4 * vertsize);
 
 /*     fprintf(stderr, "%s: %p %p %p %p\n", __FUNCTION__, v0, v1, v2, v3); */
     COPY_DWORDS(vb, vertsize, v0);
@@ -105,7 +106,7 @@ static __inline__ void via_draw_line(viaContextPtr vmesa,
                                      viaVertexPtr v1)
 {
     GLuint vertsize = vmesa->vertexSize;
-    GLuint *vb = viaAllocDma(vmesa, 2 * 4 * vertsize);
+    GLuint *vb = viaExtendPrimitive(vmesa, 2 * 4 * vertsize);
     COPY_DWORDS(vb, vertsize, v0);
     COPY_DWORDS(vb, vertsize, v1);
 }
@@ -115,7 +116,7 @@ static __inline__ void via_draw_point(viaContextPtr vmesa,
                                       viaVertexPtr v0)
 {
     GLuint vertsize = vmesa->vertexSize;
-    GLuint *vb = viaAllocDma(vmesa, 4 * vertsize);
+    GLuint *vb = viaExtendPrimitive(vmesa, 4 * vertsize);
     COPY_DWORDS(vb, vertsize, v0);
 }
 
@@ -521,7 +522,7 @@ static void viaFastRenderClippedPoly(GLcontext *ctx, const GLuint *elts,
 {
     viaContextPtr vmesa = VIA_CONTEXT(ctx);
     GLuint vertsize = vmesa->vertexSize;
-    GLuint *vb = viaAllocDma(vmesa, (n - 2) * 3 * 4 * vertsize);
+    GLuint *vb = viaExtendPrimitive(vmesa, (n - 2) * 3 * 4 * vertsize);
     GLubyte *vertptr = (GLubyte *)vmesa->verts;
     const GLuint *start = (const GLuint *)V(elts[0]);
     int i;
@@ -632,6 +633,8 @@ static void viaRunPipeline(GLcontext *ctx)
     viaContextPtr vmesa = VIA_CONTEXT(ctx);
     
     if (vmesa->newState) {
+       viaChooseVertexState(ctx);
+       viaChooseRenderState(ctx);
        viaValidateState( ctx );
     }
 
@@ -672,8 +675,14 @@ void viaRasterPrimitive(GLcontext *ctx,
               _mesa_lookup_enum_by_nr(hwprim));
 
     VIA_FINISH_PRIM(vmesa);
+    
     viaCheckDma( vmesa, 1024 );        /* Ensure no wrapping inside this function  */
 
+    if (vmesa->newEmitState) {
+       viaEmitState(vmesa);
+    }
+       
+
     regCmdB = vmesa->regCmdB;
 
     switch (hwprim) {
@@ -782,12 +791,13 @@ void viaFinishPrimitive(viaContextPtr vmesa)
    if (VIA_DEBUG) fprintf(stderr, "%s\n", __FUNCTION__);
 
    if (!vmesa->dmaLastPrim) {
-      return;
    }
    else if (vmesa->dmaLow != vmesa->dmaLastPrim) {
       GLuint cmdA = vmesa->regCmdA_End | HC_HPLEND_MASK | HC_HPMValidN_MASK | HC_HE3Fire_MASK;    
       RING_VARS;
 
+      vmesa->dmaLastPrim = 0;
+
       /* KW: modified 0x1 to 0x4 below:
        */
       if ((vmesa->dmaLow & 0x1) || !vmesa->useAgp) {
@@ -801,7 +811,6 @@ void viaFinishPrimitive(viaContextPtr vmesa)
         OUT_RING( cmdA );
         ADVANCE_RING();
       }   
-      vmesa->dmaLastPrim = 0;
 
       if (vmesa->dmaLow > VIA_DMA_HIGHWATER)
         viaFlushDma( vmesa );
@@ -819,6 +828,10 @@ void viaFinishPrimitive(viaContextPtr vmesa)
         vmesa->dmaCliprectAddr = 0;
       }
    }
+
+   vmesa->renderPrimitive = GL_POLYGON + 1;
+   vmesa->hwPrimitive = GL_POLYGON + 1;
+   vmesa->dmaLastPrim = 0;
 }