diff options
author | Kenneth Graunke <[email protected]> | 2014-06-10 18:50:03 -0700 |
---|---|---|
committer | Kenneth Graunke <[email protected]> | 2014-06-12 00:56:08 -0700 |
commit | a2ad771671d94feae16b35c26ed4d1907f74f50e (patch) | |
tree | 55ebc86e71a1d1cea522c0be2e6b1f6cf6478d1b | |
parent | be5e5b6c9364fcac8f26bc2875ffcfbaa4e17b45 (diff) |
i965: Fix Haswell discard regressions since Gen4-5 line AA fix.
In commit dc2d3a7f5c217a7cee92380fbf503924a9591bea, Iago accidentally
moved fire_fb_write() above the brw_pop_insn_state(), which caused the
SEND to lose its predication and change from WE_normal to WE_all.
Haswell uses predicated SENDs for discards, so this broke Piglit's
tests for discards.
We want the Gen4-5 MOV to be uncompressed, unpredicated, and unmasked,
but the actual FB write itself should respect those. So, pop state
first, and force it again around the single MOV.
Signed-off-by: Kenneth Graunke <[email protected]>
Reviewed-by: Matt Turner <[email protected]>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=79903
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs_generator.cpp | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp index 3787d246801..d21b4e262f5 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp @@ -106,9 +106,14 @@ fs_generator::fire_fb_write(fs_inst *inst, uint32_t msg_control; if (brw->gen < 6) { + brw_push_insn_state(p); + brw_set_default_mask_control(p, BRW_MASK_DISABLE); + brw_set_default_predicate_control(p, BRW_PREDICATE_NONE); + brw_set_default_compression_control(p, BRW_COMPRESSION_NONE); brw_MOV(p, brw_message_reg(base_reg + 1), brw_vec8_grf(1, 0)); + brw_pop_insn_state(p); } if (this->dual_source_output) @@ -196,6 +201,8 @@ fs_generator::generate_fb_write(fs_inst *inst) implied_header = brw_null_reg(); } + brw_pop_insn_state(p); + if (!runtime_check_aads_emit) { fire_fb_write(inst, inst->base_mrf, implied_header, inst->mlen); } else { @@ -221,8 +228,6 @@ fs_generator::generate_fb_write(fs_inst *inst) brw_land_fwd_jump(p, jmp); fire_fb_write(inst, inst->base_mrf, implied_header, inst->mlen); } - - brw_pop_insn_state(p); } void |