[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