Mesa (openchrome-branch): openchrome: Fix line stipple.

Thomas Hellstrom thomash at kemper.freedesktop.org
Thu Feb 26 11:03:02 UTC 2009


Module: Mesa
Branch: openchrome-branch
Commit: 1ed6194fcf6d9820118e189230372db7a4675017
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=1ed6194fcf6d9820118e189230372db7a4675017

Author: Thomas Hellstrom <thomas-at-shipmail-dot-org>
Date:   Wed Feb 25 09:39:55 2009 +0100

openchrome: Fix line stipple.

Pass piglit's line stipple test.
Also make sure we do the dma buffer cliprect space reservation removal
properly when we encounter an empty primitive list.

---

 src/mesa/drivers/dri/openchrome/via_context.h |    3 +
 src/mesa/drivers/dri/openchrome/via_tris.c    |   88 +++++++++++++++++-------
 2 files changed, 65 insertions(+), 26 deletions(-)

diff --git a/src/mesa/drivers/dri/openchrome/via_context.h b/src/mesa/drivers/dri/openchrome/via_context.h
index 959730d..f5083b0 100644
--- a/src/mesa/drivers/dri/openchrome/via_context.h
+++ b/src/mesa/drivers/dri/openchrome/via_context.h
@@ -163,6 +163,7 @@ struct via_context
     GLuint newState;		       /* _NEW_* flags */
     GLuint newEmitState;	       /* _NEW_* flags */
     GLuint newRenderState;	       /* _NEW_* flags */
+    GLuint emitStateAtClip;            /* _NEW_* flags */
     int lostState;
     int useLostState;
 
@@ -184,12 +185,14 @@ struct via_context
     GLenum renderPrimitive;
     GLenum hwPrimitive;
     GLenum hwShadeModel;
+    GLboolean resetStipple;
     unsigned char *verts;
 
     /* drmBufPtr dma_buffer;
      */
     GLuint dmaLow;
     GLuint lostStateDmaLow;
+    GLuint dmaAfterClip;
 
     GLuint dmaCliprectAddr;
     GLuint dmaLastPrim;
