Drop GLcontext typedef and use struct gl_context instead
[mesa.git] / src / mesa / drivers / dri / common / depthtmp.h
index d8b8775ae99768348d5efb006c0deb1ee67ac105..81bec9c5ffcd8043829d95f979a83a69cb7fbded 100644 (file)
@@ -1,31 +1,35 @@
-/* $XFree86: xc/lib/GL/mesa/src/drv/common/depthtmp.h,v 1.5 2001/03/21 16:14:20 dawes Exp $ */
+
+/*
+ * Notes:
+ * 1. These functions plug into the gl_renderbuffer structure.
+ * 2. The 'values' parameter always points to GLuint values, regardless of
+ *    the actual Z buffer depth.
+ */
+
+
+#include "spantmp_common.h"
 
 #ifndef DBG
 #define DBG 0
 #endif
 
-
 #ifndef HAVE_HW_DEPTH_SPANS
 #define HAVE_HW_DEPTH_SPANS 0
 #endif
+
 #ifndef HAVE_HW_DEPTH_PIXELS
 #define HAVE_HW_DEPTH_PIXELS 0
 #endif
 
-#ifndef HW_READ_LOCK
-#define HW_READ_LOCK()         HW_LOCK()
-#endif
-#ifndef HW_READ_UNLOCK
-#define HW_READ_UNLOCK()       HW_UNLOCK()
-#endif
-
-static void TAG(WriteDepthSpan)( GLcontext *ctx,
-                             GLuint n, GLint x, GLint y,
-                                const GLdepth *depth,
+static void TAG(WriteDepthSpan)( struct gl_context *ctx,
+                                 struct gl_renderbuffer *rb,
+                                 GLuint n, GLint x, GLint y,
+                                const void *values,
                                 const GLubyte mask[] )
 {
    HW_WRITE_LOCK()
       {
+         const VALUE_TYPE *depth = (const VALUE_TYPE *) values;
         GLint x1;
         GLint n1;
         LOCAL_DEPTH_VARS;
@@ -45,15 +49,15 @@ static void TAG(WriteDepthSpan)( GLcontext *ctx,
               GLint i = 0;
               CLIPSPAN( x, y, n, x1, n1, i );
 
-              if ( DBG ) fprintf( stderr, "WriteDepthSpan %d..%d (x1 %d)\n",
-                                  (int)i, (int)n1, (int)x1 );
+              if ( DBG ) fprintf( stderr, "WriteDepthSpan %d..%d (x1 %d) (mask %p)\n",
+                                  (int)i, (int)n1, (int)x1, mask );
 
               if ( mask ) {
-                 for ( ; i < n1 ; i++, x1++ ) {
+                 for ( ; n1>0 ; i++, x1++, n1-- ) {
                     if ( mask[i] ) WRITE_DEPTH( x1, y, depth[i] );
                  }
               } else {
-                 for ( ; i < n1 ; i++, x1++ ) {
+                 for ( ; n1>0 ; i++, x1++, n1-- ) {
                     WRITE_DEPTH( x1, y, depth[i] );
                  }
               }
@@ -64,14 +68,31 @@ static void TAG(WriteDepthSpan)( GLcontext *ctx,
    HW_WRITE_UNLOCK();
 }
 
-#if !HAVE_HW_DEPTH_SPANS
-static void TAG(WriteMonoDepthSpan)( GLcontext *ctx,
-                                 GLuint n, GLint x, GLint y,
-                                const GLdepth depth,
-                                const GLubyte mask[] )
+
+#if HAVE_HW_DEPTH_SPANS
+/* implement MonoWriteDepthSpan() in terms of WriteDepthSpan() */
+static void
+TAG(WriteMonoDepthSpan)( struct gl_context *ctx, struct gl_renderbuffer *rb,
+                         GLuint n, GLint x, GLint y,
+                         const void *value, const GLubyte mask[] )
+{
+   const GLuint depthVal = *((GLuint *) value);
+   GLuint depths[MAX_WIDTH];
+   GLuint i;
+   for (i = 0; i < n; i++)
+      depths[i] = depthVal;
+   TAG(WriteDepthSpan)(ctx, rb, n, x, y, depths, mask);
+}
+#else
+static void TAG(WriteMonoDepthSpan)( struct gl_context *ctx,
+                                     struct gl_renderbuffer *rb,
+                                     GLuint n, GLint x, GLint y,
+                                     const void *value,
+                                     const GLubyte mask[] )
 {
    HW_WRITE_LOCK()
       {
+         const GLuint depth = *((GLuint *) value);
         GLint x1;
         GLint n1;
         LOCAL_DEPTH_VARS;
@@ -87,11 +108,11 @@ static void TAG(WriteMonoDepthSpan)( GLcontext *ctx,
                                   __FUNCTION__, (int)i, (int)n1, (int)x1, (GLuint)depth );
 
               if ( mask ) {
-                 for ( ; i < n1 ; i++, x1++ ) {
+                 for ( ; n1>0 ; i++, x1++, n1-- ) {
                     if ( mask[i] ) WRITE_DEPTH( x1, y, depth );
                  }
               } else {
-                 for ( ; i < n1 ; i++, x1++ ) {
+                 for ( ; n1>0 ; x1++, n1-- ) {
                     WRITE_DEPTH( x1, y, depth );
                  }
               }
@@ -102,16 +123,19 @@ static void TAG(WriteMonoDepthSpan)( GLcontext *ctx,
 }
 #endif
 
-static void TAG(WriteDepthPixels)( GLcontext *ctx,
+
+static void TAG(WriteDepthPixels)( struct gl_context *ctx,
+                                   struct gl_renderbuffer *rb,
                                   GLuint n,
                                   const GLint x[],
                                   const GLint y[],
-                                  const GLdepth depth[],
+                                  const void *values,
                                   const GLubyte mask[] )
 {
    HW_WRITE_LOCK()
       {
-        GLint i;
+         const VALUE_TYPE *depth = (const VALUE_TYPE *) values;
+        GLuint i;
         LOCAL_DEPTH_VARS;
 
         if ( DBG ) fprintf( stderr, "WriteDepthPixels\n" );
@@ -123,8 +147,17 @@ static void TAG(WriteDepthPixels)( GLcontext *ctx,
 #else
         HW_CLIPLOOP()
            {
-              for ( i = 0 ; i < n ; i++ ) {
-                 if ( mask[i] ) {
+              if ( mask ) {
+                 for ( i = 0 ; i < n ; i++ ) {
+                    if ( mask[i] ) {
+                       const int fy = Y_FLIP( y[i] );
+                       if ( CLIPPIXEL( x[i], fy ) )
+                          WRITE_DEPTH( x[i], fy, depth[i] );
+                    }
+                 }
+              }
+              else {
+                 for ( i = 0 ; i < n ; i++ ) {
                     const int fy = Y_FLIP( y[i] );
                     if ( CLIPPIXEL( x[i], fy ) )
                        WRITE_DEPTH( x[i], fy, depth[i] );
@@ -140,12 +173,14 @@ static void TAG(WriteDepthPixels)( GLcontext *ctx,
 
 /* Read depth spans and pixels
  */
-static void TAG(ReadDepthSpan)( GLcontext *ctx,
+static void TAG(ReadDepthSpan)( struct gl_context *ctx,
+                                struct gl_renderbuffer *rb,
                                GLuint n, GLint x, GLint y,
-                               GLdepth depth[] )
+                               void *values )
 {
    HW_READ_LOCK()
       {
+         VALUE_TYPE *depth = (VALUE_TYPE *) values;
         GLint x1, n1;
         LOCAL_DEPTH_VARS;
 
@@ -162,8 +197,9 @@ static void TAG(ReadDepthSpan)( GLcontext *ctx,
            {
               GLint i = 0;
               CLIPSPAN( x, y, n, x1, n1, i );
-              for ( ; i < n1 ; i++ )
-                 READ_DEPTH( depth[i], (x1+i), y );
+              for ( ; n1>0 ; i++, n1-- ) {
+                 READ_DEPTH( depth[i], x+i, y );
+              }
            }
         HW_ENDCLIPLOOP();
 #endif
@@ -171,13 +207,16 @@ static void TAG(ReadDepthSpan)( GLcontext *ctx,
    HW_READ_UNLOCK();
 }
 
-static void TAG(ReadDepthPixels)( GLcontext *ctx, GLuint n,
+static void TAG(ReadDepthPixels)( struct gl_context *ctx,
+                                  struct gl_renderbuffer *rb,
+                                  GLuint n,
                                  const GLint x[], const GLint y[],
-                                 GLdepth depth[] )
+                                 void *values )
 {
    HW_READ_LOCK()
       {
-        GLint i;
+         VALUE_TYPE *depth = (VALUE_TYPE *) values;
+        GLuint i;
         LOCAL_DEPTH_VARS;
 
         if ( DBG ) fprintf( stderr, "ReadDepthPixels\n" );
@@ -202,6 +241,22 @@ static void TAG(ReadDepthPixels)( GLcontext *ctx, GLuint n,
 }
 
 
+/**
+ * Initialize the given renderbuffer's span routines to point to
+ * the depth/z functions we generated above.
+ */
+static void TAG(InitDepthPointers)(struct gl_renderbuffer *rb)
+{
+   rb->GetRow = TAG(ReadDepthSpan);
+   rb->GetValues = TAG(ReadDepthPixels);
+   rb->PutRow = TAG(WriteDepthSpan);
+   rb->PutRowRGB = NULL;
+   rb->PutMonoRow = TAG(WriteMonoDepthSpan);
+   rb->PutValues = TAG(WriteDepthPixels);
+   rb->PutMonoValues = NULL;
+}
+
+
 #if HAVE_HW_DEPTH_SPANS
 #undef WRITE_DEPTH_SPAN
 #undef WRITE_DEPTH_PIXELS
@@ -212,3 +267,4 @@ static void TAG(ReadDepthPixels)( GLcontext *ctx, GLuint n,
 #undef READ_DEPTH
 #endif
 #undef TAG
+#undef VALUE_TYPE