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

Skip to content

Commit becccdb

Browse files
committed
Fix vkResetFences also being called when swap chain is out-of-date
1 parent d9c2a6e commit becccdb

14 files changed

Lines changed: 39 additions & 13 deletions

03_Drawing_a_triangle/04_Swap_chain_recreation.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,19 @@ If the swap chain turns out to be out of date when attempting to acquire an
164164
image, then it is no longer possible to present to it. Therefore we should
165165
immediately recreate the swap chain and try again in the next `drawFrame` call.
166166

167+
However, if we abort drawing at this point then the fence will be never have
168+
been submitted with `vkQueueSubmit` and it'll be in an unexpected state when we
169+
try to wait for it later on. We could recreate the fences as part of swap chain
170+
recreation, but it's easier to move the `vkResetFences` call:
171+
172+
```c++
173+
vkResetFences(device, 1, &inFlightFences[currentFrame]);
174+
175+
if (vkQueueSubmit(graphicsQueue, 1, &submitInfo, inFlightFences[currentFrame]) != VK_SUCCESS) {
176+
throw std::runtime_error("failed to submit draw command buffer!");
177+
}
178+
```
179+
167180
You could also decide to do that if the swap chain is suboptimal, but I've
168181
chosen to proceed anyway in that case because we've already acquired an image.
169182
Both `VK_SUCCESS` and `VK_SUBOPTIMAL_KHR` are considered "success" return codes.

