synchronization - 在源访问掩码中包含 READ_BIT 是否有意义?
问题描述
内存屏障应该防止写后读和写后写危险。在读操作之后,数据没有改变,因此不需要使其可用。
但是规范和验证层确实允许READ_BIT
在srcAccessMask
. 一些隐式依赖定义为:
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
多余的,还是我错过了什么?
解决方案
READ_BIT
确实是多余的。引用VulkanDocs的规范作者:
所以我们现在已经完全解决了 srcAccessMask 中的 READ 完全是空操作。如果我们之前没有暗示您需要它,那么我们可能会使其无效。相反,我们只是将其保留为无操作,并希望向验证层添加警告,表明它是无操作的。这应该在接下来的几周内的规范中明确。
推荐阅读
- c++ - 指向函数中向量向量的指针给出“表达式必须具有指针类型”错误
- javascript - 多个模式按钮不适用于 JavaScript
- node.js - Mongoose 计数文档,其中属性设置为 false 的数组元素的计数小于一个值
- android - Android clipRect 未按预期剪辑
- python - 如何将文本文件中的数据提取到定义为空白行之间的数据行的句子中?
- css - 在coldfusion中的日期比较中显示更多/显示更少
- html - 我怎样才能对齐
- expo - 导入自己的 tensorflow 模型来响应原生
- javascript - Firestore 中断查询
- git - 从 EC2 添加 Git 和复制文件