Vous utilisez un navigateur obsolète, veuillez le mettre à jour.
Veuillez utiliser un navigateur internet moderne avec JavaScript activé pour naviguer sur OpenClassrooms.com
Une question ? Pas de panique, on va vous aider !
Salut! Vulkan me retourne une erreur que je ne comprends pas.
Voici la fonction ou j'utilise les semaphores :
void RenderTexture::display() { if (getCommandBuffers().size() > 0) { vkWaitForFences(vkSettup.getDevice(), 1, &inFlightFences[getCurrentFrame()], VK_TRUE, UINT64_MAX); VkSubmitInfo submitInfo{}; submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; VkSemaphore waitSemaphores[] = {imageAvailableSemaphores[getCurrentFrame()]}; VkPipelineStageFlags waitStages[] = {VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT}; submitInfo.waitSemaphoreCount = 1; submitInfo.pWaitSemaphores = waitSemaphores; submitInfo.pWaitDstStageMask = waitStages; submitInfo.commandBufferCount = 1; submitInfo.pCommandBuffers = &getCommandBuffers()[getCurrentFrame()]; VkSemaphore signalSemaphores[] = {renderFinishedSemaphores[getCurrentFrame()]}; submitInfo.signalSemaphoreCount = 1; submitInfo.pSignalSemaphores = signalSemaphores; vkResetFences(vkSettup.getDevice(), 1, &inFlightFences[getCurrentFrame()]); if (vkQueueSubmit(vkSettup.getGraphicQueue(), 1, &submitInfo, inFlightFences[getCurrentFrame()]) != VK_SUCCESS) { throw core::Erreur(0, "échec de l'envoi d'un command buffer!", 1); } } }
Peut être c'est parce que je n'envoie plus la present info comme ici :
void RenderWindow::drawVulkanFrame() { if (getCommandBuffers().size() > 0) { vkWaitForFences(vkSettup.getDevice(), 1, &inFlightFences[currentFrame], VK_TRUE, UINT64_MAX); uint32_t imageIndex; vkAcquireNextImageKHR(vkSettup.getDevice(), swapChain, UINT64_MAX, imageAvailableSemaphores[currentFrame], VK_NULL_HANDLE, &imageIndex); // Vérifier si une frame précédente est en train d'utiliser cette image (il y a une fence à attendre) if (imagesInFlight[imageIndex] != VK_NULL_HANDLE) { vkWaitForFences(vkSettup.getDevice(), 1, &imagesInFlight[imageIndex], VK_TRUE, UINT64_MAX); } // Marque l'image comme étant à nouveau utilisée par cette frame imagesInFlight[imageIndex] = inFlightFences[currentFrame]; VkSubmitInfo submitInfo{}; submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; VkSemaphore waitSemaphores[] = {imageAvailableSemaphores[currentFrame]}; VkPipelineStageFlags waitStages[] = {VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT}; submitInfo.waitSemaphoreCount = 1; submitInfo.pWaitSemaphores = waitSemaphores; submitInfo.pWaitDstStageMask = waitStages; submitInfo.commandBufferCount = 1; submitInfo.pCommandBuffers = &getCommandBuffers()[imageIndex]; VkSemaphore signalSemaphores[] = {renderFinishedSemaphores[currentFrame]}; submitInfo.signalSemaphoreCount = 1; submitInfo.pSignalSemaphores = signalSemaphores; vkResetFences(vkSettup.getDevice(), 1, &inFlightFences[currentFrame]); if (vkQueueSubmit(vkSettup.getGraphicQueue(), 1, &submitInfo, inFlightFences[currentFrame]) != VK_SUCCESS) { throw core::Erreur(0, "échec de l'envoi d'un command buffer!", 1); } VkPresentInfoKHR presentInfo{}; presentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; presentInfo.waitSemaphoreCount = 1; presentInfo.pWaitSemaphores = signalSemaphores; VkSwapchainKHR swapChains[] = {swapChain}; presentInfo.swapchainCount = 1; presentInfo.pSwapchains = swapChains; presentInfo.pImageIndices = &imageIndex; presentInfo.pResults = nullptr; // Optionnel vkQueuePresentKHR(vkSettup.getPresentQueue(), &presentInfo); currentFrame = (currentFrame + 1) % MAX_FRAMES_IN_FLIGHT; vkDeviceWaitIdle(vkSettup.getDevice()); } }
Que dois je faire ?
Merci!
Si vous ne trouvez plus rien, cherchez autre chose.
Oui je sais à mon avis il faut que j'enlève les sémaphores. Je pense pas qu'ils soient utiles ici et les fence je ne sais pas.
EDIT : j'ai retiré les sémaphore et plus d'erreurs.
Résolu
-Edité par OmbreNoire 7 mai 2024 à 16:24:17
Vous pouvez rédiger votre message en Markdown ou en HTML uniquement.
Si vous ne trouvez plus rien, cherchez autre chose.