diff options
author | Eric Anholt <[email protected]> | 2005-10-27 06:01:50 +0000 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2005-10-27 06:01:50 +0000 |
commit | 170a61ec00b9eb1980511b793051e238e47ca2a1 (patch) | |
tree | cf7b3dc15562058b67b2583e14d53cf91b78b986 /src/mesa/drivers/dri/common | |
parent | 2d0c92d81b5dab2215180d635b2ec8773820e3b7 (diff) |
Add support for HW stencil spans, mirroring the depth spans support. Used for
Rage 128 stencil support.
Diffstat (limited to 'src/mesa/drivers/dri/common')
-rw-r--r-- | src/mesa/drivers/dri/common/stenciltmp.h | 53 |
1 files changed, 51 insertions, 2 deletions
diff --git a/src/mesa/drivers/dri/common/stenciltmp.h b/src/mesa/drivers/dri/common/stenciltmp.h index e279b5b5c03..324fc873d3f 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<n;i++) @@ -114,6 +150,7 @@ static void TAG(WriteStencilPixels)( GLcontext *ctx, } } HW_ENDCLIPLOOP(); +#endif /* !HAVE_HW_STENCIL_PIXELS */ } HW_WRITE_UNLOCK(); } @@ -136,6 +173,11 @@ static void TAG(ReadStencilSpan)( GLcontext *ctx, if (DBG) fprintf(stderr, "ReadStencilSpan\n"); +#if HAVE_HW_STENCIL_SPANS + (void) x1; (void) n1; + + READ_STENCIL_SPAN(); +#else /* HAVE_HW_STENCIL_SPANS */ HW_CLIPLOOP() { GLint i = 0; @@ -144,6 +186,7 @@ static void TAG(ReadStencilSpan)( GLcontext *ctx, READ_STENCIL( stencil[i], (x+i), y ); } HW_ENDCLIPLOOP(); +#endif /* !HAVE_HW_STENCIL_SPANS */ } HW_READ_UNLOCK(); } @@ -161,6 +204,11 @@ static void TAG(ReadStencilPixels)( GLcontext *ctx, if (DBG) fprintf(stderr, "ReadStencilPixels\n"); +#if HAVE_HW_STENCIL_PIXELS + (void) i; + + READ_STENCIL_PIXELS(); +#else /* HAVE_HW_STENCIL_PIXELS */ HW_CLIPLOOP() { for (i=0;i<n;i++) { @@ -170,6 +218,7 @@ static void TAG(ReadStencilPixels)( GLcontext *ctx, } } HW_ENDCLIPLOOP(); +#endif /* !HAVE_HW_STENCIL_PIXELS */ } HW_READ_UNLOCK(); } |