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