1 //
2 // Copyright 2019 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 // SecondaryCommandBuffer:
7 // CPU-side storage of commands to delay GPU-side allocation until commands are submitted.
8 //
9
10 #include "libANGLE/renderer/vulkan/SecondaryCommandBuffer.h"
11 #include "common/debug.h"
12 #include "libANGLE/renderer/vulkan/vk_utils.h"
13 #include "libANGLE/trace.h"
14
15 namespace rx
16 {
17 namespace vk
18 {
19 namespace priv
20 {
21 namespace
22 {
GetCommandString(CommandID id)23 const char *GetCommandString(CommandID id)
24 {
25 switch (id)
26 {
27 case CommandID::Invalid:
28 return "--Invalid--";
29 case CommandID::BeginDebugUtilsLabel:
30 return "BeginDebugUtilsLabel";
31 case CommandID::BeginQuery:
32 return "BeginQuery";
33 case CommandID::BeginTransformFeedback:
34 return "BeginTransformFeedback";
35 case CommandID::BindComputePipeline:
36 return "BindComputePipeline";
37 case CommandID::BindDescriptorSets:
38 return "BindDescriptorSets";
39 case CommandID::BindGraphicsPipeline:
40 return "BindGraphicsPipeline";
41 case CommandID::BindIndexBuffer:
42 return "BindIndexBuffer";
43 case CommandID::BindTransformFeedbackBuffers:
44 return "BindTransformFeedbackBuffers";
45 case CommandID::BindVertexBuffers:
46 return "BindVertexBuffers";
47 case CommandID::BindVertexBuffers2:
48 return "BindVertexBuffers2";
49 case CommandID::BlitImage:
50 return "BlitImage";
51 case CommandID::BufferBarrier:
52 return "BufferBarrier";
53 case CommandID::ClearAttachments:
54 return "ClearAttachments";
55 case CommandID::ClearColorImage:
56 return "ClearColorImage";
57 case CommandID::ClearDepthStencilImage:
58 return "ClearDepthStencilImage";
59 case CommandID::CopyBuffer:
60 return "CopyBuffer";
61 case CommandID::CopyBufferToImage:
62 return "CopyBufferToImage";
63 case CommandID::CopyImage:
64 return "CopyImage";
65 case CommandID::CopyImageToBuffer:
66 return "CopyImageToBuffer";
67 case CommandID::Dispatch:
68 return "Dispatch";
69 case CommandID::DispatchIndirect:
70 return "DispatchIndirect";
71 case CommandID::Draw:
72 return "Draw";
73 case CommandID::DrawIndexed:
74 return "DrawIndexed";
75 case CommandID::DrawIndexedBaseVertex:
76 return "DrawIndexedBaseVertex";
77 case CommandID::DrawIndexedIndirect:
78 return "DrawIndexedIndirect";
79 case CommandID::DrawIndexedInstanced:
80 return "DrawIndexedInstanced";
81 case CommandID::DrawIndexedInstancedBaseVertex:
82 return "DrawIndexedInstancedBaseVertex";
83 case CommandID::DrawIndexedInstancedBaseVertexBaseInstance:
84 return "DrawIndexedInstancedBaseVertexBaseInstance";
85 case CommandID::DrawIndirect:
86 return "DrawIndirect";
87 case CommandID::DrawInstanced:
88 return "DrawInstanced";
89 case CommandID::DrawInstancedBaseInstance:
90 return "DrawInstancedBaseInstance";
91 case CommandID::EndDebugUtilsLabel:
92 return "EndDebugUtilsLabel";
93 case CommandID::EndQuery:
94 return "EndQuery";
95 case CommandID::EndTransformFeedback:
96 return "EndTransformFeedback";
97 case CommandID::FillBuffer:
98 return "FillBuffer";
99 case CommandID::ImageBarrier:
100 return "ImageBarrier";
101 case CommandID::InsertDebugUtilsLabel:
102 return "InsertDebugUtilsLabel";
103 case CommandID::MemoryBarrier:
104 return "MemoryBarrier";
105 case CommandID::NextSubpass:
106 return "NextSubpass";
107 case CommandID::PipelineBarrier:
108 return "PipelineBarrier";
109 case CommandID::PushConstants:
110 return "PushConstants";
111 case CommandID::ResetEvent:
112 return "ResetEvent";
113 case CommandID::ResetQueryPool:
114 return "ResetQueryPool";
115 case CommandID::ResolveImage:
116 return "ResolveImage";
117 case CommandID::SetBlendConstants:
118 return "SetBlendConstants";
119 case CommandID::SetCullMode:
120 return "SetCullMode";
121 case CommandID::SetDepthBias:
122 return "SetDepthBias";
123 case CommandID::SetDepthBiasEnable:
124 return "SetDepthBiasEnable";
125 case CommandID::SetDepthCompareOp:
126 return "SetDepthCompareOp";
127 case CommandID::SetDepthTestEnable:
128 return "SetDepthTestEnable";
129 case CommandID::SetDepthWriteEnable:
130 return "SetDepthWriteEnable";
131 case CommandID::SetEvent:
132 return "SetEvent";
133 case CommandID::SetFragmentShadingRate:
134 return "SetFragmentShadingRate";
135 case CommandID::SetFrontFace:
136 return "SetFrontFace";
137 case CommandID::SetLineWidth:
138 return "SetLineWidth";
139 case CommandID::SetLogicOp:
140 return "SetLogicOp";
141 case CommandID::SetPrimitiveRestartEnable:
142 return "SetPrimitiveRestartEnable";
143 case CommandID::SetRasterizerDiscardEnable:
144 return "SetRasterizerDiscardEnable";
145 case CommandID::SetScissor:
146 return "SetScissor";
147 case CommandID::SetStencilCompareMask:
148 return "SetStencilCompareMask";
149 case CommandID::SetStencilOp:
150 return "SetStencilOp";
151 case CommandID::SetStencilReference:
152 return "SetStencilReference";
153 case CommandID::SetStencilTestEnable:
154 return "SetStencilTestEnable";
155 case CommandID::SetStencilWriteMask:
156 return "SetStencilWriteMask";
157 case CommandID::SetViewport:
158 return "SetViewport";
159 case CommandID::WaitEvents:
160 return "WaitEvents";
161 case CommandID::WriteTimestamp:
162 return "WriteTimestamp";
163 default:
164 // Need this to work around MSVC warning 4715.
165 UNREACHABLE();
166 return "--unreachable--";
167 }
168 }
169 } // namespace
170
NextCommand(const CommandHeader * command)171 ANGLE_INLINE const CommandHeader *NextCommand(const CommandHeader *command)
172 {
173 return reinterpret_cast<const CommandHeader *>(reinterpret_cast<const uint8_t *>(command) +
174 command->size);
175 }
176
177 // Parse the cmds in this cmd buffer into given primary cmd buffer
executeCommands(PrimaryCommandBuffer * primary)178 void SecondaryCommandBuffer::executeCommands(PrimaryCommandBuffer *primary)
179 {
180 VkCommandBuffer cmdBuffer = primary->getHandle();
181
182 ANGLE_TRACE_EVENT0("gpu.angle", "SecondaryCommandBuffer::executeCommands");
183
184 // Used for ring buffer allocators only.
185 mCommandAllocator.terminateLastCommandBlock();
186
187 for (const CommandHeader *command : mCommands)
188 {
189 for (const CommandHeader *currentCommand = command;
190 currentCommand->id != CommandID::Invalid; currentCommand = NextCommand(currentCommand))
191 {
192 switch (currentCommand->id)
193 {
194 case CommandID::BeginDebugUtilsLabel:
195 {
196 const DebugUtilsLabelParams *params =
197 getParamPtr<DebugUtilsLabelParams>(currentCommand);
198 const char *pLabelName = Offset<char>(params, sizeof(DebugUtilsLabelParams));
199 const VkDebugUtilsLabelEXT label = {
200 VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT,
201 nullptr,
202 pLabelName,
203 {params->color[0], params->color[1], params->color[2], params->color[3]}};
204 ASSERT(vkCmdBeginDebugUtilsLabelEXT);
205 vkCmdBeginDebugUtilsLabelEXT(cmdBuffer, &label);
206 break;
207 }
208 case CommandID::BeginQuery:
209 {
210 const BeginQueryParams *params = getParamPtr<BeginQueryParams>(currentCommand);
211 vkCmdBeginQuery(cmdBuffer, params->queryPool, params->query, params->flags);
212 break;
213 }
214 case CommandID::BeginTransformFeedback:
215 {
216 const BeginTransformFeedbackParams *params =
217 getParamPtr<BeginTransformFeedbackParams>(currentCommand);
218 const VkBuffer *counterBuffers =
219 Offset<VkBuffer>(params, sizeof(BeginTransformFeedbackParams));
220 const VkDeviceSize *counterBufferOffsets =
221 reinterpret_cast<const VkDeviceSize *>(counterBuffers +
222 params->bufferCount);
223 vkCmdBeginTransformFeedbackEXT(cmdBuffer, 0, params->bufferCount,
224 counterBuffers, counterBufferOffsets);
225 break;
226 }
227 case CommandID::BindComputePipeline:
228 {
229 const BindPipelineParams *params =
230 getParamPtr<BindPipelineParams>(currentCommand);
231 vkCmdBindPipeline(cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, params->pipeline);
232 break;
233 }
234 case CommandID::BindDescriptorSets:
235 {
236 const BindDescriptorSetParams *params =
237 getParamPtr<BindDescriptorSetParams>(currentCommand);
238 const VkDescriptorSet *descriptorSets =
239 Offset<VkDescriptorSet>(params, sizeof(BindDescriptorSetParams));
240 const uint32_t *dynamicOffsets = Offset<uint32_t>(
241 descriptorSets, sizeof(VkDescriptorSet) * params->descriptorSetCount);
242 vkCmdBindDescriptorSets(cmdBuffer, params->pipelineBindPoint, params->layout,
243 params->firstSet, params->descriptorSetCount,
244 descriptorSets, params->dynamicOffsetCount,
245 dynamicOffsets);
246 break;
247 }
248 case CommandID::BindGraphicsPipeline:
249 {
250 const BindPipelineParams *params =
251 getParamPtr<BindPipelineParams>(currentCommand);
252 vkCmdBindPipeline(cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, params->pipeline);
253 break;
254 }
255 case CommandID::BindIndexBuffer:
256 {
257 const BindIndexBufferParams *params =
258 getParamPtr<BindIndexBufferParams>(currentCommand);
259 vkCmdBindIndexBuffer(cmdBuffer, params->buffer, params->offset,
260 params->indexType);
261 break;
262 }
263 case CommandID::BindTransformFeedbackBuffers:
264 {
265 const BindTransformFeedbackBuffersParams *params =
266 getParamPtr<BindTransformFeedbackBuffersParams>(currentCommand);
267 const VkBuffer *buffers =
268 Offset<VkBuffer>(params, sizeof(BindTransformFeedbackBuffersParams));
269 const VkDeviceSize *offsets =
270 Offset<VkDeviceSize>(buffers, sizeof(VkBuffer) * params->bindingCount);
271 const VkDeviceSize *sizes =
272 Offset<VkDeviceSize>(offsets, sizeof(VkDeviceSize) * params->bindingCount);
273 vkCmdBindTransformFeedbackBuffersEXT(cmdBuffer, 0, params->bindingCount,
274 buffers, offsets, sizes);
275 break;
276 }
277 case CommandID::BindVertexBuffers:
278 {
279 const BindVertexBuffersParams *params =
280 getParamPtr<BindVertexBuffersParams>(currentCommand);
281 const VkBuffer *buffers =
282 Offset<VkBuffer>(params, sizeof(BindVertexBuffersParams));
283 const VkDeviceSize *offsets =
284 Offset<VkDeviceSize>(buffers, sizeof(VkBuffer) * params->bindingCount);
285 vkCmdBindVertexBuffers(cmdBuffer, 0, params->bindingCount, buffers, offsets);
286 break;
287 }
288 case CommandID::BindVertexBuffers2:
289 {
290 const BindVertexBuffers2Params *params =
291 getParamPtr<BindVertexBuffers2Params>(currentCommand);
292 const VkBuffer *buffers =
293 Offset<VkBuffer>(params, sizeof(BindVertexBuffers2Params));
294 const VkDeviceSize *offsets =
295 Offset<VkDeviceSize>(buffers, sizeof(VkBuffer) * params->bindingCount);
296 const VkDeviceSize *strides =
297 Offset<VkDeviceSize>(offsets, sizeof(VkDeviceSize) * params->bindingCount);
298 vkCmdBindVertexBuffers2EXT(cmdBuffer, 0, params->bindingCount, buffers, offsets,
299 nullptr, strides);
300 break;
301 }
302 case CommandID::BlitImage:
303 {
304 const BlitImageParams *params = getParamPtr<BlitImageParams>(currentCommand);
305 vkCmdBlitImage(cmdBuffer, params->srcImage,
306 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, params->dstImage,
307 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ¶ms->region,
308 params->filter);
309 break;
310 }
311 case CommandID::BufferBarrier:
312 {
313 const BufferBarrierParams *params =
314 getParamPtr<BufferBarrierParams>(currentCommand);
315 vkCmdPipelineBarrier(cmdBuffer, params->srcStageMask, params->dstStageMask, 0,
316 0, nullptr, 1, ¶ms->bufferMemoryBarrier, 0, nullptr);
317 break;
318 }
319 case CommandID::ClearAttachments:
320 {
321 const ClearAttachmentsParams *params =
322 getParamPtr<ClearAttachmentsParams>(currentCommand);
323 const VkClearAttachment *attachments =
324 Offset<VkClearAttachment>(params, sizeof(ClearAttachmentsParams));
325 vkCmdClearAttachments(cmdBuffer, params->attachmentCount, attachments, 1,
326 ¶ms->rect);
327 break;
328 }
329 case CommandID::ClearColorImage:
330 {
331 const ClearColorImageParams *params =
332 getParamPtr<ClearColorImageParams>(currentCommand);
333 vkCmdClearColorImage(cmdBuffer, params->image, params->imageLayout,
334 ¶ms->color, 1, ¶ms->range);
335 break;
336 }
337 case CommandID::ClearDepthStencilImage:
338 {
339 const ClearDepthStencilImageParams *params =
340 getParamPtr<ClearDepthStencilImageParams>(currentCommand);
341 vkCmdClearDepthStencilImage(cmdBuffer, params->image, params->imageLayout,
342 ¶ms->depthStencil, 1, ¶ms->range);
343 break;
344 }
345 case CommandID::CopyBuffer:
346 {
347 const CopyBufferParams *params = getParamPtr<CopyBufferParams>(currentCommand);
348 const VkBufferCopy *regions =
349 Offset<VkBufferCopy>(params, sizeof(CopyBufferParams));
350 vkCmdCopyBuffer(cmdBuffer, params->srcBuffer, params->destBuffer,
351 params->regionCount, regions);
352 break;
353 }
354 case CommandID::CopyBufferToImage:
355 {
356 const CopyBufferToImageParams *params =
357 getParamPtr<CopyBufferToImageParams>(currentCommand);
358 vkCmdCopyBufferToImage(cmdBuffer, params->srcBuffer, params->dstImage,
359 params->dstImageLayout, 1, ¶ms->region);
360 break;
361 }
362 case CommandID::CopyImage:
363 {
364 const CopyImageParams *params = getParamPtr<CopyImageParams>(currentCommand);
365 vkCmdCopyImage(cmdBuffer, params->srcImage, params->srcImageLayout,
366 params->dstImage, params->dstImageLayout, 1, ¶ms->region);
367 break;
368 }
369 case CommandID::CopyImageToBuffer:
370 {
371 const CopyImageToBufferParams *params =
372 getParamPtr<CopyImageToBufferParams>(currentCommand);
373 vkCmdCopyImageToBuffer(cmdBuffer, params->srcImage, params->srcImageLayout,
374 params->dstBuffer, 1, ¶ms->region);
375 break;
376 }
377 case CommandID::Dispatch:
378 {
379 const DispatchParams *params = getParamPtr<DispatchParams>(currentCommand);
380 vkCmdDispatch(cmdBuffer, params->groupCountX, params->groupCountY,
381 params->groupCountZ);
382 break;
383 }
384 case CommandID::DispatchIndirect:
385 {
386 const DispatchIndirectParams *params =
387 getParamPtr<DispatchIndirectParams>(currentCommand);
388 vkCmdDispatchIndirect(cmdBuffer, params->buffer, params->offset);
389 break;
390 }
391 case CommandID::Draw:
392 {
393 const DrawParams *params = getParamPtr<DrawParams>(currentCommand);
394 vkCmdDraw(cmdBuffer, params->vertexCount, 1, params->firstVertex, 0);
395 break;
396 }
397 case CommandID::DrawIndexed:
398 {
399 const DrawIndexedParams *params =
400 getParamPtr<DrawIndexedParams>(currentCommand);
401 vkCmdDrawIndexed(cmdBuffer, params->indexCount, 1, 0, 0, 0);
402 break;
403 }
404 case CommandID::DrawIndexedBaseVertex:
405 {
406 const DrawIndexedBaseVertexParams *params =
407 getParamPtr<DrawIndexedBaseVertexParams>(currentCommand);
408 vkCmdDrawIndexed(cmdBuffer, params->indexCount, 1, 0, params->vertexOffset, 0);
409 break;
410 }
411 case CommandID::DrawIndexedIndirect:
412 {
413 const DrawIndexedIndirectParams *params =
414 getParamPtr<DrawIndexedIndirectParams>(currentCommand);
415 vkCmdDrawIndexedIndirect(cmdBuffer, params->buffer, params->offset,
416 params->drawCount, params->stride);
417 break;
418 }
419 case CommandID::DrawIndexedInstanced:
420 {
421 const DrawIndexedInstancedParams *params =
422 getParamPtr<DrawIndexedInstancedParams>(currentCommand);
423 vkCmdDrawIndexed(cmdBuffer, params->indexCount, params->instanceCount, 0, 0, 0);
424 break;
425 }
426 case CommandID::DrawIndexedInstancedBaseVertex:
427 {
428 const DrawIndexedInstancedBaseVertexParams *params =
429 getParamPtr<DrawIndexedInstancedBaseVertexParams>(currentCommand);
430 vkCmdDrawIndexed(cmdBuffer, params->indexCount, params->instanceCount, 0,
431 params->vertexOffset, 0);
432 break;
433 }
434 case CommandID::DrawIndexedInstancedBaseVertexBaseInstance:
435 {
436 const DrawIndexedInstancedBaseVertexBaseInstanceParams *params =
437 getParamPtr<DrawIndexedInstancedBaseVertexBaseInstanceParams>(
438 currentCommand);
439 vkCmdDrawIndexed(cmdBuffer, params->indexCount, params->instanceCount,
440 params->firstIndex, params->vertexOffset,
441 params->firstInstance);
442 break;
443 }
444 case CommandID::DrawIndirect:
445 {
446 const DrawIndirectParams *params =
447 getParamPtr<DrawIndirectParams>(currentCommand);
448 vkCmdDrawIndirect(cmdBuffer, params->buffer, params->offset, params->drawCount,
449 params->stride);
450 break;
451 }
452 case CommandID::DrawInstanced:
453 {
454 const DrawInstancedParams *params =
455 getParamPtr<DrawInstancedParams>(currentCommand);
456 vkCmdDraw(cmdBuffer, params->vertexCount, params->instanceCount,
457 params->firstVertex, 0);
458 break;
459 }
460 case CommandID::DrawInstancedBaseInstance:
461 {
462 const DrawInstancedBaseInstanceParams *params =
463 getParamPtr<DrawInstancedBaseInstanceParams>(currentCommand);
464 vkCmdDraw(cmdBuffer, params->vertexCount, params->instanceCount,
465 params->firstVertex, params->firstInstance);
466 break;
467 }
468 case CommandID::EndDebugUtilsLabel:
469 {
470 ASSERT(vkCmdEndDebugUtilsLabelEXT);
471 vkCmdEndDebugUtilsLabelEXT(cmdBuffer);
472 break;
473 }
474 case CommandID::EndQuery:
475 {
476 const EndQueryParams *params = getParamPtr<EndQueryParams>(currentCommand);
477 vkCmdEndQuery(cmdBuffer, params->queryPool, params->query);
478 break;
479 }
480 case CommandID::EndTransformFeedback:
481 {
482 const EndTransformFeedbackParams *params =
483 getParamPtr<EndTransformFeedbackParams>(currentCommand);
484 const VkBuffer *counterBuffers =
485 Offset<VkBuffer>(params, sizeof(EndTransformFeedbackParams));
486 const VkDeviceSize *counterBufferOffsets =
487 reinterpret_cast<const VkDeviceSize *>(counterBuffers +
488 params->bufferCount);
489 vkCmdEndTransformFeedbackEXT(cmdBuffer, 0, params->bufferCount, counterBuffers,
490 counterBufferOffsets);
491 break;
492 }
493 case CommandID::FillBuffer:
494 {
495 const FillBufferParams *params = getParamPtr<FillBufferParams>(currentCommand);
496 vkCmdFillBuffer(cmdBuffer, params->dstBuffer, params->dstOffset, params->size,
497 params->data);
498 break;
499 }
500 case CommandID::ImageBarrier:
501 {
502 const ImageBarrierParams *params =
503 getParamPtr<ImageBarrierParams>(currentCommand);
504 vkCmdPipelineBarrier(cmdBuffer, params->srcStageMask, params->dstStageMask, 0,
505 0, nullptr, 0, nullptr, 1, ¶ms->imageMemoryBarrier);
506 break;
507 }
508 case CommandID::InsertDebugUtilsLabel:
509 {
510 const DebugUtilsLabelParams *params =
511 getParamPtr<DebugUtilsLabelParams>(currentCommand);
512 const char *pLabelName = Offset<char>(params, sizeof(DebugUtilsLabelParams));
513 const VkDebugUtilsLabelEXT label = {
514 VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT,
515 nullptr,
516 pLabelName,
517 {params->color[0], params->color[1], params->color[2], params->color[3]}};
518 ASSERT(vkCmdInsertDebugUtilsLabelEXT);
519 vkCmdInsertDebugUtilsLabelEXT(cmdBuffer, &label);
520 break;
521 }
522 case CommandID::MemoryBarrier:
523 {
524 const MemoryBarrierParams *params =
525 getParamPtr<MemoryBarrierParams>(currentCommand);
526 vkCmdPipelineBarrier(cmdBuffer, params->srcStageMask, params->dstStageMask, 0,
527 1, ¶ms->memoryBarrier, 0, nullptr, 0, nullptr);
528 break;
529 }
530 case CommandID::NextSubpass:
531 {
532 const NextSubpassParams *params =
533 getParamPtr<NextSubpassParams>(currentCommand);
534 vkCmdNextSubpass(cmdBuffer, params->subpassContents);
535 break;
536 }
537 case CommandID::PipelineBarrier:
538 {
539 const PipelineBarrierParams *params =
540 getParamPtr<PipelineBarrierParams>(currentCommand);
541 const VkMemoryBarrier *memoryBarriers =
542 Offset<VkMemoryBarrier>(params, sizeof(PipelineBarrierParams));
543 const VkBufferMemoryBarrier *bufferMemoryBarriers =
544 Offset<VkBufferMemoryBarrier>(
545 memoryBarriers, params->memoryBarrierCount * sizeof(VkMemoryBarrier));
546 const VkImageMemoryBarrier *imageMemoryBarriers = Offset<VkImageMemoryBarrier>(
547 bufferMemoryBarriers,
548 params->bufferMemoryBarrierCount * sizeof(VkBufferMemoryBarrier));
549 vkCmdPipelineBarrier(cmdBuffer, params->srcStageMask, params->dstStageMask,
550 params->dependencyFlags, params->memoryBarrierCount,
551 memoryBarriers, params->bufferMemoryBarrierCount,
552 bufferMemoryBarriers, params->imageMemoryBarrierCount,
553 imageMemoryBarriers);
554 break;
555 }
556 case CommandID::PushConstants:
557 {
558 const PushConstantsParams *params =
559 getParamPtr<PushConstantsParams>(currentCommand);
560 const void *data = Offset<void>(params, sizeof(PushConstantsParams));
561 vkCmdPushConstants(cmdBuffer, params->layout, params->flag, params->offset,
562 params->size, data);
563 break;
564 }
565 case CommandID::ResetEvent:
566 {
567 const ResetEventParams *params = getParamPtr<ResetEventParams>(currentCommand);
568 vkCmdResetEvent(cmdBuffer, params->event, params->stageMask);
569 break;
570 }
571 case CommandID::ResetQueryPool:
572 {
573 const ResetQueryPoolParams *params =
574 getParamPtr<ResetQueryPoolParams>(currentCommand);
575 vkCmdResetQueryPool(cmdBuffer, params->queryPool, params->firstQuery,
576 params->queryCount);
577 break;
578 }
579 case CommandID::ResolveImage:
580 {
581 const ResolveImageParams *params =
582 getParamPtr<ResolveImageParams>(currentCommand);
583 vkCmdResolveImage(cmdBuffer, params->srcImage,
584 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, params->dstImage,
585 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ¶ms->region);
586 break;
587 }
588 case CommandID::SetBlendConstants:
589 {
590 const SetBlendConstantsParams *params =
591 getParamPtr<SetBlendConstantsParams>(currentCommand);
592 vkCmdSetBlendConstants(cmdBuffer, params->blendConstants);
593 break;
594 }
595 case CommandID::SetCullMode:
596 {
597 const SetCullModeParams *params =
598 getParamPtr<SetCullModeParams>(currentCommand);
599 vkCmdSetCullModeEXT(cmdBuffer, params->cullMode);
600 break;
601 }
602 case CommandID::SetDepthBias:
603 {
604 const SetDepthBiasParams *params =
605 getParamPtr<SetDepthBiasParams>(currentCommand);
606 vkCmdSetDepthBias(cmdBuffer, params->depthBiasConstantFactor,
607 params->depthBiasClamp, params->depthBiasSlopeFactor);
608 break;
609 }
610 case CommandID::SetDepthBiasEnable:
611 {
612 const SetDepthBiasEnableParams *params =
613 getParamPtr<SetDepthBiasEnableParams>(currentCommand);
614 vkCmdSetDepthBiasEnableEXT(cmdBuffer, params->depthBiasEnable);
615 break;
616 }
617 case CommandID::SetDepthCompareOp:
618 {
619 const SetDepthCompareOpParams *params =
620 getParamPtr<SetDepthCompareOpParams>(currentCommand);
621 vkCmdSetDepthCompareOpEXT(cmdBuffer, params->depthCompareOp);
622 break;
623 }
624 case CommandID::SetDepthTestEnable:
625 {
626 const SetDepthTestEnableParams *params =
627 getParamPtr<SetDepthTestEnableParams>(currentCommand);
628 vkCmdSetDepthTestEnableEXT(cmdBuffer, params->depthTestEnable);
629 break;
630 }
631 case CommandID::SetDepthWriteEnable:
632 {
633 const SetDepthWriteEnableParams *params =
634 getParamPtr<SetDepthWriteEnableParams>(currentCommand);
635 vkCmdSetDepthWriteEnableEXT(cmdBuffer, params->depthWriteEnable);
636 break;
637 }
638 case CommandID::SetEvent:
639 {
640 const SetEventParams *params = getParamPtr<SetEventParams>(currentCommand);
641 vkCmdSetEvent(cmdBuffer, params->event, params->stageMask);
642 break;
643 }
644 case CommandID::SetFragmentShadingRate:
645 {
646 const SetFragmentShadingRateParams *params =
647 getParamPtr<SetFragmentShadingRateParams>(currentCommand);
648 const VkExtent2D fragmentSize = {params->fragmentWidth, params->fragmentHeight};
649 const VkFragmentShadingRateCombinerOpKHR ops[2] = {
650 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
651 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
652 vkCmdSetFragmentShadingRateKHR(cmdBuffer, &fragmentSize, ops);
653 break;
654 }
655 case CommandID::SetFrontFace:
656 {
657 const SetFrontFaceParams *params =
658 getParamPtr<SetFrontFaceParams>(currentCommand);
659 vkCmdSetFrontFaceEXT(cmdBuffer, params->frontFace);
660 break;
661 }
662 case CommandID::SetLineWidth:
663 {
664 const SetLineWidthParams *params =
665 getParamPtr<SetLineWidthParams>(currentCommand);
666 vkCmdSetLineWidth(cmdBuffer, params->lineWidth);
667 break;
668 }
669 case CommandID::SetLogicOp:
670 {
671 const SetLogicOpParams *params = getParamPtr<SetLogicOpParams>(currentCommand);
672 vkCmdSetLogicOpEXT(cmdBuffer, params->logicOp);
673 break;
674 }
675 case CommandID::SetPrimitiveRestartEnable:
676 {
677 const SetPrimitiveRestartEnableParams *params =
678 getParamPtr<SetPrimitiveRestartEnableParams>(currentCommand);
679 vkCmdSetPrimitiveRestartEnableEXT(cmdBuffer, params->primitiveRestartEnable);
680 break;
681 }
682 case CommandID::SetRasterizerDiscardEnable:
683 {
684 const SetRasterizerDiscardEnableParams *params =
685 getParamPtr<SetRasterizerDiscardEnableParams>(currentCommand);
686 vkCmdSetRasterizerDiscardEnableEXT(cmdBuffer, params->rasterizerDiscardEnable);
687 break;
688 }
689 case CommandID::SetScissor:
690 {
691 const SetScissorParams *params = getParamPtr<SetScissorParams>(currentCommand);
692 vkCmdSetScissor(cmdBuffer, 0, 1, ¶ms->scissor);
693 break;
694 }
695 case CommandID::SetStencilCompareMask:
696 {
697 const SetStencilCompareMaskParams *params =
698 getParamPtr<SetStencilCompareMaskParams>(currentCommand);
699 vkCmdSetStencilCompareMask(cmdBuffer, VK_STENCIL_FACE_FRONT_BIT,
700 params->compareFrontMask);
701 vkCmdSetStencilCompareMask(cmdBuffer, VK_STENCIL_FACE_BACK_BIT,
702 params->compareBackMask);
703 break;
704 }
705 case CommandID::SetStencilOp:
706 {
707 const SetStencilOpParams *params =
708 getParamPtr<SetStencilOpParams>(currentCommand);
709 vkCmdSetStencilOpEXT(cmdBuffer,
710 static_cast<VkStencilFaceFlags>(params->faceMask),
711 static_cast<VkStencilOp>(params->failOp),
712 static_cast<VkStencilOp>(params->passOp),
713 static_cast<VkStencilOp>(params->depthFailOp),
714 static_cast<VkCompareOp>(params->compareOp));
715 break;
716 }
717 case CommandID::SetStencilReference:
718 {
719 const SetStencilReferenceParams *params =
720 getParamPtr<SetStencilReferenceParams>(currentCommand);
721 vkCmdSetStencilReference(cmdBuffer, VK_STENCIL_FACE_FRONT_BIT,
722 params->frontReference);
723 vkCmdSetStencilReference(cmdBuffer, VK_STENCIL_FACE_BACK_BIT,
724 params->backReference);
725 break;
726 }
727 case CommandID::SetStencilTestEnable:
728 {
729 const SetStencilTestEnableParams *params =
730 getParamPtr<SetStencilTestEnableParams>(currentCommand);
731 vkCmdSetStencilTestEnableEXT(cmdBuffer, params->stencilTestEnable);
732 break;
733 }
734 case CommandID::SetStencilWriteMask:
735 {
736 const SetStencilWriteMaskParams *params =
737 getParamPtr<SetStencilWriteMaskParams>(currentCommand);
738 vkCmdSetStencilWriteMask(cmdBuffer, VK_STENCIL_FACE_FRONT_BIT,
739 params->writeFrontMask);
740 vkCmdSetStencilWriteMask(cmdBuffer, VK_STENCIL_FACE_BACK_BIT,
741 params->writeBackMask);
742 break;
743 }
744 case CommandID::SetViewport:
745 {
746 const SetViewportParams *params =
747 getParamPtr<SetViewportParams>(currentCommand);
748 vkCmdSetViewport(cmdBuffer, 0, 1, ¶ms->viewport);
749 break;
750 }
751 case CommandID::WaitEvents:
752 {
753 const WaitEventsParams *params = getParamPtr<WaitEventsParams>(currentCommand);
754 const VkEvent *events = Offset<VkEvent>(params, sizeof(WaitEventsParams));
755 const VkMemoryBarrier *memoryBarriers =
756 Offset<VkMemoryBarrier>(events, params->eventCount * sizeof(VkEvent));
757 const VkBufferMemoryBarrier *bufferMemoryBarriers =
758 Offset<VkBufferMemoryBarrier>(
759 memoryBarriers, params->memoryBarrierCount * sizeof(VkMemoryBarrier));
760 const VkImageMemoryBarrier *imageMemoryBarriers = Offset<VkImageMemoryBarrier>(
761 bufferMemoryBarriers,
762 params->bufferMemoryBarrierCount * sizeof(VkBufferMemoryBarrier));
763 vkCmdWaitEvents(cmdBuffer, params->eventCount, events, params->srcStageMask,
764 params->dstStageMask, params->memoryBarrierCount,
765 memoryBarriers, params->bufferMemoryBarrierCount,
766 bufferMemoryBarriers, params->imageMemoryBarrierCount,
767 imageMemoryBarriers);
768 break;
769 }
770 case CommandID::WriteTimestamp:
771 {
772 const WriteTimestampParams *params =
773 getParamPtr<WriteTimestampParams>(currentCommand);
774 vkCmdWriteTimestamp(cmdBuffer, params->pipelineStage, params->queryPool,
775 params->query);
776 break;
777 }
778 default:
779 {
780 UNREACHABLE();
781 break;
782 }
783 }
784 }
785 }
786 }
787
getMemoryUsageStats(size_t * usedMemoryOut,size_t * allocatedMemoryOut) const788 void SecondaryCommandBuffer::getMemoryUsageStats(size_t *usedMemoryOut,
789 size_t *allocatedMemoryOut) const
790 {
791 mCommandAllocator.getMemoryUsageStats(usedMemoryOut, allocatedMemoryOut);
792 }
793
getMemoryUsageStatsForPoolAlloc(size_t blockSize,size_t * usedMemoryOut,size_t * allocatedMemoryOut) const794 void SecondaryCommandBuffer::getMemoryUsageStatsForPoolAlloc(size_t blockSize,
795 size_t *usedMemoryOut,
796 size_t *allocatedMemoryOut) const
797 {
798 *allocatedMemoryOut = blockSize * mCommands.size();
799
800 *usedMemoryOut = 0;
801 for (const CommandHeader *command : mCommands)
802 {
803 const CommandHeader *commandEnd = command;
804 while (commandEnd->id != CommandID::Invalid)
805 {
806 commandEnd = NextCommand(commandEnd);
807 }
808
809 *usedMemoryOut += reinterpret_cast<const uint8_t *>(commandEnd) -
810 reinterpret_cast<const uint8_t *>(command) + sizeof(CommandHeader::id);
811 }
812
813 ASSERT(*usedMemoryOut <= *allocatedMemoryOut);
814 }
815
dumpCommands(const char * separator) const816 std::string SecondaryCommandBuffer::dumpCommands(const char *separator) const
817 {
818 std::stringstream result;
819 for (const CommandHeader *command : mCommands)
820 {
821 for (const CommandHeader *currentCommand = command;
822 currentCommand->id != CommandID::Invalid; currentCommand = NextCommand(currentCommand))
823 {
824 result << GetCommandString(currentCommand->id) << separator;
825 }
826 }
827 return result.str();
828 }
829
830 } // namespace priv
831 } // namespace vk
832 } // namespace rx
833