HOST_WRITE 有用还是验证层错了?

HOST_WRITE useful or validation layers wrong?

在关于 HOST_WRITE_BIT 的规范中写着:

For host writes to be seen by subsequent command buffer operations, a pipeline barrier from a source of VK_ACCESS_HOST_WRITE_BIT and VK_PIPELINE_STAGE_HOST_BIT to a destination of the relevant device pipeline stages and access types must be performed. Note that such a barrier is performed implicitly upon each command buffer submission, so an explicit barrier is only rarely needed

但是,当您(通过 vkCmdPipelineBarrier(因此在 commandBuffer 中))从具有 srcAccessMask 的 PREINITIALIZED 布局转换为 0 而不是 HOST_WRITE_BIT 时,您会收到错误消息:

validation layer: Source AccessMask 0 [None] must have required access bit 16384 [VK_ACCESS_HOST_WRITE_BIT] when layout is VK_IMAGE_LAYOUT_PREINITIALIZED, unless the app has previously added a barrier for this transition.

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

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

它只是检查布局与访问标志,似乎并没有意识到这个极端情况: https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/blob/master/layers/core_validation.cpp#L9005

还有一种情况是您重新考虑并根本不对 VK_IMAGE_LAYOUT_PREINITIALIZED 图像进行托管写入(因此不需要障碍),不是吗?

我认为图层消息是 WARNING,而不是 ERROR。这可能意味着它是 "only" 一种启发式方法,并且会出现一些误报(直到它们改进了层,这似乎是可行的,但对于这种情况来说并不是那么微不足道)。


他们甚至最近才更正了演示文稿的 0 访问标志的可能性,因此他们(以类似的想法)忘记层中的类似内容并不牵强。

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


话虽这么说,也许 VK_PIPELINE_STAGE_HOST_BIT 也没有必要(TOP 就足够了)?