Re: [Mesa-dev] [PATCH v4 3/7] mesa: Add support for AMD_depth_clamp_separate

2018-08-23 Thread Marek Olšák
Looks good.

Marek

On Thu, Aug 23, 2018 at 11:16 PM, Sagar Ghuge  wrote:
> 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 
> Reviewed-by: Ian Romanick 
> Reviewed-by: Marek Olšák 
> ---
>  src/mesa/drivers/dri/i965/genX_state_upload.c | 11 ++--
>  src/mesa/main/attrib.c| 40 +++---
>  src/mesa/main/enable.c|  9 ++-
>  src/mesa/main/get.c   |  4 ++
>  src/mesa/main/get_hash_params.py  |  2 +-
>  src/mesa/main/mtypes.h|  1 -
>  src/mesa/main/rastpos.c   | 55 ---
>  src/mesa/state_tracker/st_atom_rasterizer.c   |  3 +-
>  src/mesa/state_tracker/st_cb_drawpixels.c |  3 +-
>  src/mesa/swrast/s_span.c  |  2 +-
>  src/mesa/tnl/t_vb_program.c   |  6 +-
>  src/mesa/tnl/t_vb_vertex.c|  8 ++-
>  12 files changed, 111 insertions(+), 33 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/genX_state_upload.c 
> b/src/mesa/drivers/dri/i965/genX_state_upload.c
> index c051848985..dc54cb67af 100644
> --- a/src/mesa/drivers/dri/i965/genX_state_upload.c
> +++ b/src/mesa/drivers/dri/i965/genX_state_upload.c
> @@ -1399,7 +1399,8 @@ genX(upload_clip_state)(struct brw_context *brw)
>clip.ScreenSpaceViewportYMax = 1;
>
>clip.ViewportXYClipTestEnable = true;
> -  clip.ViewportZClipTestEnable = !ctx->Transform.DepthClamp;
> +  clip.ViewportZClipTestEnable = !(ctx->Transform.DepthClampNear &&
> +   ctx->Transform.DepthClampFar);
>
>/* _NEW_TRANSFORM */
>if (GEN_GEN == 5 || GEN_IS_G4X) {
> @@ -1493,7 +1494,8 @@ genX(upload_clip_state)(struct brw_context *brw)
>clip.UserClipDistanceCullTestEnableBitmask =
>   brw_vue_prog_data(brw->vs.base.prog_data)->cull_distance_mask;
>
> -  clip.ViewportZClipTestEnable = !ctx->Transform.DepthClamp;
> +  clip.ViewportZClipTestEnable = !(ctx->Transform.DepthClampNear &&
> +   ctx->Transform.DepthClampFar);
>  #endif
>
>/* _NEW_LIGHT */
> @@ -2338,7 +2340,7 @@ genX(upload_cc_viewport)(struct brw_context *brw)
> for (unsigned i = 0; i < viewport_count; i++) {
>/* _NEW_VIEWPORT | _NEW_TRANSFORM */
>const struct gl_viewport_attrib *vp = >ViewportArray[i];
> -  if (ctx->Transform.DepthClamp) {
> +  if (ctx->Transform.DepthClampNear && ctx->Transform.DepthClampFar) {
>   ccv.MinimumDepth = MIN2(vp->Near, vp->Far);
>   ccv.MaximumDepth = MAX2(vp->Near, vp->Far);
>} else {
> @@ -4605,7 +4607,8 @@ genX(upload_raster)(struct brw_context *brw)
>raster.ScissorRectangleEnable = ctx->Scissor.EnableFlags;
>
>/* _NEW_TRANSFORM */
> -  if (!ctx->Transform.DepthClamp) {
> +  if (!(ctx->Transform.DepthClampNear &&
> +ctx->Transform.DepthClampFar)) {
>  #if GEN_GEN >= 9
>   raster.ViewportZFarClipTestEnable = true;
>   raster.ViewportZNearClipTestEnable = true;
> diff --git a/src/mesa/main/attrib.c b/src/mesa/main/attrib.c
> index cbe93ab6fa..a46fec73fd 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 
> 

[Mesa-dev] [PATCH v4 3/7] mesa: Add support for AMD_depth_clamp_separate

2018-08-23 Thread Sagar Ghuge
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 
Reviewed-by: Ian Romanick 
Reviewed-by: Marek Olšák 
---
 src/mesa/drivers/dri/i965/genX_state_upload.c | 11 ++--
 src/mesa/main/attrib.c| 40 +++---
 src/mesa/main/enable.c|  9 ++-
 src/mesa/main/get.c   |  4 ++
 src/mesa/main/get_hash_params.py  |  2 +-
 src/mesa/main/mtypes.h|  1 -
 src/mesa/main/rastpos.c   | 55 ---
 src/mesa/state_tracker/st_atom_rasterizer.c   |  3 +-
 src/mesa/state_tracker/st_cb_drawpixels.c |  3 +-
 src/mesa/swrast/s_span.c  |  2 +-
 src/mesa/tnl/t_vb_program.c   |  6 +-
 src/mesa/tnl/t_vb_vertex.c|  8 ++-
 12 files changed, 111 insertions(+), 33 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/genX_state_upload.c 
b/src/mesa/drivers/dri/i965/genX_state_upload.c
index c051848985..dc54cb67af 100644
--- a/src/mesa/drivers/dri/i965/genX_state_upload.c
+++ b/src/mesa/drivers/dri/i965/genX_state_upload.c
@@ -1399,7 +1399,8 @@ genX(upload_clip_state)(struct brw_context *brw)
   clip.ScreenSpaceViewportYMax = 1;
 
   clip.ViewportXYClipTestEnable = true;
-  clip.ViewportZClipTestEnable = !ctx->Transform.DepthClamp;
+  clip.ViewportZClipTestEnable = !(ctx->Transform.DepthClampNear &&
+   ctx->Transform.DepthClampFar);
 
   /* _NEW_TRANSFORM */
   if (GEN_GEN == 5 || GEN_IS_G4X) {
@@ -1493,7 +1494,8 @@ genX(upload_clip_state)(struct brw_context *brw)
   clip.UserClipDistanceCullTestEnableBitmask =
  brw_vue_prog_data(brw->vs.base.prog_data)->cull_distance_mask;
 
-  clip.ViewportZClipTestEnable = !ctx->Transform.DepthClamp;
+  clip.ViewportZClipTestEnable = !(ctx->Transform.DepthClampNear &&
+   ctx->Transform.DepthClampFar);
 #endif
 
   /* _NEW_LIGHT */
@@ -2338,7 +2340,7 @@ genX(upload_cc_viewport)(struct brw_context *brw)
for (unsigned i = 0; i < viewport_count; i++) {
   /* _NEW_VIEWPORT | _NEW_TRANSFORM */
   const struct gl_viewport_attrib *vp = >ViewportArray[i];
-  if (ctx->Transform.DepthClamp) {
+  if (ctx->Transform.DepthClampNear && ctx->Transform.DepthClampFar) {
  ccv.MinimumDepth = MIN2(vp->Near, vp->Far);
  ccv.MaximumDepth = MAX2(vp->Near, vp->Far);
   } else {
@@ -4605,7 +4607,8 @@ genX(upload_raster)(struct brw_context *brw)
   raster.ScissorRectangleEnable = ctx->Scissor.EnableFlags;
 
   /* _NEW_TRANSFORM */
-  if (!ctx->Transform.DepthClamp) {
+  if (!(ctx->Transform.DepthClampNear &&
+ctx->Transform.DepthClampFar)) {
 #if GEN_GEN >= 9
  raster.ViewportZFarClipTestEnable = true;
  raster.ViewportZNearClipTestEnable = true;
diff --git a/src/mesa/main/attrib.c b/src/mesa/main/attrib.c
index cbe93ab6fa..a46fec73fd 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,