[Mesa-dev] [PATCH v03 24/38] i965: Remove calculate_attr_overrides.

Rafael Antognolli rafael.antognolli at intel.com
Tue May 2 01:43:12 UTC 2017


This function now lives inside genX_state_upload.c.

Signed-off-by: Rafael Antognolli <rafael.antognolli at intel.com>
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
---
 src/mesa/drivers/dri/i965/Makefile.sources |   1 +-
 src/mesa/drivers/dri/i965/brw_state.h      |   8 +-
 src/mesa/drivers/dri/i965/gen6_sf_state.c  | 265 +----------------------
 3 files changed, 274 deletions(-)
 delete mode 100644 src/mesa/drivers/dri/i965/gen6_sf_state.c

diff --git a/src/mesa/drivers/dri/i965/Makefile.sources b/src/mesa/drivers/dri/i965/Makefile.sources
index 81759ed..47680a7 100644
--- a/src/mesa/drivers/dri/i965/Makefile.sources
+++ b/src/mesa/drivers/dri/i965/Makefile.sources
@@ -85,7 +85,6 @@ i965_FILES = \
 	gen6_queryobj.c \
 	gen6_sampler_state.c \
 	gen6_scissor_state.c \
-	gen6_sf_state.c \
 	gen6_sol.c \
 	gen6_urb.c \
 	gen6_viewport_state.c \
diff --git a/src/mesa/drivers/dri/i965/brw_state.h b/src/mesa/drivers/dri/i965/brw_state.h
index bc68c2c..3df975a 100644
--- a/src/mesa/drivers/dri/i965/brw_state.h
+++ b/src/mesa/drivers/dri/i965/brw_state.h
@@ -339,14 +339,6 @@ gen6_upload_wm_state(struct brw_context *brw,
                      bool line_stipple_enable, bool polygon_stipple_enable,
                      bool statistic_enable);
 
-/* gen6_sf_state.c */
-void
-calculate_attr_overrides(const struct brw_context *brw,
-                         uint16_t *attr_overrides,
-                         uint32_t *point_sprite_enables,
-                         uint32_t *urb_entry_read_length,
-                         uint32_t *urb_entry_read_offset);
-
 /* gen6_surface_state.c */
 void gen6_init_vtable_surface_functions(struct brw_context *brw);
 
