为什么简单Vulkan在vkCreateInstance()上失败?

uinbv5nw  于 2022-12-17  发布在  其他
关注(0)|答案(1)|浏览(185)

我试着将我的生活vulkanize.这样我就可以使用Vulkan计算.但是创建一个简单的示例失败的每一种方法,我尝试.
下面是代码:

#include <vulkan/vulkan.h>

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char * argv[])
{
    VkApplicationInfo       vkAppInfo;
    vkAppInfo.sType         = VK_STRUCTURE_TYPE_APPLICATION_INFO;

    vkAppInfo.apiVersion    = VK_API_VERSION_1_0;

    VkInstanceCreateInfo    vkCreateInfo;
    vkCreateInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
    vkCreateInfo.pApplicationInfo = &vkAppInfo;

    VkInstance instance = VK_NULL_HANDLE;
    VkResult result     = vkCreateInstance(&vkCreateInfo, NULL, &instance);
    return -1;
    if (result != VK_SUCCESS) {
        return -2;
    } else {
        return -3;
    }

    return 0;
}

我尝试了Vulkan Tutorial(没有图形功能GLFW)

evrscar2

evrscar21#

这里的问题是你假设你没有填写的字段会自动地被一些有效的数据所填充,但事实并非如此,它将被垃圾所填充,不要忘记这在C和C++中是非常普遍的事情:每个没有显式初始化的内存都是垃圾。
我建议您编写一些 Package 器函数来填充Vulkan结构体,例如VkApplicationInfo

VkApplicationInfo fill_app_info(const char* app_name, const char* app_version,
                                const char* engine_name, uint32_t engine_version,
                                uint32_t vk_api_version) {
   VkApplicationInfo info;
   info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
   info.pNext = NULL;
   info.pApplicationName = app_name;
   info.applicationVersion = app_version;
   info.pEngineName = engine_name;
   info.engineVersion = engine_version;
   info.apiVersion = vk_api_version;
   return info;
}

对于VkApplicationInfo来说,这似乎不值得,但您将更经常地需要Vulkan结构。
编写了fill_app_info的最详细版本之后,可以使用两个强大的工具来简化编写过程:默认参数和重载:

// This is even better: it has default parameters
VkApplicationInfo fill_app_info(const char* app_name, const char* app_version,
                                const char* engine_name = "MyEngine",
                                uint32_t engine_version = VK_MAKE_VERSION(1,0,0),
                                uint32_t vk_api_version = VK_API_VERSION_1_2) {
   VkApplicationInfo info;
   info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
   info.pNext = NULL;
   info.pApplicationName = app_name;
   info.applicationVersion = app_version;
   info.pEngineName = engine_name;
   info.engineVersion = engine_version;
   info.apiVersion = vk_api_version;
   return info;
}

VkApplicationInfo fill_app_info(const char* app_name) {
   // Call the other function
   return fill_app_info(app_name, VK_MAKE_VERSION(1,0,0));
}

// Call function 1 with all parameters specified
VkApplicationInfo example1 = fill_app_info("MyApp", VK_MAKE_VERSION(1,0,0), 
                                           "MyCustomEngine1000", VK_MAKE_VERSION(1,0,6),
                                           VK_API_VERSION_1_1);
// Call function 1 and use default parameters
VkApplicationInfo example2 = fill_app_info("MyApp", VK_MAKE_VERSION(1,0,0));
// Call function 2 and let it fill out everything but the app name
VkApplicationInfo example3 = fill_app_info("MyApp");

正如你所看到的,example3是在只指定一个参数的情况下创建的。如果你为所有的Vulkan结构体创建这样的函数,这会使你的整个代码更短。在Vulkan中,我们经常需要填充结构体的所有成员,即使有些成员并没有真正使用。我还建议启用验证层来检查你是否正确使用了API。另外,阅读Vulkan文档。他们告诉你如何正确填写每个结构体:https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkApplicationInfo.html

相关问题