[Mesa-dev] [PATCH v02 22/37] i965: Port Gen7+ 3DSTATE_SBE state to genxml.

Rafael Antognolli rafael.antognolli at intel.com
Mon Apr 24 22:19:17 UTC 2017


Emit 3DSTATE_SBE on Gen7+ using brw_batch_emit helper, that uses pack
structs from genxml.

v2:
   - Use ACTIVE_COMPONENT_XYZW from gen9.xml.

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/gen7_sf_state.c     | 109 +--------------
 src/mesa/drivers/dri/i965/gen8_sf_state.c     | 153 +-------------------
 src/mesa/drivers/dri/i965/genX_state_upload.c | 129 +++++++++++++++-
 5 files changed, 121 insertions(+), 274 deletions(-)
 delete mode 100644 src/mesa/drivers/dri/i965/gen7_sf_state.c
 delete mode 100644 src/mesa/drivers/dri/i965/gen8_sf_state.c

diff --git a/src/mesa/drivers/dri/i965/Makefile.sources b/src/mesa/drivers/dri/i965/Makefile.sources
index b085251..81759ed 100644
--- a/src/mesa/drivers/dri/i965/Makefile.sources
+++ b/src/mesa/drivers/dri/i965/Makefile.sources
@@ -97,7 +97,6 @@ i965_FILES = \
 	gen7_hs_state.c \
 	gen7_l3_state.c \
 	gen7_misc_state.c \
-	gen7_sf_state.c \
 	gen7_sol_state.c \
 	gen7_te_state.c \
 	gen7_urb.c \
@@ -113,7 +112,6 @@ i965_FILES = \
 	gen8_hs_state.c \
 	gen8_multisample_state.c \
 	gen8_ps_state.c \
-	gen8_sf_state.c \
 	gen8_sol_state.c \
 	gen8_surface_state.c \
 	gen8_viewport_state.c \
diff --git a/src/mesa/drivers/dri/i965/brw_state.h b/src/mesa/drivers/dri/i965/brw_state.h
index 594757c..bc68c2c 100644
--- a/src/mesa/drivers/dri/i965/brw_state.h
+++ b/src/mesa/drivers/dri/i965/brw_state.h
@@ -134,7 +134,6 @@ extern const struct brw_tracked_state gen7_hs_state;
 extern const struct brw_tracked_state gen7_l3_state;
 extern const struct brw_tracked_state gen7_ps_state;
 extern const struct brw_tracked_state gen7_push_constant_space;
-extern const struct brw_tracked_state gen7_sbe_state;
 extern const struct brw_tracked_state gen7_sf_clip_viewport;
 extern const struct brw_tracked_state gen7_sol_state;
 extern const struct brw_tracked_state gen7_te_state;
@@ -154,7 +153,6 @@ 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_state;
-extern const struct brw_tracked_state gen8_sbe_state;
 extern const struct brw_tracked_state gen8_sf_clip_viewport;
 extern const struct brw_tracked_state gen8_vertices;
 extern const struct brw_tracked_state gen8_vf_topology;
