mesa: remove gl_renderbufer::PutMonoRow() and PutMonoValues()
[mesa.git] / src / mesa / drivers / dri / common / stenciltmp.h
index 365e9811ac3457c78bdf84e253238d2a416fa37c..e4e39c7303437055aac05507c11caddccf20a2c7 100644 (file)
@@ -1,36 +1,40 @@
-/* $XFree86: xc/lib/GL/mesa/src/drv/common/stenciltmp.h,v 1.3 2001/03/21 16:14:20 dawes Exp $ */
+
+#include "spantmp_common.h"
 
 #ifndef DBG
 #define DBG 0
 #endif
 
-#ifndef HW_WRITE_LOCK
-#define HW_WRITE_LOCK()                HW_LOCK()
-#endif
-#ifndef HW_WRITE_UNLOCK
-#define HW_WRITE_UNLOCK()      HW_UNLOCK()
+#ifndef HAVE_HW_STENCIL_SPANS
+#define HAVE_HW_STENCIL_SPANS 0
 #endif
 
-#ifndef HW_READ_LOCK
-#define HW_READ_LOCK()         HW_LOCK()
-#endif
-#ifndef HW_READ_UNLOCK
-#define HW_READ_UNLOCK()       HW_UNLOCK()
+#ifndef HAVE_HW_STENCIL_PIXELS
+#define HAVE_HW_STENCIL_PIXELS 0
 #endif
 
-static void TAG(WriteStencilSpan)( GLcontext *ctx,
+static void TAG(WriteStencilSpan)( struct gl_context *ctx,
+                                   struct gl_renderbuffer *rb,
                                   GLuint n, GLint x, GLint y,
-                                  const GLstencil *stencil, 
-                                  const GLubyte mask[] )
+                                  const void *values, const GLubyte mask[] )
 {
    HW_WRITE_LOCK()
       {
+         const GLubyte *stencil = (const GLubyte *) values;
         GLint x1;
         GLint n1;
         LOCAL_STENCIL_VARS;
 
         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,36 +45,42 @@ static void TAG(WriteStencilSpan)( GLcontext *ctx,
 
               if (mask)
               {
-                 for (;i<n1;i++,x1++)
+                 for (;n1>0;i++,x1++,n1--)
                     if (mask[i])
                        WRITE_STENCIL( x1, y, stencil[i] );
               }
               else
               {
-                 for (;i<n1;i++,x1++)
+                 for (;n1>0;i++,x1++,n1--)
                     WRITE_STENCIL( x1, y, stencil[i] );
               }
            }
         HW_ENDCLIPLOOP();
+#endif /* !HAVE_HW_STENCIL_SPANS */
       }
    HW_WRITE_UNLOCK();
 }
 
 
-static void TAG(WriteStencilPixels)( GLcontext *ctx,
-                                    GLuint n, 
-                                    const GLint x[], 
-                                    const GLint y[],
-                                    const GLstencil stencil[], 
-                                    const GLubyte mask[] )
+static void TAG(WriteStencilPixels)( struct gl_context *ctx,
+                                     struct gl_renderbuffer *rb,
+                                    GLuint n,
+                                    const GLint x[], const GLint y[],
+                                    const void *values, const GLubyte mask[] )
 {
    HW_WRITE_LOCK()
       {
-        GLint i;
+         const GLubyte *stencil = (const GLubyte *) values;
+        GLuint i;
         LOCAL_STENCIL_VARS;
 
         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++)
@@ -83,6 +93,7 @@ static void TAG(WriteStencilPixels)( GLcontext *ctx,
               }
            }
         HW_ENDCLIPLOOP();
+#endif /* !HAVE_HW_STENCIL_PIXELS */
       }
    HW_WRITE_UNLOCK();
 }
@@ -90,12 +101,14 @@ static void TAG(WriteStencilPixels)( GLcontext *ctx,
 
 /* Read stencil spans and pixels
  */
-static void TAG(ReadStencilSpan)( GLcontext *ctx,
+static void TAG(ReadStencilSpan)( struct gl_context *ctx,
+                                  struct gl_renderbuffer *rb,
                                  GLuint n, GLint x, GLint y,
-                                 GLstencil stencil[])
+                                 void *values)
 {
    HW_READ_LOCK()
       {
+         GLubyte *stencil = (GLubyte *) values;
         GLint x1,n1;
         LOCAL_STENCIL_VARS;
 
@@ -103,29 +116,42 @@ 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;
               CLIPSPAN(x,y,n,x1,n1,i);
-              for (;i<n1;i++)
-                 READ_STENCIL( stencil[i], (x1+i), y );
+              for (;n1>0;i++,n1--)
+                 READ_STENCIL( stencil[i], (x+i), y );
            }
         HW_ENDCLIPLOOP();
+#endif /* !HAVE_HW_STENCIL_SPANS */
       }
    HW_READ_UNLOCK();
 }
 
-static void TAG(ReadStencilPixels)( GLcontext *ctx, GLuint n, 
-                                   const GLint x[], const GLint y[],
-                                   GLstencil stencil[] )
+static void TAG(ReadStencilPixels)( struct gl_context *ctx,
+                                    struct gl_renderbuffer *rb,
+                                    GLuint n, const GLint x[], const GLint y[],
+                                   void *values )
 {
    HW_READ_LOCK()
       {
-        GLint i;
+         GLubyte *stencil = (GLubyte *) values;
+        GLuint i;
         LOCAL_STENCIL_VARS;
 
         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++) {
@@ -135,12 +161,26 @@ static void TAG(ReadStencilPixels)( GLcontext *ctx, GLuint n,
               }
            }
         HW_ENDCLIPLOOP();
+#endif /* !HAVE_HW_STENCIL_PIXELS */
       }
    HW_READ_UNLOCK();
 }
 
 
 
+/**
+ * Initialize the given renderbuffer's span routines to point to
+ * the stencil functions we generated above.
+ */
+static void TAG(InitStencilPointers)(struct gl_renderbuffer *rb)
+{
+   rb->GetRow = TAG(ReadStencilSpan);
+   rb->GetValues = TAG(ReadStencilPixels);
+   rb->PutRow = TAG(WriteStencilSpan);
+   rb->PutRowRGB = NULL;
+   rb->PutValues = TAG(WriteStencilPixels);
+}
+
 
 #undef WRITE_STENCIL
 #undef READ_STENCIL