Module: Mesa
Branch: main
Commit: 44add595af895986c4732f8c90f7ec567d6d04ba
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=44add595af895986c4732f8c90f7ec567d6d04ba

Author: Faith Ekstrand <faith.ekstr...@collabora.com>
Date:   Thu Nov 30 18:08:04 2023 -0600

vulkan: Add helpers for pipeline stage flags

This adds hand-written helpers for detecting if a set of stage flags
contains shaders as well as expand helpers that properly handle
TOP/BOTTOM_OF_PIPE_BIT.

Reviewed-by: Lionel Landwerlin <lionel.g.landwer...@intel.com>
Reviewed-by: Konstantin Seurer <konstantin.seu...@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26407>

---

 src/vulkan/runtime/vk_synchronization.c |  2 ++
 src/vulkan/runtime/vk_synchronization.h | 46 +++++++++++++++++++++++++++++++++
 2 files changed, 48 insertions(+)

diff --git a/src/vulkan/runtime/vk_synchronization.c 
b/src/vulkan/runtime/vk_synchronization.c
index 8fb1d102141..e64472772f7 100644
--- a/src/vulkan/runtime/vk_synchronization.c
+++ b/src/vulkan/runtime/vk_synchronization.c
@@ -21,6 +21,8 @@
  * IN THE SOFTWARE.
  */
 
+#include "vk_synchronization.h"
+
 #include "vk_alloc.h"
 #include "vk_command_buffer.h"
 #include "vk_common_entrypoints.h"
diff --git a/src/vulkan/runtime/vk_synchronization.h 
b/src/vulkan/runtime/vk_synchronization.h
index da1565060e9..95c3f6681f5 100644
--- a/src/vulkan/runtime/vk_synchronization.h
+++ b/src/vulkan/runtime/vk_synchronization.h
@@ -31,15 +31,61 @@
 extern "C" {
 #endif
 
+static inline bool
+vk_pipeline_stage_flags2_has_graphics_shader(VkPipelineStageFlags2 stages)
+{
+   return stages & (VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT |
+                    VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT |
+                    VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT |
+                    VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT |
+                    VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT |
+                    VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT |
+                    VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT |
+                    VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT |
+                    VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT |
+                    VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT |
+                    VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_EXT);
+}
+
+static inline bool
+vk_pipeline_stage_flags2_has_compute_shader(VkPipelineStageFlags2 stages)
+{
+   return stages & (VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT |
+                    VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT |
+                    VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT |
+                    VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT);
+}
+
 /** Expands pipeline stage group flags
  *
  * Some stages like VK_PIPELINE_SHADER_STAGE_2_ALL_GRAPHICS_BIT represent more
  * than one stage.  This helper expands any such bits out to the full set of
  * individual stages bits they represent.
+ *
+ * Note: This helper does not handle BOTTOM/TOP_OF_PIPE.  You probably want to
+ * use vk_expand_src/dst_stage_flags2() instead.
  */
 VkPipelineStageFlags2
 vk_expand_pipeline_stage_flags2(VkPipelineStageFlags2 stages);
 
+static inline VkPipelineStageFlags2
+vk_expand_src_stage_flags2(VkPipelineStageFlags2 stages)
+{
+   if (stages & VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT)
+      stages |= VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT;
+
+   return vk_expand_pipeline_stage_flags2(stages);
+}
+
+static inline VkPipelineStageFlags2
+vk_expand_dst_stage_flags2(VkPipelineStageFlags2 stages)
+{
+   if (stages & VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT)
+      stages |= VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT;
+
+   return vk_expand_pipeline_stage_flags2(stages);
+}
+
 /** Returns the set of read accesses allowed in the given stages */
 VkAccessFlags2
 vk_read_access2_for_pipeline_stage_flags2(VkPipelineStageFlags2 stages);

Reply via email to