Vulkan 学习(1)---- Vulkan 基本概念和发展历史

目录

      • Vulkan及其演化史
      • Vulkan 基本概念
        • 基本术语
      • Vulkan 的原理
      • Vulkan应用程序
      • Vulkan的编程模型
        • 硬件初始化
        • 窗口展示表面
        • 资源设置
        • 流水线设置
          • 描述符和描述符缓冲池
          • 基于SPIR-V的着色器
          • 流水线管理
          • 指令的记录
          • 队列的提交

Vulkan及其演化史

目前主流的图形渲染API有OpenGLOpenGL ESDirectXMetal
OpenGL的应用领域较为广泛,支持多种操作系统平台(如Windows、UNIX、Linux、macOS等)基于其开发的应用可以方便、低成本地在不同操作系统平台之间移植。既可以用于开发游戏,又可以用于开发工业、行业应用
OpenGL-ES则是OpenGL针对移动端的裁剪版本。Direct-X是微软针对Win系统下图形渲染的技术,Metal则是针对Mac/iOS系统下图形渲染技术,从占有率而言DirectX是远远超过Metal的。
那么OpenGL在和Vulkan相比,Vulkan能够更好的调动GPU的性能,OpenGL在使用GPU前需要CPU处理很多数据,而Vulkan能够提供更小的运行开销、更直接的GPU控制、和更低的CPU负载。 Vulkan的原始概念是由AMD基于他们的私有的Mantle API设计和实现的,这个API几款不同的API中体现了自己的先进特性
Vulkan 发展历史

Vulkan 基本概念

基本术语
  • 物理设备(physical device)和设备(device)
    指的是物理设备在应用程序的中逻辑表示,一个计算机系统中可能包含多个物理设备

  • 队列(queue)
    队列是执行引擎(GPU)和物理设备之间的接口,一个物理设备总是包含一个或者多个队列(图形,计算,DMA/传输等),队列的职责是收集指令缓存并且分发到物理设备执行

  • 内存类型(memory type)
    广义上来讲有两种内存类型,设备内存和宿主内存,在后面会具体讨论

  • 指令(command)
    指令包含下面类型的指令:

  1. 动作指令(action command)
    包括绘制图元,清除表面,复制缓存,查询/时间戳操作,子通道的开始结束操作。这些指令可以修改帧缓存附件,读取或者写入内存,以及写入查询池

  2. 状态设置指令(set state command)
    这些指令可以用于绑定流水线,描述字集合以及缓存,或者设置一个动作状态,以及渲染通道,子通道的状态等等

  3. 同步指令(synchronization command)
    用于处理两个或者更多的动作指令同时发生的情况,此时的指令之间可能会产生争夺资源或者依赖于某些内存,该指令用于设置同步事件或者等待事件,插入流水线屏障对象,渲染通道子通道的依赖

  4. 指令缓存(command buffer)
    指令缓存是一组指令的集合,它可以记录多个指令并统一发送到队列中

Vulkan 的原理

支持Vulkan的系统可以直接查询系统信息,并返回可用的物理设备的数量。每个物理设备可以支持一个或者多个队列,这些队列被划分到不同的族群之中
每个族群都有自己的独特的功能设定,比如一个族群可能会支持图形,计算,数据传输,或者内存管理相关的内容。
队列族群每个成员可能包含一个或者多个相似的队列,因此它们之间相互是兼容的,比如: 在某个具体的驱动实现中,可能在同一个队列里同时支持数据传输和图形操作.
Vulkan允许用户显示在应用程序中管理和控制内存,它暴露了设备中所有支持的不同类型的内存堆(heap),每个堆属于一个不同的内存区域。
Vulkan的执行模型是非常简单和直接的,在这里指令缓存会被发送到队列中,后者将被物理设备按照顺序执行和消耗,Vulkan应用程序负责控制一组Vulkan设备,将一系列指令记录到指令缓存中,并发送到队列。驱动会读取队列并按照记录的顺序依次执行各个工作。
此外,有些指令缓存在应用程序中可以以多线程的方式并行同步的构建
下面是简化后的Vulkan执行模型:
Vulkan执行模型
这里应用程序记录了两个指令缓存,其中包含了多个指令,这些指令按照作业性质的不同,被传递给一个或者多个队列。
队列将这些缓存作业提交给设备加以执行,最后,设备处理得到结果,并将结果显示到输出设备,或者返回给设备做进一步的处理。
Vulkan中,应用程序主要负责下面的工作:

  • 生产指令执行所必须得先决内容
    包含资源的准备,着色器的预编译,将资源关联到着色器,设置着色器状态,构建流水线以及绘制调用等
  • 内存管理
  • 同步(宿主和设备之间,设备上的不同对列之间)
  • 风险管理

