Vulkan - в vkQueuePresentKHR уровень проверки выдает сообщение об ошибке, касающееся макета изображения

Я прошел через руководство vulkan-tutorial.com и попытался написать небольшую программу с помощью Vulkan, но столкнулся со следующей проблемой:

Программа просто отображает изображение и работает без ошибок, но после изменения размера окна и, таким образом, воссоздания цепочки подкачки и т. д., Уровень проверки выдает сообщение об ошибке в функции vkQueuePresentKHR:

Уровень проверки: [VUID-VkPresentInfoKHR-pImageIndices-01296] Объект: 0x4e3b5f0 (Type = 4) | Переданные изображения должны быть в макете VK_IMAGE_LAYOUT_PRESENT_SRC_KHR или VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR, но в VK_IMAGE_LAYOUT_UNDEFINED. Спецификация Vulkan гласит: Каждый элемент pImageIndices должен быть индексом презентабельного изображения, полученного из цепочки подкачки, указанной соответствующим элементом массива pSwapchains, а представленный подресурс изображения должен находиться в макете VK_IMAGE_LAYOUT_PRESENT_SRC_KHR во время выполнения операции на VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPresentInfoKHR-pImageIndices-01296)

Это сообщение об ошибке не появляется один или два раза, когда цепочка подкачки и все другие объекты, зависящие от размера окна, были воссозданы и был вызван vkQueuePresentKHR.

Почему изображения swapchain могут быть в неправильном макете в течение короткого времени и вернуться в правильный макет после максимум двух проходов цикла?

Это зависит от того, как вы записываете буферы команд и выполняете переходы макета.

Ekzuzy 21.10.2018 18:29

Потому что ошибки никогда не имеют смысла ... пока вы их не выясните. Покажи свой код.

krOoze 21.10.2018 20:46

убедитесь, что вы ждете простоя устройства (vkDeviceWaitIdle) до и после изменения размера.

j-p 24.10.2018 00:11

Спасибо за ответ. j-p, я жду, прежде чем изменять размер, пока устройство не станет свободным. После этого ожидание устройства ничего не изменило. krOoze, какая часть проекта будет вам полезна? Ekzuzy, маловероятно, что ошибка в моем коде вызвана переходами макета, потому что в отличие от моего старого проекта, в котором ошибка не возникает, я в этом коде ничего не менял. Что касается буферов команд, я многое изменил, поэтому я сильно упростил код и, таким образом, попытался найти ошибку, но, к сожалению, мне это не удалось.

SOUser 26.10.2018 20:00

@SOUser Но если слои проверки жалуются, что изображение цепочки обмена должно иметь макет present_src, но неопределенный макет, то это, должно быть, проблема с переходами макета. Может быть, настройка прохода рендеринга? Первоначальный и финальный макеты?

Ekzuzy 26.10.2018 22:12

@Ekzuzy Я много раз просматривал код и, к сожалению, ничего не нашел, но спасибо за ваши предложения.

SOUser 28.01.2019 19:24
Применение градиента к изображению с помощью CSS
Применение градиента к изображению с помощью CSS
Здравствуйте, братья и сестры, как дела? Недавно я застрял на применении градиента к изображению. Я применял это много раз, но иногда наши требования...
Получение URL-адреса изображения курса в Moodle с помощью PHP
Получение URL-адреса изображения курса в Moodle с помощью PHP
Moodle - это популярная система управления обучением с открытым исходным кодом, используемая многими учебными заведениями и организациями по всему...
1
6
968
1

Ответы 1

Я знаю, что вопрос старый, но я боролся с той же проблемой, и мне было сложно понять это, поэтому я хотел бы оставить этот ответ для других:

В моем случае произошло следующее: после воссоздания цепочки подкачки я потерял синхронизацию между буферами кадров и соответствующими изображениями цепочки подкачки. Это привело к использованию неправильных буферов кадров и, следовательно, к рендерингу в изображения, отличные от запрошенных цепочкой подкачки.

Сразу после воссоздания цепочки подкачки все изображения находятся в VK_IMAGE_LAYOUT_UNDEFINED, в результате чего уровень проверки обнаруживает проблему. Однако после того, как вы (неправильно) визуализируете все эти изображения, их макет больше не будет неопределенным, и ошибка больше не будет сообщаться.

Конечно, ваша программа будет продолжать отображать неправильные изображения, но если сцена статична, это невозможно наблюдать.

Другие вопросы по теме