xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/vulkan/VulkanSecondaryCommandBuffer.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1 //
2 // Copyright 2021 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 // VulkanSecondaryCommandBuffer:
7 //    A class wrapping a Vulkan command buffer for use as a secondary command buffer.
8 //
9 
10 #ifndef LIBANGLE_RENDERER_VULKAN_VULKANSECONDARYCOMMANDBUFFERVK_H_
11 #define LIBANGLE_RENDERER_VULKAN_VULKANSECONDARYCOMMANDBUFFERVK_H_
12 
13 #include "common/vulkan/vk_headers.h"
14 #include "libANGLE/renderer/vulkan/vk_command_buffer_utils.h"
15 #include "libANGLE/renderer/vulkan/vk_wrapper.h"
16 
17 namespace angle
18 {
19 class PoolAllocator;
20 class SharedRingBufferAllocator;
21 }  // namespace angle
22 
23 #if ANGLE_ENABLE_VULKAN_SHARED_RING_BUFFER_CMD_ALLOC
24 using SecondaryCommandMemoryAllocator = angle::SharedRingBufferAllocator;
25 #else
26 using SecondaryCommandMemoryAllocator = angle::PoolAllocator;
27 #endif
28 
29 namespace rx
30 {
31 class ContextVk;
32 
33 namespace vk
34 {
35 class Context;
36 class RenderPassDesc;
37 class SecondaryCommandPool;
38 
39 class VulkanSecondaryCommandBuffer : public priv::CommandBuffer
40 {
41   public:
42     VulkanSecondaryCommandBuffer() = default;
43 
44     static angle::Result InitializeCommandPool(Context *context,
45                                                SecondaryCommandPool *pool,
46                                                uint32_t queueFamilyIndex,
47                                                ProtectionType protectionType);
48     static angle::Result InitializeRenderPassInheritanceInfo(
49         ContextVk *contextVk,
50         const Framebuffer &framebuffer,
51         const RenderPassDesc &renderPassDesc,
52         VkCommandBufferInheritanceInfo *inheritanceInfoOut,
53         VkCommandBufferInheritanceRenderingInfo *renderingInfoOut,
54         gl::DrawBuffersArray<VkFormat> *colorFormatStorageOut);
55 
56     angle::Result initialize(Context *context,
57                              SecondaryCommandPool *pool,
58                              bool isRenderPassCommandBuffer,
59                              SecondaryCommandMemoryAllocator *allocator);
60 
61     void destroy();
62 
attachAllocator(SecondaryCommandMemoryAllocator * source)63     void attachAllocator(SecondaryCommandMemoryAllocator *source) {}
64 
detachAllocator(SecondaryCommandMemoryAllocator * destination)65     void detachAllocator(SecondaryCommandMemoryAllocator *destination) {}
66 
67     angle::Result begin(Context *context, const VkCommandBufferInheritanceInfo &inheritanceInfo);
68     angle::Result end(Context *context);
69     VkResult reset();
70 
executeCommands(PrimaryCommandBuffer * primary)71     void executeCommands(PrimaryCommandBuffer *primary) { primary->executeCommands(1, this); }
72 
73     void beginQuery(const QueryPool &queryPool, uint32_t query, VkQueryControlFlags flags);
74 
75     void blitImage(const Image &srcImage,
76                    VkImageLayout srcImageLayout,
77                    const Image &dstImage,
78                    VkImageLayout dstImageLayout,
79                    uint32_t regionCount,
80                    const VkImageBlit *regions,
81                    VkFilter filter);
82 
83     void clearColorImage(const Image &image,
84                          VkImageLayout imageLayout,
85                          const VkClearColorValue &color,
86                          uint32_t rangeCount,
87                          const VkImageSubresourceRange *ranges);
88     void clearDepthStencilImage(const Image &image,
89                                 VkImageLayout imageLayout,
90                                 const VkClearDepthStencilValue &depthStencil,
91                                 uint32_t rangeCount,
92                                 const VkImageSubresourceRange *ranges);
93 
94     void clearAttachments(uint32_t attachmentCount,
95                           const VkClearAttachment *attachments,
96                           uint32_t rectCount,
97                           const VkClearRect *rects);
98 
99     void copyBuffer(const Buffer &srcBuffer,
100                     const Buffer &destBuffer,
101                     uint32_t regionCount,
102                     const VkBufferCopy *regions);
103 
104     void copyBufferToImage(VkBuffer srcBuffer,
105                            const Image &dstImage,
106                            VkImageLayout dstImageLayout,
107                            uint32_t regionCount,
108                            const VkBufferImageCopy *regions);
109     void copyImageToBuffer(const Image &srcImage,
110                            VkImageLayout srcImageLayout,
111                            VkBuffer dstBuffer,
112                            uint32_t regionCount,
113                            const VkBufferImageCopy *regions);
114     void copyImage(const Image &srcImage,
115                    VkImageLayout srcImageLayout,
116                    const Image &dstImage,
117                    VkImageLayout dstImageLayout,
118                    uint32_t regionCount,
119                    const VkImageCopy *regions);
120 
121     void dispatch(uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ);
122     void dispatchIndirect(const Buffer &buffer, VkDeviceSize offset);
123 
124     void draw(uint32_t vertexCount,
125               uint32_t instanceCount,
126               uint32_t firstVertex,
127               uint32_t firstInstance);
128     void draw(uint32_t vertexCount, uint32_t firstVertex);
129     void drawInstanced(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex);
130     void drawInstancedBaseInstance(uint32_t vertexCount,
131                                    uint32_t instanceCount,
132                                    uint32_t firstVertex,
133                                    uint32_t firstInstance);
134     void drawIndexed(uint32_t indexCount,
135                      uint32_t instanceCount,
136                      uint32_t firstIndex,
137                      int32_t vertexOffset,
138                      uint32_t firstInstance);
139     void drawIndexed(uint32_t indexCount);
140     void drawIndexedBaseVertex(uint32_t indexCount, uint32_t vertexOffset);
141     void drawIndexedInstanced(uint32_t indexCount, uint32_t instanceCount);
142     void drawIndexedInstancedBaseVertex(uint32_t indexCount,
143                                         uint32_t instanceCount,
144                                         uint32_t vertexOffset);
145     void drawIndexedInstancedBaseVertexBaseInstance(uint32_t indexCount,
146                                                     uint32_t instanceCount,
147                                                     uint32_t firstIndex,
148                                                     int32_t vertexOffset,
149                                                     uint32_t firstInstance);
150     void drawIndexedIndirect(const Buffer &buffer,
151                              VkDeviceSize offset,
152                              uint32_t drawCount,
153                              uint32_t stride);
154     void drawIndirect(const Buffer &buffer,
155                       VkDeviceSize offset,
156                       uint32_t drawCount,
157                       uint32_t stride);
158 
159     void endQuery(const QueryPool &queryPool, uint32_t query);
160 
161     void fillBuffer(const Buffer &dstBuffer,
162                     VkDeviceSize dstOffset,
163                     VkDeviceSize size,
164                     uint32_t data);
165 
166     void executionBarrier(VkPipelineStageFlags stageMask);
167 
168     void bufferBarrier(VkPipelineStageFlags srcStageMask,
169                        VkPipelineStageFlags dstStageMask,
170                        const VkBufferMemoryBarrier *bufferMemoryBarrier);
171 
172     void bufferBarrier2(const VkBufferMemoryBarrier2 *bufferMemoryBarrier2);
173 
174     void imageBarrier(VkPipelineStageFlags srcStageMask,
175                       VkPipelineStageFlags dstStageMask,
176                       const VkImageMemoryBarrier &imageMemoryBarrier);
177 
178     void imageBarrier2(const VkImageMemoryBarrier2 &imageMemoryBarrier2);
179 
180     void imageWaitEvent(const VkEvent &event,
181                         VkPipelineStageFlags srcStageMask,
182                         VkPipelineStageFlags dstStageMask,
183                         const VkImageMemoryBarrier &imageMemoryBarrier);
184 
185     void memoryBarrier(VkPipelineStageFlags srcStageMask,
186                        VkPipelineStageFlags dstStageMask,
187                        const VkMemoryBarrier &memoryBarrier);
188 
189     void memoryBarrier2(const VkMemoryBarrier2 &memoryBarrier);
190 
191     void nextSubpass(VkSubpassContents subpassContents);
192 
193     void pipelineBarrier(VkPipelineStageFlags srcStageMask,
194                          VkPipelineStageFlags dstStageMask,
195                          VkDependencyFlags dependencyFlags,
196                          uint32_t memoryBarrierCount,
197                          const VkMemoryBarrier *memoryBarriers,
198                          uint32_t bufferMemoryBarrierCount,
199                          const VkBufferMemoryBarrier *bufferMemoryBarriers,
200                          uint32_t imageMemoryBarrierCount,
201                          const VkImageMemoryBarrier *imageMemoryBarriers);
202 
203     void pipelineBarrier2(VkDependencyFlags dependencyFlags,
204                           uint32_t memoryBarrierCount,
205                           const VkMemoryBarrier2 *memoryBarriers2,
206                           uint32_t bufferMemoryBarrierCount,
207                           const VkBufferMemoryBarrier2 *bufferMemoryBarriers2,
208                           uint32_t imageMemoryBarrierCount,
209                           const VkImageMemoryBarrier2 *imageMemoryBarriers2);
210 
211     void pushConstants(const PipelineLayout &layout,
212                        VkShaderStageFlags flag,
213                        uint32_t offset,
214                        uint32_t size,
215                        const void *data);
216 
217     void setEvent(VkEvent event, VkPipelineStageFlags stageMask);
218     void setVertexInput(uint32_t vertexBindingDescriptionCount,
219                         const VkVertexInputBindingDescription2EXT *vertexBindingDescriptions,
220                         uint32_t vertexAttributeDescriptionCount,
221                         const VkVertexInputAttributeDescription2EXT *vertexAttributeDescriptions);
222     void resetEvent(VkEvent event, VkPipelineStageFlags stageMask);
223     void resetQueryPool(const QueryPool &queryPool, uint32_t firstQuery, uint32_t queryCount);
224     void resolveImage(const Image &srcImage,
225                       VkImageLayout srcImageLayout,
226                       const Image &dstImage,
227                       VkImageLayout dstImageLayout,
228                       uint32_t regionCount,
229                       const VkImageResolve *regions);
230     void waitEvents(uint32_t eventCount,
231                     const VkEvent *events,
232                     VkPipelineStageFlags srcStageMask,
233                     VkPipelineStageFlags dstStageMask,
234                     uint32_t memoryBarrierCount,
235                     const VkMemoryBarrier *memoryBarriers,
236                     uint32_t bufferMemoryBarrierCount,
237                     const VkBufferMemoryBarrier *bufferMemoryBarriers,
238                     uint32_t imageMemoryBarrierCount,
239                     const VkImageMemoryBarrier *imageMemoryBarriers);
240 
241     void writeTimestamp(VkPipelineStageFlagBits pipelineStage,
242                         const QueryPool &queryPool,
243                         uint32_t query);
244 
245     void writeTimestamp2(VkPipelineStageFlagBits2 pipelineStage,
246                          const QueryPool &queryPool,
247                          uint32_t query);
248 
249     // VK_EXT_transform_feedback
250     void beginTransformFeedback(uint32_t firstCounterBuffer,
251                                 uint32_t counterBufferCount,
252                                 const VkBuffer *counterBuffers,
253                                 const VkDeviceSize *counterBufferOffsets);
254     void endTransformFeedback(uint32_t firstCounterBuffer,
255                               uint32_t counterBufferCount,
256                               const VkBuffer *counterBuffers,
257                               const VkDeviceSize *counterBufferOffsets);
258 
259     // VK_EXT_debug_utils
260     void beginDebugUtilsLabelEXT(const VkDebugUtilsLabelEXT &labelInfo);
261     void endDebugUtilsLabelEXT();
262     void insertDebugUtilsLabelEXT(const VkDebugUtilsLabelEXT &labelInfo);
263 
open()264     void open() const {}
close()265     void close() const {}
empty()266     bool empty() const
267     {
268         ASSERT(valid());
269         return !mAnyCommand;
270     }
getRenderPassWriteCommandCount()271     uint32_t getRenderPassWriteCommandCount() const
272     {
273         ASSERT(valid());
274         return mCommandTracker.getRenderPassWriteCommandCount();
275     }
dumpCommands(const char * separator)276     std::string dumpCommands(const char *separator) const { return ""; }
277 
278   private:
onRecordCommand()279     void onRecordCommand() { mAnyCommand = true; }
280 
281     SecondaryCommandPool *mCommandPool = nullptr;
282     CommandBufferCommandTracker mCommandTracker;
283     bool mAnyCommand = false;
284 };
285 
blitImage(const Image & srcImage,VkImageLayout srcImageLayout,const Image & dstImage,VkImageLayout dstImageLayout,uint32_t regionCount,const VkImageBlit * regions,VkFilter filter)286 ANGLE_INLINE void VulkanSecondaryCommandBuffer::blitImage(const Image &srcImage,
287                                                           VkImageLayout srcImageLayout,
288                                                           const Image &dstImage,
289                                                           VkImageLayout dstImageLayout,
290                                                           uint32_t regionCount,
291                                                           const VkImageBlit *regions,
292                                                           VkFilter filter)
293 {
294     onRecordCommand();
295     CommandBuffer::blitImage(srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
296                              regions, filter);
297 }
298 
beginQuery(const QueryPool & queryPool,uint32_t query,VkQueryControlFlags flags)299 ANGLE_INLINE void VulkanSecondaryCommandBuffer::beginQuery(const QueryPool &queryPool,
300                                                            uint32_t query,
301                                                            VkQueryControlFlags flags)
302 {
303     onRecordCommand();
304     CommandBuffer::beginQuery(queryPool, query, flags);
305 }
306 
endQuery(const QueryPool & queryPool,uint32_t query)307 ANGLE_INLINE void VulkanSecondaryCommandBuffer::endQuery(const QueryPool &queryPool, uint32_t query)
308 {
309     onRecordCommand();
310     CommandBuffer::endQuery(queryPool, query);
311 }
312 
writeTimestamp(VkPipelineStageFlagBits pipelineStage,const QueryPool & queryPool,uint32_t query)313 ANGLE_INLINE void VulkanSecondaryCommandBuffer::writeTimestamp(
314     VkPipelineStageFlagBits pipelineStage,
315     const QueryPool &queryPool,
316     uint32_t query)
317 {
318     onRecordCommand();
319     CommandBuffer::writeTimestamp(pipelineStage, queryPool, query);
320 }
321 
writeTimestamp2(VkPipelineStageFlagBits2 pipelineStage,const QueryPool & queryPool,uint32_t query)322 ANGLE_INLINE void VulkanSecondaryCommandBuffer::writeTimestamp2(
323     VkPipelineStageFlagBits2 pipelineStage,
324     const QueryPool &queryPool,
325     uint32_t query)
326 {
327     onRecordCommand();
328     CommandBuffer::writeTimestamp2(pipelineStage, queryPool, query);
329 }
330 
clearColorImage(const Image & image,VkImageLayout imageLayout,const VkClearColorValue & color,uint32_t rangeCount,const VkImageSubresourceRange * ranges)331 ANGLE_INLINE void VulkanSecondaryCommandBuffer::clearColorImage(
332     const Image &image,
333     VkImageLayout imageLayout,
334     const VkClearColorValue &color,
335     uint32_t rangeCount,
336     const VkImageSubresourceRange *ranges)
337 {
338     onRecordCommand();
339     CommandBuffer::clearColorImage(image, imageLayout, color, rangeCount, ranges);
340 }
341 
clearDepthStencilImage(const Image & image,VkImageLayout imageLayout,const VkClearDepthStencilValue & depthStencil,uint32_t rangeCount,const VkImageSubresourceRange * ranges)342 ANGLE_INLINE void VulkanSecondaryCommandBuffer::clearDepthStencilImage(
343     const Image &image,
344     VkImageLayout imageLayout,
345     const VkClearDepthStencilValue &depthStencil,
346     uint32_t rangeCount,
347     const VkImageSubresourceRange *ranges)
348 {
349     onRecordCommand();
350     CommandBuffer::clearDepthStencilImage(image, imageLayout, depthStencil, rangeCount, ranges);
351 }
352 
clearAttachments(uint32_t attachmentCount,const VkClearAttachment * attachments,uint32_t rectCount,const VkClearRect * rects)353 ANGLE_INLINE void VulkanSecondaryCommandBuffer::clearAttachments(
354     uint32_t attachmentCount,
355     const VkClearAttachment *attachments,
356     uint32_t rectCount,
357     const VkClearRect *rects)
358 {
359     onRecordCommand();
360     mCommandTracker.onClearAttachments();
361     CommandBuffer::clearAttachments(attachmentCount, attachments, rectCount, rects);
362 }
363 
copyBuffer(const Buffer & srcBuffer,const Buffer & destBuffer,uint32_t regionCount,const VkBufferCopy * regions)364 ANGLE_INLINE void VulkanSecondaryCommandBuffer::copyBuffer(const Buffer &srcBuffer,
365                                                            const Buffer &destBuffer,
366                                                            uint32_t regionCount,
367                                                            const VkBufferCopy *regions)
368 {
369     onRecordCommand();
370     CommandBuffer::copyBuffer(srcBuffer, destBuffer, regionCount, regions);
371 }
372 
copyBufferToImage(VkBuffer srcBuffer,const Image & dstImage,VkImageLayout dstImageLayout,uint32_t regionCount,const VkBufferImageCopy * regions)373 ANGLE_INLINE void VulkanSecondaryCommandBuffer::copyBufferToImage(VkBuffer srcBuffer,
374                                                                   const Image &dstImage,
375                                                                   VkImageLayout dstImageLayout,
376                                                                   uint32_t regionCount,
377                                                                   const VkBufferImageCopy *regions)
378 {
379     onRecordCommand();
380     CommandBuffer::copyBufferToImage(srcBuffer, dstImage, dstImageLayout, regionCount, regions);
381 }
382 
copyImageToBuffer(const Image & srcImage,VkImageLayout srcImageLayout,VkBuffer dstBuffer,uint32_t regionCount,const VkBufferImageCopy * regions)383 ANGLE_INLINE void VulkanSecondaryCommandBuffer::copyImageToBuffer(const Image &srcImage,
384                                                                   VkImageLayout srcImageLayout,
385                                                                   VkBuffer dstBuffer,
386                                                                   uint32_t regionCount,
387                                                                   const VkBufferImageCopy *regions)
388 {
389     onRecordCommand();
390     CommandBuffer::copyImageToBuffer(srcImage, srcImageLayout, dstBuffer, regionCount, regions);
391 }
392 
copyImage(const Image & srcImage,VkImageLayout srcImageLayout,const Image & dstImage,VkImageLayout dstImageLayout,uint32_t regionCount,const VkImageCopy * regions)393 ANGLE_INLINE void VulkanSecondaryCommandBuffer::copyImage(const Image &srcImage,
394                                                           VkImageLayout srcImageLayout,
395                                                           const Image &dstImage,
396                                                           VkImageLayout dstImageLayout,
397                                                           uint32_t regionCount,
398                                                           const VkImageCopy *regions)
399 {
400     onRecordCommand();
401     CommandBuffer::copyImage(srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
402                              regions);
403 }
404 
draw(uint32_t vertexCount,uint32_t instanceCount,uint32_t firstVertex,uint32_t firstInstance)405 ANGLE_INLINE void VulkanSecondaryCommandBuffer::draw(uint32_t vertexCount,
406                                                      uint32_t instanceCount,
407                                                      uint32_t firstVertex,
408                                                      uint32_t firstInstance)
409 {
410     onRecordCommand();
411     mCommandTracker.onDraw();
412     CommandBuffer::draw(vertexCount, instanceCount, firstVertex, firstInstance);
413 }
414 
draw(uint32_t vertexCount,uint32_t firstVertex)415 ANGLE_INLINE void VulkanSecondaryCommandBuffer::draw(uint32_t vertexCount, uint32_t firstVertex)
416 {
417     onRecordCommand();
418     mCommandTracker.onDraw();
419     CommandBuffer::draw(vertexCount, 1, firstVertex, 0);
420 }
421 
drawInstanced(uint32_t vertexCount,uint32_t instanceCount,uint32_t firstVertex)422 ANGLE_INLINE void VulkanSecondaryCommandBuffer::drawInstanced(uint32_t vertexCount,
423                                                               uint32_t instanceCount,
424                                                               uint32_t firstVertex)
425 {
426     onRecordCommand();
427     mCommandTracker.onDraw();
428     CommandBuffer::draw(vertexCount, instanceCount, firstVertex, 0);
429 }
430 
drawInstancedBaseInstance(uint32_t vertexCount,uint32_t instanceCount,uint32_t firstVertex,uint32_t firstInstance)431 ANGLE_INLINE void VulkanSecondaryCommandBuffer::drawInstancedBaseInstance(uint32_t vertexCount,
432                                                                           uint32_t instanceCount,
433                                                                           uint32_t firstVertex,
434                                                                           uint32_t firstInstance)
435 {
436     onRecordCommand();
437     mCommandTracker.onDraw();
438     CommandBuffer::draw(vertexCount, instanceCount, firstVertex, firstInstance);
439 }
440 
drawIndexed(uint32_t indexCount,uint32_t instanceCount,uint32_t firstIndex,int32_t vertexOffset,uint32_t firstInstance)441 ANGLE_INLINE void VulkanSecondaryCommandBuffer::drawIndexed(uint32_t indexCount,
442                                                             uint32_t instanceCount,
443                                                             uint32_t firstIndex,
444                                                             int32_t vertexOffset,
445                                                             uint32_t firstInstance)
446 {
447     onRecordCommand();
448     mCommandTracker.onDraw();
449     CommandBuffer::drawIndexed(indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
450 }
451 
drawIndexed(uint32_t indexCount)452 ANGLE_INLINE void VulkanSecondaryCommandBuffer::drawIndexed(uint32_t indexCount)
453 {
454     onRecordCommand();
455     mCommandTracker.onDraw();
456     CommandBuffer::drawIndexed(indexCount, 1, 0, 0, 0);
457 }
458 
drawIndexedBaseVertex(uint32_t indexCount,uint32_t vertexOffset)459 ANGLE_INLINE void VulkanSecondaryCommandBuffer::drawIndexedBaseVertex(uint32_t indexCount,
460                                                                       uint32_t vertexOffset)
461 {
462     onRecordCommand();
463     mCommandTracker.onDraw();
464     CommandBuffer::drawIndexed(indexCount, 1, 0, vertexOffset, 0);
465 }
466 
drawIndexedInstanced(uint32_t indexCount,uint32_t instanceCount)467 ANGLE_INLINE void VulkanSecondaryCommandBuffer::drawIndexedInstanced(uint32_t indexCount,
468                                                                      uint32_t instanceCount)
469 {
470     onRecordCommand();
471     mCommandTracker.onDraw();
472     CommandBuffer::drawIndexed(indexCount, instanceCount, 0, 0, 0);
473 }
474 
drawIndexedInstancedBaseVertex(uint32_t indexCount,uint32_t instanceCount,uint32_t vertexOffset)475 ANGLE_INLINE void VulkanSecondaryCommandBuffer::drawIndexedInstancedBaseVertex(
476     uint32_t indexCount,
477     uint32_t instanceCount,
478     uint32_t vertexOffset)
479 {
480     onRecordCommand();
481     mCommandTracker.onDraw();
482     CommandBuffer::drawIndexed(indexCount, instanceCount, 0, vertexOffset, 0);
483 }
484 
drawIndexedInstancedBaseVertexBaseInstance(uint32_t indexCount,uint32_t instanceCount,uint32_t firstIndex,int32_t vertexOffset,uint32_t firstInstance)485 ANGLE_INLINE void VulkanSecondaryCommandBuffer::drawIndexedInstancedBaseVertexBaseInstance(
486     uint32_t indexCount,
487     uint32_t instanceCount,
488     uint32_t firstIndex,
489     int32_t vertexOffset,
490     uint32_t firstInstance)
491 {
492     onRecordCommand();
493     mCommandTracker.onDraw();
494     CommandBuffer::drawIndexed(indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
495 }
496 
drawIndexedIndirect(const Buffer & buffer,VkDeviceSize offset,uint32_t drawCount,uint32_t stride)497 ANGLE_INLINE void VulkanSecondaryCommandBuffer::drawIndexedIndirect(const Buffer &buffer,
498                                                                     VkDeviceSize offset,
499                                                                     uint32_t drawCount,
500                                                                     uint32_t stride)
501 {
502     onRecordCommand();
503     mCommandTracker.onDraw();
504     CommandBuffer::drawIndexedIndirect(buffer, offset, drawCount, stride);
505 }
506 
drawIndirect(const Buffer & buffer,VkDeviceSize offset,uint32_t drawCount,uint32_t stride)507 ANGLE_INLINE void VulkanSecondaryCommandBuffer::drawIndirect(const Buffer &buffer,
508                                                              VkDeviceSize offset,
509                                                              uint32_t drawCount,
510                                                              uint32_t stride)
511 {
512     onRecordCommand();
513     mCommandTracker.onDraw();
514     CommandBuffer::drawIndirect(buffer, offset, drawCount, stride);
515 }
516 
dispatch(uint32_t groupCountX,uint32_t groupCountY,uint32_t groupCountZ)517 ANGLE_INLINE void VulkanSecondaryCommandBuffer::dispatch(uint32_t groupCountX,
518                                                          uint32_t groupCountY,
519                                                          uint32_t groupCountZ)
520 {
521     onRecordCommand();
522     CommandBuffer::dispatch(groupCountX, groupCountY, groupCountZ);
523 }
524 
dispatchIndirect(const Buffer & buffer,VkDeviceSize offset)525 ANGLE_INLINE void VulkanSecondaryCommandBuffer::dispatchIndirect(const Buffer &buffer,
526                                                                  VkDeviceSize offset)
527 {
528     onRecordCommand();
529     CommandBuffer::dispatchIndirect(buffer, offset);
530 }
531 
fillBuffer(const Buffer & dstBuffer,VkDeviceSize dstOffset,VkDeviceSize size,uint32_t data)532 ANGLE_INLINE void VulkanSecondaryCommandBuffer::fillBuffer(const Buffer &dstBuffer,
533                                                            VkDeviceSize dstOffset,
534                                                            VkDeviceSize size,
535                                                            uint32_t data)
536 {
537     onRecordCommand();
538     CommandBuffer::fillBuffer(dstBuffer, dstOffset, size, data);
539 }
540 
pipelineBarrier(VkPipelineStageFlags srcStageMask,VkPipelineStageFlags dstStageMask,VkDependencyFlags dependencyFlags,uint32_t memoryBarrierCount,const VkMemoryBarrier * memoryBarriers,uint32_t bufferMemoryBarrierCount,const VkBufferMemoryBarrier * bufferMemoryBarriers,uint32_t imageMemoryBarrierCount,const VkImageMemoryBarrier * imageMemoryBarriers)541 ANGLE_INLINE void VulkanSecondaryCommandBuffer::pipelineBarrier(
542     VkPipelineStageFlags srcStageMask,
543     VkPipelineStageFlags dstStageMask,
544     VkDependencyFlags dependencyFlags,
545     uint32_t memoryBarrierCount,
546     const VkMemoryBarrier *memoryBarriers,
547     uint32_t bufferMemoryBarrierCount,
548     const VkBufferMemoryBarrier *bufferMemoryBarriers,
549     uint32_t imageMemoryBarrierCount,
550     const VkImageMemoryBarrier *imageMemoryBarriers)
551 {
552     onRecordCommand();
553     CommandBuffer::pipelineBarrier(srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount,
554                                    memoryBarriers, bufferMemoryBarrierCount, bufferMemoryBarriers,
555                                    imageMemoryBarrierCount, imageMemoryBarriers);
556 }
557 
pipelineBarrier2(VkDependencyFlags dependencyFlags,uint32_t memoryBarrierCount,const VkMemoryBarrier2 * memoryBarriers2,uint32_t bufferMemoryBarrierCount,const VkBufferMemoryBarrier2 * bufferMemoryBarriers2,uint32_t imageMemoryBarrierCount,const VkImageMemoryBarrier2 * imageMemoryBarriers2)558 ANGLE_INLINE void VulkanSecondaryCommandBuffer::pipelineBarrier2(
559     VkDependencyFlags dependencyFlags,
560     uint32_t memoryBarrierCount,
561     const VkMemoryBarrier2 *memoryBarriers2,
562     uint32_t bufferMemoryBarrierCount,
563     const VkBufferMemoryBarrier2 *bufferMemoryBarriers2,
564     uint32_t imageMemoryBarrierCount,
565     const VkImageMemoryBarrier2 *imageMemoryBarriers2)
566 {
567     onRecordCommand();
568     CommandBuffer::pipelineBarrier2(dependencyFlags, memoryBarrierCount, memoryBarriers2,
569                                     bufferMemoryBarrierCount, bufferMemoryBarriers2,
570                                     imageMemoryBarrierCount, imageMemoryBarriers2);
571 }
572 
memoryBarrier(VkPipelineStageFlags srcStageMask,VkPipelineStageFlags dstStageMask,const VkMemoryBarrier & memoryBarrier)573 ANGLE_INLINE void VulkanSecondaryCommandBuffer::memoryBarrier(VkPipelineStageFlags srcStageMask,
574                                                               VkPipelineStageFlags dstStageMask,
575                                                               const VkMemoryBarrier &memoryBarrier)
576 {
577     onRecordCommand();
578     CommandBuffer::memoryBarrier(srcStageMask, dstStageMask, memoryBarrier);
579 }
580 
memoryBarrier2(const VkMemoryBarrier2 & memoryBarrier2)581 ANGLE_INLINE void VulkanSecondaryCommandBuffer::memoryBarrier2(
582     const VkMemoryBarrier2 &memoryBarrier2)
583 {
584     onRecordCommand();
585     CommandBuffer::memoryBarrier2(memoryBarrier2);
586 }
587 
bufferBarrier(VkPipelineStageFlags srcStageMask,VkPipelineStageFlags dstStageMask,const VkBufferMemoryBarrier * bufferMemoryBarrier)588 ANGLE_INLINE void VulkanSecondaryCommandBuffer::bufferBarrier(
589     VkPipelineStageFlags srcStageMask,
590     VkPipelineStageFlags dstStageMask,
591     const VkBufferMemoryBarrier *bufferMemoryBarrier)
592 {
593     onRecordCommand();
594     CommandBuffer::pipelineBarrier(srcStageMask, dstStageMask, 0, 0, nullptr, 1,
595                                    bufferMemoryBarrier, 0, nullptr);
596 }
597 
bufferBarrier2(const VkBufferMemoryBarrier2 * bufferMemoryBarrier2)598 ANGLE_INLINE void VulkanSecondaryCommandBuffer::bufferBarrier2(
599     const VkBufferMemoryBarrier2 *bufferMemoryBarrier2)
600 {
601     onRecordCommand();
602     CommandBuffer::pipelineBarrier2(0, 0, nullptr, 1, bufferMemoryBarrier2, 0, nullptr);
603 }
604 
imageBarrier(VkPipelineStageFlags srcStageMask,VkPipelineStageFlags dstStageMask,const VkImageMemoryBarrier & imageMemoryBarrier)605 ANGLE_INLINE void VulkanSecondaryCommandBuffer::imageBarrier(
606     VkPipelineStageFlags srcStageMask,
607     VkPipelineStageFlags dstStageMask,
608     const VkImageMemoryBarrier &imageMemoryBarrier)
609 {
610     onRecordCommand();
611     CommandBuffer::imageBarrier(srcStageMask, dstStageMask, imageMemoryBarrier);
612 }
613 
imageBarrier2(const VkImageMemoryBarrier2 & imageMemoryBarrier2)614 ANGLE_INLINE void VulkanSecondaryCommandBuffer::imageBarrier2(
615     const VkImageMemoryBarrier2 &imageMemoryBarrier2)
616 {
617     onRecordCommand();
618     CommandBuffer::imageBarrier2(imageMemoryBarrier2);
619 }
620 
imageWaitEvent(const VkEvent & event,VkPipelineStageFlags srcStageMask,VkPipelineStageFlags dstStageMask,const VkImageMemoryBarrier & imageMemoryBarrier)621 ANGLE_INLINE void VulkanSecondaryCommandBuffer::imageWaitEvent(
622     const VkEvent &event,
623     VkPipelineStageFlags srcStageMask,
624     VkPipelineStageFlags dstStageMask,
625     const VkImageMemoryBarrier &imageMemoryBarrier)
626 {
627     onRecordCommand();
628     CommandBuffer::waitEvents(1, &event, srcStageMask, dstStageMask, 0, nullptr, 0, nullptr, 1,
629                               &imageMemoryBarrier);
630 }
631 
nextSubpass(VkSubpassContents subpassContents)632 ANGLE_INLINE void VulkanSecondaryCommandBuffer::nextSubpass(VkSubpassContents subpassContents)
633 {
634     onRecordCommand();
635     CommandBuffer::nextSubpass(subpassContents);
636 }
637 
pushConstants(const PipelineLayout & layout,VkShaderStageFlags flag,uint32_t offset,uint32_t size,const void * data)638 ANGLE_INLINE void VulkanSecondaryCommandBuffer::pushConstants(const PipelineLayout &layout,
639                                                               VkShaderStageFlags flag,
640                                                               uint32_t offset,
641                                                               uint32_t size,
642                                                               const void *data)
643 {
644     onRecordCommand();
645     CommandBuffer::pushConstants(layout, flag, offset, size, data);
646 }
647 
setEvent(VkEvent event,VkPipelineStageFlags stageMask)648 ANGLE_INLINE void VulkanSecondaryCommandBuffer::setEvent(VkEvent event,
649                                                          VkPipelineStageFlags stageMask)
650 {
651     onRecordCommand();
652     CommandBuffer::setEvent(event, stageMask);
653 }
654 
setVertexInput(uint32_t vertexBindingDescriptionCount,const VkVertexInputBindingDescription2EXT * vertexBindingDescriptions,uint32_t vertexAttributeDescriptionCount,const VkVertexInputAttributeDescription2EXT * vertexAttributeDescriptions)655 ANGLE_INLINE void VulkanSecondaryCommandBuffer::setVertexInput(
656     uint32_t vertexBindingDescriptionCount,
657     const VkVertexInputBindingDescription2EXT *vertexBindingDescriptions,
658     uint32_t vertexAttributeDescriptionCount,
659     const VkVertexInputAttributeDescription2EXT *vertexAttributeDescriptions)
660 {
661     onRecordCommand();
662     CommandBuffer::setVertexInput(vertexBindingDescriptionCount, vertexBindingDescriptions,
663                                   vertexAttributeDescriptionCount, vertexAttributeDescriptions);
664 }
665 
resetEvent(VkEvent event,VkPipelineStageFlags stageMask)666 ANGLE_INLINE void VulkanSecondaryCommandBuffer::resetEvent(VkEvent event,
667                                                            VkPipelineStageFlags stageMask)
668 {
669     onRecordCommand();
670     CommandBuffer::resetEvent(event, stageMask);
671 }
672 
waitEvents(uint32_t eventCount,const VkEvent * events,VkPipelineStageFlags srcStageMask,VkPipelineStageFlags dstStageMask,uint32_t memoryBarrierCount,const VkMemoryBarrier * memoryBarriers,uint32_t bufferMemoryBarrierCount,const VkBufferMemoryBarrier * bufferMemoryBarriers,uint32_t imageMemoryBarrierCount,const VkImageMemoryBarrier * imageMemoryBarriers)673 ANGLE_INLINE void VulkanSecondaryCommandBuffer::waitEvents(
674     uint32_t eventCount,
675     const VkEvent *events,
676     VkPipelineStageFlags srcStageMask,
677     VkPipelineStageFlags dstStageMask,
678     uint32_t memoryBarrierCount,
679     const VkMemoryBarrier *memoryBarriers,
680     uint32_t bufferMemoryBarrierCount,
681     const VkBufferMemoryBarrier *bufferMemoryBarriers,
682     uint32_t imageMemoryBarrierCount,
683     const VkImageMemoryBarrier *imageMemoryBarriers)
684 {
685     onRecordCommand();
686     CommandBuffer::waitEvents(eventCount, events, srcStageMask, dstStageMask, memoryBarrierCount,
687                               memoryBarriers, bufferMemoryBarrierCount, bufferMemoryBarriers,
688                               imageMemoryBarrierCount, imageMemoryBarriers);
689 }
690 
resetQueryPool(const QueryPool & queryPool,uint32_t firstQuery,uint32_t queryCount)691 ANGLE_INLINE void VulkanSecondaryCommandBuffer::resetQueryPool(const QueryPool &queryPool,
692                                                                uint32_t firstQuery,
693                                                                uint32_t queryCount)
694 {
695     onRecordCommand();
696     CommandBuffer::resetQueryPool(queryPool, firstQuery, queryCount);
697 }
698 
resolveImage(const Image & srcImage,VkImageLayout srcImageLayout,const Image & dstImage,VkImageLayout dstImageLayout,uint32_t regionCount,const VkImageResolve * regions)699 ANGLE_INLINE void VulkanSecondaryCommandBuffer::resolveImage(const Image &srcImage,
700                                                              VkImageLayout srcImageLayout,
701                                                              const Image &dstImage,
702                                                              VkImageLayout dstImageLayout,
703                                                              uint32_t regionCount,
704                                                              const VkImageResolve *regions)
705 {
706     onRecordCommand();
707     CommandBuffer::resolveImage(srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
708                                 regions);
709 }
710 
beginTransformFeedback(uint32_t firstCounterBuffer,uint32_t counterBufferCount,const VkBuffer * counterBuffers,const VkDeviceSize * counterBufferOffsets)711 ANGLE_INLINE void VulkanSecondaryCommandBuffer::beginTransformFeedback(
712     uint32_t firstCounterBuffer,
713     uint32_t counterBufferCount,
714     const VkBuffer *counterBuffers,
715     const VkDeviceSize *counterBufferOffsets)
716 {
717     onRecordCommand();
718     CommandBuffer::beginTransformFeedback(firstCounterBuffer, counterBufferCount, counterBuffers,
719                                           counterBufferOffsets);
720 }
721 
endTransformFeedback(uint32_t firstCounterBuffer,uint32_t counterBufferCount,const VkBuffer * counterBuffers,const VkDeviceSize * counterBufferOffsets)722 ANGLE_INLINE void VulkanSecondaryCommandBuffer::endTransformFeedback(
723     uint32_t firstCounterBuffer,
724     uint32_t counterBufferCount,
725     const VkBuffer *counterBuffers,
726     const VkDeviceSize *counterBufferOffsets)
727 {
728     onRecordCommand();
729     CommandBuffer::endTransformFeedback(firstCounterBuffer, counterBufferCount, counterBuffers,
730                                         counterBufferOffsets);
731 }
732 
beginDebugUtilsLabelEXT(const VkDebugUtilsLabelEXT & labelInfo)733 ANGLE_INLINE void VulkanSecondaryCommandBuffer::beginDebugUtilsLabelEXT(
734     const VkDebugUtilsLabelEXT &labelInfo)
735 {
736     onRecordCommand();
737     CommandBuffer::beginDebugUtilsLabelEXT(labelInfo);
738 }
739 
endDebugUtilsLabelEXT()740 ANGLE_INLINE void VulkanSecondaryCommandBuffer::endDebugUtilsLabelEXT()
741 {
742     onRecordCommand();
743     CommandBuffer::endDebugUtilsLabelEXT();
744 }
745 
insertDebugUtilsLabelEXT(const VkDebugUtilsLabelEXT & labelInfo)746 ANGLE_INLINE void VulkanSecondaryCommandBuffer::insertDebugUtilsLabelEXT(
747     const VkDebugUtilsLabelEXT &labelInfo)
748 {
749     onRecordCommand();
750     CommandBuffer::insertDebugUtilsLabelEXT(labelInfo);
751 }
752 
753 }  // namespace vk
754 }  // namespace rx
755 
756 #endif  // LIBANGLE_RENDERER_VULKAN_VULKANSECONDARYCOMMANDBUFFERVK_H_
757