首页 > 解决方案 > 在源访问掩码中包含 READ_BIT 是否有意义?

问题描述

内存屏障应该防止写后读和写后写危险。在读操作之后,数据没有改变,因此不需要使其可用。

但是规范和验证层确实允许READ_BITsrcAccessMask. 一些隐式依赖定义为:

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;
};

在 Khronos Vulkan 示例中生成 mipmap 后,我也看到了这一点:

// 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, 0, texture.mip_levels, 0, 1});

在这种情况下是READ_BIT多余的,还是我错过了什么?

标签: synchronizationvulkan

解决方案


READ_BIT确实是多余的。引用VulkanDocs的规范作者:

所以我们现在已经完全解决了 srcAccessMask 中的 READ 完全是空操作。如果我们之前没有暗示您需要它,那么我们可能会使其无效。相反,我们只是将其保留为无操作,并希望向验证层添加警告,表明它是无操作的。这应该在接下来的几周内的规范中明确。


推荐阅读