From a37013ef098b1e5856592b2ac08d266b874a697d Mon Sep 17 00:00:00 2001 From: Ryan Linnit Date: Tue, 5 Dec 2023 23:59:12 +0000 Subject: [PATCH] update logic in `transitionImageLayout` to use the right subresource aspect --- code/27_depth_buffering.cpp | 11 ++++++++++- code/28_model_loading.cpp | 11 ++++++++++- code/29_mipmapping.cpp | 11 ++++++++++- code/30_multisampling.cpp | 11 ++++++++++- .../04_Swap_chain_recreation.md | 8 ++++---- .../00_Mise_en_place/01_Instance.md | 2 +- .../04_Recr\303\251ation_de_la_swap_chain.md" | 19 +++++++++---------- 7 files changed, 54 insertions(+), 19 deletions(-) diff --git a/code/27_depth_buffering.cpp b/code/27_depth_buffering.cpp index 5e0452c2..916f3695 100644 --- a/code/27_depth_buffering.cpp +++ b/code/27_depth_buffering.cpp @@ -924,12 +924,21 @@ class HelloTriangleApplication { barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; barrier.image = image; - barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; barrier.subresourceRange.baseMipLevel = 0; barrier.subresourceRange.levelCount = 1; barrier.subresourceRange.baseArrayLayer = 0; barrier.subresourceRange.layerCount = 1; + if (newLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) { + barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; + + if (hasStencilComponent(format)) { + barrier.subresourceRange.aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT; + } + } else { + barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + } + VkPipelineStageFlags sourceStage; VkPipelineStageFlags destinationStage; diff --git a/code/28_model_loading.cpp b/code/28_model_loading.cpp index 319e4f7f..597fc141 100644 --- a/code/28_model_loading.cpp +++ b/code/28_model_loading.cpp @@ -931,12 +931,21 @@ class HelloTriangleApplication { barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; barrier.image = image; - barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; barrier.subresourceRange.baseMipLevel = 0; barrier.subresourceRange.levelCount = 1; barrier.subresourceRange.baseArrayLayer = 0; barrier.subresourceRange.layerCount = 1; + if (newLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) { + barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; + + if (hasStencilComponent(format)) { + barrier.subresourceRange.aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT; + } + } else { + barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + } + VkPipelineStageFlags sourceStage; VkPipelineStageFlags destinationStage; diff --git a/code/29_mipmapping.cpp b/code/29_mipmapping.cpp index ae0cadf5..c751fa16 100644 --- a/code/29_mipmapping.cpp +++ b/code/29_mipmapping.cpp @@ -1025,12 +1025,21 @@ class HelloTriangleApplication { barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; barrier.image = image; - barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; barrier.subresourceRange.baseMipLevel = 0; barrier.subresourceRange.levelCount = mipLevels; barrier.subresourceRange.baseArrayLayer = 0; barrier.subresourceRange.layerCount = 1; + if (newLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) { + barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; + + if (hasStencilComponent(format)) { + barrier.subresourceRange.aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT; + } + } else { + barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + } + VkPipelineStageFlags sourceStage; VkPipelineStageFlags destinationStage; diff --git a/code/30_multisampling.cpp b/code/30_multisampling.cpp index 638c2219..6e3bb3bc 100644 --- a/code/30_multisampling.cpp +++ b/code/30_multisampling.cpp @@ -1075,12 +1075,21 @@ class HelloTriangleApplication { barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; barrier.image = image; - barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; barrier.subresourceRange.baseMipLevel = 0; barrier.subresourceRange.levelCount = mipLevels; barrier.subresourceRange.baseArrayLayer = 0; barrier.subresourceRange.layerCount = 1; + if (newLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) { + barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; + + if (hasStencilComponent(format)) { + barrier.subresourceRange.aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT; + } + } else { + barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + } + VkPipelineStageFlags sourceStage; VkPipelineStageFlags destinationStage; diff --git a/en/03_Drawing_a_triangle/04_Swap_chain_recreation.md b/en/03_Drawing_a_triangle/04_Swap_chain_recreation.md index 5da07458..9c598528 100644 --- a/en/03_Drawing_a_triangle/04_Swap_chain_recreation.md +++ b/en/03_Drawing_a_triangle/04_Swap_chain_recreation.md @@ -56,12 +56,12 @@ chain refresh from `cleanup` to `cleanupSwapChain`: ```c++ void cleanupSwapChain() { - for (size_t i = 0; i < swapChainFramebuffers.size(); i++) { - vkDestroyFramebuffer(device, swapChainFramebuffers[i], nullptr); + for (auto framebuffer : swapChainFramebuffers) { + vkDestroyFramebuffer(device, framebuffer, nullptr); } - for (size_t i = 0; i < swapChainImageViews.size(); i++) { - vkDestroyImageView(device, swapChainImageViews[i], nullptr); + for (auto imageView : swapChainImageViews) { + vkDestroyImageView(device, imageView, nullptr); } vkDestroySwapchainKHR(device, swapChain, nullptr); diff --git a/fr/03_Dessiner_un_triangle/00_Mise_en_place/01_Instance.md b/fr/03_Dessiner_un_triangle/00_Mise_en_place/01_Instance.md index 496e840a..851c5aee 100644 --- a/fr/03_Dessiner_un_triangle/00_Mise_en_place/01_Instance.md +++ b/fr/03_Dessiner_un_triangle/00_Mise_en_place/01_Instance.md @@ -20,7 +20,7 @@ VkInstance instance; Pour créer l'instance, nous allons d'abord remplir une première structure avec des informations sur notre application. Ces données sont optionnelles, mais elles peuvent fournir des informations utiles au driver pour optimiser ou -dignostiquer les erreurs lors de l'exécution, par exemple en reconnaissant le nom d'un moteur graphique. Cette structure +diagnostiquer les erreurs lors de l'exécution, par exemple en reconnaissant le nom d'un moteur graphique. Cette structure s'appelle `VkApplicationInfo` : ```c++ diff --git "a/fr/03_Dessiner_un_triangle/04_Recr\303\251ation_de_la_swap_chain.md" "b/fr/03_Dessiner_un_triangle/04_Recr\303\251ation_de_la_swap_chain.md" index 4f979076..175ae235 100644 --- "a/fr/03_Dessiner_un_triangle/04_Recr\303\251ation_de_la_swap_chain.md" +++ "b/fr/03_Dessiner_un_triangle/04_Recr\303\251ation_de_la_swap_chain.md" @@ -58,18 +58,12 @@ Nous allons déplacer le code de suppression depuis `cleanup` jusqu'à `cleanupS ```c++ void cleanupSwapChain() { - for (size_t i = 0; i < swapChainFramebuffers.size(); i++) { - vkDestroyFramebuffer(device, swapChainFramebuffers[i], nullptr); + for (auto framebuffer : swapChainFramebuffers) { + vkDestroyFramebuffer(device, framebuffer, nullptr); } - vkFreeCommandBuffers(device, commandPool, static_cast(commandBuffers.size()), commandBuffers.data()); - - vkDestroyPipeline(device, graphicsPipeline, nullptr); - vkDestroyPipelineLayout(device, pipelineLayout, nullptr); - vkDestroyRenderPass(device, renderPass, nullptr); - - for (size_t i = 0; i < swapChainImageViews.size(); i++) { - vkDestroyImageView(device, swapChainImageViews[i], nullptr); + for (auto imageView : swapChainImageViews) { + vkDestroyImageView(device, imageView, nullptr); } vkDestroySwapchainKHR(device, swapChain, nullptr); @@ -82,6 +76,11 @@ Nous pouvons ensuite appeler cette nouvelle fonction depuis `cleanup` pour évit void cleanup() { cleanupSwapChain(); + vkDestroyPipeline(device, graphicsPipeline, nullptr); + vkDestroyPipelineLayout(device, pipelineLayout, nullptr); + + vkDestroyRenderPass(device, renderPass, nullptr); + for (size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++) { vkDestroySemaphore(device, renderFinishedSemaphores[i], nullptr); vkDestroySemaphore(device, imageAvailableSemaphores[i], nullptr);