summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/dri/i965/gen8_sf_state.c
diff options
context:
space:
mode:
authorDamien Lespiau <damien.lespiau@intel.com>2013-02-27 15:05:25 +0000
committerKenneth Graunke <kenneth@whitecape.org>2014-11-03 15:32:34 -0800
commit48157b904a9a7a1b9a574945b43e201822402ce0 (patch)
tree3ff21ff8968b22fb7ca86ffc254b0cbe4c799bce /src/mesa/drivers/dri/i965/gen8_sf_state.c
parent2b7f73af9c9a7999d8024add8b416f95cfb6daae (diff)
downloadexternal_mesa3d-48157b904a9a7a1b9a574945b43e201822402ce0.zip
external_mesa3d-48157b904a9a7a1b9a574945b43e201822402ce0.tar.gz
external_mesa3d-48157b904a9a7a1b9a574945b43e201822402ce0.tar.bz2
i965/skl: Update 3DSTATE_SBE for Skylake.
This commands has seen the addition of 2 dwords that allow to specify which channels of which attributes need to be forwarded to the fragment shader. v2: Rebase forward a year (done by Ken). Signed-off-by: Damien Lespiau <damien.lespiau@intel.com> Signed-off-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Kristian Høgsberg <krh@bitplanet.net> Reviewed-by: Anuj Phogat <anuj.phogat@gmail.com>
Diffstat (limited to 'src/mesa/drivers/dri/i965/gen8_sf_state.c')
-rw-r--r--src/mesa/drivers/dri/i965/gen8_sf_state.c30
1 files changed, 28 insertions, 2 deletions
diff --git a/src/mesa/drivers/dri/i965/gen8_sf_state.c b/src/mesa/drivers/dri/i965/gen8_sf_state.c
index 555e6a8..0a15d9c 100644
--- a/src/mesa/drivers/dri/i965/gen8_sf_state.c
+++ b/src/mesa/drivers/dri/i965/gen8_sf_state.c
@@ -39,10 +39,13 @@ upload_sbe(struct brw_context *brw)
uint32_t urb_entry_read_length;
uint32_t point_sprite_enables;
uint32_t flat_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);
@@ -79,11 +82,34 @@ upload_sbe(struct brw_context *brw)
GEN8_SBE_FORCE_URB_ENTRY_READ_LENGTH |
GEN8_SBE_FORCE_URB_ENTRY_READ_OFFSET;
- BEGIN_BATCH(4);
- OUT_BATCH(_3DSTATE_SBE << 16 | (4 - 2));
+ 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->Base.InputsRead & BITFIELD64_BIT(attr)))
+ continue;
+
+ if (input_index < 16)
+ dw4 |= (GEN9_SBE_ACTIVE_COMPONENT_XYZW << (input_index << 1));
+ else
+ dw5 |= (GEN9_SBE_ACTIVE_COMPONENT_XYZW << (input_index << 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(flat_enables);
+ if (sbe_cmd_length >= 6) {
+ OUT_BATCH(dw4);
+ OUT_BATCH(dw5);
+ }
ADVANCE_BATCH();
BEGIN_BATCH(11);