Vulkan 简介

Vulkan 简介,第1张

序言

Vulkan 的设计理念 开放性 轻量化;

Vulkan 将 “绘制物体” 描述成为多个不同缓存和多组不同的流水线之间的关联和组合;

Vulkan 将实现引擎在底层接口兼容性测试和调试工作部分转移到了算法封装和框架设计上;

vulkan 的介绍、 概念 、术语 ,与 openGL 的不同点

vulkan 的原始概念由AMD 的 Mantle API 设计和实现的, AMD将 Mantle  的源码贡献给 khronos 组织, 而后 khronos 组织发布了vulkan

Mantle 是新一代底层图形应用编程接口, 最大化的利用CPU多核化,向开发者提供了充分利用多核图像硬件功能的能力,改进了GPU与CPU之间的协作

Vulkan 支持多种平台, windows,  ubuntu, streamOS, android…

Vulkan 与 OpenGL 的对比

(1)降低了驱动负载和cpu 使用量

         向开发者提供更为直接的硬件控制权力,访问图形处理器。

(2)多线程的扩展性

        OpenGL 多线程能力受限于它状态机模式,扩展能力非常有限。Vulkan 在不同的线程下任务 的创建,提交及执行都是完全独立的。

(3)显示 API

         OpenGL 的 API 是隐式的, 资源管理工作交给驱动层去完成,驱动层负责读取应用程序段的提示参数并跟踪资源(给驱动带来了负担)。

Vulkan 的驱动并不负责资源及组员之间相互关系的管理,都是由应用程序负责。

(4)单一API

         Vulkan桌面端和嵌入式系统使用统一的API

         OpenGL根据硬件及系统的不同, 移动端采用API 为OpenGL  ES。

(5)直接访问GPU

         Vulkan 暴露了自己的底层功能和硬件特性,给用户提供大量的控制手段。比如 对物理设备, 内存类型,指令队列 及功能扩展。

(6)错误检查和验证

        OpenGL 运行时会强制进行错误检查(OpenGL 4.6 版本可以开启和禁用),带来了性能上的损耗。 Vulkan 可以通过插件服务的形式进行错误检查和验证,需要时可以随时开启和关闭。避免了驱动错误检查带来了性能问题。

(7)可预测行为

Vulkan 的行为具有很高的可预测性,不会再延迟产生延迟和抖动,用户传递到驱动层的指令会立即提交。OpenGL的任务提交需要等待驱动层再去调度。

(8)内存控制

Vulkan 体统不同的内存接口,交由开发者去选择合适的内存类型,实现各种资源的管理和使用。 OpenGL 是通过驱动层去管理资源的,不同的供应商的实现不同也导致资源的管理方式不同。

Vulkan相关的概念

(1)物理设备 与 设备

          物理设备 指的是硬件设备, 设备是应用程序中的逻辑表示。

(2)队列

          队列表示执行引擎与应用程序之间的接口。物理设备包含一个或多个不同的队列。每个队列的功能相同或不同(图形、计算、DMA/传输…), 队列收集准备执行的指令缓存并分发到物理设备执行。

(3) 内存类型

两类: 宿主内存和设备内存。

(4) 指令

执行是执行用户的行为,可分以下几类:

动作指令  图元绘制、 清楚表面 , 复制缓存、 查询时间戳….状态指令  绑定流水线,描述符几何级缓存,设置渲染通道/子通道。同步指令 处理两个或多个动作指令,处理通道及子通道的依赖。

(5) 指令缓存 :一组指令的集合

Vulkan 的执行模型

Vulkan 的队列

队列是Vulkan 的一种中间层机制,负责接收指令缓存并传递给设备。

指令缓存的发送方式:

(1)单一队列: 顺序执行

(2)多重队列: 允许指令缓存并行的方式在多个队列中执行

指令缓存发送和执行顺序可能会不一致,客户端需要做同步 *** 作。

Vulkan 同步方式:

信号量(semaphore) 单一队列或跨队列(粗力度)

事件(event) 用在单个队列同步命令缓存的执行

栅栏(fence) 宿主和设备之间的同步

流水线屏障(pipeline barrier) 插入到指令缓存中的一种指令,确保在他之前的指令优先执行,其后的指令随后执行。

Vulkan 的对象模型

在应用程序端,包括设备、队列、指令缓存、帧缓存、流水线等在内的所有对象,统称为vulkan 对象。这些对象用句柄标识,分为可分发的和不可分发的两种。