Vulkan应用程序

下图给出了 Vulkan 中的不同组件,以及不同组件在系统重的内部关系:
Vulkan应用程序
WSI: 窗口系统集成库是由khronos提供的一套功能扩展,可以将不同操作系统的展示层结合起来
SPIR-VSPIR-V提供了一套预编译的二进制数据格式,用来设置给Vulkan的着色器,不同的着色器源代码语言,比如 GLSLHSLS的各种变种,都可以通过预编译产生SPIR-V格式的数据
LunarG SDK:LunarG 提供了一套Vulkan的SDK,其中带有很多不同的资源和工具,可以辅助Vulkan程序的开发,这些工具和资源包括Vulkan的加载器,验证层,跟踪和回放工具。

Vulkan的编程模型

下图表示了Vulkan应用程序的编程模型自顶向下的实现过程:
应用程序编程模型

硬件初始化

加载器
加载器:加载器是一段应用程序启动时候执行的代码,可以用平台无关的方法定位Vulkan驱动
注入层:加载器允许在允许过程中随时注入不同类型的层,这样做的巨大好处是,驱动不需要做任何验证,
可注入的层实现的功能包括:

  • 跟踪Vulkan API指令的执行
  • 捕获渲染的场景,稍后在继续执行
  • 为了满足调试的需要,进行错误处理和验证
窗口展示表面

窗口展示层用于和当前系统的窗口系统进行链接
创建展示图像和创建窗口的工作和平台很相关,OpenGL中是通过底层平台进行链接的,窗口系统负责创建设备/环境以及对应的帧缓存
OpenGL不同的是,Vulkan在创建设备和环境时完全不需要包含一套窗口系统,这是通过WSI(Window System Intergration)完成的

WSI支持多个窗口系统,比如Waylad, Xwindows,它还支持通过交换链的方式实现窗口系统所有权的管理,也就是Double Buffer功能
WSI实现交换链需要下面的步骤实现:

  • 创建一个本地窗口
  • 创建WSI表面并且关联到窗口上
  • 创建交换链来显示表面
  • 从创建后的交换链中获取绘制的图像
资源设置

设置资源的含义是讲数据存储到内存区域中,数据可以是下面的类型:顶点属性比如位置,颜色或者图像类型/名称,数据是保存在内存中的,以便于Vulkan访问
OpenGL是通过隐式的方式管理场景背后的内存数据,不同的是Vulkan提供了一套底层接口来控制和管理内存,同时在物理设备上提供了不同类型的内存数据
Vulkan中的资源是应用程序显式进行管理的:

  1. 资源对象(Resource Object): 设置资源的时候,应用程序需要负责分配资源所用的内存,资源可以是图像也可以是缓存对象
  2. 分配(Allocation)和子分配(SubAllocation)
    创建了资源对象以后,我们只是关联了一个逻辑地址,并没有真正的物理地址可用,分配的过程就是分配物理地址并且将逻辑地址绑定到内存,完全的分配是很耗时的,
    子分配是一种高效的内存管理方式,它可以将物理内存的很大一部分立即分配完成并且存入不同的资源对象
    子分配是由应用程序负责完成的,下图给出了物理内存中实现对象子分配的流程:
    资源分配
    在资源设置阶段,应用程序需要完成的工作是:
  • 创建一个资源对象
  • 查询应用程序内存实例,创建一个内存对象,比如缓存或者图像
  • 获取对象分配相应的内存需求
  • 分配空间并且保存数据到其中
  • 将内存绑定到我们创建的资源对象上
流水线设置

流水线是指根据应用程序逻辑定义的一系列事件,他们按照固定的顺序执行。事件主要包含下面几种:设置着色器,绑定到资源,以及状态的管理
流水线

描述符和描述符缓冲池

描述符集合指的是资源和着色器之间的接口,可以将着色器绑定到资源,比如图像或者缓存,可以将资源内存关联或者绑定到准备使用的着色器的实例上

基于SPIR-V的着色器

SPIR-V着色器的特点包括:多重输入,离线编译,glslang 验证器和多重程序入口

流水线管理

