From 170a61ec00b9eb1980511b793051e238e47ca2a1 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Thu, 27 Oct 2005 06:01:50 +0000 Subject: Add support for HW stencil spans, mirroring the depth spans support. Used for Rage 128 stencil support. --- src/mesa/drivers/dri/common/stenciltmp.h | 53 ++++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/src/mesa/drivers/dri/common/stenciltmp.h b/src/mesa/drivers/dri/common/stenciltmp.h index e279b5b5c0..324fc873d3 100644 --- a/src/mesa/drivers/dri/common/stenciltmp.h +++ b/src/mesa/drivers/dri/common/stenciltmp.h @@ -6,6 +6,14 @@ #define DBG 0 #endif +#ifndef HAVE_HW_STENCIL_SPANS +#define HAVE_HW_STENCIL_SPANS 0 +#endif + +#ifndef HAVE_HW_STENCIL_PIXELS +#define HAVE_HW_STENCIL_PIXELS 0 +#endif + static void TAG(WriteStencilSpan)( GLcontext *ctx, struct gl_renderbuffer *rb, GLuint n, GLint x, GLint y, @@ -20,6 +28,14 @@ static void TAG(WriteStencilSpan)( GLcontext *ctx, y = Y_FLIP(y); +#if HAVE_HW_STENCIL_SPANS + (void) x1; (void) n1; + + if (DBG) fprintf(stderr, "WriteStencilSpan 0..%d (x1 %d)\n", + (int)n1, (int)x1); + + WRITE_STENCIL_SPAN(); +#else /* HAVE_HW_STENCIL_SPANS */ HW_CLIPLOOP() { GLint i = 0; @@ -41,11 +57,26 @@ static void TAG(WriteStencilSpan)( GLcontext *ctx, } } HW_ENDCLIPLOOP(); +#endif /* !HAVE_HW_STENCIL_SPANS */ } HW_WRITE_UNLOCK(); } - +#if HAVE_HW_STENCIL_SPANS +/* implement MonoWriteDepthSpan() in terms of WriteDepthSpan() */ +static void +TAG(WriteMonoStencilSpan)( GLcontext *ctx, struct gl_renderbuffer *rb, + GLuint n, GLint x, GLint y, + const void *value, const GLubyte mask[] ) +{ + const GLuint stenVal = *((GLuint *) value); + GLuint stens[MAX_WIDTH]; + GLuint i; + for (i = 0; i < n; i++) + stens[i] = stenVal; + TAG(WriteStencilSpan)(ctx, rb, n, x, y, stens, mask); +} +#else /* HAVE_HW_STENCIL_SPANS */ static void TAG(WriteMonoStencilSpan)( GLcontext *ctx, struct gl_renderbuffer *rb, GLuint n, GLint x, GLint y, @@ -85,7 +116,7 @@ static void TAG(WriteMonoStencilSpan)( GLcontext *ctx, } HW_WRITE_UNLOCK(); } - +#endif /* !HAVE_HW_STENCIL_SPANS */ static void TAG(WriteStencilPixels)( GLcontext *ctx, @@ -102,6 +133,11 @@ static void TAG(WriteStencilPixels)( GLcontext *ctx, if (DBG) fprintf(stderr, "WriteStencilPixels\n"); +#if HAVE_HW_STENCIL_PIXELS + (void) i; + + WRITE_STENCIL_PIXELS(); +#else /* HAVE_HW_STENCIL_PIXELS */ HW_CLIPLOOP() { for (i=0;i