使用 VkSubpassDependency 与信号量?

2024-01-07

我正在关注这个 vulkan 教程:https://vulkan-tutorial.com/Drawing_a_triangle/Drawing/Rendering_and_presentation https://vulkan-tutorial.com/Drawing_a_triangle/Drawing/Rendering_and_presentation我目前位于子通道依赖部分。作者在文中表示,由于在从交换链获取图像之前可能会发生图像布局转换,因此我们需要使用如下的 VkSubpassDependency ,以便渲染通道将在片段着色器输出阶段等待。

VkSubpassDependency dependency = {};
dependency.srcSubpass = VK_SUBPASS_EXTERNAL;
dependency.dstSubpass = 0;
dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
dependency.srcAccessMask = 0;
dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;

不过作者之前也有这段代码

vkAcquireNextImageKHR(device, swapChain, UINT64_MAX, imageAvailableSemaphore, VK_NULL_HANDLE, &imageIndex);
VkSubmitInfo submitInfo = {};
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
VkSemaphore waitSemaphores[] = { imageAvailableSemaphore };
VkPipelineStageFlags waitStages[] = { VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT };
submitInfo.waitSemaphoreCount = 1;
submitInfo.pWaitSemaphores = waitSemaphores;
submitInfo.pWaitDstStageMask = waitStages;
submitInfo.commandBufferCount = 1;
submitInfo.pCommandBuffers = &commandBuffers[imageIndex];
VkSemaphore signalSemaphores[] = { renderFinishedSemaphore };
submitInfo.signalSemaphoreCount = 1;
submitInfo.pSignalSemaphores = signalSemaphores;
if (vkQueueSubmit(graphicsQueue, 1, &submitInfo, VK_NULL_HANDLE) != VK_SUCCESS) {
    throw std::runtime_error("failed to submit command buffer");
}

这段代码的作用是,在我们能够实际从交换链获取图像之前,片段着色器阶段不会启动(imageAvailableSemaphore 确保这一点)。对我来说,这两段代码正在做同样的事情,即确保片段着色器阶段在我们能够获取图像之前不会启动。这是为什么?

PS:我也很难理解 stagemask 和 access mask。


子通道依赖性表示从initialLayout第一个布局发生在srcStageMask and dstStageMask各自的同步范围。

