【问题标题】:Did Vulkan-HPP developers change anything in vk::DebugUtilsMessengerEXT creation?Vulkan-HPP 开发人员是否更改了 vk::DebugUtilsMessengerEXT 创建中的任何内容?
【发布时间】:2019-06-15 13:59:14
【问题描述】:

最近我更新了我的系统并尝试重新编译我的 Vulkan 应用程序(它使用 Vulkan cpp 绑定)并且几乎没有从 vk::DebugUtilsMessengerEXT 得到任何输出(字符串“Added messenger”除外)。我将它设置为 std::cout 每种回调,它打印了很多信息字符串(更新之前)。有谁知道,如何恢复调试输出?

这是我的调试信使代码:

    // ...
    vk::DebugUtilsMessengerCreateInfoEXT messengerInfo;
    messengerInfo.setMessageSeverity(
        vk::DebugUtilsMessageSeverityFlagBitsEXT::eError | 
        vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning |
        vk::DebugUtilsMessageSeverityFlagBitsEXT::eInfo | 
        vk::DebugUtilsMessageSeverityFlagBitsEXT::eVerbose);
    messengerInfo.setMessageType(
        vk::DebugUtilsMessageTypeFlagBitsEXT::eGeneral |
        vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation |
        vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance);
    messengerInfo.setPfnUserCallback(callback);
    messengerInfo.setPUserData(nullptr);
    if(instance.createDebugUtilsMessengerEXT(&messengerInfo, nullptr, &debugMessenger, loader) != vk::Result::eSuccess) throw std::runtime_error("Failed to create debug messenger!\n");
}

VKAPI_ATTR VkBool32 VKAPI_CALL System::callback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageType, const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, void* pUserData)
{
    std::cout << pCallbackData->pMessage << '\n';
    return false;
}

"loader" 是 vk::DispatchLoaderDynamic

似乎问题不仅在于 Vulkan-Hpp,还在于 C Vulkan。

【问题讨论】:

  • 是什么让您认为C接口也存在问题?另外,您是否检查过 vkEnumerateInstanceExtensions 列出了 VK_EXT_debug_utils 扩展?您在创建实例时是否启用了该扩展?

标签: vulkan


【解决方案1】:

进行了一些测试,回调似乎工作正常。我认为这里的问题可能是出于性能原因删除了一些旧的 INFO 消息——请参阅Vulkan-ValidationLayers 提交18BF5C637523D9C775。如果在 1.1.108 之前的 SDK 版本中启用了 INFORMATION_BIT 消息,您会看到大量的消息。如果您的回调没有出现预期的验证错误,请在 VVL 存储库中创建一个 github 问题,我们会立即解决。

【讨论】:

  • 如果这是故意的行为改变,它应该在 chagelog 中,但我找不到任何提及。有没有办法重新启用这些消息?我已经尝试了 .108 SDK,并且我之前看到的很多消息都丢失了,仍然有一个正在加载/卸载的扩展/层列表,也正确记录了错误。
【解决方案2】:

我是怎么做的,它是如何工作的,虽然不是最新的 SDK:

void VulkanContext::createInstance()
{
    // create the list of required extensions
    uint32_t glfwExtensionCount = 0;
    const char **glfwExtensions;
    glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount);

    std::vector<const char *> extensions(glfwExtensions, glfwExtensions + glfwExtensionCount);
    extensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);

    auto layers = std::vector<const char *>();
    if ( enableValidationLayers )
    {
        extensions.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
        extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
        layers.push_back("VK_LAYER_LUNARG_standard_validation");
    }

    vk::ApplicationInfo appInfo("Vulkan test", 1, "test", 1, VK_API_VERSION_1_1);

    auto createInfo = vk::InstanceCreateInfo(
            vk::InstanceCreateFlags(),
            &appInfo,
            static_cast<uint32_t>(layers.size()),
            layers.empty() ? nullptr : layers.data(),
            static_cast<uint32_t>(extensions.size()),
            extensions.empty() ? nullptr : extensions.data()
    );

    instance = vk::createInstanceUnique(createInfo);

    dispatcher = vk::DispatchLoaderDynamic(instance.get(), vkGetInstanceProcAddr);

    if ( enableValidationLayers )
    {
        auto severityFlags = vk::DebugUtilsMessageSeverityFlagBitsEXT::eError
                            | vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning
                            | vk::DebugUtilsMessageSeverityFlagBitsEXT::eVerbose
                            | vk::DebugUtilsMessageSeverityFlagBitsEXT::eInfo;

        auto typeFlags = vk::DebugUtilsMessageTypeFlagBitsEXT::eGeneral
                         | vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation
                         | vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance;

        messenger = instance->createDebugUtilsMessengerEXTUnique(
                {{}, severityFlags, typeFlags, debugCallback},
                nullptr,
                dispatcher
        );
    }
}

确保您启用了调试扩展和验证层。

检查您的加载程序/调度程序是否已正确初始化。

尝试使用其他一些命令来创建信使,不确定但可能 API 已更改并且严重性标志传递到错误的位置。

确保验证层安装正确,不记得自己处理过,但看到提到这可能是一个问题。

【讨论】:

  • 更新SDK时出现问题;在以后的版本中,代码工作得很好。我也没有发现任何关于你提到的变化(只是现在建议使用 VK_LAYER_KHRONOS_validation 而不是 VK_LAYER_LUNARG_standard_validation)(如果你知道,我在哪里可以找到这些信息,请告诉我)。
  • 另外,我将您的代码集成到创建 vk::Buffer 的简单应用程序中(只是为了测试,如果我遗漏了一些明显的东西),结果是一样的:只有一行,说“添加了信使”
  • 我更新到 .108 SDK 版本,现在我之前得到的很多调试输出都丢失了。我仍然得到所有加载的扩展和层的转储,但是资源创建/删除转储已经消失了。我猜不只是你。
猜你喜欢
  • 1970-01-01
  • 2013-11-14
  • 2013-01-18
  • 2014-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-13
相关资源
最近更新 更多