Vulkan: debugPrintfEXT ничего не печатает

#vulkan

#vulkan

Вопрос:

Я не могу приступить debugPrintfEXT к работе. Я не вижу, чего мне не хватает.

Шаги, которые я предпринял:

  • Включено расширение экземпляра VK_EXT_debug_utils ; Проверено с помощью Nvidia Nsight.
  • Используйте DebugUtils print для вывода сообщений. Печать всех сообщений, включая DEBUG и INFO.
  • Добавлено #extension GL_EXT_debug_printf : enable в вершинный шейдер.
  • Используется debugPrintfEXT("Foo") в вершинном шейдере.
  • Запустите код из конфигуратора Vulkan с включенным уровнем печати.
  • Включена функция проверки в экземпляре.

Код:

 vk::InstanceCreateInfo createInfo;
std::vector valFeaturesEnabled = {vk::ValidationFeatureEnableEXT::eDebugPrintf};
vk::ValidationFeaturesEXT valFeatures;
valFeatures.enabledValidationFeatureCount = (uint32_t) valFeaturesEnabled.size();
valFeatures.pEnabledValidationFeatures = valFeaturesEnabled.data();
createInfo.setPNext(amp;valFeatures);
  

Подробные сведения:

  • Windows 10
  • GTX 1080Ti
  • Visual Studio 2019
  • Vulkan 1.2

Ответ №1:

То, что вы делаете, должно работать.

Я заставил его работать, внеся некоторые небольшие изменения в образец «привет, треугольник» в Khronos Vulkan-Samples.

Принудительно используйте уровень проверки как для сборки Debug, так и для сборки Release, используя опцию CMake -DVKB_VALIDATION_LAYERS=ON или добавив define в верхней части hello_triangle.cpp . Поскольку проект активирует уровень проверки в отладочной сборке, вы можете пропустить этот шаг, если придерживаетесь отладочной сборки.

 #define VKB_VALIDATION_LAYERS
  

Добавьте VK_DEBUG_REPORT_INFORMATION_BIT_EXT флаг в debug_report_create_info.flags . Документация по этому требованию неясна, но скоро будет исправлена. Вы уже делали это.

Добавьте следующий код непосредственно перед вызовом vkCreateInstance . По сути, это то же самое, что и вставленный вами код.

 VkValidationFeatureEnableEXT enabled[] = {VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT};
VkValidationFeaturesEXT      features{VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT};
features.disabledValidationFeatureCount = 0;
features.enabledValidationFeatureCount  = 1;
features.pDisabledValidationFeatures    = nullptr;
features.pEnabledValidationFeatures     = enabled;

features.pNext                          = instance_info.pNext;
instance_info.pNext                     = amp;features;
  

И внесите те же изменения в вершинный шейдер, что и вы.

Если вы сможете заставить его работать с этим примером, возможно, вы увидите, что вы делаете по-другому в своем приложении.

Комментарии:

1. Теперь это работает! Я думаю , что он устанавливал бит info, но я думал, что делал это и раньше. Странно. В любом случае, спасибо. Второстепенный момент: это вызывает бесконечный цикл, и он не нужен: features.pNext=instance_info.pNext;