From b5faa8f83cbc5412c7bee8c70cc215fd83343bf4 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Fri, 13 Aug 2021 20:08:52 +0300 Subject: [PATCH] vk: Properly calculate cubemap memory size --- rpcs3/Emu/RSX/VK/VKHelpers.h | 2 +- rpcs3/Emu/RSX/VK/VKTexture.cpp | 6 ++++-- rpcs3/Emu/RSX/VK/VKTextureCache.cpp | 3 ++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKHelpers.h b/rpcs3/Emu/RSX/VK/VKHelpers.h index 966a22e382..b349094338 100644 --- a/rpcs3/Emu/RSX/VK/VKHelpers.h +++ b/rpcs3/Emu/RSX/VK/VKHelpers.h @@ -75,7 +75,7 @@ namespace vk }; void upload_image(const vk::command_buffer& cmd, vk::image* dst_image, - const std::vector& subresource_layout, int format, bool is_swizzled, u16 mipmap_count, + const std::vector& subresource_layout, int format, bool is_swizzled, u16 layer_count, VkImageAspectFlags flags, vk::data_heap &upload_heap, u32 heap_align, rsx::flags32_t image_setup_flags); //Other texture management helpers diff --git a/rpcs3/Emu/RSX/VK/VKTexture.cpp b/rpcs3/Emu/RSX/VK/VKTexture.cpp index d8eddfd9a1..c0a047bd66 100644 --- a/rpcs3/Emu/RSX/VK/VKTexture.cpp +++ b/rpcs3/Emu/RSX/VK/VKTexture.cpp @@ -884,7 +884,7 @@ namespace vk } void upload_image(const vk::command_buffer& cmd, vk::image* dst_image, - const std::vector& subresource_layout, int format, bool is_swizzled, u16 /*mipmap_count*/, + const std::vector& subresource_layout, int format, bool is_swizzled, u16 layer_count, VkImageAspectFlags flags, vk::data_heap &upload_heap, u32 heap_align, rsx::flags32_t image_setup_flags) { const bool requires_depth_processing = (dst_image->aspect() & VK_IMAGE_ASPECT_STENCIL_BIT) || (format == CELL_GCM_TEXTURE_DEPTH16_FLOAT); @@ -977,7 +977,8 @@ namespace vk if (!scratch_buf) { // Calculate enough scratch memory. We need 2x the size of layer 0 to fit all the mip levels and an extra 128 bytes per level as alignment overhead. - auto scratch_buf_size = 128u * ::size32(subresource_layout) + image_linear_size + image_linear_size; + const u64 layer_size = (image_linear_size + image_linear_size); + u64 scratch_buf_size = 128u * ::size32(subresource_layout) + (layer_size * layer_count); if (opt.require_deswizzle) { // Double the memory if hw deswizzle is going to be used. @@ -988,6 +989,7 @@ namespace vk if (requires_depth_processing) { // D-S aspect requires a load section that can fit a separated block => D(4) + S(1) + // Due to reverse processing of inputs, only enough space to fit one layer is needed here. scratch_buf_size += dst_image->width() * dst_image->height() * 5; } diff --git a/rpcs3/Emu/RSX/VK/VKTextureCache.cpp b/rpcs3/Emu/RSX/VK/VKTextureCache.cpp index edc34c1033..c1b91f9ad4 100644 --- a/rpcs3/Emu/RSX/VK/VKTextureCache.cpp +++ b/rpcs3/Emu/RSX/VK/VKTextureCache.cpp @@ -921,7 +921,8 @@ namespace vk rsx::flags32_t upload_command_flags = initialize_image_layout | (rsx::get_current_renderer()->get_backend_config().supports_asynchronous_compute ? upload_contents_async : upload_contents_inline); - vk::upload_image(cmd, image, subresource_layout, gcm_format, input_swizzled, mipmaps, image->aspect(), + const u16 layer_count = (type == rsx::texture_dimension_extended::texture_dimension_cubemap) ? 6 : 1; + vk::upload_image(cmd, image, subresource_layout, gcm_format, input_swizzled, layer_count, image->aspect(), *m_texture_upload_heap, upload_heap_align_default, upload_command_flags); vk::leave_uninterruptible();