From: Francisco Jerez Date: Sat, 17 Jan 2015 12:12:34 +0000 (+0200) Subject: i965/fs: Less broken handling of force_writemask_all in lower_load_payload(). X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8e47f51a5a7aba2bb56e7185988072431444d811;p=mesa.git i965/fs: Less broken handling of force_writemask_all in lower_load_payload(). It's perfectly fine to read the second half of a register written with force_writemask_all from a first half MOV instruction or vice versa, and lower_load_payload shouldn't mark the whole MOV as belonging to the second half in that case. Replicate the same metadata to both halves of the destination when writemasking is disabled. Reviewed-by: Jason Ekstrand --- diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp index 9e1676e628c..62a5639fa0a 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp @@ -3135,9 +3135,11 @@ fs_visitor::lower_load_payload() } if (inst->dst.file == MRF || inst->dst.file == GRF) { - bool force_sechalf = inst->force_sechalf; + bool force_sechalf = inst->force_sechalf && + !inst->force_writemask_all; bool toggle_sechalf = inst->dst.width == 16 && - type_sz(inst->dst.type) == 4; + type_sz(inst->dst.type) == 4 && + !inst->force_writemask_all; for (int i = 0; i < inst->regs_written; ++i) { metadata[dst_reg + i].written = true; metadata[dst_reg + i].force_sechalf = force_sechalf; @@ -3180,11 +3182,15 @@ fs_visitor::lower_load_payload() mov->force_writemask_all = metadata[src_reg].force_writemask_all; metadata[dst_reg] = metadata[src_reg]; if (dst.width * type_sz(dst.type) > 32) { - assert((!metadata[src_reg].written || - !metadata[src_reg].force_sechalf) && - (!metadata[src_reg + 1].written || - metadata[src_reg + 1].force_sechalf)); - metadata[dst_reg + 1] = metadata[src_reg + 1]; + if (metadata[src_reg].force_writemask_all) { + metadata[dst_reg + 1] = metadata[src_reg]; + } else { + assert((!metadata[src_reg].written || + !metadata[src_reg].force_sechalf) && + (!metadata[src_reg + 1].written || + metadata[src_reg + 1].force_sechalf)); + metadata[dst_reg + 1] = metadata[src_reg + 1]; + } } } else { metadata[dst_reg].force_writemask_all = false;