[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