Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 1c0471a

Browse files
committed
Fix stencil aspect missing in layout transitions on depth/stencil formats
1 parent 132131b commit 1c0471a

7 files changed

Lines changed: 64 additions & 29 deletions

File tree

06_Texture_mapping/00_Images.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,7 @@ to be in the right layout first. Create a new function to handle layout
462462
transitions:
463463

464464
```c++
465-
void transitionImageLayout(VkImage image, VkImageLayout oldLayout, VkImageLayout newLayout) {
465+
void transitionImageLayout(VkImage image, VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout) {
466466
VkCommandBuffer commandBuffer = beginSingleTimeCommands();
467467

468468
endSingleTimeCommands(commandBuffer);
@@ -611,8 +611,8 @@ to the texture image. This involves three operations:
611611
This is easy to do with the functions we just created:
612612

613613
```c++
614-
transitionImageLayout(stagingImage, VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
615-
transitionImageLayout(textureImage, VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
614+
transitionImageLayout(stagingImage, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
615+
transitionImageLayout(textureImage, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
616616
copyImage(stagingImage, textureImage, texWidth, texHeight);
617617
```
618618
@@ -624,7 +624,7 @@ To be able to start sampling from the texture image in the shader, we need one
624624
last transition:
625625
626626
```c++
627-
transitionImageLayout(textureImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
627+
transitionImageLayout(textureImage, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
628628
```
629629

630630
## Transition barrier masks

07_Depth_buffering.md

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,19 @@ VkFormat findDepthFormat() {
249249
```
250250

251251
Make sure to use the `VK_FORMAT_FEATURE_` flag instead of `VK_IMAGE_USAGE_` in
252-
this case. Call this function from `createDepthResources`:
252+
this case. All of these candidate formats contain a depth component, but the
253+
latter two also contain a stencil component. We won't be using that yet, but we
254+
do need to take that into account when performing layout transitions on images
255+
with these formats. Add a simple helper function that tells us if the chosen
256+
depth format contains a stencil component:
257+
258+
```c++
259+
bool hasStencilComponent(VkFormat format) {
260+
return format == VK_FORMAT_D32_SFLOAT_S8_UINT || format == VK_FORMAT_D24_UNORM_S8_UINT;
261+
}
262+
```
263+
264+
Call the function to find a depth format from `createDepthResources`:
253265
254266
```c++
255267
VkFormat depthFormat = findDepthFormat();
@@ -293,7 +305,7 @@ render pass like the color attachment, but here I've chosen to use a pipeline
293305
barrier because the transition only needs to happen once:
294306
295307
```c++
296-
transitionImageLayout(depthImage, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
308+
transitionImageLayout(depthImage, depthFormat, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
297309
```
298310

299311
The undefined layout can be used as initial layout, because there are no
@@ -303,12 +315,19 @@ in `transitionImageLayout` to use the right subresource aspect:
303315
```c++
304316
if (newLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) {
305317
barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
318+
319+
if (hasStencilComponent(format)) {
320+
barrier.subresourceRange.aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT;
321+
}
306322
} else {
307323
barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
308324
}
309325
```
310326

311-
And add the correct access masks:
327+
Although we're not using the stencil component, we do need to include it in the
328+
layout transitions of the depth image.
329+
330+
Finally, add the correct access masks:
312331

313332
```c++
314333
if (oldLayout == VK_IMAGE_LAYOUT_PREINITIALIZED && newLayout == VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL) {

code/depth_buffering.cpp

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -749,7 +749,7 @@ class HelloTriangleApplication {
749749
createImage(swapChainExtent.width, swapChainExtent.height, depthFormat, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, depthImage, depthImageMemory);
750750
createImageView(depthImage, depthFormat, VK_IMAGE_ASPECT_DEPTH_BIT, depthImageView);
751751

752-
transitionImageLayout(depthImage, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
752+
transitionImageLayout(depthImage, depthFormat, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
753753
}
754754

755755
VkFormat findSupportedFormat(const std::vector<VkFormat>& candidates, VkImageTiling tiling, VkFormatFeatureFlags features) {
@@ -775,6 +775,10 @@ class HelloTriangleApplication {
775775
);
776776
}
777777

778+
bool hasStencilComponent(VkFormat format) {
779+
return format == VK_FORMAT_D32_SFLOAT_S8_UINT || format == VK_FORMAT_D24_UNORM_S8_UINT;
780+
}
781+
778782
void createTextureImage() {
779783
int texWidth, texHeight, texChannels;
780784
stbi_uc* pixels = stbi_load("textures/texture.jpg", &texWidth, &texHeight, &texChannels, STBI_rgb_alpha);
@@ -797,11 +801,11 @@ class HelloTriangleApplication {
797801

798802
createImage(texWidth, texHeight, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, textureImage, textureImageMemory);
799803

800-
transitionImageLayout(stagingImage, VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
801-
transitionImageLayout(textureImage, VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
804+
transitionImageLayout(stagingImage, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
805+
transitionImageLayout(textureImage, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
802806
copyImage(stagingImage, textureImage, texWidth, texHeight);
803807

804-
transitionImageLayout(textureImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
808+
transitionImageLayout(textureImage, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
805809
}
806810

807811
void createTextureImageView() {
@@ -881,7 +885,7 @@ class HelloTriangleApplication {
881885
vkBindImageMemory(device, image, imageMemory, 0);
882886
}
883887

884-
void transitionImageLayout(VkImage image, VkImageLayout oldLayout, VkImageLayout newLayout) {
888+
void transitionImageLayout(VkImage image, VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout) {
885889
VkCommandBuffer commandBuffer = beginSingleTimeCommands();
886890

887891
VkImageMemoryBarrier barrier = {};
@@ -894,6 +898,10 @@ class HelloTriangleApplication {
894898

895899
if (newLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) {
896900
barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
901+
902+
if (hasStencilComponent(format)) {
903+
barrier.subresourceRange.aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT;
904+
}
897905
} else {
898906
barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
899907
}

code/model_loading.cpp

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -755,7 +755,7 @@ class HelloTriangleApplication {
755755
createImage(swapChainExtent.width, swapChainExtent.height, depthFormat, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, depthImage, depthImageMemory);
756756
createImageView(depthImage, depthFormat, VK_IMAGE_ASPECT_DEPTH_BIT, depthImageView);
757757

758-
transitionImageLayout(depthImage, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
758+
transitionImageLayout(depthImage, depthFormat, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
759759
}
760760

761761
VkFormat findSupportedFormat(const std::vector<VkFormat>& candidates, VkImageTiling tiling, VkFormatFeatureFlags features) {
@@ -781,6 +781,10 @@ class HelloTriangleApplication {
781781
);
782782
}
783783

784+
bool hasStencilComponent(VkFormat format) {
785+
return format == VK_FORMAT_D32_SFLOAT_S8_UINT || format == VK_FORMAT_D24_UNORM_S8_UINT;
786+
}
787+
784788
void createTextureImage() {
785789
int texWidth, texHeight, texChannels;
786790
stbi_uc* pixels = stbi_load(TEXTURE_PATH.c_str(), &texWidth, &texHeight, &texChannels, STBI_rgb_alpha);
@@ -803,11 +807,11 @@ class HelloTriangleApplication {
803807

804808
createImage(texWidth, texHeight, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, textureImage, textureImageMemory);
805809

806-
transitionImageLayout(stagingImage, VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
807-
transitionImageLayout(textureImage, VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
810+
transitionImageLayout(stagingImage, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
811+
transitionImageLayout(textureImage, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
808812
copyImage(stagingImage, textureImage, texWidth, texHeight);
809813

810-
transitionImageLayout(textureImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
814+
transitionImageLayout(textureImage, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
811815
}
812816

813817
void createTextureImageView() {
@@ -887,7 +891,7 @@ class HelloTriangleApplication {
887891
vkBindImageMemory(device, image, imageMemory, 0);
888892
}
889893

890-
void transitionImageLayout(VkImage image, VkImageLayout oldLayout, VkImageLayout newLayout) {
894+
void transitionImageLayout(VkImage image, VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout) {
891895
VkCommandBuffer commandBuffer = beginSingleTimeCommands();
892896

893897
VkImageMemoryBarrier barrier = {};
@@ -900,6 +904,10 @@ class HelloTriangleApplication {
900904

901905
if (newLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) {
902906
barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
907+
908+
if (hasStencilComponent(format)) {
909+
barrier.subresourceRange.aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT;
910+
}
903911
} else {
904912
barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
905913
}

code/sampler.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -712,11 +712,11 @@ class HelloTriangleApplication {
712712

713713
createImage(texWidth, texHeight, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, textureImage, textureImageMemory);
714714

715-
transitionImageLayout(stagingImage, VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
716-
transitionImageLayout(textureImage, VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
715+
transitionImageLayout(stagingImage, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
716+
transitionImageLayout(textureImage, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
717717
copyImage(stagingImage, textureImage, texWidth, texHeight);
718718

719-
transitionImageLayout(textureImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
719+
transitionImageLayout(textureImage, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
720720
}
721721

722722
void createTextureImageView() {
@@ -796,7 +796,7 @@ class HelloTriangleApplication {
796796
vkBindImageMemory(device, image, imageMemory, 0);
797797
}
798798

799-
void transitionImageLayout(VkImage image, VkImageLayout oldLayout, VkImageLayout newLayout) {
799+
void transitionImageLayout(VkImage image, VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout) {
800800
VkCommandBuffer commandBuffer = beginSingleTimeCommands();
801801

802802
VkImageMemoryBarrier barrier = {};

code/texture_image.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -725,11 +725,11 @@ class HelloTriangleApplication {
725725

726726
createImage(texWidth, texHeight, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, textureImage, textureImageMemory);
727727

728-
transitionImageLayout(stagingImage, VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
729-
transitionImageLayout(textureImage, VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
728+
transitionImageLayout(stagingImage, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
729+
transitionImageLayout(textureImage, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
730730
copyImage(stagingImage, textureImage, texWidth, texHeight);
731731

732-
transitionImageLayout(textureImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
732+
transitionImageLayout(textureImage, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
733733
}
734734

735735
void createImage(uint32_t width, uint32_t height, VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags properties, VDeleter<VkImage>& image, VDeleter<VkDeviceMemory>& imageMemory) {
@@ -767,7 +767,7 @@ class HelloTriangleApplication {
767767
vkBindImageMemory(device, image, imageMemory, 0);
768768
}
769769

770-
void transitionImageLayout(VkImage image, VkImageLayout oldLayout, VkImageLayout newLayout) {
770+
void transitionImageLayout(VkImage image, VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout) {
771771
VkCommandBuffer commandBuffer = beginSingleTimeCommands();
772772

773773
VkImageMemoryBarrier barrier = {};

code/texture_mapping.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -726,11 +726,11 @@ class HelloTriangleApplication {
726726

727727
createImage(texWidth, texHeight, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, textureImage, textureImageMemory);
728728

729-
transitionImageLayout(stagingImage, VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
730-
transitionImageLayout(textureImage, VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
729+
transitionImageLayout(stagingImage, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
730+
transitionImageLayout(textureImage, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
731731
copyImage(stagingImage, textureImage, texWidth, texHeight);
732732

733-
transitionImageLayout(textureImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
733+
transitionImageLayout(textureImage, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
734734
}
735735

736736
void createTextureImageView() {
@@ -810,7 +810,7 @@ class HelloTriangleApplication {
810810
vkBindImageMemory(device, image, imageMemory, 0);
811811
}
812812

813-
void transitionImageLayout(VkImage image, VkImageLayout oldLayout, VkImageLayout newLayout) {
813+
void transitionImageLayout(VkImage image, VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout) {
814814
VkCommandBuffer commandBuffer = beginSingleTimeCommands();
815815

816816
VkImageMemoryBarrier barrier = {};

0 commit comments

Comments
 (0)