[Mesa-dev] [PATCH] nvc0: make use of conservative depth info for forcing early z tests

Ilia Mirkin imirkin at alum.mit.edu
Sun Aug 23 13:33:35 PDT 2015


Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
---

Entirely untested as there are no piglit tests for this
functionality. Won't push until some appear, but wanted to get it out
there.

 .../drivers/nouveau/codegen/nv50_ir_driver.h       |  2 +-
 .../drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp  |  3 +++
 src/gallium/drivers/nouveau/nvc0/nvc0_program.c    |  2 +-
 src/gallium/drivers/nouveau/nvc0/nvc0_program.h    |  2 +-
 .../drivers/nouveau/nvc0/nvc0_shader_state.c       |  5 ----
 .../drivers/nouveau/nvc0/nvc0_state_validate.c     | 30 ++++++++++++++++++++--
 6 files changed, 34 insertions(+), 10 deletions(-)

diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_driver.h b/src/gallium/drivers/nouveau/codegen/nv50_ir_driver.h
index 2b9edcf..14acb60 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_driver.h
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_driver.h
@@ -140,7 +140,7 @@ struct nv50_ir_prog_info
       struct {
          unsigned numColourResults;
          bool writesDepth;
-         bool earlyFragTests;
+         bool depthLayout;
          bool separateFragData;
          bool usesDiscard;
       } fp;
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp
index f153674..dcfa4c4 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp
@@ -947,6 +947,9 @@ void Source::scanProperty(const struct tgsi_full_property *prop)
    case TGSI_PROPERTY_FS_COORD_PIXEL_CENTER:
       // we don't care
       break;
+   case TGSI_PROPERTY_FS_DEPTH_LAYOUT:
+      info->prop.fp.depthLayout = prop->u[0].Data;
+      break;
    case TGSI_PROPERTY_VS_PROHIBIT_UCPS:
       info->io.genUserClip = -1;
       break;
diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_program.c b/src/gallium/drivers/nouveau/nvc0/nvc0_program.c
index 12f1bb7..44d951b 100644
--- a/src/gallium/drivers/nouveau/nvc0/nvc0_program.c
+++ b/src/gallium/drivers/nouveau/nvc0/nvc0_program.c
@@ -452,7 +452,7 @@ nvc0_fp_gen_header(struct nvc0_program *fp, struct nv50_ir_prog_info *info)
          fp->hdr[18] |= info->out[i].mask << info->out[i].slot[0];
    }
 
-   fp->fp.early_z = info->prop.fp.earlyFragTests;
+   fp->fp.depth_layout = info->prop.fp.depthLayout;
 
    return 0;
 }
diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_program.h b/src/gallium/drivers/nouveau/nvc0/nvc0_program.h
index 390e0c7..fa14d68 100644
--- a/src/gallium/drivers/nouveau/nvc0/nvc0_program.h
+++ b/src/gallium/drivers/nouveau/nvc0/nvc0_program.h
@@ -44,7 +44,7 @@ struct nvc0_program {
       bool need_vertex_id;
    } vp;
    struct {
-      uint8_t early_z;
+      uint8_t depth_layout;
       uint8_t in_pos[PIPE_MAX_SHADER_INPUTS];
       uint8_t sample_interp;
    } fp;
diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_shader_state.c b/src/gallium/drivers/nouveau/nvc0/nvc0_shader_state.c
index 8f8ac2d..1c87714 100644
--- a/src/gallium/drivers/nouveau/nvc0/nvc0_shader_state.c
+++ b/src/gallium/drivers/nouveau/nvc0/nvc0_shader_state.c
@@ -113,11 +113,6 @@ nvc0_fragprog_validate(struct nvc0_context *nvc0)
          return;
    nvc0_program_update_context_state(nvc0, fp, 4);
 
-   if (fp->fp.early_z != nvc0->state.early_z_forced) {
-      nvc0->state.early_z_forced = fp->fp.early_z;
-      IMMED_NVC0(push, NVC0_3D(FORCE_EARLY_FRAGMENT_TESTS), fp->fp.early_z);
-   }
-
    BEGIN_NVC0(push, NVC0_3D(SP_SELECT(5)), 2);
    PUSH_DATA (push, 0x51);
    PUSH_DATA (push, fp->code_base);
diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c b/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c
index 47bd66d..609b3b8 100644
--- a/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c
+++ b/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c
@@ -517,25 +517,51 @@ nvc0_validate_global_residents(struct nvc0_context *nvc0,
    }
 }
 
+static bool
+nvc0_depth_layout_test_compatible(unsigned depth_layout, unsigned test)
+{
+   if (depth_layout && (test == PIPE_FUNC_ALWAYS || test == PIPE_FUNC_NEVER))
+      return true;
+   switch (depth_layout) {
+   case TGSI_FS_DEPTH_LAYOUT_UNCHANGED:
+      return true;
+   case TGSI_FS_DEPTH_LAYOUT_GREATER:
+      return test == PIPE_FUNC_GREATER || test == PIPE_FUNC_GEQUAL;
+   case TGSI_FS_DEPTH_LAYOUT_LESS:
+      return test == PIPE_FUNC_LESS || test == PIPE_FUNC_LEQUAL;
+   default:
+      return false;
+   }
+}
+
 static void
 nvc0_validate_derived_1(struct nvc0_context *nvc0)
 {
    struct nouveau_pushbuf *push = nvc0->base.pushbuf;
+   struct nvc0_program *fp = nvc0->fragprog;
    bool rasterizer_discard;
+   bool early_z = false;
 
    if (nvc0->rast && nvc0->rast->pipe.rasterizer_discard) {
       rasterizer_discard = true;
    } else {
       bool zs = nvc0->zsa &&
          (nvc0->zsa->pipe.depth.enabled || nvc0->zsa->pipe.stencil[0].enabled);
-      rasterizer_discard = !zs &&
-         (!nvc0->fragprog || !nvc0->fragprog->hdr[18]);
+      rasterizer_discard = !zs && (!fp || !fp->hdr[18]);
    }
 
    if (rasterizer_discard != nvc0->state.rasterizer_discard) {
       nvc0->state.rasterizer_discard = rasterizer_discard;
       IMMED_NVC0(push, NVC0_3D(RASTERIZE_ENABLE), !rasterizer_discard);
    }
+
+   if (fp && nvc0->zsa && nvc0->zsa->pipe.depth.enabled)
+      early_z = nvc0_depth_layout_test_compatible(
+         fp->fp.depth_layout, nvc0->zsa->pipe.depth.func);
+   if (early_z != nvc0->state.early_z_forced) {
+      nvc0->state.early_z_forced = early_z;
+      IMMED_NVC0(push, NVC0_3D(FORCE_EARLY_FRAGMENT_TESTS), early_z);
+   }
 }
 
 /* alpha test is disabled if there are no color RTs, so make sure we have at
-- 
2.4.6



More information about the mesa-dev mailing list