summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dri
diff options
context:
space:
mode:
authorEric Anholt <anholt@FreeBSD.org>2005-10-27 06:01:50 +0000
committerEric Anholt <anholt@FreeBSD.org>2005-10-27 06:01:50 +0000
commit170a61ec00b9eb1980511b793051e238e47ca2a1 (patch)
treecf7b3dc15562058b67b2583e14d53cf91b78b986 /src/mesa/drivers/dri
parent2d0c92d81b5dab2215180d635b2ec8773820e3b7 (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')
-rw-r--r--src/mesa/drivers/dri/common/stenciltmp.h53
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 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<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();
}