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