diff --git a/src/mesa/drivers/dri/openchrome/via_tris.c b/src/mesa/drivers/dri/openchrome/via_tris.c
index 092e99e..ada5da9 100644
--- a/src/mesa/drivers/dri/openchrome/via_tris.c
+++ b/src/mesa/drivers/dri/openchrome/via_tris.c
@@ -87,6 +87,21 @@ do {						\
 #endif
 #endif
 
+static const GLenum hwPrim[GL_POLYGON + 2] = {
+    GL_POINTS,
+    GL_LINES,
+    GL_LINES,
+    GL_LINES,
+    GL_TRIANGLES,
+    GL_TRIANGLES,
+    GL_TRIANGLES,
+    GL_TRIANGLES,
+    GL_TRIANGLES,
+    GL_TRIANGLES,
+    GL_POLYGON + 1
+};
+
+
 static void
 via_draw_triangle(struct via_context *vmesa,
 		  viaVertexPtr v0, viaVertexPtr v1, viaVertexPtr v2)
@@ -115,11 +130,30 @@ via_draw_quad(struct via_context *vmesa,
     COPY_DWORDS(vb, vertsize, v3);
 }
 
+static inline void
+via_do_reset_stipple(struct via_context *vmesa)
+{
+    GLboolean have_reset = (vmesa->regCmdB & HC_HLPrst_MASK) != 0;
+
+    if ((have_reset && !vmesa->resetStipple) ||
+	(!have_reset && vmesa->resetStipple)) {
+	GLenum renderPrimitive = vmesa->renderPrimitive;
+
+	VIA_FINISH_PRIM(vmesa);
+	viaRasterPrimitive(vmesa->glCtx, renderPrimitive, hwPrim[renderPrimitive]);
+    }
+    vmesa->resetStipple = GL_FALSE;
+}
+
+
 static void
 via_draw_line(struct via_context *vmesa, viaVertexPtr v0, viaVertexPtr v1)
 {
     GLuint vertsize = vmesa->vertexSize;
-    GLuint *vb = viaExtendPrimitive(vmesa, 2 * 4 * vertsize);
+    GLuint *vb;
+
+    via_do_reset_stipple(vmesa);
+    vb = viaExtendPrimitive(vmesa, 2 * 4 * vertsize);
 
     COPY_DWORDS(vb, vertsize, v0);
     COPY_DWORDS(vb, vertsize, v1);
@@ -167,8 +201,11 @@ static void
 via_ptex_line(struct via_context *vmesa, viaVertexPtr v0, viaVertexPtr v1)
 {
     GLuint vertsize = vmesa->hwVertexSize;
-    GLuint *vb = viaExtendPrimitive(vmesa, 2 * 4 * vertsize);
     viaVertex tmp;
+    GLuint *vb;
+
+    via_do_reset_stipple(vmesa);
+    vb = viaExtendPrimitive(vmesa, 2 * 4 * vertsize);
 
     PTEX_VERTEX(tmp, vertsize, v0);
     COPY_DWORDS(vb, vertsize, &tmp);
@@ -333,20 +370,6 @@ do {							\
  *                Helpers for rendering unfilled primitives            *
  ***********************************************************************/
 
-static const GLenum hwPrim[GL_POLYGON + 2] = {
-    GL_POINTS,
-    GL_LINES,
-    GL_LINES,
-    GL_LINES,
-    GL_TRIANGLES,
-    GL_TRIANGLES,
-    GL_TRIANGLES,
-    GL_TRIANGLES,
-    GL_TRIANGLES,
-    GL_TRIANGLES,
-    GL_POLYGON + 1
-};
-
 #define RASTERIZE(x) viaRasterPrimitive( ctx, x, hwPrim[x] )
 #define RENDER_PRIMITIVE vmesa->renderPrimitive
 #define TAG(x) x
@@ -517,8 +540,7 @@ static void
 viaResetLineStipple(GLcontext * ctx)
 {
     struct via_context *vmesa = VIA_CONTEXT(ctx);
-
-    vmesa->regCmdB |= HC_HLPrst_MASK;
+    vmesa->resetStipple = GL_TRUE;
 }
 
 /**********************************************************************/
@@ -538,9 +560,8 @@ viaResetLineStipple(GLcontext * ctx)
     GLubyte *vertptr = (GLubyte *)vmesa->verts;                 \
     const GLuint vertsize = vmesa->vertexSize;          \
     const GLuint * const elt = TNL_CONTEXT(ctx)->vb.Elts;       \
-   const GLboolean stipple = ctx->Line.StippleFlag;		\
-   (void) elt; (void) stipple;
-#define RESET_STIPPLE	if ( stipple ) viaResetLineStipple( ctx );
+    (void) elt;
+#define RESET_STIPPLE	if ( ctx->Line.StippleFlag ) viaResetLineStipple( ctx );
 #define RESET_OCCLUSION
 #define PRESERVE_VB_DEFS
 #define ELT(x) x
@@ -840,6 +861,8 @@ viaRenderStart(GLcontext * ctx)
     TNLcontext *tnl = TNL_CONTEXT(ctx);
     struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
 
+    vmesa->resetStipple = ctx->Line.StippleFlag;
+
     {
 	GLboolean ptexHack = viaCheckPTexHack(ctx);
 
@@ -896,6 +919,13 @@ viaRasterPrimitive(GLcontext * ctx, GLenum glprim, GLenum hwprim)
 
     assert(!vmesa->newState);
 
+    if (vmesa->resetStipple)
+	vmesa->regCmdB |= HC_HLPrst_MASK;
+    else
+	vmesa->regCmdB &= ~HC_HLPrst_MASK;
+
+    vmesa->resetStipple = GL_FALSE;
+
     if (vmesa->firstDrawAfterSwap) {
 	LOCK_HARDWARE(vmesa);
 	viaValidateDrawablesLocked(vmesa);
@@ -933,11 +963,15 @@ viaRasterPrimitive(GLcontext * ctx, GLenum glprim, GLenum hwprim)
 	     * so emit full state here.
 	     */
 
+	    vmesa->emitStateAtClip = vmesa->newEmitState;
 	    if (drawBuf && drawBuf->isSharedFrontBuffer)
 		vmesa->newEmitState = ~0;
-	}
+	    if (vmesa->newEmitState || vmesa->lostState) {
+		viaEmitState(vmesa);
+	    }
+	    vmesa->dmaAfterClip = vmesa->dmaLow;
 
-	if (vmesa->newEmitState || vmesa->lostState) {
+	} else if (vmesa->newEmitState || vmesa->lostState) {
 	    viaEmitState(vmesa);
 	}
 
@@ -958,7 +992,6 @@ viaRasterPrimitive(GLcontext * ctx, GLenum glprim, GLenum hwprim)
 	    break;
 	case GL_LINES:
 	    vmesa->regCmdA_End |= HC_HPMType_Line | HC_HVCycle_Full;
-	    regCmdB |= HC_HLPrst_MASK;
 	    if (ctx->Light.ShadeModel == GL_FLAT)
 		vmesa->regCmdA_End |= HC_HShading_FlatB;
 	    break;
@@ -1027,6 +1060,7 @@ viaRasterPrimitive(GLcontext * ctx, GLenum glprim, GLenum hwprim)
 	;			       //      assert(!vmesa->newEmitState);
     }
 
+    vmesa->resetStipple = GL_FALSE;
     vmesa->renderPrimitive = glprim;
 }
 
@@ -1079,8 +1113,10 @@ viaFinishPrimitive(struct via_context *vmesa)
 
 	/* Maybe remove the cliprect as well:
 	 */
-	if (vmesa->dmaCliprectAddr == vmesa->dmaLow - 8 * sizeof(GLuint)) {
-	    vmesa->dmaLow -= 8 * sizeof(GLuint);
+	if (vmesa->dmaCliprectAddr != ~0 &&
+	    vmesa->dmaLow == vmesa->dmaAfterClip) {
+	    vmesa->dmaLow = vmesa->dmaCliprectAddr;
+	    vmesa->newEmitState = vmesa->emitStateAtClip;
 	    vmesa->dmaCliprectAddr = ~0;
 	}
     }




More information about the mesa-commit mailing list