Vulkan Tutorial 1 创建vulkan实例

在使用vulkan做任何操作之前,首先需要创建一个vulkan的vkInstance实例。

下图为vulkan的基本架构:

上图显示,应用程序被链接到一个称为Loader的vulkan库。Loader也会加载和初始化低级图形驱动程序。同样,layer也会通过Loader被加载到应用程序。Layer一般用来验证驱动程序执行的错误。正是因为vulkan将错误验证功能交给layer,所以vulkan驱动一般比OpenGL这类图形库要小。可以在每次创建创建vulkan实例时有选择性的选择layer。

因为本人也初学,目前没有学到Loader和Layer这一步,因此此处不做详细记录。等学到后面,会有专门的笔记。关于layer的讲解,可以查看链接:https://vulkan.lunarg.com/

可通过vkCreateInstance函数创建vulkan实例。函数原型如下:

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

VkResult :其实是一个枚举类型。Vulkan返回函数执行状态时,一般都时用这个。具体可以在vulkan_core.h中查看。

VkInstanceCreateInfo:创建实例时的一些附加信息,后面再说。

VkAllocationCallbacks:一个回调函数,如果希望以自己的方式来管理内存,可传入此参数。否者Vulkan会时用系统默认                                                   的内存管理方式。

VkInstance:如果成功,Vulkan返回的一个实例句柄。

Vulkan再创建实例时,一般都会有一个VkXXXCreateInfo的结构体,此处是VkInstanceCreateInfo,可在vulkan_core.h中查看。声明如下:

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;

其他的一些CreateInfo一般也会包含sType和pNext两个成员。

sType:表示对象的类型。在创建Vulkan实例时,因为是VkInstanceCreateInfo 对象,所以传入VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO。下面是两种sType必要性的举例:

  • 驱动、验证layer或者一些其他的方法可能会对这个值做验证,如果不传入,可能会返回失败
  • 如果驱动支持扩展,那么这个可扩展可通过pNext传入,但是pNext是void*,所以需要用这个成员来帮助解析pNext

 pNext:一般设置成NULL。当驱动设备支持扩展时,可用此成员传递扩展信息。此时,sType需要设置成扩展信息的类型

flags:当前为定义,一般设置为0

pApplicationInfo:应用程序信息,后面再说

enabledLayerCount和ppEnabledLayerNames教程里面没说,以后再考虑这两个参数。

enabledExtensionCount和ppEnabledExtensionNames同上。

VkApplicationInfo声明如下:

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和pNext和前面一样。接下来的四个参数是可选的。主要是一些用户信息。

apiVersion:主要是传递api的版本信息以及补丁级别。目前好像就只有以下两种:

       VK_API_VERSION_1_0

       VK_API_VERSION_1_1

#define VK_MAKE_VERSION(major, minor, patch) \
    (((major) << 22) | ((minor) << 12) | (patch))
#define VK_API_VERSION_1_0 VK_MAKE_VERSION(1, 0, 0)
#define VK_API_VERSION_1_1 VK_MAKE_VERSION(1, 1, 0)

创建Vulkan实例的代码很简单,简单粘贴一下:

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);

 

 

你可能感兴趣的:(vulkan)