可分发的句柄:

不可分发的句柄:

对象生命周期

Vulkan 中的对象是根据应用程序的逻辑需求显示的创建和销毁的。

Create*, Destroy*, Allocate*, Free

vkCmd*  把指令记录到指令缓存中

Vulkan 错误检查与验证

可选的功能,在VulKan 的层次化结构中使用,在系统运行时动态注入。

理解Vulkan 应用程序 不同组件在系统中的内部关系:

DRIVER, SDK, WSI, SPIR, APP

驱动:应用程序与设备本身的接口,例如: 枚举系统中所有可用设备,每个队列及队列类型,内存对及相关属性。

应用程序:调用vulkan API 来执行图形或者计算工作。

WSI: Khronos 提供的一套功能扩展, 将不同的 *** 作系统平台上的展示层统一起来, linux, Windows, android.

SPIR-V  预编译的二进制数据格式,设置vulkan 着色器。

LunarG SDK ,   LunarG 提供的一套vulkan SDK。

Vulkan 编程模型

1、硬件初始化

加载器:是应用程序启动时执行的代码, 他使用平台无关的方式来定位系统中的vulkan驱动:

    (1)定位驱动

    (2)平台无关性, OpenGL 在创建设备环境要借助于窗口系统且 API 也不一样

    (3)注入层   驱动不需要做任何验证来判断程序使用的API是否合法。

    (4)跟踪 Vulkan API 的指令执行;

    (5)捕获渲染场景

    (6)调试

2、窗口展示表面

Vulkan 在创建设备和环境时不需要包含一套窗口系统,EGL, WGL, XGL。

一套一致的API

WSI 交换链机制来视线多幅图像的使用。

过程:

创建一个本地窗口;

创建WSI表面并关联到窗口上;

创建交换链来显示表面;

从创建后的交换链获取绘制后的图像;

3、资源的设置

将数据存储到内存区域中。

OpenGL会通过隐式的方式来管理场景背后的内存数据。

内存堆分类:

宿主本地(host local)设备本地(device local)

内存堆按配置分:

设备本地、 设备本地,宿主可见, 宿主本地,宿主可见。

稀疏内存;

阶段缓存-----并不是直接将数据保存到硬件端。

异步传输

OpenGL没有宿主或者设备内存的概念,内存分配过程也不透明。

(1)过程

(2)创建资源对象

(3)创建内存对象

(4)获取对象分配的内存需求

(5)分配空间并保存数据

(6)将内存绑定到资源对象上

4、设置流水线

重要概念

描述符集与描述符缓冲池

  描述符集是资源和着色器之间的接口。

频繁变化

描述符缓冲池 分配描述符集

SPIR-V 着色器

      多重输入,离线编译

5、流水线的管理

流水线对象(pipeline object) : 流水线的创建是非常耗费资源的,它包含了卓泽奇的重新编译,资源的绑定,渲染通道,帧缓存的管理以及其它的 *** 作。

PCO: 使用流水线缓冲对象创建流水线对象。

流水线布局(pipeline layout): 流水线布局提供了流水线中所用的描述符集,其中设置了各种不同的资源关联到着色器的不同方法。

过程:

(1)应用程序将着色器编译到SPIR-V,让后设置给流水线的着色器状态;

(2)描述符将资源链接到着色器本身;

(3)应用程序创建流水线对象,控制不同的硬件设定;

6、指令的记录

渲染通道(Render pass)定义用户工作执行过程可能会影响到帧缓存的内容。它可能包含了附件、子通道与子通道之间的依赖关系。渲染通道负责设置帧缓存状态,指定清除颜色。

流水线:  其中包换了流水线对象所用的各种状态信息;

描述符: 资源信息绑定到流水线;

指令缓存如果被反复执行,不需要每次都创建。Vulkan 确保指令池不会出现资源互锁。

每个线程维护一个独立的指令缓存池。

6、队列提交

多个指令缓存可以被压送到独立的兼容性队列里,从而视线并行的执行。应用程序负责指令缓存中的各种同步,以及队列之间的同步 *** 作,设置还有宿主和设备之间的同步 *** 作。

队列的提交需要执行的 *** 作:

   (1)从交换链中获取当前图像,决定下一帧绘制所用的表面;

   (2)如果需要,执行各种同同步;

   (3)收集指令缓存,并且发布到对应的设备队列中,准备处理;

   (4)请求输出设备中已经渲染完毕的图像;

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/992726.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存