[Mesa-dev] [PATCH 1/4] mesa: Rework depth range setting in preparation for NV_depth_buffer_float.

Mathias.Froehlich at gmx.net Mathias.Froehlich at gmx.net
Sun Sep 14 07:07:36 PDT 2014


From: Mathias Froehlich <Mathias.Froehlich at web.de>

Factor out some functions that will get additional callers
with the implementation of NV_depth_buffer_float.

Signed-off-by: Mathias Froehlich <Mathias.Froehlich at web.de>
---
 src/mesa/main/attrib.c   |  2 +-
 src/mesa/main/depth.c    | 66 ++++++++++++++++++++++++++++++------------------
 src/mesa/main/viewport.c | 64 +++++++++++++++++++++++++++-------------------
 src/mesa/main/viewport.h |  2 +-
 4 files changed, 82 insertions(+), 52 deletions(-)

diff --git a/src/mesa/main/attrib.c b/src/mesa/main/attrib.c
index 2e289b6..97115a1 100644
--- a/src/mesa/main/attrib.c
+++ b/src/mesa/main/attrib.c
@@ -1364,7 +1364,7 @@ _mesa_PopAttrib(void)
                for (i = 0; i < ctx->Const.MaxViewports; i++) {
                   _mesa_set_viewport(ctx, i, vp[i].X, vp[i].Y, vp[i].Width,
                                      vp[i].Height);
-                  _mesa_set_depth_range(ctx, i, vp[i].Near, vp[i].Far);
+                  _mesa_set_depth_range(ctx, i, vp[i].Near, vp[i].Far, false);
                }
             }
             break;
diff --git a/src/mesa/main/depth.c b/src/mesa/main/depth.c
index 29851ec..8ae3cb6 100644
--- a/src/mesa/main/depth.c
+++ b/src/mesa/main/depth.c
@@ -32,6 +32,44 @@
 #include "mtypes.h"
 
 
+static void
+set_clear_depth( struct gl_context *ctx, const char* fcn,
+                 GLdouble depth, bool clamp )
+{
+   if (MESA_VERBOSE & VERBOSE_API)
+      _mesa_debug(ctx, "%s(%f)\n", fcn, depth);
+
+   if (clamp)
+      depth = CLAMP( depth, 0.0, 1.0 );
+
+   ctx->Depth.Clear = depth;
+}
+
+static void
+set_depth_bounds( struct gl_context *ctx, const char* fcn,
+                  GLdouble zmin, GLdouble zmax, bool clamp )
+{
+   if (MESA_VERBOSE & VERBOSE_API)
+      _mesa_debug(ctx, "%s(%f, %f)\n", fcn, zmin, zmax);
+
+   if (zmin > zmax) {
+      _mesa_error(ctx, GL_INVALID_VALUE, "%s(zmin > zmax)", fcn);
+      return;
+   }
+
+   if (clamp) {
+      zmin = CLAMP(zmin, 0.0, 1.0);
+      zmax = CLAMP(zmax, 0.0, 1.0);
+   }
+
+   if (ctx->Depth.BoundsMin == zmin && ctx->Depth.BoundsMax == zmax)
+      return;
+
+   FLUSH_VERTICES(ctx, _NEW_DEPTH);
+   ctx->Depth.BoundsMin = (GLfloat) zmin;
+   ctx->Depth.BoundsMax = (GLfloat) zmax;
+}
+
 /**********************************************************************/
 /*****                          API Functions                     *****/
 /**********************************************************************/
@@ -42,18 +80,15 @@ void GLAPIENTRY
 _mesa_ClearDepth( GLclampd depth )
 {
    GET_CURRENT_CONTEXT(ctx);
-
-   if (MESA_VERBOSE & VERBOSE_API)
-      _mesa_debug(ctx, "glClearDepth(%f)\n", depth);
-
-   ctx->Depth.Clear = CLAMP( depth, 0.0, 1.0 );
+   set_clear_depth(ctx, "glClearDepth", depth, true);
 }
 
 
 void GLAPIENTRY
 _mesa_ClearDepthf( GLclampf depth )
 {
-   _mesa_ClearDepth(depth);
+   GET_CURRENT_CONTEXT(ctx);
+   set_clear_depth(ctx, "glClearDepthf", depth, true);
 }
 
 
@@ -123,24 +158,7 @@ void GLAPIENTRY
 _mesa_DepthBoundsEXT( GLclampd zmin, GLclampd zmax )
 {
    GET_CURRENT_CONTEXT(ctx);
-
-   if (MESA_VERBOSE & VERBOSE_API)
-      _mesa_debug(ctx, "glDepthBounds(%f, %f)\n", zmin, zmax);
-
-   if (zmin > zmax) {
-      _mesa_error(ctx, GL_INVALID_VALUE, "glDepthBoundsEXT(zmin > zmax)");
-      return;
-   }
-
-   zmin = CLAMP(zmin, 0.0, 1.0);
-   zmax = CLAMP(zmax, 0.0, 1.0);
-
-   if (ctx->Depth.BoundsMin == zmin && ctx->Depth.BoundsMax == zmax)
-      return;
-
-   FLUSH_VERTICES(ctx, _NEW_DEPTH);
-   ctx->Depth.BoundsMin = (GLfloat) zmin;
-   ctx->Depth.BoundsMax = (GLfloat) zmax;
+   set_depth_bounds(ctx, "glDepthBoundsEXT", zmin, zmax, true);
 }
 
 