物理设备需要定义发送的集合输入数据是如何进行解释和绘制的,这些状态的设置被统称为流水线状态
流水线状态包括光栅化状态,深度、模板状态此外还包括了输入几何数据的图元拓扑类型和渲染所用的着色器

指令的记录

指令的记录是逐渐构成指令缓存的过程。指令缓存是从指令缓存池中分配而来的。指令池可以用来同时分配多个指令缓存
应用程序定义了指令的开始和结束位置以后,就可以将指令记录到指令缓存之中
指令记录

图中描述的渲染过程如下:

  • 范围(scope): 记录了指令缓存记录的起始和截止位置
  • 渲染通道(render pass):
  • 流水线(pipeline): 包含了流水线对象用到的各种静态和动态的信息
  • 描述符(decriptor): 负责将资源信息绑定到流水线
  • 绑定资源(bind resource): 负责设置顶点缓存、图像几何相关的信息
  • 视口(view port): 绘制表面上可供执行图元渲染的部分矩形
  • 裁切器(scissor): 定义了一个矩形空间区域,舍弃这个区域之外的所有绘制信息
  • 绘制(drawing): 绘制指令将设置几何体的缓存属性,例如开始索引、总计数值等
队列的提交

Vulkan向应用程序暴露了不同类型的队列接口,比如:图形,DMA传输 或者计算队列
对列的执行需要下面的操作:

  • 从交换链中获取当前的图像,决定下一帧绘制所用的表面
  • 执行各种同步的机制,比如信号量,Fence等
  • 收集指令缓存,并且发布到对应的设备队列中,准备处理
  • 请求将输出设备中已经渲染完毕的图像显示出来

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

ROS——多个海龟追踪一个海龟实验

