Synchronization 在源访问掩码中有读取位有意义吗?
内存屏障应该可以防止写后读和写后写的危险。读取操作后,数据保持不变,因此无需使其可用 但是规范和验证层确实允许Synchronization 在源访问掩码中有读取位有意义吗?,synchronization,vulkan,Synchronization,Vulkan,内存屏障应该可以防止写后读和写后写的危险。读取操作后,数据保持不变,因此无需使其可用 但是规范和验证层确实允许srcacessmask中的READ\u BIT标志。某些隐式依赖项定义为: VkSubpassDependency implicitDependency = { .srcSubpass = lastSubpass; // Last subpass attachment is used in .dstSubpass = VK_SUBPASS_EXTERNAL; .
srcacessmask
中的READ\u BIT
标志。某些隐式依赖项定义为:
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});
在这种情况下,
读取位是多余的,还是我遗漏了什么?读取位确实是多余的。引用规范作者:
现在我们已经完全解决了srccessmask中的READ是
如果我们之前没有暗示你
如果我们需要它,我们可能会让它失效。相反,我们只是
我们将把它作为一个禁止操作,并希望在
验证层认为这是不可操作的。这应该在规范中明确
在接下来的几周里
我已经打开了一个示例来澄清规范中的隐式依赖关系,并计划在最佳实践验证层中添加一个警告。