Код: Выделить всё
void Renderer::draw()
{
// Wait for the previous frame to finish
vkWaitForFences(m_renderDevice.logicalDevice, 1, &m_inFlightFences[m_currentFrame], VK_TRUE, std::numeric_limits::max());
vkResetFences(m_renderDevice.logicalDevice, 1, &m_inFlightFences[m_currentFrame]);
// Setp 1: Get the next image from the swap chain
uint32_t imageIndex;
vkAcquireNextImageKHR(m_renderDevice.logicalDevice, m_swapChain, std::numeric_limits::max(), m_imageAvailableSemaphores[m_currentFrame], VK_NULL_HANDLE, &imageIndex);
// Step 2: Submit the command buffer from the image to the graphics queue
VkSubmitInfo submitInfo = {};
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
submitInfo.waitSemaphoreCount = 1; // Number of semaphores to wait on before execution begins
submitInfo.pWaitSemaphores = &m_imageAvailableSemaphores[m_currentFrame]; // Semaphores to wait on before execution begins
VkPipelineStageFlags waitStages[] = {
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
};
submitInfo.pWaitDstStageMask = waitStages; // Stages to wait at
submitInfo.commandBufferCount = 1; // Number of command buffers to be submitted
submitInfo.pCommandBuffers = &m_commandBuffers[imageIndex]; // Command buffers to submit
submitInfo.signalSemaphoreCount = 1; // Number of semaphores to signal once the command buffer has finished execution
submitInfo.pSignalSemaphores = &m_renderFinishedSemaphores[m_currentFrame]; // Semaphores to signal once the command buffer has finished execution
if (vkQueueSubmit(m_graphicsQueue, 1, &submitInfo, m_inFlightFences[m_currentFrame]) != VK_SUCCESS) {
throw std::runtime_error("failed to submit draw command buffer!");
}
// Step 3: Present the image in the swap chain to the presentation queue
VkPresentInfoKHR presentInfo = {};
presentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
presentInfo.waitSemaphoreCount = 1; // Number of semaphores to wait on before presentation
presentInfo.pWaitSemaphores = &m_renderFinishedSemaphores[m_currentFrame]; // Semaphores to wait on before presentation
presentInfo.swapchainCount = 1; // Number of swap chains to present images to
presentInfo.pSwapchains = &m_swapChain; // Swap chains to present images to
presentInfo.pImageIndices = &imageIndex; // Indices of the images in the swap chains to present
if (vkQueuePresentKHR(m_presentQueue, &presentInfo) != VK_SUCCESS) {
throw std::runtime_error("failed to present swap chain image!");
}
m_currentFrame = (m_currentFrame + 1) % MAX_FRAMES_IN_FLIGHT;
}
Ошибка проверки: [ VUID-vkQueueSubmit-pSignalSemaphores-00067 ] | MessageID = 0x539277af
vkQueueSubmit(): pSubmits[0].pSignalSemaphores[0] (VkSemaphore 0x130000000013) сигнализируется VkQueue 0x275f0407ac0, но он все еще может использоваться VkSwapchainKHR 0x20000000002.
Последнее полученное изображение. индексы: [0], 1, 2.
(Квадратные скобки отмечают последнее использование VkSemaphore 0x130000000013 в операции представления.)
Образ Swapchain 0 был представлен, но не был получен повторно, поэтому VkSemaphore 0x130000000013 может все еще использоваться и не может быть безопасно повторно использован с индексом изображения 2.
Информация о Vulkan: см. https://docs.vulkan.org/guide/latest/sw ... reuse.html для получения подробной информации о повторном использовании семафора цепочки обмена. Примеры возможных подходов:
а) Используйте отдельный семафор для каждого образа цепочки обмена. Проиндексируйте эти семафоры, используя индекс полученного образа.
б) Рассмотрим расширение VK_KHR_swapchain_maintenance1. Это позволяет использовать VkFence с операцией представления.
Спецификация Vulkan гласит: каждый двоичный семафорный элемент члена pSignalSemaphores любого элемента pSubmits должен быть отключен от сигнала, когда определенная им операция семафорного сигнала выполняется на устройстве. (https://vulkan.lunarg.com/doc/view/1.4. ... ores-00067)
Объектов: 2
[0] VkSemaphore 0x130000000013
[1] VkQueue 0x275f0407ac0
Ошибка проверки: [ VUID-vkQueueSubmit-pSignalSemaphores-00067 ] | MessageID = 0x539277af
vkQueueSubmit(): pSubmits[0].pSignalSemaphores[0] (VkSemaphore 0x160000000016) сигнализируется VkQueue 0x275f0407ac0, но он все еще может использоваться VkSwapchainKHR 0x20000000002.
Последнее полученное изображение. индексы: 0, [1], 2, 0.
(В скобках отмечено последнее использование VkSemaphore 0x160000000016 в операции представления.)
Образ Swapchain 1 был представлен, но не был получен повторно, поэтому VkSemaphore 0x160000000016 может все еще использоваться и не может быть безопасно повторно использован с индексом изображения 0.
Информация о Vulkan: см. https://docs.vulkan.org/guide/latest/sw ... reuse.html для получения подробной информации о повторном использовании семафора цепочки обмена. Примеры возможных подходов:
а) Используйте отдельный семафор для каждого образа цепочки обмена. Проиндексируйте эти семафоры, используя индекс полученного образа.
б) Рассмотрим расширение VK_KHR_swapchain_maintenance1. Это позволяет использовать VkFence с операцией представления.
Спецификация Vulkan гласит: каждый двоичный семафорный элемент члена pSignalSemaphores любого элемента pSubmits должен быть отключен от сигнала, когда определенная им операция семафорного сигнала выполняется на устройстве. (https://vulkan.lunarg.com/doc/view/1.4. ... ores-00067)
Объектов: 2
[0] VkSemaphore 0x160000000016
[1] VkQueue 0x275f0407ac0
Если я установлю для этого значения const значение 3, я вообще не получу эту ошибку.
Подробнее здесь: https://stackoverflow.com/questions/797 ... ores-00067
Мобильная версия