diff --git a/src/mesa/main/viewport.c b/src/mesa/main/viewport.c
index 6545bf6..e86a77c 100644
--- a/src/mesa/main/viewport.c
+++ b/src/mesa/main/viewport.c
@@ -240,14 +240,19 @@ _mesa_ViewportIndexedfv(GLuint index, const GLfloat *v)
 
 static void
 set_depth_range_no_notify(struct gl_context *ctx, unsigned idx,
-                          GLclampd nearval, GLclampd farval)
+                          GLdouble nearval, GLdouble farval, bool clamp)
 {
+   if (clamp) {
+      nearval = CLAMP(nearval, 0.0, 1.0);
+      farval = CLAMP(farval, 0.0, 1.0);
+   }
+
    if (ctx->ViewportArray[idx].Near == nearval &&
        ctx->ViewportArray[idx].Far == farval)
       return;
 
-   ctx->ViewportArray[idx].Near = CLAMP(nearval, 0.0, 1.0);
-   ctx->ViewportArray[idx].Far = CLAMP(farval, 0.0, 1.0);
+   ctx->ViewportArray[idx].Near = nearval;
+   ctx->ViewportArray[idx].Far = farval;
    ctx->NewState |= _NEW_VIEWPORT;
 
 #if 1
@@ -268,32 +273,19 @@ set_depth_range_no_notify(struct gl_context *ctx, unsigned idx,
 
 void
 _mesa_set_depth_range(struct gl_context *ctx, unsigned idx,
-                      GLclampd nearval, GLclampd farval)
+                      GLdouble nearval, GLdouble farval, bool clamp)
 {
-   set_depth_range_no_notify(ctx, idx, nearval, farval);
+   set_depth_range_no_notify(ctx, idx, nearval, farval, clamp);
 
    if (ctx->Driver.DepthRange)
       ctx->Driver.DepthRange(ctx);
 }
 
-/**
- * Called by glDepthRange
- *
- * \param nearval  specifies the Z buffer value which should correspond to
- *                 the near clip plane
- * \param farval  specifies the Z buffer value which should correspond to
- *                the far clip plane
- */
-void GLAPIENTRY
-_mesa_DepthRange(GLclampd nearval, GLclampd farval)
+static void
+set_all_depth_range(struct gl_context *ctx,
+                    GLdouble nearval, GLdouble farval, bool clamp)
 {
    unsigned i;
-   GET_CURRENT_CONTEXT(ctx);
-
-   FLUSH_VERTICES(ctx, 0);
-
-   if (MESA_VERBOSE&VERBOSE_API)
-      _mesa_debug(ctx, "glDepthRange %f %f\n", nearval, farval);
 
    /* The GL_ARB_viewport_array spec says:
     *
@@ -307,11 +299,31 @@ _mesa_DepthRange(GLclampd nearval, GLclampd farval)
     * implementation, but only signal the driver once at the end.
     */
    for (i = 0; i < ctx->Const.MaxViewports; i++)
-      set_depth_range_no_notify(ctx, i, nearval, farval);
+      set_depth_range_no_notify(ctx, i, nearval, farval, clamp);
 
-   if (ctx->Driver.DepthRange) {
+   if (ctx->Driver.DepthRange)
       ctx->Driver.DepthRange(ctx);
-   }
+}
+
+/**
+ * Called by glDepthRange
+ *
+ * \param nearval  specifies the Z buffer value which should correspond to
+ *                 the near clip plane
+ * \param farval  specifies the Z buffer value which should correspond to
+ *                the far clip plane
+ */
+void
+_mesa_DepthRange(GLclampd nearval, GLclampd farval)
+{
+   GET_CURRENT_CONTEXT(ctx);
+
+   FLUSH_VERTICES(ctx, 0);
+
+   if (MESA_VERBOSE&VERBOSE_API)
+      _mesa_debug(ctx, "glDepthRange %f %f\n", nearval, farval);
+
+   set_all_depth_range(ctx, nearval, farval, true);
 }
 
 void GLAPIENTRY
@@ -347,7 +359,7 @@ _mesa_DepthRangeArrayv(GLuint first, GLsizei count, const GLclampd *v)
    }
 
    for (i = 0; i < count; i++)
-      set_depth_range_no_notify(ctx, i + first, p[i].Near, p[i].Far);
+      set_depth_range_no_notify(ctx, i + first, p[i].Near, p[i].Far, true);
 
    if (ctx->Driver.DepthRange)
       ctx->Driver.DepthRange(ctx);
@@ -378,7 +390,7 @@ _mesa_DepthRangeIndexed(GLuint index, GLclampd nearval, GLclampd farval)
       return;
    }
 
-   _mesa_set_depth_range(ctx, index, nearval, farval);
+   _mesa_set_depth_range(ctx, index, nearval, farval, true);
 }
 
 /** 
diff --git a/src/mesa/main/viewport.h b/src/mesa/main/viewport.h
index f2311c0..6324cab 100644
--- a/src/mesa/main/viewport.h
+++ b/src/mesa/main/viewport.h
@@ -62,7 +62,7 @@ _mesa_DepthRangeIndexed(GLuint index, GLclampd n, GLclampd f);
 
 extern void
 _mesa_set_depth_range(struct gl_context *ctx, unsigned idx,
-                      GLclampd nearval, GLclampd farval);
+                      GLdouble nearval, GLdouble farval, bool clamp);
 
 extern void 
 _mesa_init_viewport(struct gl_context *ctx);
-- 
1.9.3



More information about the mesa-dev mailing list