In Gen < 6 AA data will or will not be sent as part of the framebuffer write SEND message depending on a runtime condition, so don't bother moving AA data to the corresponding MRF register until we know that we need to send it.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=78679 --- src/mesa/drivers/dri/i965/brw_fs.h | 1 + src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 23 ++++++++++++++++++----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h index ab8912f..351d0b6 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.h +++ b/src/mesa/drivers/dri/i965/brw_fs.h @@ -452,6 +452,7 @@ public: void emit_color_write(int target, int index, int first_color_mrf); void emit_alpha_test(); + void emit_aa(int mrf_aa_reg); void do_emit_fb_write(int target, int base_mrf, int mlen, bool eot, bool header_present); void emit_fb_write(int target, int base_mrf, int mlen, bool eot, diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp index 4c3897b..de1726f 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp @@ -2731,6 +2731,17 @@ fs_visitor::emit_alpha_test() } void +fs_visitor::emit_aa(int mrf_aa_reg) +{ + if (payload.aa_dest_stencil_reg) { + push_force_uncompressed(); + emit(MOV(fs_reg(MRF, mrf_aa_reg), + fs_reg(brw_vec8_grf(payload.aa_dest_stencil_reg, 0)))); + pop_force_uncompressed(); + } +} + +void fs_visitor::do_emit_fb_write(int target, int base_mrf, int mlen, bool eot, bool header_present) { @@ -2751,6 +2762,7 @@ fs_visitor::emit_fb_write(int target, int base_mrf, int mlen, bool eot, bool header_present) { if (!runtime_check_aads_emit) { + emit_aa(base_mrf + 2); do_emit_fb_write(target, base_mrf, mlen, eot, header_present); } else { /* This can only happen in Gen < 6 @@ -2766,12 +2778,13 @@ fs_visitor::emit_fb_write(int target, int base_mrf, int mlen, bool eot, emit(IF(BRW_PREDICATE_NORMAL)); { /* Shift message header one register since we are not sending - * AA data stored in base_mrf+2 + * AA data in base_mrf+2 */ do_emit_fb_write(target, base_mrf + 1, mlen - 1, eot, header_present); } emit(BRW_OPCODE_ELSE); { + emit_aa(base_mrf + 2); do_emit_fb_write(target, base_mrf, mlen, eot, header_present); } emit(BRW_OPCODE_ENDIF); @@ -2819,11 +2832,11 @@ fs_visitor::emit_fb_writes() nr += 2; } + /* AA data. Depending on runtime conditions we might not need to send it + * but we reserve space for it for now. + */ if (payload.aa_dest_stencil_reg) { - push_force_uncompressed(); - emit(MOV(fs_reg(MRF, nr++), - fs_reg(brw_vec8_grf(payload.aa_dest_stencil_reg, 0)))); - pop_force_uncompressed(); + nr += 1; } prog_data->uses_omask = -- 1.9.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev