[Mesa-dev] [PATCH 07/35] i965: Port Gen6+ DEPTH_STENCIL state to genxml.

Rafael Antognolli rafael.antognolli at intel.com
Wed Apr 19 23:56:00 UTC 2017


From: Kenneth Graunke <kenneth at whitecape.org>

This emits 3DSTATE_WM_DEPTH_STENCIL on Gen8+ or DEPTH_STENCIL_STATE
(and the relevant pointer packets) on Gen6-7.5 from a single function.

Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
Signed-off-by: Rafael Antognolli <rafael.antognolli at intel.com>
---
 src/mesa/drivers/dri/i965/Makefile.sources        |   2 +-
 src/mesa/drivers/dri/i965/brw_state.h             |   2 +-
 src/mesa/drivers/dri/i965/gen6_depthstencil.c     | 114 +--------------
 src/mesa/drivers/dri/i965/gen8_wm_depth_stencil.c | 118 +---------------
 src/mesa/drivers/dri/i965/genX_state_upload.c     | 101 ++++++++++++-
 5 files changed, 97 insertions(+), 240 deletions(-)
 delete mode 100644 src/mesa/drivers/dri/i965/gen6_depthstencil.c
 delete mode 100644 src/mesa/drivers/dri/i965/gen8_wm_depth_stencil.c

diff --git a/src/mesa/drivers/dri/i965/Makefile.sources b/src/mesa/drivers/dri/i965/Makefile.sources
index bbb8d6d..1e0246a 100644
--- a/src/mesa/drivers/dri/i965/Makefile.sources
+++ b/src/mesa/drivers/dri/i965/Makefile.sources
@@ -82,7 +82,6 @@ i965_FILES = \
 	gen6_clip_state.c \
 	gen6_constant_state.c \
 	gen6_depth_state.c \
-	gen6_depthstencil.c \
 	gen6_gs_state.c \
 	gen6_multisample_state.c \
 	gen6_queryobj.c \
@@ -121,7 +120,6 @@ i965_FILES = \
 	gen8_surface_state.c \
 	gen8_viewport_state.c \
 	gen8_vs_state.c \
-	gen8_wm_depth_stencil.c \
 	hsw_queryobj.c \
 	hsw_sol.c \
 	intel_batchbuffer.c \
diff --git a/src/mesa/drivers/dri/i965/brw_state.h b/src/mesa/drivers/dri/i965/brw_state.h
index 008326a..d12dbc7 100644
--- a/src/mesa/drivers/dri/i965/brw_state.h
+++ b/src/mesa/drivers/dri/i965/brw_state.h
@@ -112,7 +112,6 @@ extern const struct brw_tracked_state gen6_blend_state;
 extern const struct brw_tracked_state gen6_clip_state;
 extern const struct brw_tracked_state gen6_sf_and_clip_viewports;
 extern const struct brw_tracked_state gen6_color_calc_state;
-extern const struct brw_tracked_state gen6_depth_stencil_state;
 extern const struct brw_tracked_state gen6_gs_state;
 extern const struct brw_tracked_state gen6_gs_push_constants;
 extern const struct brw_tracked_state gen6_gs_binding_table;
@@ -157,7 +156,6 @@ extern const struct brw_tracked_state gen8_pma_fix;
 extern const struct brw_tracked_state gen8_ps_blend;
 extern const struct brw_tracked_state gen8_ps_extra;
 extern const struct brw_tracked_state gen8_ps_state;
-extern const struct brw_tracked_state gen8_wm_depth_stencil;
 extern const struct brw_tracked_state gen8_wm_state;
 extern const struct brw_tracked_state gen8_raster_state;
 extern const struct brw_tracked_state gen8_sbe_state;
