设备初始化

Instance --> GPU --> Device

Instance表示具体的Vulkan应用。在一个应用程序中可以创建多个实例,这些实例之间相互独立,互不干扰。

当调用API创建Vulkan实例的时候,Vulkan SDK内部会经由驱动装载器(loader)查找可用的GPU设备。

创建Vulkan实例需要两个输入信息:

应用程序的信息

内存分配回调函数

Vulkan通过用户输入的内存分配器来分配内存。

创建好Instance,就可以用Instance枚举所有可用的Vulkan GPU设备。

有了GPU设备,就可以获取具体GPU的信息。如果系统中安装了多个GPU设备,就可用GPU信息比较GPU设备之间的兼容性等。

找到了合适的GPU后,就可以通过GPU创建设备示例。

绘制

Queues

有了设备,就可以创建命令队列。命令队列是与设备绑定的,不能跨设备使用。

队列封装了图形、计算、直接内存访问功能,独立调度、异步等调度操作。

Command Buffer

有了设备,就可以创建命令缓冲。命令缓冲是绘制命令的批次集合。

用户可创建任意多的命令缓冲,支持在多线程中创建。

Command占用的内存是通过Command Buffer内存池动态分配,不需要指定内存池的大小。

Command

在命令缓冲区中可以创建多个命令。多个命令完成批次即命令缓冲后,可以重复利用。

这里有点像OpenGL里面的NameList。

Command Buffer的操作使用pipeline barrier区分。barrier可以等待和触发事件。

注:

这里可以看出Command被包装在Command Buffer中,当把Command Buffer提交给Queue中后,Queue中执行的是Command Buffer中的Command。

另外,Command Buffer和Queue的类别需要匹配,否则不能正确执行,但一个Command Buffer并不会跟任何Queue有联系。也就意味着,一个Command Buffer可以被提交给多个Queue,只要他们的类别匹配。

Shaders

使用设备创建Shader。

同样支持多线程。

Pipeline

渲染管线同样需要设备创建。

渲染管线状态包括:Shaders,混合、深度、剔除、模版状态等。

另外Vulkan提供了API保存和加载渲染管线的状态。

Descriptors

Vulkan资源都用descriptor表示, descriptor分成descriptor set,descriptor set从descriptor pool分配。

每个descriptor set都有个layout布局,布局是在pipeline创建的时候确定的。layout在descriptor set 和pipeline之间共享,并且必须匹配。

pipeline可以切换使用相同layout的descriptor set。

多个不同layout的set可以组成链在一个pipeline中使用。

Render Pass

Render Pass表示一帧的某个阶段,包含了绘制过程中的很多信息,包括:

- Layout和framebuffer attachment的类型

-Render Pass在开始和结束的时候该做什么

-Render Pass影响framebuffer的区域-分块渲染和延迟渲染需要的信息

Drawing

Draws位于Render Pass内,在Command Buffer的上下文中执行。支持多种绘制类型:基于索引的和非索引的,直接的和间接的等

多线程支持

同步

使用事件同步任务,可以设置、重置、查询和等待事件。

Command Buffer执行完成后可以触发事件。

任务队列

任务在设备所属的队列中执行,准备好的Command buffer送到队列中执行。

队列保留内存,驱动不负责管理内存,同样由程序管理。

队列可以触发事件,等待信号量。

Presentation

展现就是如何在屏幕上显示图片。

可显示的资源使用与framebuffer绑定的“图片”展现,由与平台相关的模块创建,即所谓的窗口系统接口WSI。

WSI用了列举系统的显示设备和视频模式,全屏,控制显示垂直同步等。

Presenta跟命令缓冲一起进入队列。

资源创建和释放

资源包括CPU资源和GPU资源。

CPU资源通过vkCreate创建,GPU资源由vkAllocMemory创建,由vkBindObjectMemory与CPU对象绑定。

应用程序负责Vulkan对象的析构,需要保证顺序。Vuilkan资源没有引用计数机制,都需要显式释放。


vkCreateInstance

