Я реализую цикл рендеринга Vulkan с несколькими динамическими кадрами, используя шаблон производитель-потребитель и пул потоков.
Основная логика цикла:
Однако в самом первом кадре проверка Vulkan сообщает об ошибках, что буфер команд не записан, а семафор, используемый для ожидания, не может быть сигнализирован.
>>>>> #0 PreRender(). stepCounter: 1, indexPrepare: 0, imageIndex: 0.
>>>>> PrepareFrame(). stepCounter: 1, indexPrepare: 0, frame.imageIndex: 0.
>>>>> RenderFrame(). stepCounter: 1, indexRender: 1.
Vulkan Validation: ERROR | vkQueueSubmit(): pCommandBuffers[0] is unrecorded and contains no commands.
Vulkan Validation: ERROR | vkQueueSubmit(): pWaitSemaphores[0] has no way to be signaled.
>>>>> PostRender(). stepCounter: 1, indexRender: 1.
Vulkan Validation: ERROR | vkQueuePresentKHR(): pPresentInfo->pImageIndices[0] was acquired with a semaphore that has not since been waited on
Ожидаемое поведение
Я ожидаю, что:
Первый кадр записывает команды в AcceptFrame и отправляет их в RenderFrame.
Настоящий семафор правильно сигнализируется и ожидает в vkQueuePresentKHR.
Как правильно записать и отправить первый кадр в этом конвейере Vulkan с кадрами в полете, чтобы избежать ошибок «незаписанного командного буфера» и «несигнализированного семафора»?
Есть ли ошибка рекомендуемый шаблон для инициализации и отправки самого первого кадра при использовании нескольких динамических кадров и пула потоков?
В качестве альтернативы предоставьте ссылки на учебные пособия или руководства, в которых объясняется, как реализовать правильный конвейер рендеринга производитель-потребитель в Vulkan с несколькими динамическими кадрами и синхронизацией.
Я реализую цикл рендеринга Vulkan с несколькими динамическими кадрами, используя шаблон производитель-потребитель и пул потоков. Основная логика цикла: [list] [*][code]PreRender[/code] в основном потоке — ожидание на границах, получение образа цепочки обмена.
[*]Отправьте AcademicFrame и RenderFrame в пул потоков.
[*]Подождите ([code]Join[/code]) для завершения задач пула потоков.
[*][code]PostRender[/code] в основном потоке — представьте изображение.
[*]Повторите.
[/list] Однако [b]в самом первом кадре[/b] проверка Vulkan сообщает об ошибках, что буфер команд не записан, а семафор, используемый для ожидания, не может быть сигнализирован.
❓ С чем я борюсь На первой итерации: [list] [*][code]PrepareFrame[/code] записывает команды (проход очистки цвета).
[*]Но RenderFrame, который отправляет буфер команд, работает с неправильным индексом кадра, отправляя буфер команд, который никогда не записывался.
[*]Уровни проверки сообщают, что семафор ожидания никогда не сигнализировался. Вот соответствующая цепочка вызовов: [code]void View::OnUpdate(double deltaTime) { if (m_RenderSurface) { m_RenderSurface->PreRender();
Vulkan Validation: ERROR | vkQueueSubmit(): pCommandBuffers[0] is unrecorded and contains no commands. Vulkan Validation: ERROR | vkQueueSubmit(): pWaitSemaphores[0] has no way to be signaled.
Vulkan Validation: ERROR | vkQueuePresentKHR(): pPresentInfo->pImageIndices[0] was acquired with a semaphore that has not since been waited on [/code] Ожидаемое поведение Я ожидаю, что: [list] [*]Первый кадр записывает команды в AcceptFrame и отправляет их в RenderFrame.
[*]Настоящий семафор правильно сигнализируется и ожидает в vkQueuePresentKHR.
[/list]
Репозиторий кода Полный код и ветка с этой реализацией Vulkan доступны здесь: https://github.com/k119-55524/Zzz
Ветвь: origin/clear-VK-api
Вопрос [list] [*][b]Как правильно записать и отправить первый кадр[/b] в этом конвейере Vulkan с кадрами в полете, чтобы избежать ошибок «незаписанного командного буфера» и «несигнализированного семафора»?
[*]Есть ли ошибка рекомендуемый шаблон для инициализации и отправки самого первого кадра при использовании нескольких динамических кадров и пула потоков?
[*][b]В качестве альтернативы предоставьте ссылки на учебные пособия или руководства[/b], в которых объясняется, как реализовать правильный конвейер рендеринга производитель-потребитель в Vulkan с несколькими динамическими кадрами и синхронизацией.