code/16_swap_chain_recreation.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -659,7 +659,6 @@ class HelloTriangleApplication {
659659

660660
void drawFrame() {
661661
vkWaitForFences(device, 1, &inFlightFences[currentFrame], VK_TRUE, std::numeric_limits<uint64_t>::max());
662-
vkResetFences(device, 1, &inFlightFences[currentFrame]);
663662

664663
uint32_t imageIndex;
665664
VkResult result = vkAcquireNextImageKHR(device, swapChain, std::numeric_limits<uint64_t>::max(), imageAvailableSemaphores[currentFrame], VK_NULL_HANDLE, &imageIndex);
@@ -687,6 +686,8 @@ class HelloTriangleApplication {
687686
submitInfo.signalSemaphoreCount = 1;
688687
submitInfo.pSignalSemaphores = signalSemaphores;
689688

689+
vkResetFences(device, 1, &inFlightFences[currentFrame]);
690+
690691
if (vkQueueSubmit(graphicsQueue, 1, &submitInfo, inFlightFences[currentFrame]) != VK_SUCCESS) {
691692
throw std::runtime_error("failed to submit draw command buffer!");
692693
}

code/17_vertex_input.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -704,7 +704,6 @@ class HelloTriangleApplication {
704704

705705
void drawFrame() {
706706
vkWaitForFences(device, 1, &inFlightFences[currentFrame], VK_TRUE, std::numeric_limits<uint64_t>::max());
707-
vkResetFences(device, 1, &inFlightFences[currentFrame]);
708707

709708
uint32_t imageIndex;
710709
VkResult result = vkAcquireNextImageKHR(device, swapChain, std::numeric_limits<uint64_t>::max(), imageAvailableSemaphores[currentFrame], VK_NULL_HANDLE, &imageIndex);
@@ -732,6 +731,8 @@ class HelloTriangleApplication {
732731
submitInfo.signalSemaphoreCount = 1;
733732
submitInfo.pSignalSemaphores = signalSemaphores;
734733

734+
vkResetFences(device, 1, &inFlightFences[currentFrame]);
735+
735736
if (vkQueueSubmit(graphicsQueue, 1, &submitInfo, inFlightFences[currentFrame]) != VK_SUCCESS) {
736737
throw std::runtime_error("failed to submit draw command buffer!");
737738
}

code/18_vertex_buffer.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -760,7 +760,6 @@ class HelloTriangleApplication {
760760

761761
void drawFrame() {
762762
vkWaitForFences(device, 1, &inFlightFences[currentFrame], VK_TRUE, std::numeric_limits<uint64_t>::max());
763-
vkResetFences(device, 1, &inFlightFences[currentFrame]);
764763

765764
uint32_t imageIndex;
766765
VkResult result = vkAcquireNextImageKHR(device, swapChain, std::numeric_limits<uint64_t>::max(), imageAvailableSemaphores[currentFrame], VK_NULL_HANDLE, &imageIndex);
@@ -788,6 +787,8 @@ class HelloTriangleApplication {
788787
submitInfo.signalSemaphoreCount = 1;
789788
submitInfo.pSignalSemaphores = signalSemaphores;
790789

790+
vkResetFences(device, 1, &inFlightFences[currentFrame]);
791+
791792
if (vkQueueSubmit(graphicsQueue, 1, &submitInfo, inFlightFences[currentFrame]) != VK_SUCCESS) {
792793
throw std::runtime_error("failed to submit draw command buffer!");
793794
}

code/19_staging_buffer.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -808,7 +808,6 @@ class HelloTriangleApplication {
808808

809809
void drawFrame() {
810810
vkWaitForFences(device, 1, &inFlightFences[currentFrame], VK_TRUE, std::numeric_limits<uint64_t>::max());
811-
vkResetFences(device, 1, &inFlightFences[currentFrame]);
812811

813812
uint32_t imageIndex;
814813
VkResult result = vkAcquireNextImageKHR(device, swapChain, std::numeric_limits<uint64_t>::max(), imageAvailableSemaphores[currentFrame], VK_NULL_HANDLE, &imageIndex);
@@ -836,6 +835,8 @@ class HelloTriangleApplication {
836835
submitInfo.signalSemaphoreCount = 1;
837836
submitInfo.pSignalSemaphores = signalSemaphores;
838837

838+
vkResetFences(device, 1, &inFlightFences[currentFrame]);
839+
839840
if (vkQueueSubmit(graphicsQueue, 1, &submitInfo, inFlightFences[currentFrame]) != VK_SUCCESS) {
840841
throw std::runtime_error("failed to submit draw command buffer!");
841842
}

code/20_index_buffer.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -841,7 +841,6 @@ class HelloTriangleApplication {
841841

842842
void drawFrame() {
843843
vkWaitForFences(device, 1, &inFlightFences[currentFrame], VK_TRUE, std::numeric_limits<uint64_t>::max());
844-
vkResetFences(device, 1, &inFlightFences[currentFrame]);
845844

846845
uint32_t imageIndex;
847846
VkResult result = vkAcquireNextImageKHR(device, swapChain, std::numeric_limits<uint64_t>::max(), imageAvailableSemaphores[currentFrame], VK_NULL_HANDLE, &imageIndex);
@@ -869,6 +868,8 @@ class HelloTriangleApplication {
869868
submitInfo.signalSemaphoreCount = 1;
870869
submitInfo.pSignalSemaphores = signalSemaphores;
871870

871+
vkResetFences(device, 1, &inFlightFences[currentFrame]);
872+
872873
if (vkQueueSubmit(graphicsQueue, 1, &submitInfo, inFlightFences[currentFrame]) != VK_SUCCESS) {
873874
throw std::runtime_error("failed to submit draw command buffer!");
874875
}

code/21_descriptor_layout.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -910,7 +910,6 @@ class HelloTriangleApplication {
910910

911911
void drawFrame() {
912912
vkWaitForFences(device, 1, &inFlightFences[currentFrame], VK_TRUE, std::numeric_limits<uint64_t>::max());
913-
vkResetFences(device, 1, &inFlightFences[currentFrame]);
914913

915914
uint32_t imageIndex;
916915
VkResult result = vkAcquireNextImageKHR(device, swapChain, std::numeric_limits<uint64_t>::max(), imageAvailableSemaphores[currentFrame], VK_NULL_HANDLE, &imageIndex);
@@ -940,6 +939,8 @@ class HelloTriangleApplication {
940939
submitInfo.signalSemaphoreCount = 1;
941940
submitInfo.pSignalSemaphores = signalSemaphores;
942941

942+
vkResetFences(device, 1, &inFlightFences[currentFrame]);
943+
943944
if (vkQueueSubmit(graphicsQueue, 1, &submitInfo, inFlightFences[currentFrame]) != VK_SUCCESS) {
944945
throw std::runtime_error("failed to submit draw command buffer!");
945946
}

code/22_descriptor_sets.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -967,7 +967,6 @@ class HelloTriangleApplication {
967967

968968
void drawFrame() {
969969
vkWaitForFences(device, 1, &inFlightFences[currentFrame], VK_TRUE, std::numeric_limits<uint64_t>::max());
970-
vkResetFences(device, 1, &inFlightFences[currentFrame]);
971970

972971
uint32_t imageIndex;
973972
VkResult result = vkAcquireNextImageKHR(device, swapChain, std::numeric_limits<uint64_t>::max(), imageAvailableSemaphores[currentFrame], VK_NULL_HANDLE, &imageIndex);
@@ -997,6 +996,8 @@ class HelloTriangleApplication {
997996
submitInfo.signalSemaphoreCount = 1;
998997
submitInfo.pSignalSemaphores = signalSemaphores;
999998

999+
vkResetFences(device, 1, &inFlightFences[currentFrame]);
1000+
10001001
if (vkQueueSubmit(graphicsQueue, 1, &submitInfo, inFlightFences[currentFrame]) != VK_SUCCESS) {
10011002
throw std::runtime_error("failed to submit draw command buffer!");
10021003
}

code/23_texture_image.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1122,7 +1122,6 @@ class HelloTriangleApplication {
11221122

11231123
void drawFrame() {
11241124
vkWaitForFences(device, 1, &inFlightFences[currentFrame], VK_TRUE, std::numeric_limits<uint64_t>::max());
1125-
vkResetFences(device, 1, &inFlightFences[currentFrame]);
11261125

11271126
uint32_t imageIndex;
11281127
VkResult result = vkAcquireNextImageKHR(device, swapChain, std::numeric_limits<uint64_t>::max(), imageAvailableSemaphores[currentFrame], VK_NULL_HANDLE, &imageIndex);
@@ -1152,6 +1151,8 @@ class HelloTriangleApplication {
11521151
submitInfo.signalSemaphoreCount = 1;
11531152
submitInfo.pSignalSemaphores = signalSemaphores;
11541153

1154+
vkResetFences(device, 1, &inFlightFences[currentFrame]);
1155+
11551156
if (vkQueueSubmit(graphicsQueue, 1, &submitInfo, inFlightFences[currentFrame]) != VK_SUCCESS) {
11561157
throw std::runtime_error("failed to submit draw command buffer!");
11571158
}

code/24_sampler.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1158,7 +1158,6 @@ class HelloTriangleApplication {
11581158

11591159
void drawFrame() {
11601160
vkWaitForFences(device, 1, &inFlightFences[currentFrame], VK_TRUE, std::numeric_limits<uint64_t>::max());
1161-
vkResetFences(device, 1, &inFlightFences[currentFrame]);
11621161

11631162
uint32_t imageIndex;
11641163
VkResult result = vkAcquireNextImageKHR(device, swapChain, std::numeric_limits<uint64_t>::max(), imageAvailableSemaphores[currentFrame], VK_NULL_HANDLE, &imageIndex);
@@ -1188,6 +1187,8 @@ class HelloTriangleApplication {
11881187
submitInfo.signalSemaphoreCount = 1;
11891188
submitInfo.pSignalSemaphores = signalSemaphores;
11901189

1190+
vkResetFences(device, 1, &inFlightFences[currentFrame]);
1191+
11911192
if (vkQueueSubmit(graphicsQueue, 1, &submitInfo, inFlightFences[currentFrame]) != VK_SUCCESS) {
11921193
throw std::runtime_error("failed to submit draw command buffer!");
11931194
}

0 commit comments

Comments
 (0)