在源访问掩码中使用READ_BIT是否有意义?

问题描述

应该使用内存屏障来防止写后读和写后写的危害。读取操作后,数据保持不变,因此无需使其可用。

但是规范和验证层确实允许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是 完全没有操作。如果我们以前没有暗示您 需要它,那么我们可能会使它无效。相反,我们只是 将其保留为空操作,并希望向其添加警告 验证层,它是无操作的。这应该在规范中明确 在接下来的几周内。