vulkan:VkImageMemoryBarrier

我在这里不太了解。: https://github.com/SaschaWillems/Vulkan/blob/master/examples/computeshader/computeshader.cpp

true

drawCmdBuffers [currentBuffer]在compute.commandBuffer之前运行,但是使用者drawCmdBuffers [currentBuffer]需要生产者compute.commandBuffer产生的textureComputetarget。

  
      
  1. 我不明白为什么在configure.commandBuffer之前调用drawCmdBuffers [currentBuffer]。
  2.   

在下面的代码中,仅渲染第一帧,而右侧图片未获得textureComputetarget,因此以蓝色背景渲染。

void draw()
{
    VulkanExampleBase::prepareFrame();

    submitInfo.commandBufferCount = 1;
    submitInfo.pCommandBuffers = &drawCmdBuffers[currentBuffer];
    VK_CHECK_RESULT(vkQueueSubmit(queue,1,&submitInfo,VK_NULL_HANDLE));

    VulkanExampleBase::submitFrame();

    // Submit compute commands
    // Use a fence to ensure that compute command buffer has finished executin before using it again
    vkWaitForFences(device,&compute.fence,VK_TRUE,UINT64_MAX);
    vkResetfences(device,&compute.fence);

    VkSubmitInfo computeSubmitInfo = vks::initializers::submitInfo();
    computeSubmitInfo.commandBufferCount = 1;
    computeSubmitInfo.pCommandBuffers = &compute.commandBuffer;

    VK_CHECK_RESULT(vkQueueSubmit(compute.queue,&computeSubmitInfo,compute.fence));
}

在调用void draw() { VulkanExampleBase::prepareFrame(); submitInfo.commandBufferCount = 1; submitInfo.pCommandBuffers = &drawCmdBuffers[currentBuffer]; VK_CHECK_RESULT(vkQueueSubmit(queue,compute.fence)); sleep(1000) // <-------- Wait } 时执行:

vkQueueSubmit(queue,VK_NULL_HANDLE)
  
      
  1. 等待VK_PIpelINE_STAGE_COMPUTE_SHADER_BIT,但是此阶段之前尚未执行,为什么管道没有卡住?是因为   之前没有管道,所以不需要等待吗?
  2.   

第6.6节“管道壁垒” vkCmdpipelineBarrier是一个同步命令,它在提交到相同队列的命令之间或相同子传递中的命令之间插入依赖项。

VkImageMemoryBarrier imageMemoryBarrier = {};
imageMemoryBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
// We won't be changing the layout of the image
imageMemoryBarrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
imageMemoryBarrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
imageMemoryBarrier.image = textureComputetarget.image;
imageMemoryBarrier.subresourceRange = { VK_IMAGE_ASPECT_COLOR_BIT,1 };
imageMemoryBarrier.srcaccessMask = VK_accESS_SHADER_WRITE_BIT;
imageMemoryBarrier.dstaccessMask = VK_accESS_SHADER_READ_BIT;
vkCmdpipelineBarrier(
    drawCmdBuffers[i],VK_PIpelINE_STAGE_COMPUTE_SHADER_BIT,VK_PIpelINE_STAGE_FRAGMENT_SHADER_BIT,VK_flaGS_NONE,nullptr,&imageMemoryBarrier);
vkCmdBeginRenderPass(drawCmdBuffers[i],&renderPassBeginInfo,VK_SUBPASS_CONTENTS_INLINE);

打印结果: 0x6000039c4a20、0x6000039c4a20 当前队列和compute.queue是同一队列,但是上面的代码可能会生成不同的队列。

  
      
  1. VkImageMemoryBarrier可以在多个队列中同步吗?

  2.   
  3. vkCmdpipelineBarrier是一个同步命令,它在提交到同一队列的命令之间插入依赖项   在同一子通道中的命令之间。为什么使用“或” ,为什么不使用   “和”

  4.   
xiaanping 回答:vulkan:VkImageMemoryBarrier

  
      
  1. 我不明白为什么在configure.commandBuffer之前调用drawCmdBuffers [currentBuffer]。
  2.   

Dunno,这是一个例子。作者可能并不担心第一帧会发生什么。只需一帧延迟即可绘制出来。在抽奖之前交换计算内容也应该很努力。

  
      
  1. 等待VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,但是此阶段之前尚未执行,为什么管道没有卡住?是因为之前没有管道,所以不需要等待吗?
  2.   

因为那不是管道和依赖项的工作方式。 vkCmdPipelineBarrier确保在屏障到达({{1})之前记录的任何命令\ op之前,屏障到达(并完成)至少srcStage阶段(即COMPUTE)之前队列中的任何命令\操作}}。

即使以前没有记录任何命令,也可以满足这种依赖性。即根据“无”的定义,尚无尚未到达dstStage阶段的命令。

  
      
  1. COMPUTE是否可以在多个队列中同步?
  2.   

是的,在信号灯的帮助下。

对于VkImageMemoryBarrier和其他队列系列,它称为Queue Family Ownership Transfer(QFOT)。

否则,信号量已经执行了内存依赖性,并且不需要VK_SHARING_MODE_EXCLUSIVE

  
      
  1. VkImageMemoryBarrier是一个同步命令,它在提交到同一队列的命令之间或同一子通道中的命令之间插入依赖项。为什么使用“或”,为什么不使用“与”?
  2.   

vkCmdPipelineBarrier不在子阶段,然后与队列中前后记录的命令形成依赖关系。

或者vkCmdPipelineBarrier在子通道内,在这种情况下,它称为“子通道自相关性”,其范围仅限于该子通道(在其他限制中)。

本文链接:https://www.f2er.com/3117771.html

大家都在问