如何在计算着色器写入和顶点属性读取之间创建障碍

时间:2019-08-06 22:21:06

标签: vulkan

我有一个粒子系统,首先运行一个计算着色器并更新所有属性,然后将这些属性用作顶点着色器中的vao输入。

现在我需要在这些阶段之间设置一个障碍,但是我不确定该怎么做,无论我如何尝试都会遇到一些错误。

目前,我有这样的管道障碍:

  VkMemoryBarrier memoryBarrier;
  memoryBarrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
  memoryBarrier.pNext = nullptr;
  memoryBarrier.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
  memoryBarrier.dstAccessMask = VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT;

  vkCmdPipelineBarrier(commandBuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
                   VK_PIPELINE_STAGE_VERTEX_INPUT_B

然后我创建具有此依赖关系的渲染通道:

VkSubpassDependency computeDependency;
computeDependency.srcSubpass = 0;
computeDependency.dstSubpass = 0;
computeDependency.srcStageMask = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT;
computeDependency.dstStageMask = VK_PIPELINE_STAGE_VERTEX_INPUT_BIT;
computeDependency.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
computeDependency.dstAccessMask = VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT;
computeDependency.dependencyFlags = 0;

但是这在我收到此错误时不起作用:验证层:依赖项1指定了一个源阶段掩码,其中包含不在源子通道0使用的GRAPHICS管道中的阶段。Vulkan规范指出:对于pDependencies,如果srcSubpass不是VK_SUBPASS_EXTERNAL,则该依赖项的srcStageMask成员中包括的所有阶段标志都必须是源子阶段(https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pDependencies-00837)的pipelineBindPoint成员所标识的管道所支持的管道阶段。

1 个答案:

答案 0 :(得分:2)

您不能在子通道的中间执行计算着色器。 The render pass scope of vkCmdDispatch is "outside",这也是为什么子通道之间的依赖性只能指定图形操作支持的阶段的原因。因此,渲染过程中计算着色器与使用者之间的任何依赖关系都是外部依赖关系:包含渲染过程的子过程与外界之间的依赖关系。

因此您的srcSubpass应该是VK_SUBPASS_EXTERNAL