diff --git a/src/mesa/drivers/dri/i965/gen6_depthstencil.c b/src/mesa/drivers/dri/i965/gen6_depthstencil.c
deleted file mode 100644
index 0f9626c..0000000
--- a/src/mesa/drivers/dri/i965/gen6_depthstencil.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright © 2009 Intel Corporation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- *
- * Authors:
- *    Eric Anholt <eric at anholt.net>
- *
- */
-
-#include "intel_batchbuffer.h"
-#include "intel_fbo.h"
-#include "brw_context.h"
-#include "brw_defines.h"
-#include "brw_state.h"
-
-static void
-gen6_upload_depth_stencil_state(struct brw_context *brw)
-{
-   struct gl_context *ctx = &brw->ctx;
-   struct gen6_depth_stencil_state *ds;
-   struct intel_renderbuffer *depth_irb;
-
-   /* _NEW_BUFFERS */
-   depth_irb = intel_get_renderbuffer(ctx->DrawBuffer, BUFFER_DEPTH);
-
-   ds = brw_state_batch(brw, sizeof(*ds), 64,
-			&brw->cc.depth_stencil_state_offset);
-   memset(ds, 0, sizeof(*ds));
-
-   /* _NEW_STENCIL | _NEW_BUFFERS */
-   if (ctx->Stencil._Enabled) {
-      int back = ctx->Stencil._BackFace;
-
-      ds->ds0.stencil_enable = 1;
-      ds->ds0.stencil_func =
-	 intel_translate_compare_func(ctx->Stencil.Function[0]);
-      ds->ds0.stencil_fail_op =
-	 intel_translate_stencil_op(ctx->Stencil.FailFunc[0]);
-      ds->ds0.stencil_pass_depth_fail_op =
-	 intel_translate_stencil_op(ctx->Stencil.ZFailFunc[0]);
-      ds->ds0.stencil_pass_depth_pass_op =
-	 intel_translate_stencil_op(ctx->Stencil.ZPassFunc[0]);
-      ds->ds1.stencil_write_mask = ctx->Stencil.WriteMask[0];
-      ds->ds1.stencil_test_mask = ctx->Stencil.ValueMask[0];
-
-      if (ctx->Stencil._TestTwoSide) {
-	 ds->ds0.bf_stencil_enable = 1;
-	 ds->ds0.bf_stencil_func =
-	    intel_translate_compare_func(ctx->Stencil.Function[back]);
-	 ds->ds0.bf_stencil_fail_op =
-	    intel_translate_stencil_op(ctx->Stencil.FailFunc[back]);
-	 ds->ds0.bf_stencil_pass_depth_fail_op =
-	    intel_translate_stencil_op(ctx->Stencil.ZFailFunc[back]);
-	 ds->ds0.bf_stencil_pass_depth_pass_op =
-	    intel_translate_stencil_op(ctx->Stencil.ZPassFunc[back]);
-	 ds->ds1.bf_stencil_write_mask = ctx->Stencil.WriteMask[back];
-	 ds->ds1.bf_stencil_test_mask = ctx->Stencil.ValueMask[back];
-      }
-
-      ds->ds0.stencil_write_enable = ctx->Stencil._WriteEnabled;
-   }
-
-   /* _NEW_DEPTH */
-   if (ctx->Depth.Test && depth_irb) {
-      ds->ds2.depth_test_enable = ctx->Depth.Test;
-      ds->ds2.depth_test_func = intel_translate_compare_func(ctx->Depth.Func);
-      ds->ds2.depth_write_enable = brw_depth_writes_enabled(brw);
-   }
-
-   /* Point the GPU at the new indirect state. */
-   if (brw->gen == 6) {
-      BEGIN_BATCH(4);
-      OUT_BATCH(_3DSTATE_CC_STATE_POINTERS << 16 | (4 - 2));
-      OUT_BATCH(0);
-      OUT_BATCH(brw->cc.depth_stencil_state_offset | 1);
-      OUT_BATCH(0);
-      ADVANCE_BATCH();
-   } else {
-      BEGIN_BATCH(2);
-      OUT_BATCH(_3DSTATE_DEPTH_STENCIL_STATE_POINTERS << 16 | (2 - 2));
-      OUT_BATCH(brw->cc.depth_stencil_state_offset | 1);
-      ADVANCE_BATCH();
-   }
-}
-
-const struct brw_tracked_state gen6_depth_stencil_state = {
-   .dirty = {
-      .mesa = _NEW_BUFFERS |
-              _NEW_DEPTH |
-              _NEW_STENCIL,
-      .brw  = BRW_NEW_BATCH |
-              BRW_NEW_BLORP |
-              BRW_NEW_STATE_BASE_ADDRESS,
-   },
-   .emit = gen6_upload_depth_stencil_state,
-};
diff --git a/src/mesa/drivers/dri/i965/gen8_wm_depth_stencil.c b/src/mesa/drivers/dri/i965/gen8_wm_depth_stencil.c
deleted file mode 100644
index 9a6c9e0..0000000
--- a/src/mesa/drivers/dri/i965/gen8_wm_depth_stencil.c
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright © 2012 Intel Corporation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#include "intel_batchbuffer.h"
-#include "intel_fbo.h"
-#include "brw_context.h"
-#include "brw_defines.h"
-#include "brw_state.h"
-#include "main/stencil.h"
-
-static void
-gen8_upload_wm_depth_stencil(struct brw_context *brw)
-{
-   struct gl_context *ctx = &brw->ctx;
-   uint32_t dw1 = 0, dw2 = 0, dw3 = 0;
-
-   /* _NEW_BUFFERS */
-   struct intel_renderbuffer *depth_irb =
-      intel_get_renderbuffer(ctx->DrawBuffer, BUFFER_DEPTH);
-
-   struct gl_stencil_attrib *stencil = &ctx->Stencil;
-
-   /* _NEW_STENCIL | _NEW_BUFFERS */
-   if (stencil->_Enabled) {
-      #define FUNC intel_translate_compare_func
-      #define OP intel_translate_stencil_op
-
-      dw1 |=
-         GEN8_WM_DS_STENCIL_TEST_ENABLE |
-         FUNC(stencil->Function[0]) << GEN8_WM_DS_STENCIL_FUNC_SHIFT |
-         OP(stencil->FailFunc[0])  << GEN8_WM_DS_STENCIL_FAIL_OP_SHIFT |
-         OP(stencil->ZFailFunc[0]) << GEN8_WM_DS_Z_FAIL_OP_SHIFT |
-         OP(stencil->ZPassFunc[0]) << GEN8_WM_DS_Z_PASS_OP_SHIFT;
-
-      if (stencil->_WriteEnabled)
-         dw1 |= GEN8_WM_DS_STENCIL_BUFFER_WRITE_ENABLE;
-
-      dw2 |=
-         SET_FIELD(stencil->WriteMask[0] & 0xff, GEN8_WM_DS_STENCIL_WRITE_MASK) |
-         SET_FIELD(stencil->ValueMask[0] & 0xff, GEN8_WM_DS_STENCIL_TEST_MASK);
-
-      if (stencil->_TestTwoSide) {
-         const int b = stencil->_BackFace;
-
-         dw1 |=
-            GEN8_WM_DS_DOUBLE_SIDED_STENCIL_ENABLE |
-            FUNC(stencil->Function[b]) << GEN8_WM_DS_BF_STENCIL_FUNC_SHIFT |
-            OP(stencil->FailFunc[b]) << GEN8_WM_DS_BF_STENCIL_FAIL_OP_SHIFT |
-            OP(stencil->ZFailFunc[b]) << GEN8_WM_DS_BF_Z_FAIL_OP_SHIFT |
-            OP(stencil->ZPassFunc[b]) << GEN8_WM_DS_BF_Z_PASS_OP_SHIFT;
-
-         dw2 |= SET_FIELD(stencil->WriteMask[b] & 0xff,
-                          GEN8_WM_DS_BF_STENCIL_WRITE_MASK) |
-                SET_FIELD(stencil->ValueMask[b] & 0xff,
-                          GEN8_WM_DS_BF_STENCIL_TEST_MASK);
-      }
-
-      if (brw->gen >= 9) {
-         int stencil_ref  = _mesa_get_stencil_ref(ctx, 0);
-         int backface_ref = _mesa_get_stencil_ref(ctx, ctx->Stencil._BackFace);
-
-         dw3 = SET_FIELD(stencil_ref, GEN9_WM_DS_STENCIL_REF) |
-               SET_FIELD(backface_ref, GEN9_WM_DS_BF_STENCIL_REF);
-      }
-   }
-
-   /* _NEW_DEPTH */
-   if (ctx->Depth.Test && depth_irb) {
-      dw1 |=
-         GEN8_WM_DS_DEPTH_TEST_ENABLE |
-         FUNC(ctx->Depth.Func) << GEN8_WM_DS_DEPTH_FUNC_SHIFT;
-
-      if (brw_depth_writes_enabled(brw))
-         dw1 |= GEN8_WM_DS_DEPTH_BUFFER_WRITE_ENABLE;
-   }
-
-   int pkt_len = brw->gen >= 9 ? 4 : 3;
-
-   BEGIN_BATCH(pkt_len);
-   OUT_BATCH(_3DSTATE_WM_DEPTH_STENCIL << 16 | (pkt_len - 2));
-   OUT_BATCH(dw1);
-   OUT_BATCH(dw2);
-   if (pkt_len > 3) {
-      OUT_BATCH(dw3);
-   }
-   ADVANCE_BATCH();
-}
-
-const struct brw_tracked_state gen8_wm_depth_stencil = {
-   .dirty = {
-      .mesa = _NEW_BUFFERS |
-              _NEW_DEPTH |
-              _NEW_STENCIL,
-      .brw  = BRW_NEW_BLORP |
-              BRW_NEW_CONTEXT,
-   },
-   .emit = gen8_upload_wm_depth_stencil,
-};
diff --git a/src/mesa/drivers/dri/i965/genX_state_upload.c b/src/mesa/drivers/dri/i965/genX_state_upload.c
index 24f32ca..050a5f0 100644
--- a/src/mesa/drivers/dri/i965/genX_state_upload.c
+++ b/src/mesa/drivers/dri/i965/genX_state_upload.c
@@ -30,6 +30,9 @@
 #include "brw_state.h"
 
 #include "intel_batchbuffer.h"
