在关于HOST_WRITE_BIT的规范中写道:
对于后续命令缓冲区操作可以看到的主机写入,必须执行从VK_ACCESS_HOST_WRITE_BIT和VK_PIPELINE_STAGE_HOST_BIT源到相关设备管道阶段和访问类型的目标的管道屏障。请注意,在每个命令缓冲区提交时会隐式执行此类屏障,因此很少需要显式屏障
但是,当你转换(通过vkCmdPipelineBarrier(在commandBuffer中))一个图像从PREINITIALIZED布局,srcAccessMask到0而不是HOST_WRITE_BIT时,你会收到一个错误:
验证层:当布局为VK_IMAGE_LAYOUT_PREINITIALIZED时,源AccessMask 0 [无]必须具有所需的访问位16384 [VK_ACCESS_HOST_WRITE_BIT],除非该应用先前已为此转换添加了屏障。
规格是否有错误?从验证层?我们所谈论的障碍是一个纯粹的执行障碍而不是记忆障碍吗?我错过了什么吗?
答案 0 :(得分:3)
我的私人观点是:验证图层错误。
它只是检查布局与访问标志,似乎并不知道这个角落的情况: 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
就足够了)?