Signed-off-by: Topi Pohjolainen <topi.pohjolai...@intel.com> --- src/intel/blorp/blorp.h | 2 ++ src/intel/blorp/blorp_blit.c | 6 ++++++ src/mesa/drivers/dri/i965/brw_blorp.c | 25 ++++++++++++++++++++----- 3 files changed, 28 insertions(+), 5 deletions(-)
diff --git a/src/intel/blorp/blorp.h b/src/intel/blorp/blorp.h index f69e99e..721322c 100644 --- a/src/intel/blorp/blorp.h +++ b/src/intel/blorp/blorp.h @@ -94,6 +94,8 @@ struct blorp_surf union isl_color_value clear_color; }; +bool blorp_copy_needs_format_override(enum isl_format fmt); + void blorp_blit(struct blorp_batch *batch, const struct blorp_surf *src_surf, diff --git a/src/intel/blorp/blorp_blit.c b/src/intel/blorp/blorp_blit.c index 0c3ee72..bbeabd9 100644 --- a/src/intel/blorp/blorp_blit.c +++ b/src/intel/blorp/blorp_blit.c @@ -1742,6 +1742,12 @@ get_copy_format_for_bpb(unsigned bpb) } } +bool +blorp_copy_needs_format_override(enum isl_format fmt) +{ + return fmt != get_copy_format_for_bpb(isl_format_get_layout(fmt)->bpb); +} + static void surf_convert_to_uncompressed(const struct isl_device *isl_dev, struct brw_blorp_surface_info *info, diff --git a/src/mesa/drivers/dri/i965/brw_blorp.c b/src/mesa/drivers/dri/i965/brw_blorp.c index d937c5c..4e3359c 100644 --- a/src/mesa/drivers/dri/i965/brw_blorp.c +++ b/src/mesa/drivers/dri/i965/brw_blorp.c @@ -407,12 +407,18 @@ brw_blorp_copy_miptrees(struct brw_context *brw, unsigned dst_x, unsigned dst_y, unsigned src_width, unsigned src_height) { - /* Get ready to blit. This includes depth resolving the src and dst - * buffers if necessary. Note: it's not necessary to do a color resolve on - * the destination buffer because we use the standard render path to render - * to destination color buffers, and the standard render path is - * fast-color-aware. + /* Get ready to blit. This includes color/depth resolving the src and dst + * buffers if necessary. */ + const enum isl_format dst_format = + translate_tex_format(brw, dst_mt->format, false); + const bool disable_dst_aux = + dst_mt->mcs_mt && intel_miptree_is_lossless_compressed(brw, dst_mt) && + blorp_copy_needs_format_override(dst_format); + + if (disable_dst_aux) + intel_miptree_resolve_color(brw, dst_mt, dst_level, dst_layer, 0); + intel_miptree_resolve_color(brw, src_mt, src_level, src_layer, INTEL_MIPTREE_IGNORE_CCS_E); intel_miptree_slice_resolve_depth(brw, src_mt, src_level, src_layer); @@ -437,6 +443,15 @@ brw_blorp_copy_miptrees(struct brw_context *brw, blorp_surf_for_miptree(brw, &dst_surf, dst_mt, true, &dst_level, dst_layer, &tmp_surfs[2]); + /* Copy uses fixed formats that are guaranteed to agree with real surface + * formats only with respect to size. Semantics may differ which will + * confuse the hardware if any compression scheme is used. Therefore the + * copy is performed target compression disabled unless the real format + * matches exactly the fixed copy format. + */ + if (disable_dst_aux) + dst_surf.aux_usage = ISL_AUX_USAGE_NONE; + struct blorp_batch batch; blorp_batch_init(&brw->blorp, &batch, brw); blorp_copy(&batch, &src_surf, src_level, src_layer, -- 2.5.5 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev