Я реализую цикл рендеринга Vulkan с несколькими динамическими кадрами, используя шаблон производитель-потребитель и пул потоков.
Основная логика цикла:
Однако в самом первом кадре проверка Vulkan сообщает об ошибках, что буфер команд не записан, а семафор, используемый для ожидания, не может быть сигнализирован.
>>>> #0 PreRender(). stepCounter: 1, indexPrepare: 0, imageIndex: 0.
>>>>> PrepareFrame(). stepCounter: 1, indexPrepare: 0, frame.imageIndex: 0.
>>>>> RenderFrame(). stepCounter: 1, indexRender: 1.
>>>>> -= DebugOutput =-
Message: [Vulkan Validation] ERROR | VALIDATION: vkQueueSubmit(): pSubmits[0].pCommandBuffers[0] VkCommandBuffer 0x1c2556b58f0 is unrecorded and contains no commands.
The Vulkan spec states: Each element of the pCommandBuffers member of each element of pSubmits must be in the pending or executable state (https://docs.vulkan.org/spec/latest/chapters/cmdbuffers.html#VUID-vkQueueSubmit-pCommandBuffers-00070)
Source: [void __cdecl zzz::IGAPI::LogGPUDebugMessage(const class std::basic_string &)] line: 114, file: C:\Workspaces\zzz\Zzz\engineFoundation\engineCore\Source\Interfaces\IGAPI\IGAPI.cppm
>>>>> -= DebugOutput =-
Message: [Vulkan Validation] ERROR | VALIDATION: vkQueueSubmit(): pSubmits[0].pWaitSemaphores[0] queue (VkQueue 0x1c25308d560) is waiting on semaphore (VkSemaphore 0x170000000017) that has no way to be signaled.
The Vulkan spec states: All elements of the pWaitSemaphores member of all elements of pSubmits created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_BINARY must reference a semaphore signal operation that has been submitted for execution and any semaphore signal operations on which it depends must have also been submitted for execution (https://docs.vulkan.org/spec/latest/chapters/cmdbuffers.html#VUID-vkQueueSubmit-pWaitSemaphores-03238)
Source: [void __cdecl zzz::IGAPI::LogGPUDebugMessage(const class std::basic_string &)] line: 114, file: C:\Workspaces\zzz\Zzz\engineFoundation\engineCore\Source\Interfaces\IGAPI\IGAPI.cppm
>>>>> PostRender(). stepCounter: 1, indexRender: 1.
>>>>> -= DebugOutput =-
Message: [Vulkan Validation] ERROR | VALIDATION: vkQueuePresentKHR(): pPresentInfo->pImageIndices[0] was acquired with a semaphore VkSemaphore 0x140000000014 that has not since been waited on
Source: [void __cdecl zzz::IGAPI::LogGPUDebugMessage(const class std::basic_string &)] line: 114, file: C:\Workspaces\zzz\Zzz\engineFoundation\engineCore\Source\Interfaces\IGAPI\IGAPI.cppm
Ожидаемое поведение
Я ожидаю, что:
Первый кадр записывает команды в 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();
frame.inFlight = false; } #pragma endregion [/code] Вывод проверки при первой итерации [code]>>>> #0 PreRender(). stepCounter: 1, indexPrepare: 0, imageIndex: 0. >>>>> PrepareFrame(). stepCounter: 1, indexPrepare: 0, frame.imageIndex: 0. >>>>> RenderFrame(). stepCounter: 1, indexRender: 1. >>>>> -= DebugOutput =- Message: [Vulkan Validation] ERROR | VALIDATION: vkQueueSubmit(): pSubmits[0].pCommandBuffers[0] VkCommandBuffer 0x1c2556b58f0 is unrecorded and contains no commands. The Vulkan spec states: Each element of the pCommandBuffers member of each element of pSubmits must be in the pending or executable state (https://docs.vulkan.org/spec/latest/chapters/cmdbuffers.html#VUID-vkQueueSubmit-pCommandBuffers-00070) Source: [void __cdecl zzz::IGAPI::LogGPUDebugMessage(const class std::basic_string &)] line: 114, file: C:\Workspaces\zzz\Zzz\engineFoundation\engineCore\Source\Interfaces\IGAPI\IGAPI.cppm >>>>> -= DebugOutput =- Message: [Vulkan Validation] ERROR | VALIDATION: vkQueueSubmit(): pSubmits[0].pWaitSemaphores[0] queue (VkQueue 0x1c25308d560) is waiting on semaphore (VkSemaphore 0x170000000017) that has no way to be signaled. The Vulkan spec states: All elements of the pWaitSemaphores member of all elements of pSubmits created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_BINARY must reference a semaphore signal operation that has been submitted for execution and any semaphore signal operations on which it depends must have also been submitted for execution (https://docs.vulkan.org/spec/latest/chapters/cmdbuffers.html#VUID-vkQueueSubmit-pWaitSemaphores-03238) Source: [void __cdecl zzz::IGAPI::LogGPUDebugMessage(const class std::basic_string &)] line: 114, file: C:\Workspaces\zzz\Zzz\engineFoundation\engineCore\Source\Interfaces\IGAPI\IGAPI.cppm >>>>> PostRender(). stepCounter: 1, indexRender: 1. >>>>> -= DebugOutput =- Message: [Vulkan Validation] ERROR | VALIDATION: vkQueuePresentKHR(): pPresentInfo->pImageIndices[0] was acquired with a semaphore VkSemaphore 0x140000000014 that has not since been waited on Source: [void __cdecl zzz::IGAPI::LogGPUDebugMessage(const class std::basic_string &)] line: 114, file: C:\Workspaces\zzz\Zzz\engineFoundation\engineCore\Source\Interfaces\IGAPI\IGAPI.cppm [/code] Ожидаемое поведение Я ожидаю, что: [list] [*]Первый кадр записывает команды в AcceptFrame и отправляет их в RenderFrame.
[*]Настоящий семафор правильно сигнализируется и ожидает в vkQueuePresentKHR.
[/list]
Репозиторий кода Полный код и ветка с этой реализацией Vulkan доступны здесь: https://github.com/k119-55524/Zzz
Ветвь: origin/clear-VK-api
Вопрос [list] [*][b]Как правильно записать и отправить первый кадр[/b] в этом конвейере Vulkan с кадрами в полете, чтобы избежать ошибок «незаписанного командного буфера» и «несигнализированного семафора»?
[*]Есть ли ошибка рекомендуемый шаблон для инициализации и отправки самого первого кадра при использовании нескольких динамических кадров и пула потоков?
[*][b]В качестве альтернативы предоставьте ссылки на учебные пособия или руководства[/b], в которых объясняется, как реализовать правильный конвейер рендеринга производитель-потребитель в Vulkan с несколькими динамическими кадрами и синхронизацией.