From cbc2d53a8e2a81bc2ab414e43df1030ab313581a Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Wed, 6 May 2026 11:03:16 +0200 Subject: [PATCH] radv: do not fallback to compute for image->buffer copies with emulated formats This shouldn't be necessary because SDMA can detile the image just fine, only buffer->image and image->image need to fallback. It just works on GFX10+ because RADV is using NBC views, and I think it works on eg. VEGA10 just by luck due to different swizzles/alignments. Fixes: 3d803d7a2e0 ("radv: Use compute copy for emulated formats") Signed-off-by: Samuel Pitoiset --- src/amd/ci/radv-renoir-fails.txt | 65 ---------------------------- src/amd/vulkan/meta/radv_meta_copy.c | 4 +- src/amd/vulkan/radv_sdma.c | 4 +- src/amd/vulkan/radv_sdma.h | 2 +- 4 files changed, 5 insertions(+), 70 deletions(-) diff --git a/src/amd/ci/radv-renoir-fails.txt b/src/amd/ci/radv-renoir-fails.txt index 71c55998088..5610913a8ff 100644 --- a/src/amd/ci/radv-renoir-fails.txt +++ b/src/amd/ci/radv-renoir-fails.txt @@ -1,68 +1,3 @@ -# RADV_EXPERIMENTAL=transfer_queue+vk_require_etc2=true regressions since 3d803d7a2e0e7d46c04381896168c344d59d88e4 -dEQP-VK.api.copy_and_blit.copy_commands2.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11_snorm_block_64x192,Fail -dEQP-VK.api.copy_and_blit.copy_commands2.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11_snorm_block_64x192_2_layers,Fail -dEQP-VK.api.copy_and_blit.copy_commands2.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11_snorm_block_64x192_5_layers,Fail -dEQP-VK.api.copy_and_blit.copy_commands2.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11_unorm_block_64x192,Fail -dEQP-VK.api.copy_and_blit.copy_commands2.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11_unorm_block_64x192_2_layers,Fail -dEQP-VK.api.copy_and_blit.copy_commands2.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11_unorm_block_64x192_5_layers,Fail -dEQP-VK.api.copy_and_blit.copy_commands2.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11g11_snorm_block_64x192,Fail -dEQP-VK.api.copy_and_blit.copy_commands2.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11g11_snorm_block_64x192_2_layers,Fail -dEQP-VK.api.copy_and_blit.copy_commands2.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11g11_snorm_block_64x192_5_layers,Fail -dEQP-VK.api.copy_and_blit.copy_commands2.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11g11_unorm_block_64x192,Fail -dEQP-VK.api.copy_and_blit.copy_commands2.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11g11_unorm_block_64x192_2_layers,Fail -dEQP-VK.api.copy_and_blit.copy_commands2.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11g11_unorm_block_64x192_5_layers,Fail -dEQP-VK.api.copy_and_blit.copy_commands2.image_to_buffer_transfer_queue.2d_images.mip_copies_etc2_r8g8b8_unorm_block_64x192,Fail -dEQP-VK.api.copy_and_blit.copy_commands2.image_to_buffer_transfer_queue.2d_images.mip_copies_etc2_r8g8b8_unorm_block_64x192_2_layers,Fail -dEQP-VK.api.copy_and_blit.copy_commands2.image_to_buffer_transfer_queue.2d_images.mip_copies_etc2_r8g8b8_unorm_block_64x192_5_layers,Fail -dEQP-VK.api.copy_and_blit.copy_commands2.image_to_buffer_transfer_queue.2d_images.mip_copies_etc2_r8g8b8a1_unorm_block_64x192,Fail -dEQP-VK.api.copy_and_blit.copy_commands2.image_to_buffer_transfer_queue.2d_images.mip_copies_etc2_r8g8b8a1_unorm_block_64x192_2_layers,Fail -dEQP-VK.api.copy_and_blit.copy_commands2.image_to_buffer_transfer_queue.2d_images.mip_copies_etc2_r8g8b8a1_unorm_block_64x192_5_layers,Fail -dEQP-VK.api.copy_and_blit.copy_commands2.image_to_buffer_transfer_queue.2d_images.mip_copies_etc2_r8g8b8a8_unorm_block_64x192,Fail -dEQP-VK.api.copy_and_blit.copy_commands2.image_to_buffer_transfer_queue.2d_images.mip_copies_etc2_r8g8b8a8_unorm_block_64x192_2_layers,Fail -dEQP-VK.api.copy_and_blit.copy_commands2.image_to_buffer_transfer_queue.2d_images.mip_copies_etc2_r8g8b8a8_unorm_block_64x192_5_layers,Fail -dEQP-VK.api.copy_and_blit.core.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11_snorm_block_64x192,Fail -dEQP-VK.api.copy_and_blit.core.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11_snorm_block_64x192_2_layers,Fail -dEQP-VK.api.copy_and_blit.core.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11_snorm_block_64x192_5_layers,Fail -dEQP-VK.api.copy_and_blit.core.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11_unorm_block_64x192,Fail -dEQP-VK.api.copy_and_blit.core.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11_unorm_block_64x192_2_layers,Fail -dEQP-VK.api.copy_and_blit.core.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11_unorm_block_64x192_5_layers,Fail -dEQP-VK.api.copy_and_blit.core.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11g11_snorm_block_64x192,Fail -dEQP-VK.api.copy_and_blit.core.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11g11_snorm_block_64x192_2_layers,Fail -dEQP-VK.api.copy_and_blit.core.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11g11_snorm_block_64x192_5_layers,Fail -dEQP-VK.api.copy_and_blit.core.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11g11_unorm_block_64x192,Fail -dEQP-VK.api.copy_and_blit.core.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11g11_unorm_block_64x192_2_layers,Fail -dEQP-VK.api.copy_and_blit.core.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11g11_unorm_block_64x192_5_layers,Fail -dEQP-VK.api.copy_and_blit.core.image_to_buffer_transfer_queue.2d_images.mip_copies_etc2_r8g8b8_unorm_block_64x192,Fail -dEQP-VK.api.copy_and_blit.core.image_to_buffer_transfer_queue.2d_images.mip_copies_etc2_r8g8b8_unorm_block_64x192_2_layers,Fail -dEQP-VK.api.copy_and_blit.core.image_to_buffer_transfer_queue.2d_images.mip_copies_etc2_r8g8b8_unorm_block_64x192_5_layers,Fail -dEQP-VK.api.copy_and_blit.core.image_to_buffer_transfer_queue.2d_images.mip_copies_etc2_r8g8b8a1_unorm_block_64x192,Fail -dEQP-VK.api.copy_and_blit.core.image_to_buffer_transfer_queue.2d_images.mip_copies_etc2_r8g8b8a1_unorm_block_64x192_2_layers,Fail -dEQP-VK.api.copy_and_blit.core.image_to_buffer_transfer_queue.2d_images.mip_copies_etc2_r8g8b8a1_unorm_block_64x192_5_layers,Fail -dEQP-VK.api.copy_and_blit.core.image_to_buffer_transfer_queue.2d_images.mip_copies_etc2_r8g8b8a8_unorm_block_64x192,Fail -dEQP-VK.api.copy_and_blit.core.image_to_buffer_transfer_queue.2d_images.mip_copies_etc2_r8g8b8a8_unorm_block_64x192_2_layers,Fail -dEQP-VK.api.copy_and_blit.core.image_to_buffer_transfer_queue.2d_images.mip_copies_etc2_r8g8b8a8_unorm_block_64x192_5_layers,Fail -dEQP-VK.api.copy_and_blit.dedicated_allocation.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11_snorm_block_64x192,Fail -dEQP-VK.api.copy_and_blit.dedicated_allocation.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11_snorm_block_64x192_2_layers,Fail -dEQP-VK.api.copy_and_blit.dedicated_allocation.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11_snorm_block_64x192_5_layers,Fail -dEQP-VK.api.copy_and_blit.dedicated_allocation.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11_unorm_block_64x192,Fail -dEQP-VK.api.copy_and_blit.dedicated_allocation.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11_unorm_block_64x192_2_layers,Fail -dEQP-VK.api.copy_and_blit.dedicated_allocation.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11_unorm_block_64x192_5_layers,Fail -dEQP-VK.api.copy_and_blit.dedicated_allocation.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11g11_snorm_block_64x192,Fail -dEQP-VK.api.copy_and_blit.dedicated_allocation.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11g11_snorm_block_64x192_2_layers,Fail -dEQP-VK.api.copy_and_blit.dedicated_allocation.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11g11_snorm_block_64x192_5_layers,Fail -dEQP-VK.api.copy_and_blit.dedicated_allocation.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11g11_unorm_block_64x192,Fail -dEQP-VK.api.copy_and_blit.dedicated_allocation.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11g11_unorm_block_64x192_2_layers,Fail -dEQP-VK.api.copy_and_blit.dedicated_allocation.image_to_buffer_transfer_queue.2d_images.mip_copies_eac_r11g11_unorm_block_64x192_5_layers,Fail -dEQP-VK.api.copy_and_blit.dedicated_allocation.image_to_buffer_transfer_queue.2d_images.mip_copies_etc2_r8g8b8_unorm_block_64x192,Fail -dEQP-VK.api.copy_and_blit.dedicated_allocation.image_to_buffer_transfer_queue.2d_images.mip_copies_etc2_r8g8b8_unorm_block_64x192_2_layers,Fail -dEQP-VK.api.copy_and_blit.dedicated_allocation.image_to_buffer_transfer_queue.2d_images.mip_copies_etc2_r8g8b8_unorm_block_64x192_5_layers,Fail -dEQP-VK.api.copy_and_blit.dedicated_allocation.image_to_buffer_transfer_queue.2d_images.mip_copies_etc2_r8g8b8a1_unorm_block_64x192,Fail -dEQP-VK.api.copy_and_blit.dedicated_allocation.image_to_buffer_transfer_queue.2d_images.mip_copies_etc2_r8g8b8a1_unorm_block_64x192_2_layers,Fail -dEQP-VK.api.copy_and_blit.dedicated_allocation.image_to_buffer_transfer_queue.2d_images.mip_copies_etc2_r8g8b8a1_unorm_block_64x192_5_layers,Fail -dEQP-VK.api.copy_and_blit.dedicated_allocation.image_to_buffer_transfer_queue.2d_images.mip_copies_etc2_r8g8b8a8_unorm_block_64x192,Fail -dEQP-VK.api.copy_and_blit.dedicated_allocation.image_to_buffer_transfer_queue.2d_images.mip_copies_etc2_r8g8b8a8_unorm_block_64x192_2_layers,Fail -dEQP-VK.api.copy_and_blit.dedicated_allocation.image_to_buffer_transfer_queue.2d_images.mip_copies_etc2_r8g8b8a8_unorm_block_64x192_5_layers,Fail - dEQP-VK.wsi.direct.colorspace.basic,Fail dEQP-VK.wsi.direct.colorspace.hdr,Fail dEQP-VK.wsi.direct.present_timing.time_domain.calibration.present_stage_local,Fail diff --git a/src/amd/vulkan/meta/radv_meta_copy.c b/src/amd/vulkan/meta/radv_meta_copy.c index d8349cdf5e9..b48ad04b163 100644 --- a/src/amd/vulkan/meta/radv_meta_copy.c +++ b/src/amd/vulkan/meta/radv_meta_copy.c @@ -88,7 +88,7 @@ transfer_copy_memory_image(struct radv_cmd_buffer *cmd_buffer, VkAddressCopyFlag const struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); struct radv_cmd_stream *cs = cmd_buffer->cs; - if (!radv_sdma_supports_image(device, image)) { + if (!radv_sdma_supports_image(device, image, to_image)) { if (!radv_gang_init(cmd_buffer)) return; @@ -598,7 +598,7 @@ transfer_copy_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_i struct radv_cmd_stream *cs = cmd_buffer->cs; unsigned int dst_aspect_mask_remaining = region->dstSubresource.aspectMask; - if (!radv_sdma_supports_image(device, src_image) || !radv_sdma_supports_image(device, dst_image)) { + if (!radv_sdma_supports_image(device, src_image, false) || !radv_sdma_supports_image(device, dst_image, true)) { if (!radv_gang_init(cmd_buffer)) return; diff --git a/src/amd/vulkan/radv_sdma.c b/src/amd/vulkan/radv_sdma.c index 3c41be48c7e..8b9f9e2a32e 100644 --- a/src/amd/vulkan/radv_sdma.c +++ b/src/amd/vulkan/radv_sdma.c @@ -524,12 +524,12 @@ radv_sdma_copy_image_t2t_scanline(const struct radv_device *device, struct radv_ } bool -radv_sdma_supports_image(const struct radv_device *device, const struct radv_image *image) +radv_sdma_supports_image(const struct radv_device *device, const struct radv_image *image, bool to_image) { const struct radv_physical_device *pdev = radv_device_physical(device); if (radv_is_format_emulated(pdev, image->vk.format)) - return false; + return to_image ? false : true; if (!pdev->info.sdma_supports_sparse && (image->vk.create_flags & VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT)) diff --git a/src/amd/vulkan/radv_sdma.h b/src/amd/vulkan/radv_sdma.h index b4a37990ddf..96ba8a72045 100644 --- a/src/amd/vulkan/radv_sdma.h +++ b/src/amd/vulkan/radv_sdma.h @@ -68,7 +68,7 @@ void radv_sdma_copy_memory(const struct radv_device *device, struct radv_cmd_str uint64_t dst_va, uint64_t size, bool tmz); void radv_sdma_fill_memory(const struct radv_device *device, struct radv_cmd_stream *cs, const uint64_t va, const uint64_t size, const uint32_t value); -bool radv_sdma_supports_image(const struct radv_device *device, const struct radv_image *image); +bool radv_sdma_supports_image(const struct radv_device *device, const struct radv_image *image, bool to_image); void radv_sdma_emit_nop(const struct radv_device *device, struct radv_cmd_stream *cs);