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