diff --git a/src/mesa/drivers/dri/i965/gen7_sf_state.c b/src/mesa/drivers/dri/i965/gen7_sf_state.c
deleted file mode 100644
index 7ab8a99..0000000
--- a/src/mesa/drivers/dri/i965/gen7_sf_state.c
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright © 2011 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 "brw_context.h"
-#include "brw_state.h"
-#include "brw_defines.h"
-#include "brw_util.h"
-#include "main/macros.h"
-#include "main/fbobject.h"
-#include "main/framebuffer.h"
-#include "intel_batchbuffer.h"
-
-static void
-upload_sbe_state(struct brw_context *brw)
-{
-   struct gl_context *ctx = &brw->ctx;
-   /* BRW_NEW_FS_PROG_DATA */
-   const struct brw_wm_prog_data *wm_prog_data =
-      brw_wm_prog_data(brw->wm.base.prog_data);
-   uint32_t num_outputs = wm_prog_data->num_varying_inputs;
-   uint32_t dw1;
-   uint32_t point_sprite_enables;
-   int i;
-   uint16_t attr_overrides[16];
-   /* _NEW_BUFFERS */
-   bool render_to_fbo = _mesa_is_user_fbo(ctx->DrawBuffer);
-   uint32_t point_sprite_origin;
-
-   /* FINISHME: Attribute Swizzle Control Mode? */
-   dw1 = GEN7_SBE_SWIZZLE_ENABLE | num_outputs << GEN7_SBE_NUM_OUTPUTS_SHIFT;
-
-   /* _NEW_POINT
-    *
-    * Window coordinates in an FBO are inverted, which means point
-    * sprite origin must be inverted.
-    */
-   if ((ctx->Point.SpriteOrigin == GL_LOWER_LEFT) != render_to_fbo) {
-      point_sprite_origin = GEN6_SF_POINT_SPRITE_LOWERLEFT;
-   } else {
-      point_sprite_origin = GEN6_SF_POINT_SPRITE_UPPERLEFT;
-   }
-   dw1 |= point_sprite_origin;
-
-   /* _NEW_POINT | _NEW_LIGHT | _NEW_PROGRAM,
-    * BRW_NEW_FS_PROG_DATA | BRW_NEW_FRAGMENT_PROGRAM |
-    * BRW_NEW_GS_PROG_DATA | BRW_NEW_PRIMITIVE | BRW_NEW_TES_PROG_DATA |
-    * BRW_NEW_VUE_MAP_GEOM_OUT
-    */
-   uint32_t urb_entry_read_length;
-   uint32_t urb_entry_read_offset;
-   calculate_attr_overrides(brw, attr_overrides, &point_sprite_enables,
-                            &urb_entry_read_length, &urb_entry_read_offset);
-   dw1 |= urb_entry_read_length << GEN7_SBE_URB_ENTRY_READ_LENGTH_SHIFT |
-          urb_entry_read_offset << GEN7_SBE_URB_ENTRY_READ_OFFSET_SHIFT;
-
-   BEGIN_BATCH(14);
-   OUT_BATCH(_3DSTATE_SBE << 16 | (14 - 2));
-   OUT_BATCH(dw1);
-
-   /* Output dwords 2 through 9 */
-   for (i = 0; i < 8; i++) {
-      OUT_BATCH(attr_overrides[i * 2] | attr_overrides[i * 2 + 1] << 16);
-   }
-
-   OUT_BATCH(point_sprite_enables); /* dw10 */
-   OUT_BATCH(wm_prog_data->flat_inputs);
-   OUT_BATCH(0); /* wrapshortest enables 0-7 */
-   OUT_BATCH(0); /* wrapshortest enables 8-15 */
-   ADVANCE_BATCH();
-}
-
-const struct brw_tracked_state gen7_sbe_state = {
-   .dirty = {
-      .mesa  = _NEW_BUFFERS |
-               _NEW_LIGHT |
-               _NEW_POINT |
-               _NEW_POLYGON |
-               _NEW_PROGRAM,
-      .brw   = BRW_NEW_BLORP |
-               BRW_NEW_CONTEXT |
-               BRW_NEW_FRAGMENT_PROGRAM |
-               BRW_NEW_FS_PROG_DATA |
-               BRW_NEW_GS_PROG_DATA |
-               BRW_NEW_TES_PROG_DATA |
-               BRW_NEW_PRIMITIVE |
-               BRW_NEW_VUE_MAP_GEOM_OUT,
-   },
-   .emit = upload_sbe_state,
-};
diff --git a/src/mesa/drivers/dri/i965/gen8_sf_state.c b/src/mesa/drivers/dri/i965/gen8_sf_state.c
deleted file mode 100644
index 3b1dd61..0000000
--- a/src/mesa/drivers/dri/i965/gen8_sf_state.c
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright © 2011 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 "compiler/nir/nir.h"
-#include "brw_context.h"
-#include "brw_state.h"
-#include "brw_defines.h"
-#include "brw_util.h"
-#include "main/macros.h"
-#include "main/fbobject.h"
-#include "intel_batchbuffer.h"
-
-static void
-upload_sbe(struct brw_context *brw)
-{
-   struct gl_context *ctx = &brw->ctx;
-   /* BRW_NEW_FS_PROG_DATA */
-   const struct brw_wm_prog_data *wm_prog_data =
-      brw_wm_prog_data(brw->wm.base.prog_data);
-   uint32_t num_outputs = wm_prog_data->num_varying_inputs;
-   uint16_t attr_overrides[VARYING_SLOT_MAX];
-   uint32_t urb_entry_read_length;
-   uint32_t urb_entry_read_offset;
-   uint32_t point_sprite_enables;
-   int sbe_cmd_length;
-
-   uint32_t dw1 =
-      GEN7_SBE_SWIZZLE_ENABLE |
-      num_outputs << GEN7_SBE_NUM_OUTPUTS_SHIFT;
-   uint32_t dw4 = 0;
-   uint32_t dw5 = 0;
-
-   /* _NEW_BUFFERS */
-   bool render_to_fbo = _mesa_is_user_fbo(ctx->DrawBuffer);
-
-   /* _NEW_POINT
-    *
-    * Window coordinates in an FBO are inverted, which means point
-    * sprite origin must be inverted.
-    */
-   if ((ctx->Point.SpriteOrigin == GL_LOWER_LEFT) != render_to_fbo)
-      dw1 |= GEN6_SF_POINT_SPRITE_LOWERLEFT;
-   else
-      dw1 |= GEN6_SF_POINT_SPRITE_UPPERLEFT;
-
-   /* _NEW_POINT | _NEW_LIGHT | _NEW_PROGRAM,
-    * BRW_NEW_FS_PROG_DATA | BRW_NEW_FRAGMENT_PROGRAM |
-    * BRW_NEW_GS_PROG_DATA | BRW_NEW_PRIMITIVE | BRW_NEW_TES_PROG_DATA |
-    * BRW_NEW_VUE_MAP_GEOM_OUT
-    */
-   calculate_attr_overrides(brw, attr_overrides,
-                            &point_sprite_enables,
-                            &urb_entry_read_length,
-                            &urb_entry_read_offset);
-
-   /* Typically, the URB entry read length and offset should be programmed in
-    * 3DSTATE_VS and 3DSTATE_GS; SBE inherits it from the last active stage
-    * which produces geometry.  However, we don't know the proper value until
-    * we call calculate_attr_overrides().
-    *
-    * To fit with our existing code, we override the inherited values and
-    * specify it here directly, as we did on previous generations.
-    */
-   dw1 |=
-      urb_entry_read_length << GEN7_SBE_URB_ENTRY_READ_LENGTH_SHIFT |
-      urb_entry_read_offset << GEN8_SBE_URB_ENTRY_READ_OFFSET_SHIFT |
-      GEN8_SBE_FORCE_URB_ENTRY_READ_LENGTH |
-      GEN8_SBE_FORCE_URB_ENTRY_READ_OFFSET;
-
-   if (brw->gen == 8) {
-      sbe_cmd_length = 4;
-   } else {
-      sbe_cmd_length = 6;
-
-      /* prepare the active component dwords */
-      int input_index = 0;
-      for (int attr = 0; attr < VARYING_SLOT_MAX; attr++) {
-         if (!(brw->fragment_program->info.inputs_read &
-               BITFIELD64_BIT(attr))) {
-            continue;
-         }
-
-         assert(input_index < 32);
-
-         if (input_index < 16)
-            dw4 |= (GEN9_SBE_ACTIVE_COMPONENT_XYZW << (input_index << 1));
-         else
-            dw5 |= (GEN9_SBE_ACTIVE_COMPONENT_XYZW << ((input_index - 16) << 1));
-
-         ++input_index;
-      }
-   }
-   BEGIN_BATCH(sbe_cmd_length);
-   OUT_BATCH(_3DSTATE_SBE << 16 | (sbe_cmd_length - 2));
-   OUT_BATCH(dw1);
-   OUT_BATCH(point_sprite_enables);
-   OUT_BATCH(wm_prog_data->flat_inputs);
-   if (sbe_cmd_length >= 6) {
-      OUT_BATCH(dw4);
-      OUT_BATCH(dw5);
-   }
-   ADVANCE_BATCH();
-
-   BEGIN_BATCH(11);
-   OUT_BATCH(_3DSTATE_SBE_SWIZ << 16 | (11 - 2));
-
-   /* Output DWords 1 through 8: */
-   for (int i = 0; i < 8; i++) {
-      OUT_BATCH(attr_overrides[i * 2] | attr_overrides[i * 2 + 1] << 16);
-   }
-
-   OUT_BATCH(0); /* wrapshortest enables 0-7 */
-   OUT_BATCH(0); /* wrapshortest enables 8-15 */
-   ADVANCE_BATCH();
-}
-
-const struct brw_tracked_state gen8_sbe_state = {
-   .dirty = {
-      .mesa  = _NEW_BUFFERS |
-               _NEW_LIGHT |
-               _NEW_POINT |
-               _NEW_POLYGON |
-               _NEW_PROGRAM,
-      .brw   = BRW_NEW_BLORP |
-               BRW_NEW_CONTEXT |
-               BRW_NEW_FRAGMENT_PROGRAM |
-               BRW_NEW_FS_PROG_DATA |
-               BRW_NEW_GS_PROG_DATA |
-               BRW_NEW_TES_PROG_DATA |
-               BRW_NEW_VUE_MAP_GEOM_OUT,
-   },
-   .emit = upload_sbe,
-};
diff --git a/src/mesa/drivers/dri/i965/genX_state_upload.c b/src/mesa/drivers/dri/i965/genX_state_upload.c
index 68b7c29..ec85ec1 100644
--- a/src/mesa/drivers/dri/i965/genX_state_upload.c
+++ b/src/mesa/drivers/dri/i965/genX_state_upload.c
@@ -112,7 +112,7 @@ __gen_combine_address(struct brw_context *brw, void *location,
         _brw_cmd_pack(cmd)(brw, (void *)_dst, &name),              \
         _dst = NULL)
 
