Understanding Vulkan Objects

​ 和学习其他API一样,学习Vulkan API中有一个重要部分:了解Vulkan API定义了拿下类型,以及这些类型之间的关系。为了帮助理解这些类型,接下来会绘制一幅关系图,表现它们之间的关系,尤其是创建依赖关系。

​ 每个Vulkan类型都有一个特定的前缀Vk。这些前缀在下面的关系图中将会被省略。每个Vulkan函数都有一个特定前缀vk。举个例子:关系图中的Sampler,其实表示VkSampler。这些Vulkan类型不能被视为指针或者数字,把它理解成句柄是一个不错的方向,它是一个不透明的句柄。绿色背景对象的原始类型是uint32_t

​ 带箭头的实线表示创建顺序。举个例子,创建DescriptorSet之前,必选先创建DescriptorPool

​ 带实心菱形的实线表示包含关系,也就是说,该对象无需创建,直接从它的父对象中获取。举个例子:PhysicalDevice对象并不是创建的,而是从Instance对象中枚举的。

​ 虚线表示其他关系,比如:提交各种命令到CommandBUffer对象。

在这里插入图片描述
InstanceVulkan应用第一个创建的对象。它用于连接上层应用与Vulkan运行时驱动,因此,在上层应用中应该只创建一个。同时,它也用于存储Vulkan程序相关状态的软件结构,因此,所有上层应用想要使能的验证层或特性扩展,都应该在创建Instance时被指定。

PhysicalDevice:表示GPU硬件的抽象。上层应用可以从Instance对象中枚举得到物理设备,之所以是枚举的原因在于可以存在多个物理设备。同时,可以从PhysicalDevice对象中查询VendorIdDeviceId和所有支持的特性,以及相关属性和限制。

PhysicalDevice对象可以枚举得到所有可用的Queue Families。最主要的就是图形队列,其次还有计算队列或传输队列。

PhysicalDevice对象还可以枚举得到支持Memory HeapsMemory TypesMemory Heap表示特定的RAM池,它能抽象母板上的RAM、或GPU片上的RAM、或任何其他Host-Or-Device内存。在分配内存时,上层应用必须指定Memory Type,它承载了堆内存的特定需求,比如:Host-VisibleCoherent(CPU and GPU Visible)。根据不同的供应商,这些类型会有不同的组合。

Device:它是基于物理设备创建的逻辑设备。它是Vulkan API中最基本的对象,几乎所有对象的创建都会依赖它。在创建逻辑设备时,需要指定期望使能的设备特性,比如:各向异性纹理过滤。同时,上层应用也必须指明将会使用的队列,包括其索引和Queue Families

Queue:它接收指令,并将指令提交到GPU上去执行。所有GPU执行任务,都会填充到CommandBuffers中,然后提交到Queues,使用Vulkan API函数vkQueueSubmit。如果,上层应用分别制定了图形队列和计算队列,则可以将不同的CommandBuffers提交对应的队列。

CommandPool:它是一个简单的对象,唯一的功能就是分配CommandBuffer。它也需要指定Queue Family

CommandBuffer:它是从CommandPool对象中分配的。它表示在逻辑设备上执行各种指令的缓冲。在这个指令缓冲上面,上层应用可以填充各种各样的指令,所有指令都有相同的前缀vkCmd

Sampler:它不会被绑定到任何特定的Image上。它更像是一组状态参数,比如:滤波模式(nearest or linear),或寻址模式(repeat, clamp-to-edge, clamp-to-border)。

BufferImage是两种占用设备内存的资源类型。

Buffer是相对简单的那种,它是任意的二进制数据的容器,且以字节(Byte)为单位的长度。

Image则表示像素集合。在其他API中,被称之为纹理(textture)。上层应用创建一个Image时,有很多参数需要指定。比如:类型上可以分为1D,2D,3D;像素格式也有很多种(比如:R8G8B8A8_UNORM or R32_SFLOAT);也可以是一组离散图像,用于mipmap;Image在不同的驱动实现下,可以有两种内部组成格式(tilinglayout)。

创建一个Buffer或者Image,驱动并不会自动为之分配内存。上层应用需要分成3步去创建:

  • Allocate DeviceMemory
  • Create Buffer or Image
  • Bing them together using function vkBindBufferMemory or vkBindImageMemory

