【问题标题】:vkEnumerateDeviceExtensionProperties Throwing mysterious error codevkEnumerateDeviceExtensionProperties 抛出神秘的错误代码
【发布时间】:2019-07-05 14:38:57
【问题描述】:

我正在关注这个vulkan tutorial 并到达交换链部分。

我复制粘贴了关于修改 checkDeviceExtensionProperties 的部分,这让我得到了这个功能:

//globally declared at the top of the file
const std::vector<const char*> deviceExtensions = {
    VK_KHR_SWAPCHAIN_EXTENSION_NAME
}; 

/* code */

bool checkDeviceExtensionSupport(VkPhysicalDevice pDevice) {
    uint32_t extensionCount;
    vkEnumerateDeviceExtensionProperties(pDevice, nullptr, &extensionCount, nullptr);

    std::vector<VkExtensionProperties> availableExtensions(extensionCount);
    vkEnumerateDeviceExtensionProperties(pDevice, nullptr, &extensionCount, availableExtensions.data());

   /* std::set<std::string> requiredExtensions(deviceExtensions.begin(), deviceExtensions.end());

    for (const auto& extension : availableExtensions) {
        requiredExtensions.erase(extension.extensionName);
    }*/

    return true;//requiredExtensions.empty();
}

当我取消注释函数 vkEnumerateDeviceExtensionProperties 时,会引发错误。

调试回调返回的错误码(即VkDebugUtilsMessageSeverityFlagBitsEXT的位)为0b10000。这不是vulkan_core.h 中定义的任何位。

关于我可能搞砸的任何建议?

编辑:

调试消息的输出是:

[...]
validation layer: Device Extension: VK_KHR_device_group (libGLX_nvidia.so.0) version 0.0.3
Loader Message
16
validation layer: Device Extension: VK_KHR_draw_indirect_count (libGLX_nvidia.so.0) version 0.0.1
Loader Message
16
validation layer: Device Extension: VK_KHR_driver_properties (libGLX_nvidia.so.0) version 0.0.1
Loader Message
16
validation layer: Device Extension: VK_KHR_external_fence (libGLX_nvidia.so.0) version 0.0.1
Loader Message
16
validation layer: Device Extension: VK_KHR_external_fence_fd (libGLX_nvidia.so.0) version 0.0.1
Loader Message
16
validation layer: Device Extension: VK_KHR_external_memory (libGLX_nvidia.so.0) version 0.0.1
Loader Message
16
validation layer: Device Extension: VK_KHR_external_memory_fd (libGLX_nvidia.so.0) version 0.0.1
Loader Message
16
validation layer: Device Extension: VK_KHR_external_semaphore (libGLX_nvidia.so.0) version 0.0.1
Loader Message
16
validation layer: Device Extension: VK_KHR_external_semaphore_fd (libGLX_nvidia.so.0) version 0.0.1
Loader Message
16
validation layer: Device Extension: VK_KHR_get_memory_requirements2 (libGLX_nvidia.so.0) version 0.0.1
Loader Message
16
validation layer: Device Extension: VK_KHR_image_format_list (libGLX_nvidia.so.0) version 0.0.1
[...]

调试回调是:

static VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback(
    VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
    VkDebugUtilsMessageTypeFlagsEXT messageType,
    const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,
    void* pUserData) {

    std::cerr << "validation layer: " << pCallbackData->pMessage << std::endl;
    cout << pCallbackData->pMessageIdName << endl;
    cout << messageSeverity << endl;

    if (messageSeverity >= VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) {
        // Message is important enough to show
    }


    return VK_FALSE;
}

【问题讨论】:

  • 那么,回调的pMessage 是什么?
  • 消息只是每个扩展的名称和版本。当我可以访问它时,我将在此处粘贴输出。

标签: c++ graphics gpu vulkan


【解决方案1】:

0b10000VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT。只需在使用 vkCreateDebugUtilsMessengerEXT 创建回调时过滤 INFO 消息。

【讨论】:

  • 如果只是 INFO 严重性,那是否意味着实际上没有发生错误?我只是收到事件通知?
  • 没错,您可以放心地忽略这种类型的事件。它们仅包含在调试内容时可能有用的信息。
  • VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXTVK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT 只是提供信息。除非您正在挖掘一些信息,否则在创建 Messenger 时禁用它们。
猜你喜欢
  • 2012-01-24
  • 2013-12-03
  • 1970-01-01
  • 1970-01-01
  • 2012-11-10
  • 1970-01-01
  • 2015-03-13
  • 2017-04-20
  • 2014-06-07
相关资源
最近更新 更多