From 41c318027621d818eeabf56189b678eaa676994a Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 18 Nov 2019 21:39:40 +0300 Subject: [PATCH] rsx: Fix invalid format checks for DMA sections which are typeless --- rpcs3/Emu/RSX/Common/texture_cache.h | 51 +++++++++++++++------------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/rpcs3/Emu/RSX/Common/texture_cache.h b/rpcs3/Emu/RSX/Common/texture_cache.h index 3d59fe1f79..272d13b1f1 100644 --- a/rpcs3/Emu/RSX/Common/texture_cache.h +++ b/rpcs3/Emu/RSX/Common/texture_cache.h @@ -2247,37 +2247,40 @@ namespace rsx dst_area = old_dst_area; } - const bool format_check = (src_is_render_target || is_format_convert); - if (!use_null_region && cached_dest && format_check) + if (cached_dest && cached_dest->get_context() != texture_upload_context::dma) { - bool src_is_depth; - if (is_format_convert) + // NOTE: DMA sections are plain memory blocks with no format! + if (src_is_render_target || is_format_convert) { - src_is_depth = false; - } - else - { - verify(HERE), src_is_render_target; - src_is_depth = (typeless_info.src_is_typeless)? false : src_subres.is_depth; + bool src_is_depth; + if (is_format_convert) + { + src_is_depth = false; + } + else + { + verify(HERE), src_is_render_target; + src_is_depth = (typeless_info.src_is_typeless) ? false : src_subres.is_depth; + } + + if (cached_dest->is_depth_texture() != src_is_depth) + { + // Opt to cancel the destination. Can also use typeless convert + LOG_WARNING(RSX, "Format mismatch on blit destination block. Performance warning."); + + // The invalidate call before creating a new target will remove this section + cached_dest = nullptr; + dest_texture = 0; + dst_area = old_dst_area; + } } - if (cached_dest->is_depth_texture() != src_is_depth) + if (LIKELY(cached_dest)) { - // Opt to cancel the destination. Can also use typeless convert - LOG_WARNING(RSX, "Format mismatch on blit destination block. Performance warning."); - - // The invalidate call before creating a new target will remove this section - cached_dest = nullptr; - dest_texture = 0; - dst_area = old_dst_area; + typeless_info.dst_gcm_format = cached_dest->get_gcm_format(); + dst_is_depth_surface = cached_dest->is_depth_texture(); } } - - if (LIKELY(cached_dest)) - { - typeless_info.dst_gcm_format = cached_dest->get_gcm_format(); - dst_is_depth_surface = cached_dest->is_depth_texture(); - } } else {