Vulkan-HPP开发人员是否在vk :: DebugUtilsMessengerEXT创建中进行了任何更改?

时间:2019-06-15 13:59:14

标签: vulkan

最近,我更新了系统,并尝试重新编译我的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;
}

“加载程序”为vk :: DispatchLoaderDynamic

麻烦似乎不仅与Vulkan-Hpp有关,而且与C Vulkan有关。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

尽管不是最新的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
        );
    }
}

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

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

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

确保验证层安装正确,不要回想起自己,而是看到提到这可能是一个问题。