目标 通过键盘控制一个海龟(领航龟)的移动,其余生成的海龟通过监听实现追踪定期获取领航龟和其余龟的坐标信息,通过广播告知其余龟,进行相应移动其余龟负责监听 疑惑点(已解决) int main(int…

【感谢告知】本账号内容调整,聚焦于Google账号和产品的使用经验和问题案例分析

亲爱的各位朋友: 感谢您对本账号的关注和支持! 基于对朋友们需求的分析和个人兴趣的转变,该账号从今天将对内容做一些调整,有原来的内容改为Google(谷歌)账号和产品的使用经验,以及相关问题的…

判断是否为完全二叉树

目录 分析 分析 1.完全二叉树的概念:对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。 2.思路:可以采…

Redis源码整体结构

一 前言 Redis源码研究为什么先介绍整体结构呢?其实也很简单,作为程序员的,要想对一个项目有快速的认知,对项目整体目录结构有一个清晰认识,有助于我们更好的了解这个系统。 二 目录结构 Redis源码download到本地之后,对应结构如下: 从上面的截图可以看出,Redis源码一…

pdf怎么转换成图片格式文件,pdf文档怎么转换成图片格式

在数字化时代,pdf文件转换成图片格式是一种常见的操作,无论是在工作还是日常生活中,我们总会遇到需要将pdf文件转换为图片的需求。这可能是因为图片格式更易于分享、展示或编辑。那么,如何高效地将pdf转换成图片呢?本文…

C++初学者指南-4.诊断---未定义行为检测器

C初学者指南-4.诊断—未定义行为检测器 未定义行为检测器(UBSAN) 适用编译器:clang,g在运行时检测许多类型的未定义行为 解引用空指针从未对齐的指针读取整数溢出被0除 … 在代码中加入额外的指令:在调试构建中增加运行时约25% 示例:有符号整形溢出 …

RabbitMq - Java客户端基础【简单案例 +Work模型】

目录 1、前置知识 1.1、AMQP怎么理解 1.2、Spring AMQP是什么 1.3、为什么要了解Spring-AMQP? 2、使用Spring-AMQP实现一个发消息案例 3、Work模型 问题: 优化: 小结:Work模型的使用: 1、前置知识 1.1、AMQP怎…

【论文阅读】-- Visual Traffic Jam Analysis Based on Trajectory Data

基于轨迹数据的可视化交通拥堵分析 摘要1 引言2 相关工作2.1 交通事件检测2.2 交通可视化2.3 传播图可视化 3 概述3.1 设计要求3.2 输入数据说明3.3 交通拥堵数据模型3.4 工作流程 4 预处理4.1 路网处理4.2 GPS数据清理4.3 地图匹配4.4 道路速度计算4.5 交通拥堵检测4.6 传播图…

2024世界人工智能大会,神仙打架

B站:啥都会一点的研究生公众号:啥都会一点的研究生 AI圈最近又发生了啥新鲜事? 该栏目以周更频率总结国内外前沿AI动态,感兴趣的可以点击订阅合集以及时收到最新推送 B站首秀世界人工智能大会,展示自研AI技术与AIGC…

生成式人工智能如何改变软件开发:助手还是取代者?

生成式人工智能如何改变软件开发:助手还是取代者? 生成式人工智能(AIGC)正在引领软件开发领域的技术变革。从代码生成、错误检测到自动化测试,AI工具在提高开发效率的同时,也引发了对开发者职业前景的讨论…

【shell编程小项目】

目录 一、项目拓扑二、要求三、shell编程 一、项目拓扑 二、要求 环境准备: 准备两个虚拟机,按照环境配置好对应的 IP 地址和对应的主机名和 SSH 密钥登录在 workstation.exam.com 节点实现如下需求: 1、编写 Shell 脚本,要求代码…

【web APIs】快速上手Day04(Dom节点)

目录 Web APIs - 第4天日期对象实例化方法案例-页面显示时间时间的另外一个写法 时间戳三种方式获取时间戳案例-毕业倒计时效果 节点操作DOM节点查找节点父节点查找案例-关闭广告子节点查找兄弟关系查找 增加节点创建节点追加节点案例-学成在线案例渲染克隆节点 删除节点 M端事…

ESP32 步进电机精准控制:打造高精度 DIY 写字机器人,实现流畅书写体验

摘要: 想让你的 ESP32 不再仅仅是控制灯光的工具吗? 本文将带你使用 ESP32 开发板、步进电机和简单的机械结构打造一个能够自动写字的机器人。我们将深入浅出地讲解硬件连接、软件代码以及控制逻辑,并提供完整的项目代码和电路图,即使是 Ardu…

在mac下 Vue2和Vue3并存 全局Vue2环境创建Vue3新项目(Vue cli2和Vue cli4)

全局安装vue2 npm install vue-cli -g自行在任意位置创建一个文件夹vue3,局部安装vue3,注意不要带-g npm install vue/cli安装完成后,进入目录,修改vue为vue3 找到vue3/node-moudles/.bin/vue,把vue改成vue3。 对环境变量进行配置…

码垛机:物流自动化的关键设备

在数字化浪潮席卷全球的今天,物流行业正迎来前所未有的变革。其中,码垛机作为物流自动化的关键设备,正在逐步改变着传统仓库的运营模式,引领着物流自动化的新篇章。 一、码垛机:物流自动化的得力助手 码垛机是一种能够…

【手写数据库内核组件】0201 哈希表hashtable的实战演练,多种非加密算法,hash桶的冲突处理,查找插入删除操作的代码实现

hash表原理与实战 ​专栏内容: postgresql使用入门基础手写数据库toadb并发编程 个人主页:我的主页 管理社区:开源数据库 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 文章目录 hash表…

从资金管理的角度 谈谈伦敦金投资技巧

刚进入伦敦金市场的时候,笔者认为技术分析是很重要的,所以将学习伦敦金投资技巧的精力全部投入到技术分析的学习中。经过一系列交易的亏损,笔者才发现,其实交易管理才是最重要的。如果管理得好,30%的胜率,投…

Python28-7.5 降维算法之t-分布邻域嵌入t-SNE

t-分布邻域嵌入(t-distributed Stochastic Neighbor Embedding,t-SNE)是一种用于数据降维和可视化的机器学习算法,尤其适用于高维数据的降维。t-SNE通过将高维数据嵌入到低维空间(通常是二维或三维)中&…

CC工具箱使用指南:【相交占比分析】

一、简介 需求场景如下,有【待分析地块】和【面积占比参考】2个图层。2个图层之间存在空间上的重叠。工具的目的是为了分析出【待分析地块】的每1个图斑中,和【面积占比参考】相交的面积,以及和总面积的占比。 举一个应用场景为例&#xff0…

STM32点灯闪烁

stm32c8t6引脚图 开发板引脚图 GPIO端口的每个位可以由软件分别配置成 多种模式。 ─ 输入浮空 ─ 输入上拉 ─ 输入下拉 ─ 模拟输入 ─ 开漏输出 ─ 推挽式输出 ─ 推挽式复用功能 ─ 开漏复用功能 配置GPIO端口步骤:开启时钟->使用结构体设置输出模式…