这就是为什么上层应用必须创建DeviceMemory对象,它代表了一块内存,按照指定的内存类型和按照字节为单位指定大小。同时,上层应用不应该为每一个BufferImage分别创建一个DeviceMemory。取而代之的是,上层应用应该批发一大块DeviceMemory用于众多BufferImage。这是因为,分配DeviceMemory是一个开销较大的操作,同时,驱动也限制了DeviceMemory分配的数量。这个限制可以在PhysicalDevice中查询。

这里有一个例外,SwapChain中的Image则不需要上层应用主动分配并绑定DeviceMemory

BufferImage被创建、绑定DeviceMemory,在渲染过程中也不能被直接使用。

BufferView:它必须依赖已经创建好的Buffer对象,才能被创建。同时,创建的时候必须传递偏移和范围,来表示该BufferView仅仅只是访问其中一部分。

ImageView:它必须依赖已经创建好的Image对象,才能被创建。同时,也必须传递一组参数,来限制该ImageView的访问范围和方式。

着色器访问这些资源(BufferImageSampler)的方式是描述符。但是,描述符本身并不存在,它们总是被被描述符集管理。在创建描述符集之前,应用程序必须先创建一个DescriptorSetLayout,它是用于定义描述符集的行为模板。举个例子:假设,应用程序的某个着色器需要如下资源:

Binding slotResource
0One uniform buffer(called constant buffer in DirectX) available to the vertex shader stage.
1Another uniform buffer available to the fragment shader stage
2A sampled image
3A sampler, also available to the fragment shader stage

在创建描述符集之前,应用程序需要创建一个DescriptorPool,它专用于分配DescriptorSet。在创建DescriptorPool之前,应用程序必须指定将来需要使用的描述符集的类型以及最大可分配数量。

最终,应用程序分配DescriptorSet所需要的前置对象包括DescriptorPoolDescriptorSetLayout

DescriptorSet表示保存实际描述符集的内存,可以对其进行配置,以便描述符集指向特定的BufferBufferViewImageSampler。应用程序可以通过掉用函数vkUpdateDescriptorSets

可以通过函数vkCmdBindDescriptorSetsCommandBuffer中需要使用的描述符集绑定。这个函数还需要PipelineLayout对象。它表示渲染管线的配置,指定描述符集的类型将会在CommandBuffer中使用。

FrameBuffer:应用程序可以创建一个FrameBuffer对象,必须指定RenderPassImageView数组。同时,它的数量和格式必须匹配RenderPass

Pipeline下次再看

Semaphore:它的创建无需参数,用于Queue之间的同步。

Event:它的创建无需参数,专用于GPUCPU之间的同步,调用的函数是vkCmdSetEventvkCmdResetEventvkCmdWaitEvent。同样,也可以在CPU的其他线程中调用函数vkGetEventStatus获取Event的状态。

参考:https://gpuopen.com/learn/understanding-vulkan-objects/

参考:https://docs.vulkan.org/spec/latest/chapters/pipelines.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/735635.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

map和set(二)——AVL树的简单实现

引入 二叉搜索树有其自身的缺陷,假如往树中 插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此 map、set等关联式容器的底层结构是对二叉树进行了平衡处理,即采用平衡树来实现。简…

康奈尔开源近10万份审稿意见,未来论文发表或将由AI定夺

大语言模型(LLMs)的进步为自动化论文评审开辟了新途径,这些模型在学术反馈领域展现出巨大潜力。自动化评审的核心优势在于其能够精准指出论文草稿的不足之处,助力作者优化研究。尽管已有丰富的同行评审数据,但现有自动…

20.2 nginx

20.2 nginx 1. 学习目标2. 介绍2.1 正向代理2.2 反向代理2.3 动态静态资源分离2.4 nginx优缺点3. 安装3.1 Linux安装****************************************************************************************************************************************************…

基于stm32的流水灯设计

1基于stm32的流水灯设计[proteus仿真] 速度检测系统这个题目算是课程设计和毕业设计中常见的题目了,本期是一个基于51单片机的自行车测速系统设计 需要的源文件和程序的小伙伴可以关注公众号【阿目分享嵌入式】,赞赏任意文章 2¥&#xff0c…

《领导的气场——8堂课讲透中国式领导智慧》读书笔记

整体感悟 个人感觉书籍比较偏说教、理论,没有看完。 现仅仅摘录自己“心有戚戚焉”的内容。 经典摘录 管理的本质是通过别人完成任务。有一百件事情,一个人都做了,那只能叫勤劳;有一百件事情,主事的人自己一件也不做&…

js 获取浏览器相关的宽高尺寸