diff --git a/src/mesa/drivers/dri/i965/gen6_sf_state.c b/src/mesa/drivers/dri/i965/gen6_sf_state.c
deleted file mode 100644
index 45b5769..0000000
--- a/src/mesa/drivers/dri/i965/gen6_sf_state.c
+++ /dev/null
@@ -1,265 +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 "brw_context.h"
-#include "brw_state.h"
-#include "brw_defines.h"
-#include "brw_util.h"
-#include "compiler/nir/nir.h"
-#include "main/macros.h"
-#include "main/fbobject.h"
-#include "main/framebuffer.h"
-#include "intel_batchbuffer.h"
-
-/**
- * Determine the appropriate attribute override value to store into the
- * 3DSTATE_SF structure for a given fragment shader attribute.  The attribute
- * override value contains two pieces of information: the location of the
- * attribute in the VUE (relative to urb_entry_read_offset, see below), and a
- * flag indicating whether to "swizzle" the attribute based on the direction
- * the triangle is facing.
- *
- * If an attribute is "swizzled", then the given VUE location is used for
- * front-facing triangles, and the VUE location that immediately follows is
- * used for back-facing triangles.  We use this to implement the mapping from
- * gl_FrontColor/gl_BackColor to gl_Color.
- *
- * urb_entry_read_offset is the offset into the VUE at which the SF unit is
- * being instructed to begin reading attribute data.  It can be set to a
- * nonzero value to prevent the SF unit from wasting time reading elements of
- * the VUE that are not needed by the fragment shader.  It is measured in
- * 256-bit increments.
- */
-static uint32_t
-get_attr_override(const struct brw_vue_map *vue_map, int urb_entry_read_offset,
-                  int fs_attr, bool two_side_color, uint32_t *max_source_attr)
-{
-   /* Find the VUE slot for this attribute. */
-   int slot = vue_map->varying_to_slot[fs_attr];
-
-   /* Viewport and Layer are stored in the VUE header.  We need to override
-    * them to zero if earlier stages didn't write them, as GL requires that
-    * they read back as zero when not explicitly set.
-    */
-   if (fs_attr == VARYING_SLOT_VIEWPORT || fs_attr == VARYING_SLOT_LAYER) {
-      unsigned override =
-         ATTRIBUTE_0_OVERRIDE_X | ATTRIBUTE_0_OVERRIDE_W |
-         ATTRIBUTE_CONST_0000 << ATTRIBUTE_0_CONST_SOURCE_SHIFT;
-
-      if (!(vue_map->slots_valid & VARYING_BIT_LAYER))
-         override |= ATTRIBUTE_0_OVERRIDE_Y;
-      if (!(vue_map->slots_valid & VARYING_BIT_VIEWPORT))
-         override |= ATTRIBUTE_0_OVERRIDE_Z;
-
-      return override;
-   }
-
-   /* If there was only a back color written but not front, use back
-    * as the color instead of undefined
-    */
-   if (slot == -1 && fs_attr == VARYING_SLOT_COL0)
-      slot = vue_map->varying_to_slot[VARYING_SLOT_BFC0];
-   if (slot == -1 && fs_attr == VARYING_SLOT_COL1)
-      slot = vue_map->varying_to_slot[VARYING_SLOT_BFC1];
-
-   if (slot == -1) {
-      /* This attribute does not exist in the VUE--that means that the vertex
-       * shader did not write to it.  This means that either:
-       *
-       * (a) This attribute is a texture coordinate, and it is going to be
-       * replaced with point coordinates (as a consequence of a call to
-       * glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE)), so the
-       * hardware will ignore whatever attribute override we supply.
-       *
-       * (b) This attribute is read by the fragment shader but not written by
-       * the vertex shader, so its value is undefined.  Therefore the
-       * attribute override we supply doesn't matter.
-       *
-       * (c) This attribute is gl_PrimitiveID, and it wasn't written by the
-       * previous shader stage.
-       *
-       * Note that we don't have to worry about the cases where the attribute
-       * is gl_PointCoord or is undergoing point sprite coordinate
-       * replacement, because in those cases, this function isn't called.
-       *
-       * In case (c), we need to program the attribute overrides so that the
-       * primitive ID will be stored in this slot.  In every other case, the
-       * attribute override we supply doesn't matter.  So just go ahead and
-       * program primitive ID in every case.
-       */
-      return (ATTRIBUTE_0_OVERRIDE_W |
-              ATTRIBUTE_0_OVERRIDE_Z |
-              ATTRIBUTE_0_OVERRIDE_Y |
-              ATTRIBUTE_0_OVERRIDE_X |
-              (ATTRIBUTE_CONST_PRIM_ID << ATTRIBUTE_0_CONST_SOURCE_SHIFT));
-   }
-
-   /* Compute the location of the attribute relative to urb_entry_read_offset.
-    * Each increment of urb_entry_read_offset represents a 256-bit value, so
-    * it counts for two 128-bit VUE slots.
-    */
-   int source_attr = slot - 2 * urb_entry_read_offset;
-   assert(source_attr >= 0 && source_attr < 32);
-
-   /* If we are doing two-sided color, and the VUE slot following this one
-    * represents a back-facing color, then we need to instruct the SF unit to
-    * do back-facing swizzling.
-    */
-   bool swizzling = two_side_color &&
-      ((vue_map->slot_to_varying[slot] == VARYING_SLOT_COL0 &&
-        vue_map->slot_to_varying[slot+1] == VARYING_SLOT_BFC0) ||
-       (vue_map->slot_to_varying[slot] == VARYING_SLOT_COL1 &&
-        vue_map->slot_to_varying[slot+1] == VARYING_SLOT_BFC1));
-
-   /* Update max_source_attr.  If swizzling, the SF will read this slot + 1. */
-   if (*max_source_attr < source_attr + swizzling)
-      *max_source_attr = source_attr + swizzling;
-
-   if (swizzling) {
-      return source_attr |
-         (ATTRIBUTE_SWIZZLE_INPUTATTR_FACING << ATTRIBUTE_SWIZZLE_SHIFT);
-   }
-
-   return source_attr;
-}
-
-
-/**
- * Create the mapping from the FS inputs we produce to the previous pipeline
- * stage (GS or VS) outputs they source from.
- */
-void
-calculate_attr_overrides(const struct brw_context *brw,
-                         uint16_t *attr_overrides,
-                         uint32_t *point_sprite_enables,
-                         uint32_t *urb_entry_read_length,
-                         uint32_t *urb_entry_read_offset)
-{
-   /* 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 max_source_attr = 0;
-
-   *point_sprite_enables = 0;
-
-   *urb_entry_read_offset = BRW_SF_URB_ENTRY_READ_OFFSET;
-
-   /* BRW_NEW_FRAGMENT_PROGRAM
-    *
-    * If the fragment shader reads VARYING_SLOT_LAYER, then we need to pass in
-    * the full vertex header.  Otherwise, we can program the SF to start
-    * reading at an offset of 1 (2 varying slots) to skip unnecessary data:
-    * - VARYING_SLOT_PSIZ and BRW_VARYING_SLOT_NDC on gen4-5
-    * - VARYING_SLOT_{PSIZ,LAYER} and VARYING_SLOT_POS on gen6+
-    */
-
-   bool fs_needs_vue_header = brw->fragment_program->info.inputs_read &
-      (VARYING_BIT_LAYER | VARYING_BIT_VIEWPORT);
-
-   *urb_entry_read_offset = fs_needs_vue_header ? 0 : 1;
-
-   /* From the Ivybridge PRM, Vol 2 Part 1, 3DSTATE_SBE,
-    * description of dw10 Point Sprite Texture Coordinate Enable:
-    *
-    * "This field must be programmed to zero when non-point primitives
-    * are rendered."
-    *
-    * The SandyBridge PRM doesn't explicitly say that point sprite enables
-    * must be programmed to zero when rendering non-point primitives, but
-    * the IvyBridge PRM does, and if we don't, we get garbage.
-    *
-    * This is not required on Haswell, as the hardware ignores this state
-    * when drawing non-points -- although we do still need to be careful to
-    * correctly set the attr overrides.
-    *
-    * _NEW_POLYGON
-    * BRW_NEW_PRIMITIVE | BRW_NEW_GS_PROG_DATA | BRW_NEW_TES_PROG_DATA
-    */
-   bool drawing_points = brw_is_drawing_points(brw);
-
-   /* Initialize all the attr_overrides to 0.  In the loop below we'll modify
-    * just the ones that correspond to inputs used by the fs.
-    */
-   memset(attr_overrides, 0, 16*sizeof(*attr_overrides));
-
-   for (int attr = 0; attr < VARYING_SLOT_MAX; attr++) {
-      int input_index = wm_prog_data->urb_setup[attr];
-
-      if (input_index < 0)
-	 continue;
-
-      /* _NEW_POINT */
-      bool point_sprite = false;
-      if (drawing_points) {
-         if (brw->ctx.Point.PointSprite &&
-             (attr >= VARYING_SLOT_TEX0 && attr <= VARYING_SLOT_TEX7) &&
-             (brw->ctx.Point.CoordReplace & (1u << (attr - VARYING_SLOT_TEX0)))) {
-            point_sprite = true;
-         }
-
-         if (attr == VARYING_SLOT_PNTC)
-            point_sprite = true;
-
-         if (point_sprite)
-            *point_sprite_enables |= (1 << input_index);
-      }
-
-      /* BRW_NEW_VUE_MAP_GEOM_OUT | _NEW_LIGHT | _NEW_PROGRAM */
-      uint16_t attr_override = point_sprite ? 0 :
-         get_attr_override(&brw->vue_map_geom_out,
-			   *urb_entry_read_offset, attr,
-                           brw->ctx.VertexProgram._TwoSideEnabled,
-                           &max_source_attr);
-
-      /* The hardware can only do the overrides on 16 overrides at a
-       * time, and the other up to 16 have to be lined up so that the
-       * input index = the output index.  We'll need to do some
-       * tweaking to make sure that's the case.
-       */
-      if (input_index < 16)
-         attr_overrides[input_index] = attr_override;
-      else
-         assert(attr_override == input_index);
-   }
-
-   /* From the Sandy Bridge PRM, Volume 2, Part 1, documentation for
-    * 3DSTATE_SF DWord 1 bits 15:11, "Vertex URB Entry Read Length":
-    *
-    * "This field should be set to the minimum length required to read the
-    *  maximum source attribute.  The maximum source attribute is indicated
-    *  by the maximum value of the enabled Attribute # Source Attribute if
-    *  Attribute Swizzle Enable is set, Number of Output Attributes-1 if
-    *  enable is not set.
-    *  read_length = ceiling((max_source_attr + 1) / 2)
-    *
-    *  [errata] Corruption/Hang possible if length programmed larger than
-    *  recommended"
-    *
-    * Similar text exists for Ivy Bridge.
-    */
-   *urb_entry_read_length = ALIGN(max_source_attr + 1, 2) / 2;
-}
-- 
git-series 0.9.1


More information about the mesa-dev mailing list