|
@@ -528,6 +528,7 @@ CLP(GraphicsStateGuardian)(GraphicsEngine *engine, GraphicsPipe *pipe) :
|
|
|
|
|
|
|
|
_scissor_enabled = false;
|
|
_scissor_enabled = false;
|
|
|
_scissor_attrib_active = false;
|
|
_scissor_attrib_active = false;
|
|
|
|
|
+ _has_attrib_depth_range = false;
|
|
|
|
|
|
|
|
_white_texture = 0;
|
|
_white_texture = 0;
|
|
|
|
|
|
|
@@ -3337,6 +3338,7 @@ reset() {
|
|
|
_glDepthRangedNV(-1.0, 1.0);
|
|
_glDepthRangedNV(-1.0, 1.0);
|
|
|
_use_depth_zero_to_one = true;
|
|
_use_depth_zero_to_one = true;
|
|
|
_use_remapped_depth_range = true;
|
|
_use_remapped_depth_range = true;
|
|
|
|
|
+ _has_attrib_depth_range = false;
|
|
|
|
|
|
|
|
if (GLCAT.is_debug()) {
|
|
if (GLCAT.is_debug()) {
|
|
|
GLCAT.debug()
|
|
GLCAT.debug()
|
|
@@ -3352,6 +3354,17 @@ reset() {
|
|
|
}
|
|
}
|
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
|
|
+ if (_has_attrib_depth_range) {
|
|
|
|
|
+#ifdef OPENGLES
|
|
|
|
|
+ glDepthRangef(0.0f, 1.0f);
|
|
|
|
|
+#else
|
|
|
|
|
+ glDepthRange(0.0, 1.0);
|
|
|
|
|
+#endif
|
|
|
|
|
+ _depth_range_near = 0;
|
|
|
|
|
+ _depth_range_far = 1;
|
|
|
|
|
+ _has_attrib_depth_range = false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
// Set up all the enableddisabled flags to GL's known initial values:
|
|
// Set up all the enableddisabled flags to GL's known initial values:
|
|
|
// everything off.
|
|
// everything off.
|
|
|
_multisample_mode = 0;
|
|
_multisample_mode = 0;
|
|
@@ -3926,6 +3939,33 @@ prepare_display_region(DisplayRegionPipelineReader *dr) {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ PN_stdfloat near;
|
|
|
|
|
+ PN_stdfloat far;
|
|
|
|
|
+ dr->get_depth_range(near, far);
|
|
|
|
|
+#ifdef GSG_VERBOSE
|
|
|
|
|
+ if (GLCAT.is_spam()) {
|
|
|
|
|
+ GLCAT.spam()
|
|
|
|
|
+ << "glDepthRange(" << near << ", " << far << ")" << endl;
|
|
|
|
|
+ }
|
|
|
|
|
+#endif
|
|
|
|
|
+
|
|
|
|
|
+#ifdef OPENGLES
|
|
|
|
|
+ // OpenGL ES uses a single-precision call.
|
|
|
|
|
+ glDepthRangef((GLclampf)near, (GLclampf)far);
|
|
|
|
|
+#else
|
|
|
|
|
+ // Mainline OpenGL uses a double-precision call.
|
|
|
|
|
+ if (!_use_remapped_depth_range) {
|
|
|
|
|
+ glDepthRange((GLclampd)near, (GLclampd)far);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // If we have a remapped depth range, we should adjust the values to range
|
|
|
|
|
+ // from -1 to 1. We need to use an NV extension to pass unclamped values.
|
|
|
|
|
+ _glDepthRangedNV(near * 2.0 - 1.0, far * 2.0 - 1.0);
|
|
|
|
|
+ }
|
|
|
|
|
+#endif // OPENGLES
|
|
|
|
|
+ _has_attrib_depth_range = false;
|
|
|
|
|
+ _depth_range_near = near;
|
|
|
|
|
+ _depth_range_far = far;
|
|
|
|
|
+
|
|
|
report_my_gl_errors();
|
|
report_my_gl_errors();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -8151,24 +8191,35 @@ do_issue_depth_offset() {
|
|
|
|
|
|
|
|
PN_stdfloat min_value = target_depth_offset->get_min_value();
|
|
PN_stdfloat min_value = target_depth_offset->get_min_value();
|
|
|
PN_stdfloat max_value = target_depth_offset->get_max_value();
|
|
PN_stdfloat max_value = target_depth_offset->get_max_value();
|
|
|
|
|
+ if (min_value != (PN_stdfloat)0.0 ||
|
|
|
|
|
+ max_value != (PN_stdfloat)1.0 ||
|
|
|
|
|
+ _has_attrib_depth_range) {
|
|
|
|
|
+ min_value = _depth_range_far * min_value + _depth_range_near * (1 - min_value);
|
|
|
|
|
+ max_value = _depth_range_far * max_value + _depth_range_near * (1 - max_value);
|
|
|
|
|
+
|
|
|
#ifdef GSG_VERBOSE
|
|
#ifdef GSG_VERBOSE
|
|
|
- GLCAT.spam()
|
|
|
|
|
- << "glDepthRange(" << min_value << ", " << max_value << ")" << endl;
|
|
|
|
|
|
|
+ if (GLCAT.is_spam()) {
|
|
|
|
|
+ GLCAT.spam()
|
|
|
|
|
+ << "glDepthRange(" << min_value << ", " << max_value << ")" << endl;
|
|
|
|
|
+ }
|
|
|
#endif
|
|
#endif
|
|
|
#ifdef OPENGLES
|
|
#ifdef OPENGLES
|
|
|
- // OpenGL ES uses a single-precision call.
|
|
|
|
|
- glDepthRangef((GLclampf)min_value, (GLclampf)max_value);
|
|
|
|
|
|
|
+ // OpenGL ES uses a single-precision call.
|
|
|
|
|
+ glDepthRangef((GLclampf)min_value, (GLclampf)max_value);
|
|
|
#else
|
|
#else
|
|
|
- // Mainline OpenGL uses a double-precision call.
|
|
|
|
|
- if (!_use_remapped_depth_range) {
|
|
|
|
|
- glDepthRange((GLclampd)min_value, (GLclampd)max_value);
|
|
|
|
|
- } else {
|
|
|
|
|
- // If we have a remapped depth range, we should adjust the values to range
|
|
|
|
|
- // from -1 to 1. We need to use an NV extension to pass unclamped values.
|
|
|
|
|
- _glDepthRangedNV(min_value * 2.0 - 1.0, max_value * 2.0 - 1.0);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // Mainline OpenGL uses a double-precision call.
|
|
|
|
|
+ if (!_use_remapped_depth_range) {
|
|
|
|
|
+ glDepthRange((GLclampd)min_value, (GLclampd)max_value);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // If we have a remapped depth range, we should adjust the values to range
|
|
|
|
|
+ // from -1 to 1. We need to use an NV extension to pass unclamped values.
|
|
|
|
|
+ _glDepthRangedNV(min_value * 2.0 - 1.0, max_value * 2.0 - 1.0);
|
|
|
|
|
+ }
|
|
|
#endif // OPENGLES
|
|
#endif // OPENGLES
|
|
|
|
|
|
|
|
|
|
+ _has_attrib_depth_range = true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
report_my_gl_errors();
|
|
report_my_gl_errors();
|
|
|
}
|
|
}
|
|
|
|
|
|