vk: Workaround for slow bo transfer (pinned<->VRAM) when using RADV

- perf shows extremely high number of cycles wasted in memmove glibc method
This commit is contained in:
kd-11 2021-05-26 22:59:57 +03:00 committed by kd-11
parent 6fed80333c
commit 56f7359da4
1 changed files with 11 additions and 2 deletions

View File

@ -880,7 +880,7 @@ namespace vk
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);
rsx::texture_uploader_capabilities caps{ .alignment = heap_align };
rsx::texture_uploader_capabilities caps{ .supports_zero_copy = true, .alignment = heap_align };
rsx::texture_memory_info opt{};
bool check_caps = true;
@ -896,6 +896,15 @@ namespace vk
std::vector<std::pair<VkBuffer, u32>> upload_commands;
copy_regions.reserve(subresource_layout.size());
#ifndef _WIN32
// RADV workaround. Buffer-to-buffer transfers are extremely slow and invoke memmove in vkCmdCopyBuffer.
if (const auto vendor = vk::get_driver_vendor();
vendor == driver_vendor::RADV)
{
caps.supports_zero_copy = false;
}
#endif
for (const rsx::subresource_layout &layout : subresource_layout)
{
const auto [row_pitch, upload_pitch_in_texel] = calculate_upload_pitch(format, heap_align, dst_image, layout);
@ -913,7 +922,7 @@ namespace vk
{
caps.supports_byteswap = (image_linear_size >= 1024);
caps.supports_hw_deswizzle = caps.supports_byteswap;
caps.supports_zero_copy = caps.supports_byteswap;
caps.supports_zero_copy = caps.supports_zero_copy && caps.supports_byteswap;
caps.supports_vtc_decoding = false;
check_caps = false;
}