Ошибка проверки: [VUID-vkQueueSubmit-pSignalSemaphores-00067]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Ошибка проверки: [VUID-vkQueueSubmit-pSignalSemaphores-00067]

Сообщение Anonymous »

Я новичок в Vulkan и столкнулся с ошибкой. У меня есть этот код для рендеринга

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»