Vulkan规范:第五章 5.6

来源:互联网 发布:nba2k14王朝模拟数据 编辑:程序博客网 时间:2024/06/01 07:11

5.6. 次级命令缓冲区的执行

次命令缓冲区必须不能直接被提交到队列。相反,需要被记录到主命令缓冲区的一部分来被执行:

void vkCmdExecuteCommands(    VkCommandBuffer                             commandBuffer,    uint32_t                                    commandBufferCount,    const VkCommandBuffer*                      pCommandBuffers);
  • commandBuffer 是主命令缓冲区,次命令缓冲区在它里面执行。

  • commandBufferCount 是 pCommandBuffers 数组的大小。

  • pCommandBuffers 是次命令缓冲区handle的数组,按照在数组中的位置被提交到主命令缓冲区中被记录、执行。

一旦vkCmdExecuteCommands被调用,在任何主命令缓冲区中的由pCommandBuffers指定的次命令缓冲区之前的任何执行工作都被无效化了, 除非这些次命令缓冲区被记录时带有VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT

正确使用
  • commandBuffer 必须在分配的时候带有的参数 level 值为 VK_COMMAND_BUFFER_LEVEL_PRIMARY

  • pCommandBuffers中任何一个元素必须在分配的时候带有的参数level 值为 VK_COMMAND_BUFFER_LEVEL_SECONDARY

  • pCommandBuffers中任何一个元素不能在commandBuffer之中处于pending状态,也不能出现两次,除非带有VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT 标志位

  • pCommandBuffers的任何元素都不能在任何其他的 VkCommandBuffer中处于pending 状态,除非被记录时带有VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT 标志位

  • pCommandBuffers 中任何一个元素都不能处于可执行状态

  • pCommandBuffers 中任何一个元素都必须从队列族索引与commandBuffer所在的VkCommandPool 相同的VkCommandPool分配而来。

  • 如果vkCmdExecuteCommands在一个render pass 实例中被调用,此render pass实例必须在开始的时候保证 vkCmdBeginRenderPass参数的成员 contents 被设置为 VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS

  • 如果在一个render pass实例内调用 vkCmdExecuteCommands 命令,pCommandBuffers 中的任何元素必须以VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT的方式被记录

  • 如果在一个render pass实例内调用vkCmdExecuteCommands 命令,pCommandBuffers中的任何元素被记录时, 必须让VkCommandBufferInheritanceInfo::subpass 被设置为指定的将所在执行的命令缓冲区的subpass的索引

  • 如果在一个render pass 实例内调用vkCmdExecuteCommands, 在用来开始记录pCommandBuffers 中每一个元素的vkBeginCommandBuffer 的成员pname::pBeginInfo::pInheritanceInfo::renderPass 指定 render pass实例必须和 当前使用的render pass 兼容

  • 如果在一个render pass实例中调用 vkCmdExecuteCommandspCommandBuffers 中任一个以VkCommandBufferInheritanceInfo::framebuffer 被记录的元素必须匹配在当前的render pass实例中使用的VkFramebuffer

  • 如果在一个render pass实例中没有调用 vkCmdExecuteCommands ,pCommandBuffers 中任何一个元素在被记录时不能带有VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT

  • 如果 inherited queries 特征没有被启用,commandBuffer 的queries都不能为 active

  • 若 commandBuffer 有一个VK_QUERY_TYPE_OCCLUSION query active, 那么 pCommandBuffers 的每一个元素被记录时VkCommandBufferInheritanceInfo::occlusionQueryEnable 必须设置为 VK_TRUE

  • 若 commandBuffer 有一个VK_QUERY_TYPE_OCCLUSION query active, 那么 pCommandBuffers 的每一个元素被记录时VkCommandBufferInheritanceInfo::queryFlags 所有的bit必须为该query设置好

  • 若 commandBuffer 有一个 VK_QUERY_TYPE_PIPELINE_STATISTICS query active,那么 pCommandBuffers 的每一个元素在记录时 VkCommandBufferInheritanceInfo::pipelineStatistics 所有的bit都必须和这个query使用的VkQueryPool的bit位相同

  • pCommandBuffers 任何一个元素不能开启 在commandBuffer active的 query类型

Valid Usage (Implicit)
  • commandBuffer must be a valid VkCommandBuffer handle

  • pCommandBuffers must be a pointer to an array of commandBufferCount valid VkCommandBuffer handles

  • commandBuffer must be in the recording state

  • The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations

  • commandBuffer must be a primary VkCommandBuffer

  • commandBufferCount must be greater than 0

  • Both of commandBuffer, and the elements of pCommandBuffers must have been created, allocated, or retrieved from the same VkDevice

Host Synchronization
  • Host access to commandBuffer must be externally synchronized

  • Host access to the VkCommandPool that commandBuffer was allocated from must be externally synchronized

Command Properties
Command Buffer LevelsRender Pass ScopeSupported Queue TypesPipeline Type

Primary

Both

Transfer
graphics
compute

 
原创粉丝点击