问题描述
应该使用内存屏障来防止写后读和写后写的危害。读取操作后,数据保持不变,因此无需使其可用。
但是规范和验证层确实允许nArray = arr + 5
中的READ_BIT
标志。一些隐式依赖项定义为:
srcAccessMask
在Khronos Vulkan示例中生成了mipmap之后,我也看到了这一点:
VkSubpassDependency implicitDependency = {
.srcSubpass = lastSubpass; // Last subpass attachment is used in
.dstSubpass = VK_SUBPASS_EXTERNAL;
.srcStageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
.dstStageMask = VK_PIPELINE_STAGE_BottOM_OF_PIPE_BIT;
.srcAccessMask = VK_ACCESS_INPUT_ATTACHMENT_READ_BIT |
VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
.dstAccessMask = 0;
.dependencyFlags = 0;
};
在这种情况下,// After the loop,all mip layers are in TRANSFER_SRC layout,so transition all to SHADER_READ
vkb::insert_image_memory_barrier(
blit_command,texture.image,VK_ACCESS_TRANSFER_READ_BIT,// srcAccessMask
VK_ACCESS_SHADER_READ_BIT,// dstAccessMask
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,VK_PIPELINE_STAGE_TRANSFER_BIT,VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,{VK_IMAGE_ASPECT_COLOR_BIT,texture.mip_levels,1});
是多余的,还是我缺少了什么?
解决方法
READ_BIT
确实是多余的。引用规范作者VulkanDocs:
所以我们现在已经完全解决了srcAccessMask中的READ是 完全没有操作。如果我们以前没有暗示您 需要它,那么我们可能会使它无效。相反,我们只是 将其保留为空操作,并希望向其添加警告 验证层,它是无操作的。这应该在规范中明确 在接下来的几周内。