[Mesa-dev] [v2 35/39] i965/gen8+: Prepare depth state emission for isl based miptrees

Topi Pohjolainen topi.pohjolainen at gmail.com
Wed May 3 09:22:48 UTC 2017


Also drops unnecessary check for stencil_mt when setting qpitch -
that is inside stencil_mt guarded block already.

Signed-off-by: Topi Pohjolainen <topi.pohjolainen at intel.com>
---
 src/mesa/drivers/dri/i965/gen8_depth_state.c | 38 +++++++++++++++++++++++-----
 1 file changed, 31 insertions(+), 7 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/gen8_depth_state.c b/src/mesa/drivers/dri/i965/gen8_depth_state.c
index 8210e7c..c06d13c 100644
--- a/src/mesa/drivers/dri/i965/gen8_depth_state.c
+++ b/src/mesa/drivers/dri/i965/gen8_depth_state.c
@@ -51,6 +51,8 @@ emit_depth_packets(struct brw_context *brw,
                    uint32_t min_array_element)
 {
    uint32_t mocs_wb = brw->gen >= 9 ? SKL_MOCS_WB : BDW_MOCS_WB;
+   unsigned depth_pitch = 0 + 1;
+   unsigned depth_qpitch = 0;
 
    /* Skip repeated NULL depth/stencil emits (think 2D rendering). */
    if (!depth_mt && !stencil_mt && brw->no_depth_or_stencil) {
@@ -60,6 +62,14 @@ emit_depth_packets(struct brw_context *brw,
 
    brw_emit_depth_stall_flushes(brw);
 
+   if (depth_mt && depth_mt->surf.size > 0) {
+      depth_pitch = depth_mt->surf.row_pitch;
+      depth_qpitch = depth_mt->surf.array_pitch_el_rows;
+   } else if (depth_mt) {
+      depth_pitch = depth_mt->pitch;
+      depth_qpitch = depth_mt->qpitch;
+   }
+
    /* _NEW_BUFFERS, _NEW_DEPTH, _NEW_STENCIL */
    BEGIN_BATCH(8);
    OUT_BATCH(GEN7_3DSTATE_DEPTH_BUFFER << 16 | (8 - 2));
@@ -68,7 +78,7 @@ emit_depth_packets(struct brw_context *brw,
              (stencil_mt != NULL && stencil_writable) << 27 |
              (hiz ? 1 : 0) << 22 |
              depthbuffer_format << 18 |
-             (depth_mt ? depth_mt->pitch - 1 : 0));
+             (depth_pitch - 1));
    if (depth_mt) {
       OUT_RELOC64(depth_mt->bo,
                   I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, 0);
@@ -79,7 +89,7 @@ emit_depth_packets(struct brw_context *brw,
    OUT_BATCH(((width - 1) << 4) | ((height - 1) << 18) | lod);
    OUT_BATCH(((depth - 1) << 21) | (min_array_element << 10) | mocs_wb);
    OUT_BATCH(0);
-   OUT_BATCH(((depth - 1) << 21) | (depth_mt ? depth_mt->qpitch >> 2 : 0));
+   OUT_BATCH(((depth - 1) << 21) | (depth_qpitch >> 2));
    ADVANCE_BATCH();
 
    if (!hiz) {
@@ -113,6 +123,17 @@ emit_depth_packets(struct brw_context *brw,
       if (intel_miptree_wants_r8_stencil(brw))
          stencil_mt->r8stencil_needs_update = true;
 
+      unsigned stencil_pitch = 0 + 1;
+      unsigned stencil_qpitch = 0;
+
+      if (stencil_mt->surf.size > 0) {
+         stencil_pitch = stencil_mt->surf.row_pitch;
+         stencil_qpitch = stencil_mt->surf.array_pitch_el_rows;
+      } else {
+         stencil_pitch = 2 * stencil_mt->pitch;
+         stencil_qpitch = stencil_mt->qpitch;
+      }
+
       BEGIN_BATCH(5);
       OUT_BATCH(GEN7_3DSTATE_STENCIL_BUFFER << 16 | (5 - 2));
       /* The stencil buffer has quirky pitch requirements.  From the Graphics
@@ -129,11 +150,10 @@ emit_depth_packets(struct brw_context *brw,
        * page (which would imply that it does).  Experiments with the hardware
        * indicate that it does.
        */
-      OUT_BATCH(HSW_STENCIL_ENABLED | mocs_wb << 22 |
-                (2 * stencil_mt->pitch - 1));
+      OUT_BATCH(HSW_STENCIL_ENABLED | mocs_wb << 22 | (stencil_pitch - 1));
       OUT_RELOC64(stencil_mt->bo,
                   I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, 0);
-      OUT_BATCH(stencil_mt ? stencil_mt->qpitch >> 2 : 0);
+      OUT_BATCH(stencil_qpitch >> 2);
       ADVANCE_BATCH();
    }
 
@@ -193,7 +213,8 @@ gen8_emit_depth_stencil_hiz(struct brw_context *brw,
       break;
    case GL_TEXTURE_3D:
       assert(mt);
-      depth = MAX2(mt->logical_depth0, 1);
+      depth = mt->surf.size > 0 ? mt->surf.logical_level0_px.depth :
+                                  MAX2(mt->logical_depth0, 1);
       surftype = translate_tex_target(gl_target);
       break;
    case GL_TEXTURE_1D_ARRAY:
@@ -216,7 +237,10 @@ gen8_emit_depth_stencil_hiz(struct brw_context *brw,
 
    lod = irb ? irb->mt_level - irb->mt->first_level : 0;
 
-   if (mt) {
+   if (mt && mt->surf.size > 0) {
+      width = mt->surf.logical_level0_px.width;
+      height = mt->surf.logical_level0_px.height;
+   } else if (mt) {
       width = mt->logical_width0;
       height = mt->logical_height0;
    }
-- 
2.9.3



More information about the mesa-dev mailing list