diff --git a/rpcs3/Emu/RSX/VK/VKHelpers.h b/rpcs3/Emu/RSX/VK/VKHelpers.h index 9d07a4581e..fae75c0724 100644 --- a/rpcs3/Emu/RSX/VK/VKHelpers.h +++ b/rpcs3/Emu/RSX/VK/VKHelpers.h @@ -71,10 +71,11 @@ namespace vk enum image_upload_options { - upload_contents_async = 1, - initialize_image_layout = 2, - preserve_image_layout = 4, - source_is_gpu_resident = 8, + upload_contents_async = 0x0001, + initialize_image_layout = 0x0002, + preserve_image_layout = 0x0004, + source_is_gpu_resident = 0x0008, + source_is_userptr = 0x0010, // meta-flags upload_contents_inline = 0, diff --git a/rpcs3/Emu/RSX/VK/VKRenderTargets.cpp b/rpcs3/Emu/RSX/VK/VKRenderTargets.cpp index 138f7e46aa..736b886a77 100644 --- a/rpcs3/Emu/RSX/VK/VKRenderTargets.cpp +++ b/rpcs3/Emu/RSX/VK/VKRenderTargets.cpp @@ -724,6 +724,7 @@ namespace vk subres.height_in_block ); subres.data = std::span(ext_data); + upload_flags |= source_is_userptr; #else const auto [scratch_buf, linear_data_scratch_offset] = vk::detile_memory_block(cmd, tiled_region, range, subres.width_in_block, subres.height_in_block, get_bpp()); diff --git a/rpcs3/Emu/RSX/VK/VKTexture.cpp b/rpcs3/Emu/RSX/VK/VKTexture.cpp index c69064dbe4..eaf5c0b710 100644 --- a/rpcs3/Emu/RSX/VK/VKTexture.cpp +++ b/rpcs3/Emu/RSX/VK/VKTexture.cpp @@ -990,7 +990,7 @@ namespace vk auto pdev = vk::get_current_renderer(); rsx::texture_uploader_capabilities caps{ .supports_dxt = pdev->get_texture_compression_bc_support(), .alignment = heap_align }; rsx::texture_memory_info opt{}; - bool check_caps = true; + bool check_hw_caps = !(image_setup_flags & source_is_userptr); vk::buffer* scratch_buf = nullptr; u32 scratch_offset = 0; @@ -1015,13 +1015,13 @@ namespace vk image_linear_size = row_pitch * layout.depth * (rsx::is_compressed_host_format(caps, format) ? layout.height_in_block : layout.height_in_texel); // Only do GPU-side conversion if occupancy is good - if (check_caps) + if (check_hw_caps) { caps.supports_byteswap = (image_linear_size >= 1024) || (image_setup_flags & source_is_gpu_resident); caps.supports_hw_deswizzle = caps.supports_byteswap; caps.supports_zero_copy = caps.supports_byteswap; caps.supports_vtc_decoding = false; - check_caps = false; + check_hw_caps = false; } auto buf_allocator = [&](usz) -> std::tuple