• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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, &params->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, &params->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                                           &params->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                                          &params->color, 1, &params->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                                                 &params->depthStencil, 1, &params->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, &params->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, &params->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, &params->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, &params->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, &params->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, &params->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, &params->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, &params->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