Я прошел через руководство 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 могут быть в неправильном макете в течение короткого времени и вернуться в правильный макет после максимум двух проходов цикла?
Потому что ошибки никогда не имеют смысла ... пока вы их не выясните. Покажи свой код.
убедитесь, что вы ждете простоя устройства (vkDeviceWaitIdle) до и после изменения размера.
Спасибо за ответ. j-p, я жду, прежде чем изменять размер, пока устройство не станет свободным. После этого ожидание устройства ничего не изменило. krOoze, какая часть проекта будет вам полезна? Ekzuzy, маловероятно, что ошибка в моем коде вызвана переходами макета, потому что в отличие от моего старого проекта, в котором ошибка не возникает, я в этом коде ничего не менял. Что касается буферов команд, я многое изменил, поэтому я сильно упростил код и, таким образом, попытался найти ошибку, но, к сожалению, мне это не удалось.
@SOUser Но если слои проверки жалуются, что изображение цепочки обмена должно иметь макет present_src, но неопределенный макет, то это, должно быть, проблема с переходами макета. Может быть, настройка прохода рендеринга? Первоначальный и финальный макеты?
@Ekzuzy Я много раз просматривал код и, к сожалению, ничего не нашел, но спасибо за ваши предложения.
Я знаю, что вопрос старый, но я боролся с той же проблемой, и мне было сложно понять это, поэтому я хотел бы оставить этот ответ для других:
В моем случае произошло следующее: после воссоздания цепочки подкачки я потерял синхронизацию между буферами кадров и соответствующими изображениями цепочки подкачки. Это привело к использованию неправильных буферов кадров и, следовательно, к рендерингу в изображения, отличные от запрошенных цепочкой подкачки.
Сразу после воссоздания цепочки подкачки все изображения находятся в VK_IMAGE_LAYOUT_UNDEFINED, в результате чего уровень проверки обнаруживает проблему. Однако после того, как вы (неправильно) визуализируете все эти изображения, их макет больше не будет неопределенным, и ошибка больше не будет сообщаться.
Конечно, ваша программа будет продолжать отображать неправильные изображения, но если сцена статична, это невозможно наблюдать.
Это зависит от того, как вы записываете буферы команд и выполняете переходы макета.