vulkan从小白到专家——VulkanDevice

0关于vulkan

1)定义了一堆的概念,跟opengl太不一样了,以至于出来很多年了,实际普及率很低。
2)驱动极大简化,很多工作都丢给了开发者维护。

Vulkan不像opengl,一个Context太过于抽象和笼统。vulkan的概念更加切合实际,走进vulkan,首先要理解device。
在这里插入图片描述

0.1 vulkan pattern

获取属性接口的pattern,
XXXGet(int* counter, XXXProperty* arr); 参数可能还包含一个作用域 比较device,之类。
一般两次调用,

  1. 获取个数:后面array传nullptr,第一个参数传入counter的地址,
  2. 创建动态数组以后,
  3. 精准填充数组,传入参数和数组地址即可,

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设备,


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值