Vulkan: недопустимый объект модуля шейдера

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

vkCreateGraphicsPipeline вызывает на уровне проверки следующие ошибки: Недействительный объект модуля шейдера 0x8 Недействительный объект модуля шейдера 0x9

И тогда программа вылетает на уровне проверки. Я создал VkShaderModule для вершинного шейдера и фрагментного шейдера и использовал glslangvalidator -V для преобразования их в модули SPIR-V, на которые vkCreateShaderModule не жаловался.

Возможно, я что-нибудь пропустил? Кажется, что в примерах дела обстоят точно так же, как и у меня.


person atlan    schedule 03.10.2016    source источник
comment
Вы не показали нам код, который на самом деле вызывает указанную вами проблему.   -  person Nicol Bolas    schedule 03.10.2016
comment
Голосование "против" крайне неуместно. Код в данном случае не имеет значения, поскольку есть только один способ создать модуль шейдера и указать его для конвейера. Это также непрактично из-за многословия API Vulkan. Хотя само сообщение об ошибке довольно расплывчато, оно, вероятно, имеет очень конкретную причину, и, несомненно, другие сталкивались с ней раньше и должны точно знать, какой сценарий ее вызывает.   -  person atlan    schedule 03.10.2016
comment
Если это правда, то вы в основном предполагаете, что уровень проверки каким-то образом сломан. И все же, если бы люди вообще не могли создавать графические конвейеры, тогда никто не мог бы использовать слои проверки. Конечно, люди используют слои проверки, поэтому не может быть общей проблемы с созданием графических конвейеров из шейдерных модулей. И поэтому, если нет причин подозревать иное, мы должны предположить, что ваш код виноват. Поэтому нам нужно увидеть, что на самом деле делает ваш код, каким бы подробным он ни был.   -  person Nicol Bolas    schedule 03.10.2016
comment
Что ж, слои не должны падать (за исключением некоторых заметных случаев). ; Сказав это и увидев сообщение об ошибке, я решил, что это один из них. Похоже на ошибку Object Tracker. Ваши VkShaderModule дескрипторы по какой-то причине недействительны. Покажи, как ты их создаешь. Возможно, вы забыли проверить VkResult на SUCCESS? Также, возможно, проверьте, включаете ли вы слои в правильном порядке (например, через мета-уровень standard_validation).   -  person krOoze    schedule 03.10.2016
comment
Ага, это ручка. Я не понимал, о чем идет речь в сообщении, и подумал, что, возможно, объект, на который ссылается дескриптор, был каким-то образом недействителен, но на самом деле это только сам дескриптор, на который ссылается сообщение. Оказывается, проблема заключалась в том, что я должен был пометить конструктор копирования для класса контейнера VkShaderModule как удаленный, и объект неявно уничтожался копией, выполненной в контейнере STL.   -  person atlan    schedule 03.10.2016
comment
Рад слышать это. Тогда отвечу ...   -  person krOoze    schedule 03.10.2016
comment
@atlan: Оказывается, проблема заключалась в том, что я должен был пометить конструктор копии для класса контейнера VkShaderModule как удаленный, и объект неявно разрушался копией, выполненной в контейнере STL. Возможно, теперь вы поймете, почему важно предоставлять минимально воспроизводимый пример, когда вы задаете вопросы.   -  person Nicol Bolas    schedule 03.10.2016


Ответы (1)


Сообщение об ошибке и аварийное поведение уровня указывают на недопустимый дескриптор объекта Vulkan (например, объект не удалось vkCreate*d или vkDestroyed перед использованием), обнаруженный уровнем проверки VK_LAYER_LUNARG_object_tracker.

Уровни проверки, вероятно, не должны аварийно завершиться, если все они включены и в установленном порядке. Этого можно добиться, используя только VK_LAYER_LUNARG_standard_validation мета-слой.

Как и в любом хорошем валидаторе, сообщения об ошибках совершенно нечитаемы маленькими людьми.
Стандартные уровни валидации находятся в открытом доступе в GitHub / KhronosGroup / Vulkan-LoaderAndValidationLayers / Layers, поэтому в случае сомнений можно выполнить поиск по заданному тексту сообщения. Обычно это core_validation.cpp, но в вашем случае это будет object_tracker.cpp. (Сообщение будет в формате printf, например, "Invalid% s Object 0x%", что немного затруднит поиск).

person krOoze    schedule 03.10.2016