Vulkan API基本概念的更多相关文章

  1. 使用 Vulkan * API 并行渲染对象

    Vulkan API 是业界最热门的新技术之一.它们支持多线程编程,可以简化跨平台开发,而且主要的芯片.GPU 和设备制造商都为其提供支持.Vulkan API 有望成为未来主流图形渲染平台之一.该平 ...

  2. MapReduce API 基本概念

    在正式分析新旧 API 之前, 先要介绍几个基本概念. 这些概念贯穿于所有 API 之中,因此, 有必要单独讲解. 1.序列化 序列化是指将结构化对象转为字节流以便于通过网络进行传输或写入持久存储的过 ...

  3. Compute API 关键概念 详解

    Compute API 是 RESTful HTTP 服务,提供管理虚机的能力. 虚机可能有不同的内存大小,CPU数量,硬盘大小,能够在几分钟之内创建出来.和虚机的交互,可以通过Compute API ...

  4. 【翻译】Flink Table Api & SQL —— 概念与通用API

    本文翻译自官网:https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/common.html Flink Tabl ...

  5. web API的概念

    11月20日 纷乱的术语 接口:从接口测试说起,接口是某个对象和外界交互的部分,应用程序可能有很多接口. 用户界面UI(user interface) 消息交互接口,外界是其他程序:diameter, ...

  6. SDK,API概念

    什么是SDK什么是API? SDK 就是 Software Development Kit 的缩写,就是"软件开发工具包". 这是一个覆盖面相当广泛的名词,可以这么说:辅助开发某一 ...

  7. Android 7.0 新增功能和api

    Android 7.0 Nougat 为用户和开发者引入多种新功能.本文重点介绍面向开发者的新功能. 请务必查阅 Android 7.0 行为变更以了解平台变更可能影响您的应用的领域. 要详细了解 A ...

  8. [译]Vulkan教程(02)概况

    [译]Vulkan教程(02)概况 这是我翻译(https://vulkan-tutorial.com)上的Vulkan教程的第2篇. This chapter will start off with ...

  9. [译]Vulkan教程(01)入门

    [译]Vulkan教程(01)入门 接下来我将翻译(https://vulkan-tutorial.com)上的Vulkan教程.这可能是我学习Vulkan的最好方式,但不是最理想的方式. 我会用“d ...

随机推荐

  1. ORACLE数据库编程

    第一章 Oracle数据库基本概念 一.介绍 Oracle数据库系统是美国Oracle(甲骨文)公司提供的以分布式数据库为 核心的一组软件产品,是目前最流行的客户/服务器(Client/Server, ...

  2. 【阿里聚安全·安全周刊】 全美警局已普遍拥有破解 iPhone 的能力 | 女黑客破解任天堂Switch,称硬件漏洞无法修复

    本周的七个关键词: 破解 iPhone丨 女黑客破解任天堂丨假的身份证 丨 扫黄打非丨华盛顿特区发现手机间谍设备 丨 Telegram被俄罗斯监管机构告上法庭丨价值5万美金的Firefox浏览器漏洞 ...

  3. JS面向对象使用面向对象进行开发

      面向对象基础一之初体验使用面向对象进行开发 对 JS 中的面向对象的基础进行讲述, 初体验使用面向对象进行开发 主要内容是 面向对象的概念及特性 用面向对象的方式解决简单的标签创建实例 一些基础的 ...

  4. [ABP]浅谈模块系统与 ABP 框架初始化

    在 ABP 框架当中所有库以及项目都是以模块的形式存在,所有模块都是继承自AbpModule 这个抽象基类,每个模块都拥有四个生命周期.分别是: PreInitialze(); Initialize( ...

  5. 深入java多线程一

    涉及到 1.线程的启动(start) 2.线程的暂停(suspend()和resume()) 3.线程的停止(interrupt与异常停止,interrupt与睡眠中停止,stop(),return) ...

  6. bzoj 4180: 字符串计数

    Description SD有一名神犇叫做Oxer,他觉得字符串的题目都太水了,于是便出了一道题来虐蒟蒻yts1999. 他给出了一个字符串T,字符串T中有且仅有4种字符 'A', 'B', 'C', ...

  7. UVA1658:Admiral

    题意:给定一个有向带权图,求两条不相交(无公共点)的路径且路径权值之和最小,路径由1到v 题解:这题的关键就在于每个点只能走一遍,于是我们想到以边换点的思想,用边来代替点,怎么代替呢? 把i拆成i和i ...

  8. python3 字符串str 教程

    字符串可以用单引号或双引号来创建. Python 不支持单字符类型,单字符也在Python也是作为一个字符串使用. 例: var1 = 'Hello World!' var2 = "Pyth ...

  9. zookeeper快速入门

    一.zookeeper简介 zookeeper 是apache旗下的hadoop子项目,它一个开源的,分布式的服务协调器.同样通过zookeeper可以实现服务间的同步与配置维护.通常情况下,在分布式 ...

  10. make cmake gcc 间的关系

    看了一些关于make  cmake gcc间关系的帖子,其中这一篇简单明了. 作者:辉常哥链接:https://www.zhihu.com/question/36609459/answer/89743 ...