Vulkan 学习-01- 创建Vulkan实例

Vulkan 实例

Vulkan API 使用vkInstance 对象来存储应用级别的状态。在进行其他的操作之前,应用必须创建一个Vulkan实例。
基础的Vulkan架构看起来像这样

BasicAppLoader.png

这个图说明,Vulkan应用与Vulkan 库相关联,使用loader。实例的创建会初始化loader。这个loader会加载和初始化一个由GPU提供的二级的图形驱动。

请注意在图表中提到的layers,它们也是被loader加载的。layers通常被用来validation。validation是驱动的错误校验。在Vulkan中,驱动比在其他的API更加的轻量化,这正是因为驱动将validation功能给layers代理的结果。layers并不是必须的,而且在每一次创建实例的时候,layers可以被选择性的加载。

vkCreateInstance

查看01-init_instance.cpp源代码,找到vkCreateInstance的调用,其原型为

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

来一点一点的分析这个函数原型
VkResult - 函数的返回状态。
VkInstanceCreateInfo - 创建一个实例所需要的额外的信息。这是一个相当重要的结构体。
VkAllocationCallbacks - 用户可以设定自定义的内存分配函数,不指定的话,Vulkan会使用默认的。
例子中并没有使用这个特性,所以这个参数一直都是NULL
VkInstance - 如果instance能够被顺利的创建,这个就是实例的句柄。

VkInstanceCreateInfo 结构体

Vulkan创建对象的时候,总会有一个VkObjectCreateInfo参数。

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

sType - 指明这个结构体的类型。既然这是一个VkInstanceCreateInfo 结构体,你需要将其设置为VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO。这样做的话,看起来有点重复了。但是这样做还是有一些价值的:

  • driver,validation layer或者其他的该结构体的消费者,能够通过该字段做一些校验。
  • 结构体可以通过void*指针来传递给使用这个结构体的对象,然后还是能够识别出这个指针该有的类型。

由于该字段总是结构体的第一个字段,该结构体的消费者总是能够轻易的确定它的类型,然后决定来如何处理它。

pNext - 该字段通常被设置为NULL。这个空指针有时被用于传递扩展指定的消息。

flags - 当前没有flags被定义,将其设置为0。

pApplicationInfo - 稍后再说。

enabledLayerCountppEnabledLayerNames - 该教程不涉及到这个,先空着吧。

enabledExtensionCountppEnabledExtensionNames - 稍后再讲。

VkApplicationInfo 结构体

这个结构体提供了应用的一些由Vulkan实现的基本的信息。

typedef struct VkApplicationInfo {
    VkStructureType    sType;
    const void*        pNext;
    const char*        pApplicationName;
    uint32_t           applicationVersion;
    const char*        pEngineName;
    uint32_t           engineVersion;
    uint32_t           apiVersion;
} VkApplicationInfo;

sType and pNext - 同 vkInstanceCreateInfo structure

pApplicationName, applicationVersion, pEngineName, engineVersion - 这些不是非得要填写的字段。一些 tools, loaders, layers, 或者 drivers 的实现可能会用这些字段进行debugging或者出报告。driver甚至可以使用这些字段来更改自身的行为。

apiVersion - This field communicates the major, minor, and patch levels of the Vulkan API header used to compile the application. If you are using Vulkan 1.0, major should be 1 and minor should be 0. Using the VK_API_VERSION_1_0 macro from vulkan.h accomplishes this, with a patch level of 0. Differences in the patch level should not affect the full compatibility between versions that differ only in the patch level. Generally, you should set this field to VK_API_VERSION_1_0 unless you have a good reason to do otherwise.

回到代码

一旦这些结构体被填充了,sample可以创建instance了

VkInstance inst;
VkResult res;

res = vkCreateInstance(&inst_info, NULL, &inst);
if (res == VK_ERROR_INCOMPATIBLE_DRIVER) {
    std::cout << "cannot find a compatible Vulkan ICD\n";
    exit(-1);
} else if (res) {
    std::cout << "unknown error\n";
    exit(-1);
}

vkDestroyInstance(inst, NULL);

在上面的代码中,应用快速的校验了返回值,并将其输出到标准输入输出流。当返回值为0(VK_SUCCESS)的时候,即说明执行正确。
最后,应用在退出前销毁了这个实例。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352