记录指令到指令缓冲
我们通过调用vkBeginCommandBuffer函数开始指令缓冲的记录操作,这一函数以VkCommandBufferBeginInfo结构体作为参数来指定一些有关指令缓冲的使用细节。
for (size_t i = 0; i < commandBuffers.size(); i++) {
VkCommandBufferBeginInfo beginInfo = {};
beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
beginInfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
beginInfo.pInheritanceInfo = nullptr; // Optional
if (vkBeginCommandBuffer(commandBuffers[i], &beginInfo) != VK_SUCCESS) {
throw std::runtime_error("failed to begin recording command buffer!");
}
}
flags成员变量用于指定我们将要怎样使用指令缓冲。它的值可以是下面这些:
-
VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT:指令缓冲在执行一次后,就被用来记录新的指令。
-
VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT:这是一个只在一个渲染流程内使用的辅助指令缓冲。
-
VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT:在指令缓冲等待执行时,仍然可以提交这一指令缓冲。
在这里,我们使用了VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT标记,这使得我们可以在上一帧还未结束渲染时,提交下一帧的渲染指令。pInheritanceInfo成员变量只用于辅助指令缓冲,可以用它来指定从调用它的主要指令缓冲继承的状态。
指令缓冲对象记录指令后,调用vkBeginCommandBuffer函数会重置指令缓冲对象。