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