From f04a0a2bb64c653950050b3a900a54917f306cba Mon Sep 17 00:00:00 2001 From: kd-11 Date: Wed, 3 Apr 2019 20:48:32 +0300 Subject: [PATCH] rsx: Remove some old restrictions affecting memory persistence --- rpcs3/Emu/RSX/GL/GLHelpers.cpp | 26 +++++++++++++------------- rpcs3/Emu/RSX/GL/GLRenderTargets.cpp | 7 +++---- rpcs3/Emu/RSX/VK/VKRenderTargets.h | 14 ++------------ 3 files changed, 18 insertions(+), 29 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLHelpers.cpp b/rpcs3/Emu/RSX/GL/GLHelpers.cpp index b94b14c896..a0a838952e 100644 --- a/rpcs3/Emu/RSX/GL/GLHelpers.cpp +++ b/rpcs3/Emu/RSX/GL/GLHelpers.cpp @@ -367,8 +367,8 @@ namespace gl { std::unique_ptr typeless_src; std::unique_ptr typeless_dst; - u32 src_id = src->id(); - u32 dst_id = dst->id(); + const gl::texture* real_src = src; + const gl::texture* real_dst = dst; if (xfer_info.src_is_typeless) { @@ -380,7 +380,7 @@ namespace gl typeless_src = std::make_unique(GL_TEXTURE_2D, internal_width, src->height(), 1, 1, internal_fmt); copy_typeless(typeless_src.get(), src); - src_id = typeless_src->id(); + real_src = typeless_src.get(); src_rect.x1 = (u16)(src_rect.x1 * xfer_info.src_scaling_hint); src_rect.x2 = (u16)(src_rect.x2 * xfer_info.src_scaling_hint); } @@ -395,7 +395,7 @@ namespace gl typeless_dst = std::make_unique(GL_TEXTURE_2D, internal_width, dst->height(), 1, 1, internal_fmt); copy_typeless(typeless_dst.get(), dst); - dst_id = typeless_dst->id(); + real_dst = typeless_dst.get(); dst_rect.x1 = (u16)(dst_rect.x1 * xfer_info.dst_scaling_hint); dst_rect.x2 = (u16)(dst_rect.x2 * xfer_info.dst_scaling_hint); } @@ -406,17 +406,17 @@ namespace gl if (is_depth_copy) { - if (src->get_internal_format() == gl::texture::internal_format::depth16 || - dst->get_internal_format() == gl::texture::internal_format::depth16) - { - attachment = GL_DEPTH_ATTACHMENT; - target = gl::buffers::depth; - } - else + verify(HERE), real_src->aspect() == real_dst->aspect(); + if (real_dst->aspect() & gl::image_aspect::stencil) { attachment = GL_DEPTH_STENCIL_ATTACHMENT; target = gl::buffers::depth_stencil; } + else + { + attachment = GL_DEPTH_ATTACHMENT; + target = gl::buffers::depth; + } } else { @@ -429,10 +429,10 @@ namespace gl save_binding_state saved; glBindFramebuffer(GL_READ_FRAMEBUFFER, blit_src.id()); - glFramebufferTexture2D(GL_READ_FRAMEBUFFER, attachment, GL_TEXTURE_2D, src_id, 0); + glFramebufferTexture2D(GL_READ_FRAMEBUFFER, attachment, GL_TEXTURE_2D, real_src->id(), 0); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, blit_dst.id()); - glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, attachment, GL_TEXTURE_2D, dst_id, 0); + glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, attachment, GL_TEXTURE_2D, real_dst->id(), 0); if (xfer_info.flip_horizontal) { diff --git a/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp b/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp index 6be52c13e2..4e3624d5dd 100644 --- a/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp +++ b/rpcs3/Emu/RSX/GL/GLRenderTargets.cpp @@ -617,7 +617,6 @@ void gl::render_target::memory_barrier(gl::command_context& cmd, bool force_init const auto dst_bpp = get_bpp(); rsx::typeless_xfer typeless_info{}; - const bool dst_is_depth = is_depth(get_internal_format()); const auto region = rsx::get_transferable_region(this); if (get_internal_format() == src_texture->get_internal_format()) @@ -628,17 +627,17 @@ void gl::render_target::memory_barrier(gl::command_context& cmd, bool force_init else { // Mem cast, generate typeless xfer info - const bool src_is_depth = is_depth(src_texture->get_internal_format()); - if (src_bpp != dst_bpp || dst_is_depth || src_is_depth) + if (src_bpp != dst_bpp || aspect() != src_texture->aspect()) { typeless_info.src_is_typeless = true; typeless_info.src_context = rsx::texture_upload_context::framebuffer_storage; typeless_info.src_native_format_override = (u32)get_internal_format(); - typeless_info.src_is_depth = src_is_depth; + typeless_info.src_is_depth = !!(src_texture->aspect() & gl::image_aspect::depth); typeless_info.src_scaling_hint = f32(src_bpp) / dst_bpp; } } + const bool dst_is_depth = !!(aspect() & gl::image_aspect::depth); gl::g_hw_blitter->scale_image(cmd, old_contents, this, { 0, 0, std::get<0>(region), std::get<1>(region) }, { 0, 0, std::get<2>(region) , std::get<3>(region) }, diff --git a/rpcs3/Emu/RSX/VK/VKRenderTargets.h b/rpcs3/Emu/RSX/VK/VKRenderTargets.h index f61cfd8001..7673869ed7 100644 --- a/rpcs3/Emu/RSX/VK/VKRenderTargets.h +++ b/rpcs3/Emu/RSX/VK/VKRenderTargets.h @@ -118,22 +118,12 @@ namespace vk } else { - const bool src_is_depth = !!(src_texture->attachment_aspect_flag & VK_IMAGE_ASPECT_DEPTH_BIT); - const bool dst_is_depth = !!(attachment_aspect_flag & VK_IMAGE_ASPECT_DEPTH_BIT); - - if (src_is_depth != dst_is_depth) - { - // TODO: Implement proper copy_typeless for vulkan that crosses the depth<->color aspect barrier - null_transfer_impl(); - return; - } - - if (src_bpp != dst_bpp || src_is_depth || dst_is_depth) + if (src_bpp != dst_bpp || src_texture->attachment_aspect_flag != attachment_aspect_flag) { typeless_info.src_is_typeless = true; typeless_info.src_context = rsx::texture_upload_context::framebuffer_storage; typeless_info.src_native_format_override = (u32)info.format; - typeless_info.src_is_depth = src_is_depth; + typeless_info.src_is_depth = !!(src_texture->attachment_aspect_flag & VK_IMAGE_ASPECT_DEPTH_BIT); typeless_info.src_scaling_hint = f32(src_bpp) / dst_bpp; } }