diff options
author | Eric Anholt <eric@anholt.net> | 2014-03-06 16:29:39 -0800 |
---|---|---|
committer | Kenneth Graunke <kenneth@whitecape.org> | 2014-03-10 13:05:12 -0700 |
commit | 30259856a8a82a55c030df1ad052e505c61144bc (patch) | |
tree | d72186d89875a26bf38352227107c4330da3c680 /src/mesa/drivers/dri/i965/brw_binding_tables.c | |
parent | db26253a482a721d8ae93cc306e3c6ce070c06cf (diff) | |
download | external_mesa3d-30259856a8a82a55c030df1ad052e505c61144bc.zip external_mesa3d-30259856a8a82a55c030df1ad052e505c61144bc.tar.gz external_mesa3d-30259856a8a82a55c030df1ad052e505c61144bc.tar.bz2 |
i965: Move binding table update packets to binding table setup time.
This keeps us from needing to reemit all the other stage state just
because a surface changed.
Improves unoptimized glamor x11perf -f8text by 1.10201% +/- 0.489869%
(n=296). [v1]
v2:
- Drop binding table packets from Gen8 unit state as well.
- Pass _3DSTATE_BINDING_TABLE_POINTERS_XS to brw_upload_binding_table,
cutting even more code.
v3: Don't forget to drop them from 3DSTATE_GS (botched refactor in v2).
Signed-off-by: Eric Anholt <eric@anholt.net> [v1]
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> [v1]
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org> [v2, v3]
Reviewed-by: Eric Anholt <eric@anholt.net> [v3]
Diffstat (limited to 'src/mesa/drivers/dri/i965/brw_binding_tables.c')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_binding_tables.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_binding_tables.c b/src/mesa/drivers/dri/i965/brw_binding_tables.c index 0de5d1a..1cd4bba 100644 --- a/src/mesa/drivers/dri/i965/brw_binding_tables.c +++ b/src/mesa/drivers/dri/i965/brw_binding_tables.c @@ -52,6 +52,7 @@ */ static void brw_upload_binding_table(struct brw_context *brw, + uint32_t packet_name, GLbitfield brw_new_binding_table, struct brw_stage_state *stage_state) { @@ -82,6 +83,13 @@ brw_upload_binding_table(struct brw_context *brw, } brw->state.dirty.brw |= brw_new_binding_table; + + if (brw->gen >= 7) { + BEGIN_BATCH(2); + OUT_BATCH(packet_name << 16 | (2 - 2)); + OUT_BATCH(stage_state->bind_bo_offset); + ADVANCE_BATCH(); + } } /** @@ -93,7 +101,9 @@ brw_upload_binding_table(struct brw_context *brw, static void brw_vs_upload_binding_table(struct brw_context *brw) { - brw_upload_binding_table(brw, BRW_NEW_VS_BINDING_TABLE, &brw->vs.base); + brw_upload_binding_table(brw, + _3DSTATE_BINDING_TABLE_POINTERS_VS, + BRW_NEW_VS_BINDING_TABLE, &brw->vs.base); } const struct brw_tracked_state brw_vs_binding_table = { @@ -112,7 +122,9 @@ const struct brw_tracked_state brw_vs_binding_table = { static void brw_upload_wm_binding_table(struct brw_context *brw) { - brw_upload_binding_table(brw, BRW_NEW_PS_BINDING_TABLE, &brw->wm.base); + brw_upload_binding_table(brw, + _3DSTATE_BINDING_TABLE_POINTERS_PS, + BRW_NEW_PS_BINDING_TABLE, &brw->wm.base); } const struct brw_tracked_state brw_wm_binding_table = { @@ -132,7 +144,9 @@ brw_gs_upload_binding_table(struct brw_context *brw) if (brw->geometry_program == NULL) return; - brw_upload_binding_table(brw, BRW_NEW_GS_BINDING_TABLE, &brw->gs.base); + brw_upload_binding_table(brw, + _3DSTATE_BINDING_TABLE_POINTERS_GS, + BRW_NEW_GS_BINDING_TABLE, &brw->gs.base); } const struct brw_tracked_state brw_gs_binding_table = { |