0关于vulkan
1)定义了一堆的概念,跟opengl太不一样了,以至于出来很多年了,实际普及率很低。
2)驱动极大简化,很多工作都丢给了开发者维护。
Vulkan不像opengl,一个Context太过于抽象和笼统。vulkan的概念更加切合实际,走进vulkan,首先要理解device。
0.1 vulkan pattern
获取属性接口的pattern,
XXXGet(int* counter, XXXProperty* arr); 参数可能还包含一个作用域 比较device,之类。
一般两次调用,
- 获取个数:后面array传nullptr,第一个参数传入counter的地址,
- 创建动态数组以后,
- 精准填充数组,传入参数和数组地址即可,
0.2 name pattern
结构体V大写,函数vk都小写,
1 ApplicationCreateInfo,
填充VkApplicationInfo结构体,
apiVersion
- apiVersion = VK_MAKE_VERSION(1, 0, 0);
- 或者 apiVersion = VK_API_VERSION_1_1
2 Instance
创建Instance之前,先一顿骚操作,查询各种关联信息。
1、获取instance个数,
android上测试获取instance个数失败,始终为0,
uint32_t instance_layer_count = 0;
// use nullptr for second parameters in order to get all the layer count
vkEnumerateInstanceLayerProperties(&instance_layer_count, nullptr);
if (instance_layer_count == 0) {
// return;
}
VkLayerProperties instance_properties[50]; // 方便调试所以用栈
vkEnumerateInstanceLayerProperties(&instance_layer_count, instance_properties);
2、获取扩展信息ok的,
uint32_t extension_count = 0;
auto xxhr = vkEnumerateInstanceExtensionProperties(
nullptr, &extension_count, nullptr);
VkExtensionProperties extension_availables[extension_count];
vkEnumerateInstanceExtensionProperties(nullptr, &extension_count, extension_availables);
p40pro上获取到信息如下:
(VkExtensionProperties[50]) {
[0] = (extensionName = “VK_KHR_surface”, specVersion = 25)
[1] = (extensionName = “VK_KHR_android_surface”, specVersion = 6)
[2] = (extensionName = “VK_EXT_swapchain_colorspace”, specVersion = 4)
[3] = (extensionName = “VK_KHR_get_surface_capabilities2”, specVersion = 1)
[4] = (extensionName = “VK_EXT_debug_report”, specVersion = 9)
[5] = (extensionName = “VK_KHR_device_group_creation”, specVersion = 1)
[6] = (extensionName = “VK_KHR_external_fence_capabilities”, specVersion = 1)
[7] = (extensionName = “VK_KHR_external_memory_capabilities”, specVersion = 1)
[8] = (extensionName = “VK_KHR_external_semaphore_capabilities”, specVersion = 1)
[9] = (extensionName = “VK_KHR_get_physical_device_properties2”, specVersion = 2)
3、创建Instance
先填充VkInstanceCreateInfo结构体,要引用上面ApplicationInfo,
Instance的扩展属性需要分平台填充,一些demo中都是如下代码直接给出的,不科学。
instance_extensions.push_back("VK_KHR_surface");
instance_extensions.push_back("VK_KHR_android_surface");
正确分平台获取方式
instance_extensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME); //
#ifdef __ANDROID
instance_extensions.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME); // vulkan_android.h 中
#elif defined(__WIN32)
instance_extensions.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
#elif defined(__linux)
instance_extensions.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
#elif defined(__APPLE__)
instance_extensions.push_back(VK_KHR_MACOS_SURFACE_EXTENSION_NAME);
#endif
3 创建surface
pattern=AndroidSurface
填充结构体:Vk{pattern}CreateInfoKHR
创建函数,vkCreate{pattern}KHR
4 GPU/physical Device
创建之前,还是先查询,
4.1 穷举物理设备的个数
还是相同套路,先获取个数,再获取数组内容,
一般android上就一个GPU设备,