1 /*
2 * Copyright © 2023 Collabora, Ltd
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21 * IN THE SOFTWARE.
22 */
23 #ifndef VK_SYNCHRONIZATION_H
24 #define VK_SYNCHRONIZATION_H
25
26 #include <vulkan/vulkan_core.h>
27
28 #include <stdbool.h>
29
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33
34 static inline bool
vk_pipeline_stage_flags2_has_graphics_shader(VkPipelineStageFlags2 stages)35 vk_pipeline_stage_flags2_has_graphics_shader(VkPipelineStageFlags2 stages)
36 {
37 return stages & (VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT |
38 VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT |
39 VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT |
40 VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT |
41 VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT |
42 VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT |
43 VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT |
44 VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT |
45 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT |
46 VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT |
47 VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_EXT);
48 }
49
50 static inline bool
vk_pipeline_stage_flags2_has_compute_shader(VkPipelineStageFlags2 stages)51 vk_pipeline_stage_flags2_has_compute_shader(VkPipelineStageFlags2 stages)
52 {
53 return stages & (VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT |
54 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT |
55 VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT |
56 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT);
57 }
58
59 /** Expands pipeline stage group flags
60 *
61 * Some stages like VK_PIPELINE_SHADER_STAGE_2_ALL_GRAPHICS_BIT represent more
62 * than one stage. This helper expands any such bits out to the full set of
63 * individual stages bits they represent.
64 *
65 * Note: This helper does not handle BOTTOM/TOP_OF_PIPE. You probably want to
66 * use vk_expand_src/dst_stage_flags2() instead.
67 */
68 VkPipelineStageFlags2
69 vk_expand_pipeline_stage_flags2(VkPipelineStageFlags2 stages);
70
71 static inline VkPipelineStageFlags2
vk_expand_src_stage_flags2(VkPipelineStageFlags2 stages)72 vk_expand_src_stage_flags2(VkPipelineStageFlags2 stages)
73 {
74 if (stages & VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT)
75 stages |= VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT;
76
77 return vk_expand_pipeline_stage_flags2(stages);
78 }
79
80 static inline VkPipelineStageFlags2
vk_expand_dst_stage_flags2(VkPipelineStageFlags2 stages)81 vk_expand_dst_stage_flags2(VkPipelineStageFlags2 stages)
82 {
83 if (stages & VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT)
84 stages |= VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT;
85
86 return vk_expand_pipeline_stage_flags2(stages);
87 }
88
89 /** Returns the set of read accesses allowed in the given stages */
90 VkAccessFlags2
91 vk_read_access2_for_pipeline_stage_flags2(VkPipelineStageFlags2 stages);
92
93 /** Returns the set of write accesses allowed in the given stages */
94 VkAccessFlags2
95 vk_write_access2_for_pipeline_stage_flags2(VkPipelineStageFlags2 stages);
96
97 VkAccessFlags2
98 vk_expand_src_access_flags2(VkPipelineStageFlags2 stages,
99 VkAccessFlags2 access);
100
101 VkAccessFlags2
102 vk_expand_dst_access_flags2(VkPipelineStageFlags2 stages,
103 VkAccessFlags2 access);
104
105 VkAccessFlags2
106 vk_filter_src_access_flags2(VkPipelineStageFlags2 stages,
107 VkAccessFlags2 access);
108
109 VkAccessFlags2
110 vk_filter_dst_access_flags2(VkPipelineStageFlags2 stages,
111 VkAccessFlags2 access);
112
113 #ifdef __cplusplus
114 }
115 #endif
116
117 #endif /* VK_SYNCHRONIZATION_H */
118