aboutsummaryrefslogtreecommitdiffstats
path: root/src/mesa/main
diff options
context:
space:
mode:
authorSagar Ghuge <[email protected]>2018-07-27 14:55:57 -0700
committerAnuj Phogat <[email protected]>2018-08-28 12:57:27 -0700
commit5650d3997851007a4e4268a4fa4bd698db41e7dc (patch)
tree64317045968fff5a595dfa19e7275726d1b67487 /src/mesa/main
parent379949b967f88d27529a2a1a9706753600ce80ca (diff)
mesa: Add support for AMD_depth_clamp_separate
Enable _mesa_PushAttrib() and _mesa_PopAttrib() to handle GL_DEPTH_CLAMP_NEAR_AMD and GL_DEPTH_CLAMP_FAR_AMD tokens. Remove DepthClamp, because DepthClampNear + DepthClampFar replaces it, as suggested by Marek Olsak. Driver that enables AMD_depth_clamp_separate will only ever look at DepthClampNear and DepthClampFar, as suggested by Ian Romanick. v2: 1) Remove unnecessary parentheses (Marek Olsak) 2) if AMD_depth_clamp_separate is unsupported, TEST_AND_UPDATE GL_DEPTH_CLAMP only (Marek Olsak) 3) Clamp against near and far plane separately (Marek Olsak) 4) Clip point separately for near and far Z clipping plane (Marek Olsak) v3: Clamp raster position zw to the range [min(n,f), 0] for near plane and [0, max(n,f)] for far plane (Marek Olsak) v4: Use MIN2 and MAX2 instead of CLAMP (Marek Olsak) Signed-off-by: Sagar Ghuge <[email protected]> Reviewed-by: Ian Romanick <[email protected]> Reviewed-by: Marek Olšák <[email protected]>
Diffstat (limited to 'src/mesa/main')
-rw-r--r--src/mesa/main/attrib.c40
-rw-r--r--src/mesa/main/enable.c9
-rw-r--r--src/mesa/main/get.c4
-rw-r--r--src/mesa/main/get_hash_params.py2
-rw-r--r--src/mesa/main/mtypes.h1
-rw-r--r--src/mesa/main/rastpos.c55
6 files changed, 90 insertions, 21 deletions
diff --git a/src/mesa/main/attrib.c b/src/mesa/main/attrib.c
index cbe93ab6faa..a46fec73fdf 100644
--- a/src/mesa/main/attrib.c
+++ b/src/mesa/main/attrib.c
@@ -72,7 +72,8 @@ struct gl_enable_attrib
GLbitfield ClipPlanes;
GLboolean ColorMaterial;
GLboolean CullFace;
- GLboolean DepthClamp;
+ GLboolean DepthClampNear;
+ GLboolean DepthClampFar;
GLboolean DepthTest;
GLboolean Dither;
GLboolean Fog;
@@ -336,7 +337,8 @@ _mesa_PushAttrib(GLbitfield mask)
attr->ClipPlanes = ctx->Transform.ClipPlanesEnabled;
attr->ColorMaterial = ctx->Light.ColorMaterialEnabled;
attr->CullFace = ctx->Polygon.CullFlag;
- attr->DepthClamp = ctx->Transform.DepthClamp;
+ attr->DepthClampNear = ctx->Transform.DepthClampNear;
+ attr->DepthClampFar = ctx->Transform.DepthClampFar;
attr->DepthTest = ctx->Depth.Test;
attr->Dither = ctx->Color.DitherFlag;
attr->Fog = ctx->Fog.Enabled;
@@ -627,8 +629,18 @@ pop_enable_group(struct gl_context *ctx, const struct gl_enable_attrib *enable)
TEST_AND_UPDATE(ctx->Light.ColorMaterialEnabled, enable->ColorMaterial,
GL_COLOR_MATERIAL);
TEST_AND_UPDATE(ctx->Polygon.CullFlag, enable->CullFace, GL_CULL_FACE);
- TEST_AND_UPDATE(ctx->Transform.DepthClamp, enable->DepthClamp,
- GL_DEPTH_CLAMP);
+
+ if (!ctx->Extensions.AMD_depth_clamp_separate) {
+ TEST_AND_UPDATE(ctx->Transform.DepthClampNear && ctx->Transform.DepthClampFar,
+ enable->DepthClampNear && enable->DepthClampFar,
+ GL_DEPTH_CLAMP);
+ } else {
+ TEST_AND_UPDATE(ctx->Transform.DepthClampNear, enable->DepthClampNear,
+ GL_DEPTH_CLAMP_NEAR_AMD);
+ TEST_AND_UPDATE(ctx->Transform.DepthClampFar, enable->DepthClampFar,
+ GL_DEPTH_CLAMP_FAR_AMD);
+ }
+
TEST_AND_UPDATE(ctx->Depth.Test, enable->DepthTest, GL_DEPTH_TEST);
TEST_AND_UPDATE(ctx->Color.DitherFlag, enable->Dither, GL_DITHER);
TEST_AND_UPDATE(ctx->Fog.Enabled, enable->Fog, GL_FOG);
@@ -1433,9 +1445,23 @@ _mesa_PopAttrib(void)
if (xform->RescaleNormals != ctx->Transform.RescaleNormals)
_mesa_set_enable(ctx, GL_RESCALE_NORMAL_EXT,
ctx->Transform.RescaleNormals);
- if (xform->DepthClamp != ctx->Transform.DepthClamp)
- _mesa_set_enable(ctx, GL_DEPTH_CLAMP,
- ctx->Transform.DepthClamp);
+
+ if (!ctx->Extensions.AMD_depth_clamp_separate) {
+ if (xform->DepthClampNear != ctx->Transform.DepthClampNear &&
+ xform->DepthClampFar != ctx->Transform.DepthClampFar) {
+ _mesa_set_enable(ctx, GL_DEPTH_CLAMP,
+ ctx->Transform.DepthClampNear &&
+ ctx->Transform.DepthClampFar);
+ }
+ } else {
+ if (xform->DepthClampNear != ctx->Transform.DepthClampNear)
+ _mesa_set_enable(ctx, GL_DEPTH_CLAMP_NEAR_AMD,
+ ctx->Transform.DepthClampNear);
+ if (xform->DepthClampFar != ctx->Transform.DepthClampFar)
+ _mesa_set_enable(ctx, GL_DEPTH_CLAMP_FAR_AMD,
+ ctx->Transform.DepthClampFar);
+ }
+
if (ctx->Extensions.ARB_clip_control)
_mesa_ClipControl(xform->ClipOrigin, xform->ClipDepthMode);
}
diff --git a/src/mesa/main/enable.c b/src/mesa/main/enable.c
index d1b2f3a9625..30d275075d5 100644
--- a/src/mesa/main/enable.c
+++ b/src/mesa/main/enable.c
@@ -1007,12 +1007,14 @@ _mesa_set_enable(struct gl_context *ctx, GLenum cap, GLboolean state)
if (!_mesa_is_desktop_gl(ctx))
goto invalid_enum_error;
CHECK_EXTENSION(ARB_depth_clamp, cap);
- if (ctx->Transform.DepthClamp == state)
+ if (ctx->Transform.DepthClampNear == state &&
+ ctx->Transform.DepthClampFar == state)
return;
FLUSH_VERTICES(ctx, ctx->DriverFlags.NewDepthClamp ? 0 :
_NEW_TRANSFORM);
ctx->NewDriverState |= ctx->DriverFlags.NewDepthClamp;
- ctx->Transform.DepthClamp = state;
+ ctx->Transform.DepthClampNear = state;
+ ctx->Transform.DepthClampFar = state;
break;
case GL_FRAGMENT_SHADER_ATI:
@@ -1684,7 +1686,8 @@ _mesa_IsEnabled( GLenum cap )
if (!_mesa_is_desktop_gl(ctx))
goto invalid_enum_error;
CHECK_EXTENSION(ARB_depth_clamp);
- return ctx->Transform.DepthClamp;
+ return ctx->Transform.DepthClampNear ||
+ ctx->Transform.DepthClampFar;
case GL_FRAGMENT_SHADER_ATI:
if (ctx->API != API_OPENGL_COMPAT)
diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c
index f870b217db5..16625e92e25 100644
--- a/src/mesa/main/get.c
+++ b/src/mesa/main/get.c
@@ -698,6 +698,10 @@ find_custom_value(struct gl_context *ctx, const struct value_desc *d, union valu
v->value_int_4[3] = GET_COLORMASK_BIT(ctx->Color.ColorMask, 0, 3);
break;
+ case GL_DEPTH_CLAMP:
+ v->value_bool = ctx->Transform.DepthClampNear || ctx->Transform.DepthClampFar;
+ break;
+
case GL_EDGE_FLAG:
v->value_bool = ctx->Current.Attrib[VERT_ATTRIB_EDGEFLAG][0] == 1.0F;
break;
diff --git a/src/mesa/main/get_hash_params.py b/src/mesa/main/get_hash_params.py
index ed5328df7cb..87ed4bfaeac 100644
--- a/src/mesa/main/get_hash_params.py
+++ b/src/mesa/main/get_hash_params.py
@@ -903,7 +903,7 @@ descriptor=[
[ "DEPTH_BOUNDS_EXT", "CONTEXT_FLOAT2(Depth.BoundsMin), extra_EXT_depth_bounds_test" ],
# GL_ARB_depth_clamp
- [ "DEPTH_CLAMP", "CONTEXT_BOOL(Transform.DepthClamp), extra_ARB_depth_clamp" ],
+ [ "DEPTH_CLAMP", "LOC_CUSTOM, TYPE_BOOLEAN, 0, extra_ARB_depth_clamp" ],
# GL_ATI_fragment_shader
[ "FRAGMENT_SHADER_ATI", "CONTEXT_BOOL(ATIFragmentShader.Enabled), extra_ATI_fragment_shader" ],
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index e752046d1b8..5ce0b4b5847 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -1282,7 +1282,6 @@ struct gl_transform_attrib
GLboolean Normalize; /**< Normalize all normals? */
GLboolean RescaleNormals; /**< GL_EXT_rescale_normal */
GLboolean RasterPositionUnclipped; /**< GL_IBM_rasterpos_clip */
- GLboolean DepthClamp; /**< GL_ARB_depth_clamp */
GLboolean DepthClampNear; /**< GL_AMD_depth_clamp_separate */
GLboolean DepthClampFar; /**< GL_AMD_depth_clamp_separate */
/** GL_ARB_clip_control */
diff --git a/src/mesa/main/rastpos.c b/src/mesa/main/rastpos.c
index 1ca83c78b0a..0308003905b 100644
--- a/src/mesa/main/rastpos.c
+++ b/src/mesa/main/rastpos.c
@@ -61,16 +61,35 @@ viewclip_point_xy( const GLfloat v[] )
/**
- * Clip a point against the far/near Z clipping planes.
+ * Clip a point against the near Z clipping planes.
*
* \param v vertex vector describing the point to clip.
*
* \return zero if outside view volume, or one if inside.
*/
static GLuint
-viewclip_point_z( const GLfloat v[] )
+viewclip_point_near_z( const GLfloat v[] )
{
- if (v[2] > v[3] || v[2] < -v[3] ) {
+ if (v[2] < -v[3]) {
+ return 0;
+ }
+ else {
+ return 1;
+ }
+}
+
+
+/**
+ * Clip a point against the far Z clipping planes.
+ *
+ * \param v vertex vector describing the point to clip.
+ *
+ * \return zero if outside view volume, or one if inside.
+ */
+static GLuint
+viewclip_point_far_z( const GLfloat v[] )
+{
+ if (v[2] > v[3]) {
return 0;
}
else {
@@ -389,8 +408,14 @@ _mesa_RasterPos(struct gl_context *ctx, const GLfloat vObj[4])
TRANSFORM_POINT( clip, ctx->ProjectionMatrixStack.Top->m, eye );
/* clip to view volume. */
- if (!ctx->Transform.DepthClamp) {
- if (viewclip_point_z(clip) == 0) {
+ if (!ctx->Transform.DepthClampNear) {
+ if (viewclip_point_near_z(clip) == 0) {
+ ctx->Current.RasterPosValid = GL_FALSE;
+ return;
+ }
+ }
+ if (!ctx->Transform.DepthClampFar) {
+ if (viewclip_point_far_z(clip) == 0) {
ctx->Current.RasterPosValid = GL_FALSE;
return;
}
@@ -420,10 +445,22 @@ _mesa_RasterPos(struct gl_context *ctx, const GLfloat vObj[4])
ctx->Current.RasterPos[2] = ndc[2] * scale[2] + translate[2];
ctx->Current.RasterPos[3] = clip[3];
- if (ctx->Transform.DepthClamp) {
- ctx->Current.RasterPos[3] = CLAMP(ctx->Current.RasterPos[3],
- ctx->ViewportArray[0].Near,
- ctx->ViewportArray[0].Far);
+ if (ctx->Transform.DepthClampNear &&
+ ctx->Transform.DepthClampFar) {
+ ctx->Current.RasterPos[3] = CLAMP(ctx->Current.RasterPos[3],
+ ctx->ViewportArray[0].Near,
+ ctx->ViewportArray[0].Far);
+ } else {
+ /* Clamp against near and far plane separately */
+ if (ctx->Transform.DepthClampNear) {
+ ctx->Current.RasterPos[3] = MAX2(ctx->Current.RasterPos[3],
+ ctx->ViewportArray[0].Near);
+ }
+
+ if (ctx->Transform.DepthClampFar) {
+ ctx->Current.RasterPos[3] = MIN2(ctx->Current.RasterPos[3],
+ ctx->ViewportArray[0].Far);
+ }
}
/* compute raster distance */