window 屏幕 屏幕分辨率的高: window.screen.height 屏幕分辨率的宽: window.screen.width 屏幕可用工作区高度: window.screen.availHeight 屏幕可用工作区宽度: window.screen.availWidth document 网页 网页可见区域宽&#xf…

C语言学习--练习4(二维数组)

目录 1.统计有序数组中的负数 2.矩阵对角线元素和 3.最富有客户的资产总量 4.托普利兹矩阵 5.矩阵中的幸运数 6.二进制矩阵中的特殊位置 7.岛屿的周长 1.统计有序数组中的负数 //直接遍历二维数组即可 int countNegatives(int** grid, int gridSize, int* gridColSize) …

比特币普通地址、隔离见证(兼容)、隔离见证(原生)、Taproot 地址傻傻分不清楚

我们在使用比特币钱包的时候,可以看到各种地址类型:普通地址、隔离见证(兼容)、隔离见证(原生)、Taproot 地址。 看得我们一脸懵逼,为什么会有这么多种类型的地址? 它们之间都有什么…

选修-单片机作业第1/2次

第一次作业 第二次作业 1、51 系列单片机片内由哪几个部分组成?各个部件的最主要功能是什么? 51系列单片机的内部主要由以下几个部分组成,每个部件的主要功能如下: 1. **中央处理器(CPU)**:这是…

装windows11+centos双系统时遇到问题及解决方法

从u盘启动提示linpus lite has been blocked 首先下载iso镜像文件,制作u盘启动工具,进行启动,这里进入bios界面进行启动项选择后,虽然已经将usb作为首要启动值 却会出现上图所示被“block”情形 需要在bios界面security选项&…

【数理统计实验(四)】方差分析

🍉CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一|统计学|干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项,参与研究经费10w、40w级横向 文…

【动态规划】代码随想录算法训练营第四十四天 |完全背包,518. 零钱兑换 II , 377. 组合总和 Ⅳ (待补充)

完全背包理论基础 完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。 完全背包和…

三、实战篇 优惠券秒杀

源码仓库地址:gitgitee.com:chuangchuang-liu/hm-dingping.git 1、全局唯一ID 数据库默认自增的存在的问题: id增长规律明显受单表数据量的限制 场景一分析:id如果增长规律归于明显,容易被用户或者商业对手猜测出一些敏感信息&…

QT画图功能

QT画图功能 每个QWidget都自带的功能,继承了QPainteDevice都可以使用QPainter来进行绘图。 画图需要调用paintEvent绘制事件,paintEvent事件时QWidget类自带的事件。 重写paintEvent事件。(重写事件:如果父类有某个方法&#xff…

Spring Boot 面试题及答案整理,最新面试题

Spring Boot中的自动配置是如何工作的? Spring Boot的自动配置是其核心特性之一,它通过以下方式工作: 1、EnableAutoConfiguration注解: 这个注解告诉Spring Boot开始查找添加了Configuration注解的类,并自动配置它们…

22.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-加载配置文件到分析工具界面

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果 内容参考于:易道云信息技术研究院VIP课 上一个内容:21.配置数据保存…

加快代码审查的 7 个最佳实践

目录 前言 1-保持小的拉取请求 2-使用拉取请求模板 3-实施响应时间 SLA 4-培训初级和中级工程师 5-设置持续集成管道 6-使用拉取请求审查应用程序 7-生成图表以可视化您的代码更改 前言 代码审查可能会很痛苦软件工程师经常抱怨审查过程缓慢,延迟下游任务&…

什么是GoogLeNet,亮点是什么,为什么是这个结构?

GooLeNet 亮点 最明显的亮点就是引入了Inception,初衷是多卷积核增加特征的多样性,提高泛化能力 ,比如,最下边是一个输入层,然后这个输入分别传递给1*1,3 * 3 ,5 * 5和一个最大池化层&#xff…

2024春招和暑期实习全面启动!

大家好,我是小柠檬。2024春招和暑期实习全面启动!最近,我注意到很多同学都在积极投递简历。 3D视觉求职星球 今天给大家推荐我们的3D视觉岗求职星球,里面时常发布大量3D视觉岗位和星球专属内推岗位。 篇幅有限,文节选…

最新全流程GMS地下水数值模拟及溶质(包含反应性溶质)运移模拟技术深度应用

本文以地下水数值模拟软件GMS操作,本文中强调模块化教学,分为前期数据收集与处理;三维地质结构建模;地下水流动模型构建;地下水溶质运移模型构建和反应性溶质运移构建5个模块;采用全流程模式将地下水数值模…