xref: /aosp_15_r20/external/deqp/external/vulkancts/framework/vulkan/vkBarrierUtil.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1 /*-------------------------------------------------------------------------
2  * Vulkan CTS Framework
3  * --------------------
4  *
5  * Copyright (c) 2018 The Khronos Group Inc.
6  * Copyright (c) 2018 Google Inc.
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  *//*!
21  * \file
22  * \brief Utility for generating barriers
23  *//*--------------------------------------------------------------------*/
24 
25 #include "vkBarrierUtil.hpp"
26 
27 namespace vk
28 {
29 
makeBufferMemoryBarrier(const VkAccessFlags srcAccessMask,const VkAccessFlags dstAccessMask,const VkBuffer buffer,const VkDeviceSize offset,const VkDeviceSize bufferSizeBytes,const uint32_t srcQueueFamilyIndex,const uint32_t dstQueueFamilyIndex)30 VkBufferMemoryBarrier makeBufferMemoryBarrier(const VkAccessFlags srcAccessMask, const VkAccessFlags dstAccessMask,
31                                               const VkBuffer buffer, const VkDeviceSize offset,
32                                               const VkDeviceSize bufferSizeBytes, const uint32_t srcQueueFamilyIndex,
33                                               const uint32_t dstQueueFamilyIndex)
34 {
35     return {
36         VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // VkStructureType sType;
37         DE_NULL,                                 // const void* pNext;
38         srcAccessMask,                           // VkAccessFlags srcAccessMask;
39         dstAccessMask,                           // VkAccessFlags dstAccessMask;
40         srcQueueFamilyIndex,                     // uint32_t srcQueueFamilyIndex;
41         dstQueueFamilyIndex,                     // uint32_t destQueueFamilyIndex;
42         buffer,                                  // VkBuffer buffer;
43         offset,                                  // VkDeviceSize offset;
44         bufferSizeBytes,                         // VkDeviceSize size;
45     };
46 }
47 
makeBufferMemoryBarrier2(const VkPipelineStageFlags2KHR srcStageMask,const VkAccessFlags2KHR srcAccessMask,const VkPipelineStageFlags2KHR dstStageMask,const VkAccessFlags2KHR dstAccessMask,const VkBuffer buffer,const VkDeviceSize offset,const VkDeviceSize size,const uint32_t srcQueueFamilyIndex,const uint32_t dstQueueFamilyIndex)48 VkBufferMemoryBarrier2KHR makeBufferMemoryBarrier2(const VkPipelineStageFlags2KHR srcStageMask,
49                                                    const VkAccessFlags2KHR srcAccessMask,
50                                                    const VkPipelineStageFlags2KHR dstStageMask,
51                                                    const VkAccessFlags2KHR dstAccessMask, const VkBuffer buffer,
52                                                    const VkDeviceSize offset, const VkDeviceSize size,
53                                                    const uint32_t srcQueueFamilyIndex,
54                                                    const uint32_t dstQueueFamilyIndex)
55 {
56     return {
57         VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2_KHR, // VkStructureType sType;
58         DE_NULL,                                       // const void* pNext;
59         srcStageMask,                                  // VkPipelineStageFlags2KHR srcStageMask;
60         srcAccessMask,                                 // VkAccessFlags2KHR srcAccessMask;
61         dstStageMask,                                  // VkPipelineStageFlags2KHR dstStageMask;
62         dstAccessMask,                                 // VkAccessFlags2KHR dstAccessMask;
63         srcQueueFamilyIndex,                           // uint32_t srcQueueFamilyIndex;
64         dstQueueFamilyIndex,                           // uint32_t dstQueueFamilyIndex;
65         buffer,                                        // VkBuffer buffer;
66         offset,                                        // VkDeviceSize offset;
67         size                                           // VkDeviceSize size;
68     };
69 }
70 
makeImageMemoryBarrier(const VkAccessFlags srcAccessMask,const VkAccessFlags dstAccessMask,const VkImageLayout oldLayout,const VkImageLayout newLayout,const VkImage image,const VkImageSubresourceRange subresourceRange,const uint32_t srcQueueFamilyIndex,const uint32_t dstQueueFamilyIndex)71 VkImageMemoryBarrier makeImageMemoryBarrier(const VkAccessFlags srcAccessMask, const VkAccessFlags dstAccessMask,
72                                             const VkImageLayout oldLayout, const VkImageLayout newLayout,
73                                             const VkImage image, const VkImageSubresourceRange subresourceRange,
74                                             const uint32_t srcQueueFamilyIndex, const uint32_t dstQueueFamilyIndex)
75 {
76     return {
77         VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType;
78         DE_NULL,                                // const void* pNext;
79         srcAccessMask,                          // VkAccessFlags outputMask;
80         dstAccessMask,                          // VkAccessFlags inputMask;
81         oldLayout,                              // VkImageLayout oldLayout;
82         newLayout,                              // VkImageLayout newLayout;
83         srcQueueFamilyIndex,                    // uint32_t srcQueueFamilyIndex;
84         dstQueueFamilyIndex,                    // uint32_t destQueueFamilyIndex;
85         image,                                  // VkImage image;
86         subresourceRange,                       // VkImageSubresourceRange subresourceRange;
87     };
88 }
89 
makeImageMemoryBarrier2(const VkPipelineStageFlags2KHR srcStageMask,const VkAccessFlags2KHR srcAccessMask,const VkPipelineStageFlags2KHR dstStageMask,const VkAccessFlags2KHR dstAccessMask,const VkImageLayout oldLayout,const VkImageLayout newLayout,const VkImage image,const VkImageSubresourceRange subresourceRange,const uint32_t srcQueueFamilyIndex,const uint32_t dstQueueFamilyIndex)90 VkImageMemoryBarrier2KHR makeImageMemoryBarrier2(const VkPipelineStageFlags2KHR srcStageMask,
91                                                  const VkAccessFlags2KHR srcAccessMask,
92                                                  const VkPipelineStageFlags2KHR dstStageMask,
93                                                  const VkAccessFlags2KHR dstAccessMask, const VkImageLayout oldLayout,
94                                                  const VkImageLayout newLayout, const VkImage image,
95                                                  const VkImageSubresourceRange subresourceRange,
96                                                  const uint32_t srcQueueFamilyIndex, const uint32_t dstQueueFamilyIndex)
97 {
98     return {
99         VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2_KHR, // VkStructureType sType;
100         DE_NULL,                                      // const void* pNext;
101         srcStageMask,                                 // VkPipelineStageFlags2KHR srcStageMask;
102         srcAccessMask,                                // VkAccessFlags2KHR srcAccessMask;
103         dstStageMask,                                 // VkPipelineStageFlags2KHR dstStageMask;
104         dstAccessMask,                                // VkAccessFlags2KHR dstAccessMask;
105         oldLayout,                                    // VkImageLayout oldLayout;
106         newLayout,                                    // VkImageLayout newLayout;
107         srcQueueFamilyIndex,                          // uint32_t srcQueueFamilyIndex;
108         dstQueueFamilyIndex,                          // uint32_t destQueueFamilyIndex;
109         image,                                        // VkImage image;
110         subresourceRange,                             // VkImageSubresourceRange subresourceRange;
111     };
112 }
113 
makeMemoryBarrier(const VkAccessFlags srcAccessMask,const VkAccessFlags dstAccessMask)114 VkMemoryBarrier makeMemoryBarrier(const VkAccessFlags srcAccessMask, const VkAccessFlags dstAccessMask)
115 {
116     return {
117         VK_STRUCTURE_TYPE_MEMORY_BARRIER, // VkStructureType sType;
118         DE_NULL,                          // const void* pNext;
119         srcAccessMask,                    // VkAccessFlags srcAccessMask;
120         dstAccessMask,                    // VkAccessFlags dstAccessMask;
121     };
122 }
123 
makeMemoryBarrier2(const VkPipelineStageFlags2KHR srcStageMask,const VkAccessFlags2KHR srcAccessMask,const VkPipelineStageFlags2KHR dstStageMask,const VkAccessFlags2KHR dstAccessMask)124 VkMemoryBarrier2KHR makeMemoryBarrier2(const VkPipelineStageFlags2KHR srcStageMask,
125                                        const VkAccessFlags2KHR srcAccessMask,
126                                        const VkPipelineStageFlags2KHR dstStageMask,
127                                        const VkAccessFlags2KHR dstAccessMask)
128 {
129     return {
130         VK_STRUCTURE_TYPE_MEMORY_BARRIER_2_KHR, // VkStructureType sType;
131         DE_NULL,                                // const void* pNext;
132         srcStageMask,                           // VkPipelineStageFlags2KHR srcStageMask;
133         srcAccessMask,                          // VkAccessFlags2KHR srcAccessMask;
134         dstStageMask,                           // VkPipelineStageFlags2KHR dstStageMask;
135         dstAccessMask                           // VkAccessFlags2KHR dstAccessMask;
136     };
137 }
138 
cmdPipelineMemoryBarrier(const DeviceInterface & vk,const VkCommandBuffer commandBuffer,const VkPipelineStageFlags srcStageMask,const VkPipelineStageFlags dstStageMask,const VkMemoryBarrier * pMemoryBarriers,const size_t memoryBarrierCount,const VkDependencyFlags dependencyFlags)139 void cmdPipelineMemoryBarrier(const DeviceInterface &vk, const VkCommandBuffer commandBuffer,
140                               const VkPipelineStageFlags srcStageMask, const VkPipelineStageFlags dstStageMask,
141                               const VkMemoryBarrier *pMemoryBarriers, const size_t memoryBarrierCount,
142                               const VkDependencyFlags dependencyFlags)
143 {
144     const uint32_t memoryBarrierCount32 = static_cast<uint32_t>(memoryBarrierCount);
145 
146     DE_ASSERT(memoryBarrierCount == memoryBarrierCount32);
147 
148     vk.cmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount32,
149                           pMemoryBarriers, 0u, DE_NULL, 0u, DE_NULL);
150 }
151 
cmdPipelineBufferMemoryBarrier(const DeviceInterface & vk,const VkCommandBuffer commandBuffer,const VkPipelineStageFlags srcStageMask,const VkPipelineStageFlags dstStageMask,const VkBufferMemoryBarrier * pBufferMemoryBarriers,const size_t bufferMemoryBarrierCount,const VkDependencyFlags dependencyFlags)152 void cmdPipelineBufferMemoryBarrier(const DeviceInterface &vk, const VkCommandBuffer commandBuffer,
153                                     const VkPipelineStageFlags srcStageMask, const VkPipelineStageFlags dstStageMask,
154                                     const VkBufferMemoryBarrier *pBufferMemoryBarriers,
155                                     const size_t bufferMemoryBarrierCount, const VkDependencyFlags dependencyFlags)
156 {
157     const uint32_t bufferMemoryBarrierCount32 = static_cast<uint32_t>(bufferMemoryBarrierCount);
158 
159     DE_ASSERT(bufferMemoryBarrierCount == bufferMemoryBarrierCount32);
160 
161     vk.cmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, 0u, DE_NULL,
162                           bufferMemoryBarrierCount32, pBufferMemoryBarriers, 0u, DE_NULL);
163 }
164 
cmdPipelineImageMemoryBarrier(const DeviceInterface & vk,const VkCommandBuffer commandBuffer,const VkPipelineStageFlags srcStageMask,const VkPipelineStageFlags dstStageMask,const VkImageMemoryBarrier * pImageMemoryBarriers,const size_t imageMemoryBarrierCount,const VkDependencyFlags dependencyFlags)165 void cmdPipelineImageMemoryBarrier(const DeviceInterface &vk, const VkCommandBuffer commandBuffer,
166                                    const VkPipelineStageFlags srcStageMask, const VkPipelineStageFlags dstStageMask,
167                                    const VkImageMemoryBarrier *pImageMemoryBarriers,
168                                    const size_t imageMemoryBarrierCount, const VkDependencyFlags dependencyFlags)
169 {
170     const uint32_t imageMemoryBarrierCount32 = static_cast<uint32_t>(imageMemoryBarrierCount);
171 
172     DE_ASSERT(imageMemoryBarrierCount == imageMemoryBarrierCount32);
173 
174     vk.cmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, 0u, DE_NULL, 0u, DE_NULL,
175                           imageMemoryBarrierCount32, pImageMemoryBarriers);
176 }
177 } // namespace vk
178