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