信号量等待pWaitDstStageMask表示信号量将在不晚于该阶段等待(并且根据信号量等待的性质,会阻止任何后续执行,直到等待完成。

你不能跳过信号量,因为vkAcquireNextImageKHR不是队列操作,信号量(或栅栏)是知道表示引擎不再需要图像的唯一方法。

并且您不能跳过 subpass 依赖项,因为跳过它相当于提供srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT。这意味着布局转换(可以是写访问)可以在任何点执行。如果你的pWaitDstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,这意味着演示引擎可能仍在读取图像,而您的工作已经尝试更改图像布局。

你可以使用pWaitDstStageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT (resp. VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT)没有障碍\依赖性。但这意味着“首先等待信号量”,然后阻止一切。包括甚至不需要交换链图像的部分(例如顶点处理)。在某些平台上这可能不是最佳的,并且没有理由这样做。

我应该补充一点,同步命令并不真正经过管道阶段。它们仅定义同步范围之间的依赖关系。信号量等待和 Subpass 依赖之间发生的情况是执行依赖链。信号量定义了 PE 和COLOR阶段。 Subpass Dependency 定义了COLOR阶段和布局过渡。由此选择的阶段do形成一个执行依赖链这两个同步原语之间。这样的链就形成了传递性;即,它充当 PE 和布局转换之间的单一依赖关系。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 VkSubpassDependency 与信号量? 的相关文章

  • 初识Vulkan渲染管线

    目前参考 Vulkan规范 和 Vulkan开发实战详解 对渲染管线有了一个初步的认识 现结合中英文的渲染管线图进行笔记整理 中英文的渲染管线图分别如下所示 xff1a 绘制命令送入设备队列执行后 xff0c Vulkan将原始的物体顶点坐
  • 在Android Studio中使用vulkan

    首先要确定手机是否支持Vulkan 可以下载一个aida64 在设备中如果能找到vulkan设备 说明支持 否则不支持 严格按照官方介绍的步骤一步步执行 就能获得官方推荐的可执行的例子 有很多 可以都试一试 那怎么在自己的工程中使用vulk
  • Vulkan下多线程渲染设计

    1 Vulkan 视角下的多线程渲染 首先我们需要从vulkan api的顶层框架上来看一下 它在哪些地方可以让我们并行 Vulkan API的基本框架 Vulkan不同于Gles只有一个 不被API暴露出来的 单一链条的cmdbuffer
  • Vulkan® A Specification Core And Extension::Vulkan文档核心部分和扩展部分对照与翻译说明

    2020 7 1 更 修改和完善某些描述 Vulkan版本 1 2 137 1 2 145 Vulkan文档分成两种 核心部分 核心部分 扩展部分 核心部分是必定要翻译的 对于扩展部分 本人并不是所有扩展都见过 所以对于扩展部分尽可能的翻译
  • Vulkan入门精要

    Vulkan入门精要 fuxiii github io https fuxiii github io Essentials of Vulkan
  • Vulkan Windows VS2022 开发环境配置

    1 确保编译器支持C 17 所以需要Visual Studio 2017及其以上版本 我这里用的是2022 确保环境安装了CMake CMake gui 可选装 2 下载Vulkan SDK 到 https vulkan lunarg co
  • Vulkan同步机制和图形-计算-图形转换的风险(一)

    在现代渲染环境中 很多情况下在一个数据帧期间会产生计算负荷 在GPU上计算通常 非固定功能 是并行编程的 通常用于具有挑战性 完全不可能或仅通过标准图形管道 顶点 几何 细化 栅格 碎片 实现的效率低下的技术 一般情况下 计算在实现技术方面
  • 【PBR系列二】辐射度量学理论

    本文核心知识主要参照 现代计算机图形学入门 闫令琪课程课件PPT 后续光线追踪系列辐射度量学知识也源于此处 辐射度量学理论 在开始之前我们先思考 为什么学习辐射度量学 辐射度量学是基于物理光照的基础 一 辐射能和辐射通量 辐射能 Radia
  • Vulkan-程序结构

    程序结构 一般来说 完整的Vulkan程序包含 创建Vulkan实例 获取物理设备列表创建逻辑设备 创建命令缓冲 获取设备中支持图形工作的队列 初始化交换链 创建深度缓冲 创建渲染通道 创建帧缓冲 创建绘制对象 初始化渲染管线 创建栅栏和初
  • 闭关之 Vulkan 应用开发指南笔记(四):绘制、几何体&片段处理、同步和回读数据

    目录 第8章 绘制 8 1 准备绘制 8 2 顶点数据 8 3 索引绘制 8 3 1 只用索引的绘制 8 3 2 重置索引 8 4 实例化 8 5 间接绘制 第9章 几何体处理 9 1 表面细分 9 1 1 表面细分配置 表面细分模式 控制
  • 关于 Vulkan 简介 —— Android N 引入新的 3D 渲染引擎

    关于 Vulkan Vulkan 被视作是 OpenGL 的后续产品 它是一种多平台 API 可支持开发人员准备游戏 CAD 工具 性能基准测试等高性能图形应用 它可在不同的操作系统 比如 Windows Linux 或 Android 上
  • Vulkan 描述符绑定

    在我的 vulkan 应用程序中 当所有网格使用相同的纹理时 我曾经这样绘制网格 Updatedescriptorsets texture Command buffer record For each mesh Bind transform
  • Vulkan 的 VkMemoryHeapFlagBits 是否缺少值?

    在 Vulkan 规范 1 0 9 第 180 页 中 我们有以下内容 typedef struct VkMemoryHeap VkDeviceSize size VkMemoryHeapFlags flags VkMemoryHeap 和
  • 使用管道屏障代替信号量

    我想确保我正确理解管道障碍 因此 只要第二个屏障的源阶段晚于第一个屏障的目标阶段 屏障就能够同步两个命令缓冲区 它是否正确 当然 如果命令缓冲区在管道的不同迭代期间执行 我将需要使用信号量 在我看来 同步是 Vulkan 中最难掌握的部分
  • 使用 VkSubpassDependency 与信号量?

    我正在关注这个 vulkan 教程 https vulkan tutorial com Drawing a triangle Drawing Rendering and presentation https vulkan tutorial
  • 将 Vulkan 与 SFML 结合使用?

    我目前使用 GLFW 进行窗口创建和用户输入 GLFW 只是让我们可以说 glfwWindowHint GLFW CLIENT API GLFW NO API 告诉 GLFW 不支持 OpenGL 它甚至提供了类似的功能 glfwCreat
  • GPU 上的相干内存是什么?

    我在记忆中不止一次遇到 非连贯 和 连贯 记忆这个术语 科技论文 https renderdoc org vulkan in 30 minutes html与图形编程相关 我一直在寻找简单明了的解释 但发现大部分是 硬核 论文this ht
  • xvfb(带有 Mesa 19.2)与 Vulkan 兼容吗?

    我正在尝试在无头 Ubuntu 19 10 虚拟机上运行基于 Vulkan 的图形应用程序 通过xvfb https en wikipedia org wiki Xvfb 从裸露的 Ubuntu 19 10 映像开始 使用创建lxc htt
  • Vulkan 内存对齐要求

    我正在为 Vulkan 设备内存实现一个简单的内存管理器 并希望确保我了解内存的对齐要求以及如何满足这些要求 因此 假设我使用 vkAllocateMemory 分配了一个内存 池 并希望将该池中的内存块子分配给各个资源 基于 VkMemo
  • vulkan 扩展:哪些由谁支持?

    有EXT KHR or AMD or NV扩展 也许还有其他一些 我知道NV means NvidiaAMD 不太可能支持 it nv 扩展 但是 khr 或 ext 又如何呢 他们是所有人都强制支持的吗 有一个website https

随机推荐

  • 更改字典键的最佳方法

    我想知道是否有更好的方法来更改字典键 例如 var dic new Dictionary
  • SQLAlchemy/MySQL 在查询期间丢失与 MySQL 服务器的连接

    SQLAlchemy 0 9 8 和 mysql 5 6 21 osx10 8 x86 64 和 MAC OS X 10 3 3 Yosemite 我总是断断续续 InterfaceError InterfaceError 2013 Los
  • 宏编程中如何获取当前目录名称?

    我需要知道如何在宏编程中获取当前目录变量 我正在桌面上保存一个文件 如下所示 C Users deadlock Desktop data html 是否可以将 C Users deadlock Desktop 替换为当前的直接变量 这是我的
  • 执行相机意图时 Activity 被终止

    编辑 问题已解决 请参见我的答案 https stackoverflow com a 9791832 839965 below 在我的应用程序中 我调用系统相机拍照 然后处理结果onActivityResult 你知道 平常的 它曾经有效
  • Setuid 到 Perl 脚本

    我正在使用 Perl 脚本从 mqueue 文件夹中删除 sendmail 的数据 When I setuid到该 Perl 脚本并尝试从用户运行它 它会抛出以下消息 Insecure dependency in chdir while r
  • 如何通过标签查找并禁用内容控件以删除它及其内容?

    我有一个不幸的任务 被迫为我公司的单位设计一个基于Word 的电子生产卡 尽管我从未使用过VBA 我更愿意在 Excel 中完成此操作 因为我不必费力处理内容控制和页面上各种表格中难以找到的位置 但公司的文档系统强制这一特定的文档系统必须在
  • 如何在 CakePHP 中生成 MySQL IS NOT NULL 条件?

    我正在尝试获取结果的子集作为 virtualField 以在我的视图中使用 我什至可能不知道如何解决这个问题 但这是我到目前为止所做的 我在这里从这个问题开始 CakePHP virtualField 查找所有不为空 https stack
  • Typescript,从接口中提取多个调用签名[重复]

    这个问题在这里已经有答案了 鉴于以下情况 interface Foo attr string a string number a number number 如何创建一种仅选择函数重载的类型 这意味着 interface Bar a str
  • 错误:请通过更新 google-services 插件的版本来修复版本冲突

    我在使用 Google 服务插件时遇到问题 我将谷歌服务更新到最新版本 我从这个网站获得了依赖 https bintray com android android tools com google gms google services h
  • Keras、Tensorflow:将两个不同的模型输出合并为一个

    我正在研究一种深度学习模型 我试图将两种不同模型的输出结合起来 整体结构是这样的 所以第一个模型采用一个矩阵 例如 10 x 30 input 1 input text layers Input shape 1 dtype string e
  • net.snowflake.client.jdbc.SnowflakeChunkDownloader :等待下载 #chunk0 超时

    等待下载块错误超时 Snowflake JDBC 驱动程序版本 3 13 18 遇到错误 net snowflake client jdbc SnowflakeSQLException JDBC driver internal error
  • iPython magic for Zipline 找不到数据包

    我有一个 Python 2 7 脚本 可以在命令提示符下正常运行 Zipline 使用 bundle myBundle加载自定义数据包myBundle我已经注册使用extension py zipline run f myAlgo py b
  • 如何使用 HttpWebRequest 发布数据?

    我有这个HttpWebRequest var request HttpWebRequest Create http example com api Phrase GetJDTO request ContentType application
  • 在GUI中删除表中的数据

    我有一个问题 当用户输入密钥时 如何删除 GUI 中 jTable 中的所有数据 谢谢 您可以设置一个新的空数据模型 TableModel newModel new DefaultTableModel jtable setModel new
  • Mahout 堆空间不足

    我正在使用 Mahout 在一组推文上运行 NaiveBayes 两个文件 一个 100 MB 一个 300 MB 我将 JAVA HEAP MAX 更改为 JAVA HEAP MAX Xmx2000m 之前是 1000 但即便如此 mah
  • 自动过滤 SQLAlchemy 查询的正确方法?

    我刚刚使用 sqlalchemy 从 CRM 应用程序中反思了一个相当令人讨厌的模式 所有表上都有一个已删除的列 我想自动过滤所有标记为已删除的实体和关系 这是我想出的 class CustomizableQuery Query An ov
  • 将阴影添加到视差遮挡贴图

    我已经通过实现视差遮挡贴图学习OpenGL https learnopengl com Advanced Lighting Parallax Mapping 现在我想添加自阴影 以便片段挤压在表面上投射阴影 我读过一些关于这个主题的论文 但
  • GitHub - 按作者列出提交

    有什么办法可以上GitHub http github com 在浏览器中列出单个作者所做的所有提交 都不是本地的 例如通过git log 也不通过 API 单击提交列表 提交历史记录 中的用户名只会进入该用户的个人资料页面 检查 GitHu
  • 使用 HashMap 作为表单支持 Bean Spring MVC + ThymeLeaf

    我是 Spring MVC 的新手 来自 Grails 是否可以使用 HashMap 作为表单支持 bean 在 Grails 中 人们可以从任何控制器操作访问名为 params 的对象 Params 只是一个映射 其中包含 POST 数据
  • 使用 VkSubpassDependency 与信号量?

    我正在关注这个 vulkan 教程 https vulkan tutorial com Drawing a triangle Drawing Rendering and presentation https vulkan tutorial