Изменили ли разработчики Vulkan-HPP что-нибудь в создании vk :: DebugUtilsMessengerEXT? - PullRequest
0 голосов
/ 15 июня 2019

Недавно я обновил свою систему и попытался перекомпилировать мое приложение 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.

Ответы [ 2 ]

2 голосов
/ 17 июня 2019

Было ли некоторое тестирование, и обратные вызовы, кажется, работают правильно.Я думаю, что проблема здесь может заключаться в удалении некоторых старых сообщений INFO по соображениям производительности - см. Vulkan-ValidationLayers commitits 18BF5C637 и 523D9C775.Если бы INFORMATION_BIT сообщений было включено в выпусках SDK до 1.1.108, вы бы видели тонну выплескивания.Если ожидаемые ошибки проверки не попадают в ваш обратный вызов, создайте проблему с github в репозитории VVL, и мы немедленно исправим ее.

0 голосов
/ 15 июня 2019

Как я это делаю, и это работает, хотя и не последний 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 изменился, и флаги серьезности были переданы не в том месте.

Убедитесь, что слои проверки правильности установлены, не вспомните, что я сам имел дело с этим, но видел, что это может быть проблемой.

...