-#if GEN_GEN == 6
+#if GEN_GEN >= 6
 /**
  * Determine the appropriate attribute override value to store into the
  * 3DSTATE_SF structure for a given fragment shader attribute.  The attribute
@@ -336,11 +336,6 @@ genX(calculate_attr_overrides)(const struct brw_context *brw,
     */
    *urb_entry_read_length = ALIGN(max_source_attr + 1, 2) / 2;
 }
-#endif
-
-/* ---------------------------------------------------------------------- */
-
-#if GEN_GEN >= 6
 
 /* ---------------------------------------------------------------------- */
 
@@ -769,6 +764,124 @@ static const struct brw_tracked_state genX(sf_state) = {
 
 /* ---------------------------------------------------------------------- */
 
+#if GEN_GEN >= 7
+static void
+genX(upload_sbe)(struct brw_context *brw)
+{
+   struct gl_context *ctx = &brw->ctx;
+   /* BRW_NEW_FS_PROG_DATA */
+   const struct brw_wm_prog_data *wm_prog_data =
+      brw_wm_prog_data(brw->wm.base.prog_data);
+   uint32_t num_outputs = wm_prog_data->num_varying_inputs;
+#if GEN_GEN >= 8
+   struct GENX(SF_OUTPUT_ATTRIBUTE_DETAIL) attr_overrides[16] = { { 0 } };
+#endif
+   uint32_t urb_entry_read_length;
+   uint32_t urb_entry_read_offset;
+   uint32_t point_sprite_enables;
+
+   brw_batch_emit(brw, GENX(3DSTATE_SBE), sbe) {
+      sbe.AttributeSwizzleEnable = true;
+      sbe.NumberofSFOutputAttributes = num_outputs;
+
+      /* _NEW_BUFFERS */
+      bool render_to_fbo = _mesa_is_user_fbo(ctx->DrawBuffer);
+
+      /* _NEW_POINT
+       *
+       * Window coordinates in an FBO are inverted, which means point
+       * sprite origin must be inverted.
+       */
+      if ((ctx->Point.SpriteOrigin == GL_LOWER_LEFT) != render_to_fbo)
+         sbe.PointSpriteTextureCoordinateOrigin = LOWERLEFT;
+      else
+         sbe.PointSpriteTextureCoordinateOrigin = UPPERLEFT;
+
+      /* _NEW_POINT | _NEW_LIGHT | _NEW_PROGRAM,
+       * BRW_NEW_FS_PROG_DATA | BRW_NEW_FRAGMENT_PROGRAM |
+       * BRW_NEW_GS_PROG_DATA | BRW_NEW_PRIMITIVE | BRW_NEW_TES_PROG_DATA |
+       * BRW_NEW_VUE_MAP_GEOM_OUT
+       */
+#if GEN_GEN < 8
+      genX(calculate_attr_overrides)(brw,
+                                     sbe.Attribute,
+                                     &point_sprite_enables,
+                                     &urb_entry_read_length,
+                                     &urb_entry_read_offset);
+#else
+      genX(calculate_attr_overrides)(brw,
+                                     attr_overrides,
+                                     &point_sprite_enables,
+                                     &urb_entry_read_length,
+                                     &urb_entry_read_offset);
+#endif
+
+      /* Typically, the URB entry read length and offset should be programmed
+       * in 3DSTATE_VS and 3DSTATE_GS; SBE inherits it from the last active
+       * stage which produces geometry.  However, we don't know the proper
+       * value until we call calculate_attr_overrides().
+       *
+       * To fit with our existing code, we override the inherited values and
+       * specify it here directly, as we did on previous generations.
+       */
+      sbe.VertexURBEntryReadLength = urb_entry_read_length;
+      sbe.VertexURBEntryReadOffset = urb_entry_read_offset;
+      sbe.PointSpriteTextureCoordinateEnable = point_sprite_enables;
+      sbe.ConstantInterpolationEnable = wm_prog_data->flat_inputs;
+
+#if GEN_GEN >= 8
+      sbe.ForceVertexURBEntryReadLength = true;
+      sbe.ForceVertexURBEntryReadOffset = true;
+#endif
+
+#if GEN_GEN >= 9
+      /* prepare the active component dwords */
+      int input_index = 0;
+      for (int attr = 0; attr < VARYING_SLOT_MAX; attr++) {
+         if (!(brw->fragment_program->info.inputs_read &
+               BITFIELD64_BIT(attr))) {
+            continue;
+         }
+
+         assert(input_index < 32);
+
+         sbe.AttributeActiveComponentFormat[input_index] = ACTIVE_COMPONENT_XYZW;
+         ++input_index;
+      }
+#endif
+   }
+
+#if GEN_GEN >= 8
+   brw_batch_emit(brw, GENX(3DSTATE_SBE_SWIZ), sbes) {
+      for (int i = 0; i < 16; i++)
+         sbes.Attribute[i] = attr_overrides[i];
+   }
+#endif
+}
+
+static const struct brw_tracked_state genX(sbe_state) = {
+   .dirty = {
+      .mesa  = _NEW_BUFFERS |
+               _NEW_LIGHT |
+               _NEW_POINT |
+               _NEW_POLYGON |
+               _NEW_PROGRAM,
+      .brw   = BRW_NEW_BLORP |
+               BRW_NEW_CONTEXT |
+               BRW_NEW_FRAGMENT_PROGRAM |
+               BRW_NEW_FS_PROG_DATA |
+               BRW_NEW_GS_PROG_DATA |
+               BRW_NEW_TES_PROG_DATA |
+               BRW_NEW_VUE_MAP_GEOM_OUT |
+               (GEN_GEN == 7 ? BRW_NEW_PRIMITIVE
+                             : 0),
+   },
+   .emit = genX(upload_sbe),
+};
+#endif
+
+/* ---------------------------------------------------------------------- */
+
 #if GEN_GEN >= 8
 static void
 genX(upload_raster)(struct brw_context *brw)
@@ -1086,7 +1199,7 @@ genX(init_atoms)(struct brw_context *brw)
       &gen7_gs_state,
       &gen7_sol_state,
       &genX(clip_state),
-      &gen7_sbe_state,
+      &genX(sbe_state),
       &genX(sf_state),
       &gen7_wm_state,
       &gen7_ps_state,
@@ -1174,7 +1287,7 @@ genX(init_atoms)(struct brw_context *brw)
       &gen7_sol_state,
       &genX(clip_state),
       &genX(raster_state),
-      &gen8_sbe_state,
+      &genX(sbe_state),
       &genX(sf_state),
       &gen8_ps_blend,
       &gen8_ps_extra,
-- 
git-series 0.9.1


More information about the mesa-dev mailing list