xref: /aosp_15_r20/external/mesa3d/src/vulkan/runtime/vk_synchronization.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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