Partage
  • Partager sur Facebook
  • Partager sur Twitter

Validation layer retourne erreur avec VULKAN

Sujet résolu
    7 mai 2024 à 14:32:30

    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!

    • Partager sur Facebook
    • Partager sur Twitter
      7 mai 2024 à 15:50:40

      L'erreur te dit que tu attends un sémaphore qui n'est jamais signalé
      • Partager sur Facebook
      • Partager sur Twitter

      Si vous ne trouvez plus rien, cherchez autre chose.

        7 mai 2024 à 16:18:25

        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

        • Partager sur Facebook
        • Partager sur Twitter

        Validation layer retourne erreur avec VULKAN

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        • Editeur
        • Markdown