2016-11-09 333 views
2

在约HOST_WRITE_BIT的规格是写:HOST_WRITE有用或验证图层错误?

对于主机写入到由后续命令缓冲器的操作可以看出,从VK_ACCESS_HOST_WRITE_BIT源和VK_PIPELINE_STAGE_HOST_BIT到相关设备的流水线级和访问的目的地的管道屏障类型必须执行。另外,这样的屏障在每个命令缓冲区提交隐式执行,所以显式屏障仅很少需要

但是,当过渡(通过vkCmdPipelineBarrier(所以在commandBuffer))从预先初始化布局与一种图像一个srcAccessMask到0,而不是HOST_WRITE_BIT,则得到一个错误:

验证层:源AccessMask 0 [无]必须具有所需的访问位16384时布局VK_IMAGE_LAYOUT_PREINITIALIZED,除非该应用以前添加的屏障[VK_ACCESS_HOST_WRITE_BIT]为了这个转变。

从规格中是否有错误?从验证层?我们谈论的障碍是纯粹的执行障碍而不是记忆吗?我错过了什么吗?

回答

3

我的私人意见是:验证层错误。

它只是简单地检查布局VS访问标志和似乎没有意识到这个角落情况: https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/blob/master/layers/core_validation.cpp#L9005

还有,当你重新考虑,并在所有没有承载写入到VK_IMAGE_LAYOUT_PREINITIALIZED图像也时(因而不需要屏障),不是吗?

我相信层消息是WARNING而不是ERROR。这可能意味着它仅仅是“启发式”,并且预计会出现一些误报(直到他们改进了层次,这似乎是可能的,但对于这种情况并不那么微不足道)。


他们甚至只是近来修正可能性为0演示访问标志,所以它不是遥不可及的,他们会(类似头脑)忘了什么东西一样,在该层。

我会在那里报告问题。他们不会咬人,更糟糕的是,可能发生的一些Khronos内部人士比我更懂得解释为什么你错了。


话虽这么说,也许VK_PIPELINE_STAGE_HOST_BIT不必太(和TOP应该足够了)?

+0

好的就在你回答之前,我在github上做了一个问题^^。 所以这是一个警告,而不是一个错误,你是对的。 我不明白TOP_OF_PIPE是从哪里来的^^ –

+0

那么,你所说的声明说,根本不需要**屏障。按照这个逻辑,如果你有障碍,那么非阻塞的('src = TOP_OF_PIPE')就足够了,不是吗? – krOoze

+0

要转换图像布局,您必须使用内存屏障。但恕我直言,你不需要告诉Vulkan内存可用,因为它已经由隐含屏障执行了。 –