From: Mathias Froehlich <mathias.froehl...@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.froehl...@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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev