From 887ea43e395a99aab8453f24b9dc15f6922241e1 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sat, 24 Mar 2018 14:13:11 +0300 Subject: [PATCH] rsx: Fix some texture cache problems - gl/vk: Properly handle remapping temporary resources --- rpcs3/Emu/RSX/Common/surface_store.h | 2 +- rpcs3/Emu/RSX/GL/GLRenderTargets.h | 4 ++-- rpcs3/Emu/RSX/GL/GLTextureCache.h | 14 ++++++++++++++ rpcs3/Emu/RSX/VK/VKRenderTargets.h | 2 +- rpcs3/Emu/RSX/VK/VKTextureCache.h | 4 ++-- 5 files changed, 20 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/RSX/Common/surface_store.h b/rpcs3/Emu/RSX/Common/surface_store.h index 8cebf9d41c..3659cb3dc5 100644 --- a/rpcs3/Emu/RSX/Common/surface_store.h +++ b/rpcs3/Emu/RSX/Common/surface_store.h @@ -64,7 +64,7 @@ namespace rsx GcmTileInfo *tile = nullptr; rsx::surface_antialiasing aa_mode = rsx::surface_antialiasing::center_1_sample; - virtual image_storage_type get_surface() const = 0; + virtual image_storage_type get_surface() = 0; virtual u16 get_surface_width() const = 0; virtual u16 get_surface_height() const = 0; virtual u16 get_rsx_pitch() const = 0; diff --git a/rpcs3/Emu/RSX/GL/GLRenderTargets.h b/rpcs3/Emu/RSX/GL/GLRenderTargets.h index 04f0e922f6..720ad7ed0d 100644 --- a/rpcs3/Emu/RSX/GL/GLRenderTargets.h +++ b/rpcs3/Emu/RSX/GL/GLRenderTargets.h @@ -113,9 +113,9 @@ namespace gl return surface_height; } - u32 get_surface() const override + u32 get_surface() override { - return id(); + return get_view(0xAAE4, rsx::default_remap_vector); } u32 get_view(u32 remap_encoding, const std::pair, std::array>& remap) diff --git a/rpcs3/Emu/RSX/GL/GLTextureCache.h b/rpcs3/Emu/RSX/GL/GLTextureCache.h index 4613f09e2c..e43ea18b5d 100644 --- a/rpcs3/Emu/RSX/GL/GLTextureCache.h +++ b/rpcs3/Emu/RSX/GL/GLTextureCache.h @@ -706,12 +706,26 @@ namespace gl } } + //TODO: Native texture views are needed here. It works because this routine is only called with rendertarget data if (ifmt != sized_internal_fmt) { err_once("GL format mismatch (data cast?). Sized ifmt=0x%X vs Src ifmt=0x%X", sized_internal_fmt, ifmt); //Apply base component map onto the new texture if a data cast has been done apply_component_mapping_flags(dst_type, gcm_format, rsx::texture_create_flags::default_component_order); } + else + { + //Inherit the parent's default mapping. The caller should ensure the native order is set beforehand + GLint src_remap[4]; + glBindTexture(GL_TEXTURE_2D, src_id); + glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, (GLint*)&src_remap[0]); + glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, (GLint*)&src_remap[1]); + glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, (GLint*)&src_remap[2]); + glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, (GLint*)&src_remap[3]); + + glBindTexture(dst_type, dst_id); + glTexParameteriv(dst_type, GL_TEXTURE_SWIZZLE_RGBA, src_remap); + } if (memcmp(remap.first.data(), rsx::default_remap_vector.first.data(), 4) || memcmp(remap.second.data(), rsx::default_remap_vector.second.data(), 4)) diff --git a/rpcs3/Emu/RSX/VK/VKRenderTargets.h b/rpcs3/Emu/RSX/VK/VKRenderTargets.h index 47abf51332..0d667f280b 100644 --- a/rpcs3/Emu/RSX/VK/VKRenderTargets.h +++ b/rpcs3/Emu/RSX/VK/VKRenderTargets.h @@ -64,7 +64,7 @@ namespace vk return result; } - vk::image* get_surface() const override + vk::image* get_surface() override { return (vk::image*)this; } diff --git a/rpcs3/Emu/RSX/VK/VKTextureCache.h b/rpcs3/Emu/RSX/VK/VKTextureCache.h index 838214b564..67053f7012 100644 --- a/rpcs3/Emu/RSX/VK/VKTextureCache.h +++ b/rpcs3/Emu/RSX/VK/VKTextureCache.h @@ -706,10 +706,10 @@ namespace vk } vk::image_view* generate_atlas_from_images(vk::command_buffer& cmd, u32 gcm_format, u16 width, u16 height, - const std::vector& sections_to_copy, const texture_channel_remap_t& /*remap_vector*/) override + const std::vector& sections_to_copy, const texture_channel_remap_t& remap_vector) override { auto result = create_temporary_subresource_view_impl(cmd, sections_to_copy.front().src, VK_IMAGE_TYPE_2D, - VK_IMAGE_VIEW_TYPE_2D, gcm_format, 0, 0, width, height, rsx::default_remap_vector, false); + VK_IMAGE_VIEW_TYPE_2D, gcm_format, 0, 0, width, height, remap_vector, false); VkImage dst = result->info.image; VkImageAspectFlags aspect = VK_IMAGE_ASPECT_COLOR_BIT;