[TOC]

文章

参考:https://zhuanlan.zhihu.com/p/165341403

Vulkan 简介

图形软件有两个大类:专用软件包(special-purpose packages)和通用编程软件包(general programming packages)。

专用软件包通常提供一种UI设计语言,让用户直接生成想要的图形,不用关心内部实现。这类软件例子是PS、CAD等等。

相反,通用编程软件包提供一个可使用C、C++或Java等高级语言编程的图形函数库。图形函数库中提供几何图元、矩阵变换等操作,提供了间接操作硬件的软件接口,所以这组图形函数又被称为计算机图形应用编程接口(computer-graphics application programming interface,CG API)。OpenGL、Vulkan、DirectX、Metal皆在此列。

Vulkan多线程

Vulkan不仅仅是图形(graphics)API,而是一个面向图形和计算的编程接口(graphics and compute)。支持Vulkan的设备可以是GPU,也可以是DSP或者固定功能的硬件。

Vulkan中的计算模型主要基于并行计算,因此支持多线程是Vulkan设计的核心理念之一。

为了较少Vulkan内部因为互斥同步等操作造成的卡顿问题,Vulkan内部默认认为对任何资源的访问不存在多线程竞争,所有的资源同步操作由应用开发者去负责,因为对资源的访问和使用没有人比应用开发者自己更加清楚。Vulkan称之为外部同步(external synchronization)。

因为这个原因,资源管理和线程同步工作成为编写Vulkan程序的最大难点之一。想要让Vulkan多线程正常运行,你需要做大量的工作。当然,换来的是Vulkan有了更加干净的线程模型以及比其它CG API高得多的性能。

img

Instances, Devices, and Queues

在正式研究Vulkan多线程之前,有三个重要的基础概念需要了解—Instances, Devices, and Queues。

Instances可以看做是应用的子系统,从逻辑上把Vulkan与应用程序上下文中的其他逻辑隔开。Instances可以看做是Vulkan的上下文,它会跟踪所有状态,从逻辑上把所有支持Vulkan的设备整合在一起。

Devices有两个概念:Physical devices和Logical device。

Physical devices通常代表一个或者多个支持Vulkan的硬件设备,这些设备具有特定功能,可以提供一系列Queues。图形显卡、加速器、DSP等都可以是Vulkan的Physical devices。

Logical device是Physical devices的软件抽象,用于预订一些硬件资源。

Queues可以理解为一个“GPU线程”,它是实现Vulkan多线程的关键元素之一,用于响应应用的请求,大部分时间,应用都在与其交互。

Vulkan功能的层次结构图如下:

img