• 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 imageWaitEvent(const VkEvent &event,
175                         VkPipelineStageFlags srcStageMask,
176                         VkPipelineStageFlags dstStageMask,
177                         const VkImageMemoryBarrier &imageMemoryBarrier);
178 
179     void memoryBarrier(VkPipelineStageFlags srcStageMask,
180                        VkPipelineStageFlags dstStageMask,
181                        const VkMemoryBarrier &memoryBarrier);
182 
183     void nextSubpass(VkSubpassContents subpassContents);
184 
185     void pipelineBarrier(VkPipelineStageFlags srcStageMask,
186                          VkPipelineStageFlags dstStageMask,
187                          VkDependencyFlags dependencyFlags,
188                          uint32_t memoryBarrierCount,
189                          const VkMemoryBarrier *memoryBarriers,
190                          uint32_t bufferMemoryBarrierCount,
191                          const VkBufferMemoryBarrier *bufferMemoryBarriers,
192                          uint32_t imageMemoryBarrierCount,
193                          const VkImageMemoryBarrier *imageMemoryBarriers);
194 
195     void pushConstants(const PipelineLayout &layout,
196                        VkShaderStageFlags flag,
197                        uint32_t offset,
198                        uint32_t size,
199                        const void *data);
200 
201     void setEvent(VkEvent event, VkPipelineStageFlags stageMask);
202     void setVertexInput(uint32_t vertexBindingDescriptionCount,
203                         const VkVertexInputBindingDescription2EXT *vertexBindingDescriptions,
204                         uint32_t vertexAttributeDescriptionCount,
205                         const VkVertexInputAttributeDescription2EXT *vertexAttributeDescriptions);
206     void resetEvent(VkEvent event, VkPipelineStageFlags stageMask);
207     void resetQueryPool(const QueryPool &queryPool, uint32_t firstQuery, uint32_t queryCount);
208     void resolveImage(const Image &srcImage,
209                       VkImageLayout srcImageLayout,
210                       const Image &dstImage,
211                       VkImageLayout dstImageLayout,
212                       uint32_t regionCount,
213                       const VkImageResolve *regions);
214     void waitEvents(uint32_t eventCount,
215                     const VkEvent *events,
216                     VkPipelineStageFlags srcStageMask,
217                     VkPipelineStageFlags dstStageMask,
218                     uint32_t memoryBarrierCount,
219                     const VkMemoryBarrier *memoryBarriers,
220                     uint32_t bufferMemoryBarrierCount,
221                     const VkBufferMemoryBarrier *bufferMemoryBarriers,
222                     uint32_t imageMemoryBarrierCount,
223                     const VkImageMemoryBarrier *imageMemoryBarriers);
224 
225     void writeTimestamp(VkPipelineStageFlagBits pipelineStage,
226                         const QueryPool &queryPool,
227                         uint32_t query);
228 
229     // VK_EXT_transform_feedback
230     void beginTransformFeedback(uint32_t firstCounterBuffer,
231                                 uint32_t counterBufferCount,
232                                 const VkBuffer *counterBuffers,
233                                 const VkDeviceSize *counterBufferOffsets);
234     void endTransformFeedback(uint32_t firstCounterBuffer,
235                               uint32_t counterBufferCount,
236                               const VkBuffer *counterBuffers,
237                               const VkDeviceSize *counterBufferOffsets);
238 
239     // VK_EXT_debug_utils
240     void beginDebugUtilsLabelEXT(const VkDebugUtilsLabelEXT &labelInfo);
241     void endDebugUtilsLabelEXT();
242     void insertDebugUtilsLabelEXT(const VkDebugUtilsLabelEXT &labelInfo);
243 
open()244     void open() const {}
close()245     void close() const {}
empty()246     bool empty() const
247     {
248         ASSERT(valid());
249         return !mAnyCommand;
250     }
getRenderPassWriteCommandCount()251     uint32_t getRenderPassWriteCommandCount() const
252     {
253         ASSERT(valid());
254         return mCommandTracker.getRenderPassWriteCommandCount();
255     }
dumpCommands(const char * separator)256     std::string dumpCommands(const char *separator) const { return ""; }
257 
258   private:
onRecordCommand()259     void onRecordCommand() { mAnyCommand = true; }
260 
261     SecondaryCommandPool *mCommandPool = nullptr;
262     CommandBufferCommandTracker mCommandTracker;
263     bool mAnyCommand = false;
264 };
265 
blitImage(const Image & srcImage,VkImageLayout srcImageLayout,const Image & dstImage,VkImageLayout dstImageLayout,uint32_t regionCount,const VkImageBlit * regions,VkFilter filter)266 ANGLE_INLINE void VulkanSecondaryCommandBuffer::blitImage(const Image &srcImage,
267                                                           VkImageLayout srcImageLayout,
268                                                           const Image &dstImage,
269                                                           VkImageLayout dstImageLayout,
270                                                           uint32_t regionCount,
271                                                           const VkImageBlit *regions,
272                                                           VkFilter filter)
273 {
274     onRecordCommand();
275     CommandBuffer::blitImage(srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
276                              regions, filter);
277 }
278 
beginQuery(const QueryPool & queryPool,uint32_t query,VkQueryControlFlags flags)279 ANGLE_INLINE void VulkanSecondaryCommandBuffer::beginQuery(const QueryPool &queryPool,
280                                                            uint32_t query,
281                                                            VkQueryControlFlags flags)
282 {
283     onRecordCommand();
284     CommandBuffer::beginQuery(queryPool, query, flags);
285 }
286 
endQuery(const QueryPool & queryPool,uint32_t query)287 ANGLE_INLINE void VulkanSecondaryCommandBuffer::endQuery(const QueryPool &queryPool, uint32_t query)
288 {
289     onRecordCommand();
290     CommandBuffer::endQuery(queryPool, query);
291 }
292 
writeTimestamp(VkPipelineStageFlagBits pipelineStage,const QueryPool & queryPool,uint32_t query)293 ANGLE_INLINE void VulkanSecondaryCommandBuffer::writeTimestamp(
294     VkPipelineStageFlagBits pipelineStage,
295     const QueryPool &queryPool,
296     uint32_t query)
297 {
298     onRecordCommand();
299     CommandBuffer::writeTimestamp(pipelineStage, queryPool, query);
300 }
301 
clearColorImage(const Image & image,VkImageLayout imageLayout,const VkClearColorValue & color,uint32_t rangeCount,const VkImageSubresourceRange * ranges)302 ANGLE_INLINE void VulkanSecondaryCommandBuffer::clearColorImage(
303     const Image &image,
304     VkImageLayout imageLayout,
305     const VkClearColorValue &color,
306     uint32_t rangeCount,
307     const VkImageSubresourceRange *ranges)
308 {
309     onRecordCommand();
310     CommandBuffer::clearColorImage(image, imageLayout, color, rangeCount, ranges);
311 }
312 
clearDepthStencilImage(const Image & image,VkImageLayout imageLayout,const VkClearDepthStencilValue & depthStencil,uint32_t rangeCount,const VkImageSubresourceRange * ranges)313 ANGLE_INLINE void VulkanSecondaryCommandBuffer::clearDepthStencilImage(
314     const Image &image,
315     VkImageLayout imageLayout,
316     const VkClearDepthStencilValue &depthStencil,
317     uint32_t rangeCount,
318     const VkImageSubresourceRange *ranges)
319 {
320     onRecordCommand();
321     CommandBuffer::clearDepthStencilImage(image, imageLayout, depthStencil, rangeCount, ranges);
322 }
323 
clearAttachments(uint32_t attachmentCount,const VkClearAttachment * attachments,uint32_t rectCount,const VkClearRect * rects)324 ANGLE_INLINE void VulkanSecondaryCommandBuffer::clearAttachments(
325     uint32_t attachmentCount,
326     const VkClearAttachment *attachments,
327     uint32_t rectCount,
328     const VkClearRect *rects)
329 {
330     onRecordCommand();
331     mCommandTracker.onClearAttachments();
332     CommandBuffer::clearAttachments(attachmentCount, attachments, rectCount, rects);
333 }
334 
copyBuffer(const Buffer & srcBuffer,const Buffer & destBuffer,uint32_t regionCount,const VkBufferCopy * regions)335 ANGLE_INLINE void VulkanSecondaryCommandBuffer::copyBuffer(const Buffer &srcBuffer,
336                                                            const Buffer &destBuffer,
337                                                            uint32_t regionCount,
338                                                            const VkBufferCopy *regions)
339 {
340     onRecordCommand();
341     CommandBuffer::copyBuffer(srcBuffer, destBuffer, regionCount, regions);
342 }
343 
copyBufferToImage(VkBuffer srcBuffer,const Image & dstImage,VkImageLayout dstImageLayout,uint32_t regionCount,const VkBufferImageCopy * regions)344 ANGLE_INLINE void VulkanSecondaryCommandBuffer::copyBufferToImage(VkBuffer srcBuffer,
345                                                                   const Image &dstImage,
346                                                                   VkImageLayout dstImageLayout,
347                                                                   uint32_t regionCount,
348                                                                   const VkBufferImageCopy *regions)
349 {
350     onRecordCommand();
351     CommandBuffer::copyBufferToImage(srcBuffer, dstImage, dstImageLayout, regionCount, regions);
352 }
353 
copyImageToBuffer(const Image & srcImage,VkImageLayout srcImageLayout,VkBuffer dstBuffer,uint32_t regionCount,const VkBufferImageCopy * regions)354 ANGLE_INLINE void VulkanSecondaryCommandBuffer::copyImageToBuffer(const Image &srcImage,
355                                                                   VkImageLayout srcImageLayout,
356                                                                   VkBuffer dstBuffer,
357                                                                   uint32_t regionCount,
358                                                                   const VkBufferImageCopy *regions)
359 {
360     onRecordCommand();
361     CommandBuffer::copyImageToBuffer(srcImage, srcImageLayout, dstBuffer, regionCount, regions);
362 }
363 
copyImage(const Image & srcImage,VkImageLayout srcImageLayout,const Image & dstImage,VkImageLayout dstImageLayout,uint32_t regionCount,const VkImageCopy * regions)364 ANGLE_INLINE void VulkanSecondaryCommandBuffer::copyImage(const Image &srcImage,
365                                                           VkImageLayout srcImageLayout,
366                                                           const Image &dstImage,
367                                                           VkImageLayout dstImageLayout,
368                                                           uint32_t regionCount,
369                                                           const VkImageCopy *regions)
370 {
371     onRecordCommand();
372     CommandBuffer::copyImage(srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
373                              regions);
374 }
375 
draw(uint32_t vertexCount,uint32_t instanceCount,uint32_t firstVertex,uint32_t firstInstance)376 ANGLE_INLINE void VulkanSecondaryCommandBuffer::draw(uint32_t vertexCount,
377                                                      uint32_t instanceCount,
378                                                      uint32_t firstVertex,
379                                                      uint32_t firstInstance)
380 {
381     onRecordCommand();
382     mCommandTracker.onDraw();
383     CommandBuffer::draw(vertexCount, instanceCount, firstVertex, firstInstance);
384 }
385 
draw(uint32_t vertexCount,uint32_t firstVertex)386 ANGLE_INLINE void VulkanSecondaryCommandBuffer::draw(uint32_t vertexCount, uint32_t firstVertex)
387 {
388     onRecordCommand();
389     mCommandTracker.onDraw();
390     CommandBuffer::draw(vertexCount, 1, firstVertex, 0);
391 }
392 
drawInstanced(uint32_t vertexCount,uint32_t instanceCount,uint32_t firstVertex)393 ANGLE_INLINE void VulkanSecondaryCommandBuffer::drawInstanced(uint32_t vertexCount,
394                                                               uint32_t instanceCount,
395                                                               uint32_t firstVertex)
396 {
397     onRecordCommand();
398     mCommandTracker.onDraw();
399     CommandBuffer::draw(vertexCount, instanceCount, firstVertex, 0);
400 }
401 
drawInstancedBaseInstance(uint32_t vertexCount,uint32_t instanceCount,uint32_t firstVertex,uint32_t firstInstance)402 ANGLE_INLINE void VulkanSecondaryCommandBuffer::drawInstancedBaseInstance(uint32_t vertexCount,
403                                                                           uint32_t instanceCount,
404                                                                           uint32_t firstVertex,
405                                                                           uint32_t firstInstance)
406 {
407     onRecordCommand();
408     mCommandTracker.onDraw();
409     CommandBuffer::draw(vertexCount, instanceCount, firstVertex, firstInstance);
410 }
411 
drawIndexed(uint32_t indexCount,uint32_t instanceCount,uint32_t firstIndex,int32_t vertexOffset,uint32_t firstInstance)412 ANGLE_INLINE void VulkanSecondaryCommandBuffer::drawIndexed(uint32_t indexCount,
413                                                             uint32_t instanceCount,
414                                                             uint32_t firstIndex,
415                                                             int32_t vertexOffset,
416                                                             uint32_t firstInstance)
417 {
418     onRecordCommand();
419     mCommandTracker.onDraw();
420     CommandBuffer::drawIndexed(indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
421 }
422 
drawIndexed(uint32_t indexCount)423 ANGLE_INLINE void VulkanSecondaryCommandBuffer::drawIndexed(uint32_t indexCount)
424 {
425     onRecordCommand();
426     mCommandTracker.onDraw();
427     CommandBuffer::drawIndexed(indexCount, 1, 0, 0, 0);
428 }
429 
drawIndexedBaseVertex(uint32_t indexCount,uint32_t vertexOffset)430 ANGLE_INLINE void VulkanSecondaryCommandBuffer::drawIndexedBaseVertex(uint32_t indexCount,
431                                                                       uint32_t vertexOffset)
432 {
433     onRecordCommand();
434     mCommandTracker.onDraw();
435     CommandBuffer::drawIndexed(indexCount, 1, 0, vertexOffset, 0);
436 }
437 
drawIndexedInstanced(uint32_t indexCount,uint32_t instanceCount)438 ANGLE_INLINE void VulkanSecondaryCommandBuffer::drawIndexedInstanced(uint32_t indexCount,
439                                                                      uint32_t instanceCount)
440 {
441     onRecordCommand();
442     mCommandTracker.onDraw();
443     CommandBuffer::drawIndexed(indexCount, instanceCount, 0, 0, 0);
444 }
445 
drawIndexedInstancedBaseVertex(uint32_t indexCount,uint32_t instanceCount,uint32_t vertexOffset)446 ANGLE_INLINE void VulkanSecondaryCommandBuffer::drawIndexedInstancedBaseVertex(
447     uint32_t indexCount,
448     uint32_t instanceCount,
449     uint32_t vertexOffset)
450 {
451     onRecordCommand();
452     mCommandTracker.onDraw();
453     CommandBuffer::drawIndexed(indexCount, instanceCount, 0, vertexOffset, 0);
454 }
455 
drawIndexedInstancedBaseVertexBaseInstance(uint32_t indexCount,uint32_t instanceCount,uint32_t firstIndex,int32_t vertexOffset,uint32_t firstInstance)456 ANGLE_INLINE void VulkanSecondaryCommandBuffer::drawIndexedInstancedBaseVertexBaseInstance(
457     uint32_t indexCount,
458     uint32_t instanceCount,
459     uint32_t firstIndex,
460     int32_t vertexOffset,
461     uint32_t firstInstance)
462 {
463     onRecordCommand();
464     mCommandTracker.onDraw();
465     CommandBuffer::drawIndexed(indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
466 }
467 
drawIndexedIndirect(const Buffer & buffer,VkDeviceSize offset,uint32_t drawCount,uint32_t stride)468 ANGLE_INLINE void VulkanSecondaryCommandBuffer::drawIndexedIndirect(const Buffer &buffer,
469                                                                     VkDeviceSize offset,
470                                                                     uint32_t drawCount,
471                                                                     uint32_t stride)
472 {
473     onRecordCommand();
474     mCommandTracker.onDraw();
475     CommandBuffer::drawIndexedIndirect(buffer, offset, drawCount, stride);
476 }
477 
drawIndirect(const Buffer & buffer,VkDeviceSize offset,uint32_t drawCount,uint32_t stride)478 ANGLE_INLINE void VulkanSecondaryCommandBuffer::drawIndirect(const Buffer &buffer,
479                                                              VkDeviceSize offset,
480                                                              uint32_t drawCount,
481                                                              uint32_t stride)
482 {
483     onRecordCommand();
484     mCommandTracker.onDraw();
485     CommandBuffer::drawIndirect(buffer, offset, drawCount, stride);
486 }
487 
dispatch(uint32_t groupCountX,uint32_t groupCountY,uint32_t groupCountZ)488 ANGLE_INLINE void VulkanSecondaryCommandBuffer::dispatch(uint32_t groupCountX,
489                                                          uint32_t groupCountY,
490                                                          uint32_t groupCountZ)
491 {
492     onRecordCommand();
493     CommandBuffer::dispatch(groupCountX, groupCountY, groupCountZ);
494 }
495 
dispatchIndirect(const Buffer & buffer,VkDeviceSize offset)496 ANGLE_INLINE void VulkanSecondaryCommandBuffer::dispatchIndirect(const Buffer &buffer,
497                                                                  VkDeviceSize offset)
498 {
499     onRecordCommand();
500     CommandBuffer::dispatchIndirect(buffer, offset);
501 }
502 
fillBuffer(const Buffer & dstBuffer,VkDeviceSize dstOffset,VkDeviceSize size,uint32_t data)503 ANGLE_INLINE void VulkanSecondaryCommandBuffer::fillBuffer(const Buffer &dstBuffer,
504                                                            VkDeviceSize dstOffset,
505                                                            VkDeviceSize size,
506                                                            uint32_t data)
507 {
508     onRecordCommand();
509     CommandBuffer::fillBuffer(dstBuffer, dstOffset, size, data);
510 }
511 
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)512 ANGLE_INLINE void VulkanSecondaryCommandBuffer::pipelineBarrier(
513     VkPipelineStageFlags srcStageMask,
514     VkPipelineStageFlags dstStageMask,
515     VkDependencyFlags dependencyFlags,
516     uint32_t memoryBarrierCount,
517     const VkMemoryBarrier *memoryBarriers,
518     uint32_t bufferMemoryBarrierCount,
519     const VkBufferMemoryBarrier *bufferMemoryBarriers,
520     uint32_t imageMemoryBarrierCount,
521     const VkImageMemoryBarrier *imageMemoryBarriers)
522 {
523     onRecordCommand();
524     CommandBuffer::pipelineBarrier(srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount,
525                                    memoryBarriers, bufferMemoryBarrierCount, bufferMemoryBarriers,
526                                    imageMemoryBarrierCount, imageMemoryBarriers);
527 }
528 
memoryBarrier(VkPipelineStageFlags srcStageMask,VkPipelineStageFlags dstStageMask,const VkMemoryBarrier & memoryBarrier)529 ANGLE_INLINE void VulkanSecondaryCommandBuffer::memoryBarrier(VkPipelineStageFlags srcStageMask,
530                                                               VkPipelineStageFlags dstStageMask,
531                                                               const VkMemoryBarrier &memoryBarrier)
532 {
533     onRecordCommand();
534     CommandBuffer::memoryBarrier(srcStageMask, dstStageMask, memoryBarrier);
535 }
536 
bufferBarrier(VkPipelineStageFlags srcStageMask,VkPipelineStageFlags dstStageMask,const VkBufferMemoryBarrier * bufferMemoryBarrier)537 ANGLE_INLINE void VulkanSecondaryCommandBuffer::bufferBarrier(
538     VkPipelineStageFlags srcStageMask,
539     VkPipelineStageFlags dstStageMask,
540     const VkBufferMemoryBarrier *bufferMemoryBarrier)
541 {
542     onRecordCommand();
543     CommandBuffer::pipelineBarrier(srcStageMask, dstStageMask, 0, 0, nullptr, 1,
544                                    bufferMemoryBarrier, 0, nullptr);
545 }
546 
imageBarrier(VkPipelineStageFlags srcStageMask,VkPipelineStageFlags dstStageMask,const VkImageMemoryBarrier & imageMemoryBarrier)547 ANGLE_INLINE void VulkanSecondaryCommandBuffer::imageBarrier(
548     VkPipelineStageFlags srcStageMask,
549     VkPipelineStageFlags dstStageMask,
550     const VkImageMemoryBarrier &imageMemoryBarrier)
551 {
552     onRecordCommand();
553     CommandBuffer::imageBarrier(srcStageMask, dstStageMask, imageMemoryBarrier);
554 }
555 
imageWaitEvent(const VkEvent & event,VkPipelineStageFlags srcStageMask,VkPipelineStageFlags dstStageMask,const VkImageMemoryBarrier & imageMemoryBarrier)556 ANGLE_INLINE void VulkanSecondaryCommandBuffer::imageWaitEvent(
557     const VkEvent &event,
558     VkPipelineStageFlags srcStageMask,
559     VkPipelineStageFlags dstStageMask,
560     const VkImageMemoryBarrier &imageMemoryBarrier)
561 {
562     onRecordCommand();
563     CommandBuffer::waitEvents(1, &event, srcStageMask, dstStageMask, 0, nullptr, 0, nullptr, 1,
564                               &imageMemoryBarrier);
565 }
566 
nextSubpass(VkSubpassContents subpassContents)567 ANGLE_INLINE void VulkanSecondaryCommandBuffer::nextSubpass(VkSubpassContents subpassContents)
568 {
569     onRecordCommand();
570     CommandBuffer::nextSubpass(subpassContents);
571 }
572 
pushConstants(const PipelineLayout & layout,VkShaderStageFlags flag,uint32_t offset,uint32_t size,const void * data)573 ANGLE_INLINE void VulkanSecondaryCommandBuffer::pushConstants(const PipelineLayout &layout,
574                                                               VkShaderStageFlags flag,
575                                                               uint32_t offset,
576                                                               uint32_t size,
577                                                               const void *data)
578 {
579     onRecordCommand();
580     CommandBuffer::pushConstants(layout, flag, offset, size, data);
581 }
582 
setEvent(VkEvent event,VkPipelineStageFlags stageMask)583 ANGLE_INLINE void VulkanSecondaryCommandBuffer::setEvent(VkEvent event,
584                                                          VkPipelineStageFlags stageMask)
585 {
586     onRecordCommand();
587     CommandBuffer::setEvent(event, stageMask);
588 }
589 
setVertexInput(uint32_t vertexBindingDescriptionCount,const VkVertexInputBindingDescription2EXT * vertexBindingDescriptions,uint32_t vertexAttributeDescriptionCount,const VkVertexInputAttributeDescription2EXT * vertexAttributeDescriptions)590 ANGLE_INLINE void VulkanSecondaryCommandBuffer::setVertexInput(
591     uint32_t vertexBindingDescriptionCount,
592     const VkVertexInputBindingDescription2EXT *vertexBindingDescriptions,
593     uint32_t vertexAttributeDescriptionCount,
594     const VkVertexInputAttributeDescription2EXT *vertexAttributeDescriptions)
595 {
596     onRecordCommand();
597     CommandBuffer::setVertexInput(vertexBindingDescriptionCount, vertexBindingDescriptions,
598                                   vertexAttributeDescriptionCount, vertexAttributeDescriptions);
599 }
600 
resetEvent(VkEvent event,VkPipelineStageFlags stageMask)601 ANGLE_INLINE void VulkanSecondaryCommandBuffer::resetEvent(VkEvent event,
602                                                            VkPipelineStageFlags stageMask)
603 {
604     onRecordCommand();
605     CommandBuffer::resetEvent(event, stageMask);
606 }
607 
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)608 ANGLE_INLINE void VulkanSecondaryCommandBuffer::waitEvents(
609     uint32_t eventCount,
610     const VkEvent *events,
611     VkPipelineStageFlags srcStageMask,
612     VkPipelineStageFlags dstStageMask,
613     uint32_t memoryBarrierCount,
614     const VkMemoryBarrier *memoryBarriers,
615     uint32_t bufferMemoryBarrierCount,
616     const VkBufferMemoryBarrier *bufferMemoryBarriers,
617     uint32_t imageMemoryBarrierCount,
618     const VkImageMemoryBarrier *imageMemoryBarriers)
619 {
620     onRecordCommand();
621     CommandBuffer::waitEvents(eventCount, events, srcStageMask, dstStageMask, memoryBarrierCount,
622                               memoryBarriers, bufferMemoryBarrierCount, bufferMemoryBarriers,
623                               imageMemoryBarrierCount, imageMemoryBarriers);
624 }
625 
resetQueryPool(const QueryPool & queryPool,uint32_t firstQuery,uint32_t queryCount)626 ANGLE_INLINE void VulkanSecondaryCommandBuffer::resetQueryPool(const QueryPool &queryPool,
627                                                                uint32_t firstQuery,
628                                                                uint32_t queryCount)
629 {
630     onRecordCommand();
631     CommandBuffer::resetQueryPool(queryPool, firstQuery, queryCount);
632 }
633 
resolveImage(const Image & srcImage,VkImageLayout srcImageLayout,const Image & dstImage,VkImageLayout dstImageLayout,uint32_t regionCount,const VkImageResolve * regions)634 ANGLE_INLINE void VulkanSecondaryCommandBuffer::resolveImage(const Image &srcImage,
635                                                              VkImageLayout srcImageLayout,
636                                                              const Image &dstImage,
637                                                              VkImageLayout dstImageLayout,
638                                                              uint32_t regionCount,
639                                                              const VkImageResolve *regions)
640 {
641     onRecordCommand();
642     CommandBuffer::resolveImage(srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
643                                 regions);
644 }
645 
beginTransformFeedback(uint32_t firstCounterBuffer,uint32_t counterBufferCount,const VkBuffer * counterBuffers,const VkDeviceSize * counterBufferOffsets)646 ANGLE_INLINE void VulkanSecondaryCommandBuffer::beginTransformFeedback(
647     uint32_t firstCounterBuffer,
648     uint32_t counterBufferCount,
649     const VkBuffer *counterBuffers,
650     const VkDeviceSize *counterBufferOffsets)
651 {
652     onRecordCommand();
653     CommandBuffer::beginTransformFeedback(firstCounterBuffer, counterBufferCount, counterBuffers,
654                                           counterBufferOffsets);
655 }
656 
endTransformFeedback(uint32_t firstCounterBuffer,uint32_t counterBufferCount,const VkBuffer * counterBuffers,const VkDeviceSize * counterBufferOffsets)657 ANGLE_INLINE void VulkanSecondaryCommandBuffer::endTransformFeedback(
658     uint32_t firstCounterBuffer,
659     uint32_t counterBufferCount,
660     const VkBuffer *counterBuffers,
661     const VkDeviceSize *counterBufferOffsets)
662 {
663     onRecordCommand();
664     CommandBuffer::endTransformFeedback(firstCounterBuffer, counterBufferCount, counterBuffers,
665                                         counterBufferOffsets);
666 }
667 
beginDebugUtilsLabelEXT(const VkDebugUtilsLabelEXT & labelInfo)668 ANGLE_INLINE void VulkanSecondaryCommandBuffer::beginDebugUtilsLabelEXT(
669     const VkDebugUtilsLabelEXT &labelInfo)
670 {
671     onRecordCommand();
672     CommandBuffer::beginDebugUtilsLabelEXT(labelInfo);
673 }
674 
endDebugUtilsLabelEXT()675 ANGLE_INLINE void VulkanSecondaryCommandBuffer::endDebugUtilsLabelEXT()
676 {
677     onRecordCommand();
678     CommandBuffer::endDebugUtilsLabelEXT();
679 }
680 
insertDebugUtilsLabelEXT(const VkDebugUtilsLabelEXT & labelInfo)681 ANGLE_INLINE void VulkanSecondaryCommandBuffer::insertDebugUtilsLabelEXT(
682     const VkDebugUtilsLabelEXT &labelInfo)
683 {
684     onRecordCommand();
685     CommandBuffer::insertDebugUtilsLabelEXT(labelInfo);
686 }
687 
688 }  // namespace vk
689 }  // namespace rx
690 
691 #endif  // LIBANGLE_RENDERER_VULKAN_VULKANSECONDARYCOMMANDBUFFERVK_H_
692