【问题标题】:why does getting vulkan extensions from a method fail vulkan instance creation?为什么从方法获取 vulkan 扩展会失败 vulkan 实例创建?
【发布时间】:2017-05-24 08:46:52
【问题描述】:

我正在关注 vulkan-tutorial.com 教程,我正在学习验证层步骤。在教程 Alexander Overvoorde 中,作者将可用扩展的集合(例如创建实例)移到了它自己的函数中。

std::vector<const char*> getRequiredExtensions()

以前我收集该信息的方式略有不同,因为我使用的是 SDL2 而不是 glfw,但我的程序运行时创建了实例并且没有验证错误。问题是当我将代码移至此函数时,我无法再创建实例。

这很好用:

unsigned int extensionCount = 0;
vkEnumerateInstanceExtensionProperties(NULL, &extensionCount, NULL);
std::vector<VkExtensionProperties> extensionProperties(extensionCount);
vkEnumerateInstanceExtensionProperties(NULL, &extensionCount, extensionProperties.data());
std::vector<const char*> extensionNames;
std::cout << "available extensions:" << std::endl;
int i = 0;
while (i < extensionCount) {
    extensionNames.push_back(extensionProperties[i].extensionName);
    std::cout << extensionNames[i] << std::endl;
    i++;
}
if (enableValidationLayers) {
    extensionNames.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
}*/
createInfo.enabledExtensionCount = extensionCount;
createInfo.ppEnabledExtensionNames = extensionNames.data();

但是即使函数使用完全相同的代码并返回扩展名,这也失败了,然后我像这样使用它:

std::vector<const char*> extensionNames = getRequiredExtensions();
createInfo.enabledExtensionCount = static_cast<uint32_t>(extensionNames.size());
createInfo.ppEnabledExtensionNames = extensionNames.data();

那么为什么这不起作用呢?我有正式的 Java 教学背景,但已经用 C++ 编码了一年,所以它可能就像我发送错误的语法错误或指针。另外

reateInfo.enabledExtensionCount = static_cast<uint32_t>(getRequiredExtensions().size());

工作得很好,所以返回的向量大小正确:我相信是 5,因为我有 4 个扩展和调试一个。

【问题讨论】:

    标签: c++ sdl-2 vulkan


    【解决方案1】:

    来自the documentation at Khronos.orgVkExtensionProperties 看起来像这样:

    typedef struct VkExtensionProperties {
        char        extensionName[VK_MAX_EXTENSION_NAME_SIZE];
        uint32_t    specVersion;
    } VkExtensionProperties;
    

    ... 所以在这一行:

    extensionNames.push_back(extensionProperties[i].extensionName);
    

    ...您存储到extensionNames 中的是指向位于extensionProperties 中的数组的指针,它是您的函数的本地对象。当您从函数返回时,所有数组都与extensionProperties 一起被破坏,并且您的所有指针现在都悬空。
    当 Vulkan 尝试使用这些死指针时,您会得到未定义的行为。

    【讨论】:

    • 你能建议我克服这个问题的最佳方法吗?会使用std::vector&lt;std::shared_ptr&lt;const char&gt;&gt; getRequiredExtensions() 工作吗?因为我不能让createInfo.ppEnabledExtensionNames = extensionNames.data(); 带走std::vector&lt;&lt;std::shared_ptr&lt;const char&gt;&gt;
    • iv 尝试使用共享 ptr 但它不起作用,我真的想将 extensionProperties 保留在函数的本地
    • @MatthewBuchanan 在这种情况下,我想说不要出汗,并将您的 API 清洁作为优先事项。返回一个std::vector&lt;std::string&gt;,并在实际需要分配createInfo.ppEnabledExtensionNames 的函数中创建一个std::vector&lt;char const *&gt; 仅用于此任务。
    猜你喜欢
    • 2021-02-01
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多