Skip to content

Command Buffers

https://docs.vulkan.org/spec/latest/chapters/cmdbuffers.html

VkCommand

  • flag ?
  • reset ?

Pool

allocate

record command

vkCmdCopyBufferToImage

使い捨て同期実行

  • VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT
  • vkQueueWaitIdle

render

begin
  • attachment
  • clearColor
  • viewport
cpp
  VkCommandBufferBeginInfo beginInfo{
      .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
      .flags = 0,
      .pInheritanceInfo = nullptr,
  };
  if (vkBeginCommandBuffer(commandBuffer, &beginInfo) != VK_SUCCESS) {
    throw std::runtime_error("failed to begin recording command buffer!");
  }

  VkClearValue clearColor = {0.0f, 0.0f, 0.0f, 1.0f};
  VkRenderPassBeginInfo renderPassInfo{
      .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
      .renderPass = _renderPass,
      .framebuffer = _swapchainFramebuffers[i],
      .renderArea =
          {
              .offset = {0, 0},
              .extent = swapchainExtent,
          },
      .clearValueCount = 1,
      .pClearValues = &clearColor,
  };
  vkCmdBeginRenderPass(commandBuffer, &renderPassInfo,
                       VK_SUBPASS_CONTENTS_INLINE);
bind & draw
cpp
  // bind
  vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS,
                    _graphicsPipeline);

  VkBuffer vertexBuffers[] = {_vertexBuffer->buffer()};
  VkDeviceSize offsets[] = {0};
  vkCmdBindVertexBuffers(commandBuffer, 0, 1, vertexBuffers, offsets);

  vkCmdBindIndexBuffer(commandBuffer, _indexBuffer->buffer(), 0,
                       VK_INDEX_TYPE_UINT16);

  vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS,
                          _pipelineLayout, 0, 1, &_descriptorSets[i], 0,
                          nullptr);

  // Tell Vulkan to draw the triangle USING THE INDEX BUFFER!
  vkCmdDrawIndexed(commandBuffer, indices.size(), 1, 0, 0, 0);
end
cpp
  vkCmdEndRenderPass(commandBuffer);

  if (vkEndCommandBuffer(commandBuffer) != VK_SUCCESS) {
    throw std::runtime_error("failed to record command buffer!");
  }