在使用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必要性的举例:
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);