diff --git a/docs/features.txt b/docs/features.txt index 68a80e4f37d..35e0774c4df 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -618,7 +618,7 @@ Khronos extensions that are not part of any Vulkan version: VK_EXT_display_surface_counter DONE (anv, lvp, nvk, panvk, radv, tu, vn) VK_EXT_dynamic_rendering_unused_attachments DONE (anv, hk, lvp, nvk, radv, tu, vn) VK_EXT_extended_dynamic_state3 DONE (anv, hk, lvp, nvk, pvr, radv, tu, vn) - VK_EXT_external_memory_acquire_unmodified DONE (anv, radv, vn) + VK_EXT_external_memory_acquire_unmodified DONE (anv, panvk, radv, vn) VK_EXT_external_memory_dma_buf DONE (anv, hasvk, hk, lvp, nvk, panvk, pvr, radv, tu, v3dv, vn) VK_EXT_external_memory_host DONE (anv, dzn, hasvk, lvp, radv) VK_EXT_filter_cubic DONE (tu/a650+, vn) diff --git a/docs/relnotes/new_features.txt b/docs/relnotes/new_features.txt index bf535b93f38..2bc78b29002 100644 --- a/docs/relnotes/new_features.txt +++ b/docs/relnotes/new_features.txt @@ -1,2 +1,3 @@ VK_KHR_relaxed_block_layout on pvr VK_KHR_storage_buffer_storage_class on pvr +VK_EXT_external_memory_acquire_unmodified on panvk diff --git a/src/panfrost/vulkan/panvk_vX_cmd_meta.c b/src/panfrost/vulkan/panvk_vX_cmd_meta.c index 41cca7b8001..733629bbcb2 100644 --- a/src/panfrost/vulkan/panvk_vX_cmd_meta.c +++ b/src/panfrost/vulkan/panvk_vX_cmd_meta.c @@ -659,6 +659,20 @@ cmd_clear_afbc_metadata(VkCommandBuffer _cmdbuf, panvk_per_arch(cmd_meta_compute_end)(cmdbuf, &save); } +static bool +panvk_acquire_unmodified(const VkImageMemoryBarrier2 *barrier) +{ + if (barrier->srcQueueFamilyIndex != VK_QUEUE_FAMILY_EXTERNAL && + barrier->srcQueueFamilyIndex != VK_QUEUE_FAMILY_FOREIGN_EXT) + return false; + + const VkExternalMemoryAcquireUnmodifiedEXT *acquire_unmodified = + vk_find_struct_const(barrier->pNext, + EXTERNAL_MEMORY_ACQUIRE_UNMODIFIED_EXT); + return acquire_unmodified && + acquire_unmodified->acquireUnmodifiedMemory == VK_TRUE; +} + /* TODO: pass less data than what's in a VkImageMemoryBarrier2 */ struct panvk_image_layout_transition_handler { @@ -672,7 +686,8 @@ panvk_get_image_layout_transition_handler(const VkImageMemoryBarrier2 *barrier) { VK_FROM_HANDLE(panvk_image, img, barrier->image); - if (barrier->oldLayout == barrier->newLayout) + if (barrier->oldLayout == barrier->newLayout || + panvk_acquire_unmodified(barrier)) return (struct panvk_image_layout_transition_handler){0}; if (barrier->oldLayout == VK_IMAGE_LAYOUT_UNDEFINED && diff --git a/src/panfrost/vulkan/panvk_vX_physical_device.c b/src/panfrost/vulkan/panvk_vX_physical_device.c index 69bdc512eea..10ac39cb9e4 100644 --- a/src/panfrost/vulkan/panvk_vX_physical_device.c +++ b/src/panfrost/vulkan/panvk_vX_physical_device.c @@ -138,6 +138,7 @@ panvk_per_arch(get_physical_device_extensions)( .EXT_descriptor_indexing = PAN_ARCH >= 9, .EXT_extended_dynamic_state = true, .EXT_extended_dynamic_state2 = true, + .EXT_external_memory_acquire_unmodified = true, .EXT_external_memory_dma_buf = true, .EXT_global_priority = true, .EXT_global_priority_query = true,