Vulkan规范:第五章 5.6

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 Levels Render Pass Scope Supported Queue Types Pipeline Type

Primary

Both

Transfer
graphics
compute

 
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值