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