+#include "intel_fbo.h"
+
+#include "main/stencil.h"
 
 UNUSED static void *
 emit_dwords(struct brw_context *brw, unsigned n)
@@ -98,9 +101,9 @@ __gen_combine_address(struct brw_context *brw, void *location,
       _dw + 1; /* Array starts at dw[1] */             \
    })
 
-#define brw_state_emit(brw, cmd, aub, align, offset, name)         \
+#define brw_state_emit(brw, cmd, align, offset, name)              \
    for (struct cmd name = { 0, },                                  \
-        *_dst = brw_state_batch(brw, aub,_brw_cmd_length(cmd) * 4, \
+        *_dst = brw_state_batch(brw, _brw_cmd_length(cmd) * 4,     \
                                 align, offset);                    \
         __builtin_expect(_dst != NULL, 1);                         \
         _brw_cmd_pack(cmd)(brw, (void *)_dst, &name),              \
@@ -108,6 +111,96 @@ __gen_combine_address(struct brw_context *brw, void *location,
 
 /* ---------------------------------------------------------------------- */
 
+static void
+genX(upload_depth_stencil_state)(struct brw_context *brw)
+{
+   struct gl_context *ctx = &brw->ctx;
+
+   /* _NEW_BUFFERS */
+   struct intel_renderbuffer *depth_irb =
+      intel_get_renderbuffer(ctx->DrawBuffer, BUFFER_DEPTH);
+
+   /* _NEW_DEPTH */
+   struct gl_depthbuffer_attrib *depth = &ctx->Depth;
+
+   /* _NEW_STENCIL */
+   struct gl_stencil_attrib *stencil = &ctx->Stencil;
+   const int b = stencil->_BackFace;
+
+#if GEN_GEN >= 8
+   brw_batch_emit(brw, GENX(3DSTATE_WM_DEPTH_STENCIL), wmds) {
+#else
+   uint32_t ds_offset;
+   brw_state_emit(brw, GENX(DEPTH_STENCIL_STATE), 64, &ds_offset, wmds) {
+#endif
+      if (depth->Test && depth_irb) {
+         wmds.DepthTestEnable = true;
+         wmds.DepthBufferWriteEnable = brw_depth_writes_enabled(brw);
+         wmds.DepthTestFunction = intel_translate_compare_func(depth->Func);
+      }
+
+      if (stencil->_Enabled) {
+         wmds.StencilTestEnable = true;
+         wmds.StencilWriteMask = stencil->WriteMask[0] & 0xff;
+         wmds.StencilTestMask = stencil->ValueMask[0] & 0xff;
+
+         wmds.StencilTestFunction =
+            intel_translate_compare_func(stencil->Function[0]);
+         wmds.StencilFailOp =
+            intel_translate_stencil_op(stencil->FailFunc[0]);
+         wmds.StencilPassDepthPassOp =
+            intel_translate_stencil_op(stencil->ZPassFunc[0]);
+         wmds.StencilPassDepthFailOp =
+            intel_translate_stencil_op(stencil->ZFailFunc[0]);
+
+         wmds.StencilBufferWriteEnable = stencil->_WriteEnabled;
+
+         if (stencil->_TestTwoSide) {
+            wmds.DoubleSidedStencilEnable = true;
+            wmds.BackfaceStencilWriteMask = stencil->WriteMask[b] & 0xff;
+            wmds.BackfaceStencilTestMask = stencil->ValueMask[b] & 0xff;
+
+            wmds.BackfaceStencilTestFunction =
+               intel_translate_compare_func(stencil->Function[b]);
+            wmds.BackfaceStencilFailOp =
+               intel_translate_stencil_op(stencil->FailFunc[b]);
+            wmds.BackfaceStencilPassDepthPassOp =
+               intel_translate_stencil_op(stencil->ZPassFunc[b]);
+            wmds.BackfaceStencilPassDepthFailOp =
+               intel_translate_stencil_op(stencil->ZFailFunc[b]);
+         }
+
+#if GEN_GEN >= 9
+         wmds.StencilReferenceValue = _mesa_get_stencil_ref(ctx, 0);
+         wmds.BackfaceStencilReferenceValue = _mesa_get_stencil_ref(ctx, b);
+#endif
+      }
+   }
+
+#if GEN_GEN == 6
+   brw_batch_emit(brw, GENX(3DSTATE_CC_STATE_POINTERS), ptr) {
+      ptr.PointertoDEPTH_STENCIL_STATE = ds_offset;
+      ptr.DEPTH_STENCIL_STATEChange = true;
+   }
+#elif GEN_GEN == 7
+   brw_batch_emit(brw, GENX(3DSTATE_DEPTH_STENCIL_STATE_POINTERS), ptr) {
+      ptr.PointertoDEPTH_STENCIL_STATE = ds_offset;
+   }
+#endif
+}
+
+static const struct brw_tracked_state genX(depth_stencil_state) = {
+   .dirty = {
+      .mesa = _NEW_BUFFERS |
+              _NEW_DEPTH |
+              _NEW_STENCIL,
+      .brw  = BRW_NEW_BLORP |
+              (GEN_GEN >= 8 ? BRW_NEW_CONTEXT
+                            : BRW_NEW_BLORP |
+                              BRW_NEW_STATE_BASE_ADDRESS),
+   },
+   .emit = genX(upload_depth_stencil_state),
+};
 
 /* ---------------------------------------------------------------------- */
 
@@ -192,7 +285,7 @@ genX(init_atoms)(struct brw_context *brw)
       &gen7_urb,
       &gen6_blend_state,		/* must do before cc unit */
       &gen6_color_calc_state,	/* must do before cc unit */
-      &gen6_depth_stencil_state,	/* must do before cc unit */
+      &genX(depth_stencil_state),	/* must do before cc unit */
 
       &brw_vs_image_surfaces, /* Before vs push/pull constants and binding table */
       &brw_tcs_image_surfaces, /* Before tcs push/pull constants and binding table */
@@ -340,7 +433,7 @@ genX(init_atoms)(struct brw_context *brw)
       &gen8_ps_blend,
       &gen8_ps_extra,
       &gen8_ps_state,
-      &gen8_wm_depth_stencil,
+      &genX(depth_stencil_state),
       &gen8_wm_state,
 
       &gen6_scissor_state,
-- 
git-series 0.9.1


More information about the mesa-dev mailing list