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