设备初始化

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. JavaScript中内存使用规则--堆和栈

    堆和栈都是运行时内存中分配的一个数据区,因此也被称为堆区和栈区,但二者存储的数据类型和处理速度不同.堆(heap)用于复杂数据类型(引用类型)分配空间,例如数组对象.object对象:它是运行时动态分 ...

  2. CSS 选择器简介

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 选择器权重 如果以4位数表示选择符权重,那么: 元素选择器的权重是1: id 选择器的权重为100: cl ...

  3. Oracle中SQL调优(SQL TUNING)之最权威获取SQL执行计划大全

    该文档为根据相关资料整理.总结而成,主要讲解Oracle数据库中,获取SQL语句执行计划的最权威.最正确的方法.步骤,此外,还详细说明了每种方法中可选项的意义及使用方法,以方便大家和自己日常工作中查阅 ...

  4. kubernetes controller 实现

    对于kubernetes中不存在的资源类型,我们可以通过自定义资源的方式进行扩展,首先创建customresourcedefinition对象定义资源及其schema,然后就可以创建自定义的资源了,但 ...

  5. Spring-cloud(二)注册服务提供者搭建

    上文已经写了如何去搭建注册中心,仅有注册中心是远远不够的,所以我们需要注册到注册中心并提供服务的节点,这里称为注册服务提供者 前提 阅读上文,并成功搭建注册中心,环境无需改变 项目搭建 这里我们需要新 ...

  6. MongoDB 分片集群搭建

    一.概述 分片是一种在多台机器上分配数据的方法.MongoDB使用分片来支持具有非常大的数据集和高吞吐量操作.有两种解决系统增长的方法:垂直扩展和水平扩展. 垂直扩展涉及增加单个服务器的容量,例如使用 ...

  7. STL源码剖析 — 空间配置器(allocator)

    前言 以STL的实现角度而言,第一个需要介绍的就是空间配置器,因为整个STL的操作对象都存放在容器之中. 你完全可以实现一个直接向硬件存取空间的allocator. 下面介绍的是SGI STL提供的配 ...

  8. Spring Cloud Eureka 自我保护机制

    Eureka Server 在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 会将这些实例保护起来,让这些实例不会过期,但是在保护期内如果 ...

  9. [SDOI 2011]计算器

    Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给 ...

  10. noip模拟题-赛斯石

    题目背景 白露横江,水光接天,纵一苇之所如,凌万顷之茫然.--苏轼 真程海洋近来需要进购大批赛斯石,你或许会问,什么是赛斯石? 首先我们来了解一下赛斯,赛斯是一个重量单位,我们用sisi作为其单位.比 ...