Использование debugPrintfEXT в Vulkan

#glsl #vulkan #validation-layers

Вопрос:

Я пытаюсь понять, как использовать debugPrintfEXT, но безуспешно. Сначала я включил расширение в своем шейдере вершин

 #version 450
#extension GL_EXT_debug_printf : enable


void main()
{
    debugPrintfEXT("Test");
    // ... some more stuff here ...
}
 

Затем я указываю необходимые расширения для экземпляра Vulkan

 VkValidationFeatureEnableEXT enables[] = {VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT};
VkValidationFeaturesEXT features = {};
features.sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT;
features.enabledValidationFeatureCount = 1;
features.pEnabledValidationFeatures = enables;

VkInstanceCreateInfo info = {};
info.pNext = amp;features;
 

В info.ppEnabledExtensionNames поле я указал VK_EXT_validation_features и VK_EXT_debug_utils среди прочего.

Когда я запускаю свое приложение, я получаю следующие журналы

 VUID_Undefined(ERROR / SPEC): msgNum: 2044605652 - Validation Error: [ VUID_Undefined ] Object 0: VK_NULL_HANDLE, type = VK_OBJECT_TYPE_DEVICE; | MessageID = 0x79de34d4 | vkCreateDebugUtilsMessengerEXT: value of pCreateInfo->pNext must be NULL. This error is based on the Valid Usage documentation for version 182 of the Vulkan header.  It is possible that you are using a struct from a private extension or an extension that was added to a later version of the Vulkan header, in which case the use of pCreateInfo->pNext is undefined and may not work correctly with validation enabled
    Objects: 1
        [0] 0, type: 3, name: NULL

[Debug][Error][Validation]"Validation Error: [ VUID-VkShaderModuleCreateInfo-pCode-04147 ] Object 0: handle = 0x5651b647e828, type = VK_OBJECT_TYPE_DEVICE; | MessageID = 0x3d492883 | vkCreateShaderModule(): The SPIR-V Extension (SPV_KHR_non_semantic_info) was declared, but none of the requirements were met to use it. The Vulkan spec states: If pCode declares any of the SPIR-V extensions listed in the SPIR-V Environment appendix, one of the corresponding requirements must be satisfied (https://vulkan.lunarg.com/doc/view/1.2.182.0/linux/1.2-extensions/vkspec.html#VUID-VkShaderModuleCreateInfo-pCode-04147)"

 

Что еще я должен сделать? И что делает

одно из соответствующих требований должно быть выполнено

в смысле? Есть ли что-то, чего мне не хватает?

Редактировать:

Как предложил Карл Шульц, необходимо добавить VK_KHR_shader_non_semantic_info к info.ppEnabledExtensionNames .

Кроме того, не забудьте установить уровень журнала на INFO с VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT помощью in VkDebugUtilsMessengerCreateInfoEXT::messageSeverity . По умолчанию все выходные данные, полученные с помощью debugPrintfEXT , имеют информационный уровень.

Вы также можете увидеть

 Printf message was truncated, likely due to a buffer size that was too small for the message
 

если вы создадите слишком много потоков, каждый из них напечатает свои собственные длинные журналы.

Ответ №1:

Вам также необходимо включить расширение VK_KHR_shader_non_semantic_info устройства в коде приложения при создании устройства.

LunarG также недавно опубликовала белую книгу о debugPrintfEXT .

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

1. ваша ссылка на белую книгу мертва

2. @ElectRocnic Спасибо, исправлено.