1.2 实例、设备和队列

Vulkan包含了一个层级化的功能结构,从顶级开始是实例,实例聚集了所有支持Vulkan的设备。每个设备提供了一个或多个队列,这些队列执行应用程序请求的工作。

Vulkan实例是一种软件构造,它在逻辑上将应用程序的状态与在应用程序上下文中运行的其他应用程序或库分开。系统中的物理设备(每个都具有某些功能)表示为实例的成员,包括一组可用队列。

物理设备通常表示一个单独的硬件或者互相连接的一组硬件。在任何系统里,都有一些数量固定的物理设备,除非这个系统支持重新配置,例如热插拔。由实例创建的逻辑设备是一个与物理设备相关的软件概念,表示与某个特定物理设备相关的预定资源,其中包括了物理设备上可用队列的一个子集。可以通过创建多个逻辑设备来表示一个物理设备,应用程序花大部分时间与逻辑设备交互。

图1.1说明了这种层次结构。 在图中,应用程序创建了两个Vulkan实例。系统中有三个物理设备可供两个实例使用。 枚举后,应用程序在第一个物理设备上创建一个逻辑设备,为第二个设备创建两个逻辑设备,为第三个设备创建另一个逻辑设备。每个逻辑设备启用其相应物理设备队列的不同子集。实际上,大多数Vulkan应用程序几乎不会那么复杂,只需使用单个实例为系统中的一个物理设备创建单个逻辑设备。 图1.1仅用于演示Vulkan系统的灵活性


vulkan Android实战 android vulkan开发_vulkan Android实战

图1.1 Vulkan实例、设备和队列的层级关系

 

以下小节讨论如何创建Vulkan实例,查询系统中的物理设备并附着与其中一个相对应的逻辑设备,最后获取设备提供的队列的句柄。

1.2.1 Vulkan实例

Vulkan可以看作是您的应用程序的子系统。 将应用程序链接到Vulkan库并初始化后,它就会跟踪某些状态。由于Vulkan不会将任何全局状态引入您的应用程序,因此所有跟踪状态都必须存储在您提供的对象中。以下就是实例对象,由VkInstance对象表示。为了构造它,我们将调用我们的第一个Vulkan函数vkCreateInstance(),其原型是:

VkResult vkCreateInstance (
    const VkInstanceCreateInfo* pCreateInfo,
    const VkAllocationCallbacks* pAllocator,
    VkInstance* pInstance);

此声明是典型的Vulkan函数。如果要将多个参数传递给Vulkan,函数通常会传入结构指针。这里,pCreateInfo是一个指向VkInstanceCreateInfo结构实例的指针,该结构包含描述新Vulkan实例的参数。 VkInstanceCreateInfo的定义如下:

typedef struct VkInstanceCreateInfo {
    VkStructureType sType;
    const void* pNext;
    VkInstanceCreateFlags flags;
    const VkApplicationInfo* pApplicationInfo;
    uint32_t enabledLayerCount;
    const char* const* ppEnabledLayerNames;
    uint32_t enabledExtensionCount;
    const char* const* ppEnabledExtensionNames;
} VkInstanceCreateInfo;