From b0fa138c86bd2f483e9a6bf7c0e1759241a6b49d Mon Sep 17 00:00:00 2001 From: Konstantin Seurer Date: Thu, 23 May 2024 11:42:08 +0200 Subject: [PATCH] vulkan: Add vk_expand_(dst|src)_access_flags2 Those helpers do not filter out dead access bits to keep synchronization conservative. Reviewed-by: Samuel Pitoiset Part-of: --- src/vulkan/runtime/vk_synchronization.c | 46 ++++++++++++++++--------- src/vulkan/runtime/vk_synchronization.h | 8 +++++ 2 files changed, 38 insertions(+), 16 deletions(-) diff --git a/src/vulkan/runtime/vk_synchronization.c b/src/vulkan/runtime/vk_synchronization.c index 701474164e4..7013ace2063 100644 --- a/src/vulkan/runtime/vk_synchronization.c +++ b/src/vulkan/runtime/vk_synchronization.c @@ -31,6 +31,34 @@ #include "vk_util.h" #include "../wsi/wsi_common.h" +VkAccessFlags2 +vk_expand_src_access_flags2(VkPipelineStageFlags2 stages, + VkAccessFlags2 access) +{ + if (access & VK_ACCESS_2_MEMORY_WRITE_BIT) + access |= vk_write_access2_for_pipeline_stage_flags2(stages);; + + if (access & VK_ACCESS_2_SHADER_WRITE_BIT) + access |= VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT; + + return access; +} + +VkAccessFlags2 +vk_expand_dst_access_flags2(VkPipelineStageFlags2 stages, + VkAccessFlags2 access) +{ + if (access & VK_ACCESS_2_MEMORY_READ_BIT) + access |= vk_read_access2_for_pipeline_stage_flags2(stages); + + if (access & VK_ACCESS_2_SHADER_READ_BIT) + access |= VK_ACCESS_2_SHADER_SAMPLED_READ_BIT | + VK_ACCESS_2_SHADER_STORAGE_READ_BIT | + VK_ACCESS_2_SHADER_BINDING_TABLE_READ_BIT_KHR; + + return access; +} + VkAccessFlags2 vk_filter_src_access_flags2(VkPipelineStageFlags2 stages, VkAccessFlags2 access) @@ -38,14 +66,8 @@ vk_filter_src_access_flags2(VkPipelineStageFlags2 stages, const VkPipelineStageFlags2 all_write_access = vk_write_access2_for_pipeline_stage_flags2(stages); - if (access & VK_ACCESS_2_MEMORY_WRITE_BIT) - access |= all_write_access; - - if (access & VK_ACCESS_2_SHADER_WRITE_BIT) - access |= VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT; - /* We only care about write access in src flags */ - return access & all_write_access; + return vk_expand_src_access_flags2(stages, access) & all_write_access; } VkAccessFlags2 @@ -55,16 +77,8 @@ vk_filter_dst_access_flags2(VkPipelineStageFlags2 stages, const VkPipelineStageFlags2 all_read_access = vk_read_access2_for_pipeline_stage_flags2(stages); - if (access & VK_ACCESS_2_MEMORY_READ_BIT) - access |= all_read_access; - - if (access & VK_ACCESS_2_SHADER_READ_BIT) - access |= VK_ACCESS_2_SHADER_SAMPLED_READ_BIT | - VK_ACCESS_2_SHADER_STORAGE_READ_BIT | - VK_ACCESS_2_SHADER_BINDING_TABLE_READ_BIT_KHR; - /* We only care about read access in dst flags */ - return access & all_read_access; + return vk_expand_dst_access_flags2(stages, access) & all_read_access; } VKAPI_ATTR void VKAPI_CALL diff --git a/src/vulkan/runtime/vk_synchronization.h b/src/vulkan/runtime/vk_synchronization.h index 5c3fd1f4992..0ffbc2d3b20 100644 --- a/src/vulkan/runtime/vk_synchronization.h +++ b/src/vulkan/runtime/vk_synchronization.h @@ -94,6 +94,14 @@ vk_read_access2_for_pipeline_stage_flags2(VkPipelineStageFlags2 stages); VkAccessFlags2 vk_write_access2_for_pipeline_stage_flags2(VkPipelineStageFlags2 stages); +VkAccessFlags2 +vk_expand_src_access_flags2(VkPipelineStageFlags2 stages, + VkAccessFlags2 access); + +VkAccessFlags2 +vk_expand_dst_access_flags2(VkPipelineStageFlags2 stages, + VkAccessFlags2 access); + VkAccessFlags2 vk_filter_src_access_flags2(VkPipelineStageFlags2 stages, VkAccessFlags2 access);