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