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

Skip to content

Commit 291347e

Browse files
committed
Fix frames in flight synchronization edge case
1 parent 96f8176 commit 291347e

16 files changed

Lines changed: 148 additions & 1 deletion

code/15_hello_triangle.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ class HelloTriangleApplication {
101101
std::vector<VkSemaphore> imageAvailableSemaphores;
102102
std::vector<VkSemaphore> renderFinishedSemaphores;
103103
std::vector<VkFence> inFlightFences;
104+
std::vector<VkFence> imagesInFlight;
104105
size_t currentFrame = 0;
105106

106107
void initWindow() {
@@ -621,6 +622,7 @@ class HelloTriangleApplication {
621622
imageAvailableSemaphores.resize(MAX_FRAMES_IN_FLIGHT);
622623
renderFinishedSemaphores.resize(MAX_FRAMES_IN_FLIGHT);
623624
inFlightFences.resize(MAX_FRAMES_IN_FLIGHT);
625+
imagesInFlight.resize(swapChainImages.size(), VK_NULL_HANDLE);
624626

625627
VkSemaphoreCreateInfo semaphoreInfo = {};
626628
semaphoreInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
@@ -645,6 +647,11 @@ class HelloTriangleApplication {
645647
uint32_t imageIndex;
646648
vkAcquireNextImageKHR(device, swapChain, UINT64_MAX, imageAvailableSemaphores[currentFrame], VK_NULL_HANDLE, &imageIndex);
647649

650+
if (imagesInFlight[imageIndex] != VK_NULL_HANDLE) {
651+
vkWaitForFences(device, 1, &imagesInFlight[imageIndex], VK_TRUE, UINT64_MAX);
652+
}
653+
imagesInFlight[imageIndex] = inFlightFences[currentFrame];
654+
648655
VkSubmitInfo submitInfo = {};
649656
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
650657

code/16_swap_chain_recreation.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ class HelloTriangleApplication {
101101
std::vector<VkSemaphore> imageAvailableSemaphores;
102102
std::vector<VkSemaphore> renderFinishedSemaphores;
103103
std::vector<VkFence> inFlightFences;
104+
std::vector<VkFence> imagesInFlight;
104105
size_t currentFrame = 0;
105106

106107
bool framebufferResized = false;
@@ -653,6 +654,7 @@ class HelloTriangleApplication {
653654
imageAvailableSemaphores.resize(MAX_FRAMES_IN_FLIGHT);
654655
renderFinishedSemaphores.resize(MAX_FRAMES_IN_FLIGHT);
655656
inFlightFences.resize(MAX_FRAMES_IN_FLIGHT);
657+
imagesInFlight.resize(swapChainImages.size(), VK_NULL_HANDLE);
656658

657659
VkSemaphoreCreateInfo semaphoreInfo = {};
658660
semaphoreInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
@@ -683,6 +685,11 @@ class HelloTriangleApplication {
683685
throw std::runtime_error("failed to acquire swap chain image!");
684686
}
685687

688+
if (imagesInFlight[imageIndex] != VK_NULL_HANDLE) {
689+
vkWaitForFences(device, 1, &imagesInFlight[imageIndex], VK_TRUE, UINT64_MAX);
690+
}
691+
imagesInFlight[imageIndex] = inFlightFences[currentFrame];
692+
686693
VkSubmitInfo submitInfo = {};
687694
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
688695

code/17_vertex_input.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ class HelloTriangleApplication {
140140
std::vector<VkSemaphore> imageAvailableSemaphores;
141141
std::vector<VkSemaphore> renderFinishedSemaphores;
142142
std::vector<VkFence> inFlightFences;
143+
std::vector<VkFence> imagesInFlight;
143144
size_t currentFrame = 0;
144145

145146
bool framebufferResized = false;
@@ -698,6 +699,7 @@ class HelloTriangleApplication {
698699
imageAvailableSemaphores.resize(MAX_FRAMES_IN_FLIGHT);
699700
renderFinishedSemaphores.resize(MAX_FRAMES_IN_FLIGHT);
700701
inFlightFences.resize(MAX_FRAMES_IN_FLIGHT);
702+
imagesInFlight.resize(swapChainImages.size(), VK_NULL_HANDLE);
701703

702704
VkSemaphoreCreateInfo semaphoreInfo = {};
703705
semaphoreInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
@@ -728,6 +730,11 @@ class HelloTriangleApplication {
728730
throw std::runtime_error("failed to acquire swap chain image!");
729731
}
730732

733+
if (imagesInFlight[imageIndex] != VK_NULL_HANDLE) {
734+
vkWaitForFences(device, 1, &imagesInFlight[imageIndex], VK_TRUE, UINT64_MAX);
735+
}
736+
imagesInFlight[imageIndex] = inFlightFences[currentFrame];
737+
731738
VkSubmitInfo submitInfo = {};
732739
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
733740

code/18_vertex_buffer.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ class HelloTriangleApplication {
144144
std::vector<VkSemaphore> imageAvailableSemaphores;
145145
std::vector<VkSemaphore> renderFinishedSemaphores;
146146
std::vector<VkFence> inFlightFences;
147+
std::vector<VkFence> imagesInFlight;
147148
size_t currentFrame = 0;
148149

149150
bool framebufferResized = false;
@@ -754,6 +755,7 @@ class HelloTriangleApplication {
754755
imageAvailableSemaphores.resize(MAX_FRAMES_IN_FLIGHT);
755756
renderFinishedSemaphores.resize(MAX_FRAMES_IN_FLIGHT);
756757
inFlightFences.resize(MAX_FRAMES_IN_FLIGHT);
758+
imagesInFlight.resize(swapChainImages.size(), VK_NULL_HANDLE);
757759

758760
VkSemaphoreCreateInfo semaphoreInfo = {};
759761
semaphoreInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
@@ -784,6 +786,11 @@ class HelloTriangleApplication {
784786
throw std::runtime_error("failed to acquire swap chain image!");
785787
}
786788

789+
if (imagesInFlight[imageIndex] != VK_NULL_HANDLE) {
790+
vkWaitForFences(device, 1, &imagesInFlight[imageIndex], VK_TRUE, UINT64_MAX);
791+
}
792+
imagesInFlight[imageIndex] = inFlightFences[currentFrame];
793+
787794
VkSubmitInfo submitInfo = {};
788795
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
789796

code/19_staging_buffer.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ class HelloTriangleApplication {
144144
std::vector<VkSemaphore> imageAvailableSemaphores;
145145
std::vector<VkSemaphore> renderFinishedSemaphores;
146146
std::vector<VkFence> inFlightFences;
147+
std::vector<VkFence> imagesInFlight;
147148
size_t currentFrame = 0;
148149

149150
bool framebufferResized = false;
@@ -802,6 +803,7 @@ class HelloTriangleApplication {
802803
imageAvailableSemaphores.resize(MAX_FRAMES_IN_FLIGHT);
803804
renderFinishedSemaphores.resize(MAX_FRAMES_IN_FLIGHT);
804805
inFlightFences.resize(MAX_FRAMES_IN_FLIGHT);
806+
imagesInFlight.resize(swapChainImages.size(), VK_NULL_HANDLE);
805807

806808
VkSemaphoreCreateInfo semaphoreInfo = {};
807809
semaphoreInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
@@ -832,6 +834,11 @@ class HelloTriangleApplication {
832834
throw std::runtime_error("failed to acquire swap chain image!");
833835
}
834836

837+
if (imagesInFlight[imageIndex] != VK_NULL_HANDLE) {
838+
vkWaitForFences(device, 1, &imagesInFlight[imageIndex], VK_TRUE, UINT64_MAX);
839+
}
840+
imagesInFlight[imageIndex] = inFlightFences[currentFrame];
841+
835842
VkSubmitInfo submitInfo = {};
836843
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
837844

code/20_index_buffer.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ class HelloTriangleApplication {
151151
std::vector<VkSemaphore> imageAvailableSemaphores;
152152
std::vector<VkSemaphore> renderFinishedSemaphores;
153153
std::vector<VkFence> inFlightFences;
154+
std::vector<VkFence> imagesInFlight;
154155
size_t currentFrame = 0;
155156

156157
bool framebufferResized = false;
@@ -835,6 +836,7 @@ class HelloTriangleApplication {
835836
imageAvailableSemaphores.resize(MAX_FRAMES_IN_FLIGHT);
836837
renderFinishedSemaphores.resize(MAX_FRAMES_IN_FLIGHT);
837838
inFlightFences.resize(MAX_FRAMES_IN_FLIGHT);
839+
imagesInFlight.resize(swapChainImages.size(), VK_NULL_HANDLE);
838840

839841
VkSemaphoreCreateInfo semaphoreInfo = {};
840842
semaphoreInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
@@ -865,6 +867,11 @@ class HelloTriangleApplication {
865867
throw std::runtime_error("failed to acquire swap chain image!");
866868
}
867869

870+
if (imagesInFlight[imageIndex] != VK_NULL_HANDLE) {
871+
vkWaitForFences(device, 1, &imagesInFlight[imageIndex], VK_TRUE, UINT64_MAX);
872+
}
873+
imagesInFlight[imageIndex] = inFlightFences[currentFrame];
874+
868875
VkSubmitInfo submitInfo = {};
869876
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
870877

code/21_descriptor_layout.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ class HelloTriangleApplication {
164164
std::vector<VkSemaphore> imageAvailableSemaphores;
165165
std::vector<VkSemaphore> renderFinishedSemaphores;
166166
std::vector<VkFence> inFlightFences;
167+
std::vector<VkFence> imagesInFlight;
167168
size_t currentFrame = 0;
168169

169170
bool framebufferResized = false;
@@ -887,6 +888,7 @@ class HelloTriangleApplication {
887888
imageAvailableSemaphores.resize(MAX_FRAMES_IN_FLIGHT);
888889
renderFinishedSemaphores.resize(MAX_FRAMES_IN_FLIGHT);
889890
inFlightFences.resize(MAX_FRAMES_IN_FLIGHT);
891+
imagesInFlight.resize(swapChainImages.size(), VK_NULL_HANDLE);
890892

891893
VkSemaphoreCreateInfo semaphoreInfo = {};
892894
semaphoreInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
@@ -937,6 +939,11 @@ class HelloTriangleApplication {
937939

938940
updateUniformBuffer(imageIndex);
939941

942+
if (imagesInFlight[imageIndex] != VK_NULL_HANDLE) {
943+
vkWaitForFences(device, 1, &imagesInFlight[imageIndex], VK_TRUE, UINT64_MAX);
944+
}
945+
imagesInFlight[imageIndex] = inFlightFences[currentFrame];
946+
940947
VkSubmitInfo submitInfo = {};
941948
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
942949

code/22_descriptor_sets.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ class HelloTriangleApplication {
167167
std::vector<VkSemaphore> imageAvailableSemaphores;
168168
std::vector<VkSemaphore> renderFinishedSemaphores;
169169
std::vector<VkFence> inFlightFences;
170+
std::vector<VkFence> imagesInFlight;
170171
size_t currentFrame = 0;
171172

172173
bool framebufferResized = false;
@@ -946,6 +947,7 @@ class HelloTriangleApplication {
946947
imageAvailableSemaphores.resize(MAX_FRAMES_IN_FLIGHT);
947948
renderFinishedSemaphores.resize(MAX_FRAMES_IN_FLIGHT);
948949
inFlightFences.resize(MAX_FRAMES_IN_FLIGHT);
950+
imagesInFlight.resize(swapChainImages.size(), VK_NULL_HANDLE);
949951

950952
VkSemaphoreCreateInfo semaphoreInfo = {};
951953
semaphoreInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
@@ -996,6 +998,11 @@ class HelloTriangleApplication {
996998

997999
updateUniformBuffer(imageIndex);
9981000

1001+
if (imagesInFlight[imageIndex] != VK_NULL_HANDLE) {
1002+
vkWaitForFences(device, 1, &imagesInFlight[imageIndex], VK_TRUE, UINT64_MAX);
1003+
}
1004+
imagesInFlight[imageIndex] = inFlightFences[currentFrame];
1005+
9991006
VkSubmitInfo submitInfo = {};
10001007
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
10011008

code/23_texture_image.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ class HelloTriangleApplication {
173173
std::vector<VkSemaphore> imageAvailableSemaphores;
174174
std::vector<VkSemaphore> renderFinishedSemaphores;
175175
std::vector<VkFence> inFlightFences;
176+
std::vector<VkFence> imagesInFlight;
176177
size_t currentFrame = 0;
177178

178179
bool framebufferResized = false;
@@ -1101,6 +1102,7 @@ class HelloTriangleApplication {
11011102
imageAvailableSemaphores.resize(MAX_FRAMES_IN_FLIGHT);
11021103
renderFinishedSemaphores.resize(MAX_FRAMES_IN_FLIGHT);
11031104
inFlightFences.resize(MAX_FRAMES_IN_FLIGHT);
1105+
imagesInFlight.resize(swapChainImages.size(), VK_NULL_HANDLE);
11041106

11051107
VkSemaphoreCreateInfo semaphoreInfo = {};
11061108
semaphoreInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
@@ -1151,6 +1153,11 @@ class HelloTriangleApplication {
11511153

11521154
updateUniformBuffer(imageIndex);
11531155

1156+
if (imagesInFlight[imageIndex] != VK_NULL_HANDLE) {
1157+
vkWaitForFences(device, 1, &imagesInFlight[imageIndex], VK_TRUE, UINT64_MAX);
1158+
}
1159+
imagesInFlight[imageIndex] = inFlightFences[currentFrame];
1160+
11541161
VkSubmitInfo submitInfo = {};
11551162
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11561163

code/24_sampler.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ class HelloTriangleApplication {
175175
std::vector<VkSemaphore> imageAvailableSemaphores;
176176
std::vector<VkSemaphore> renderFinishedSemaphores;
177177
std::vector<VkFence> inFlightFences;
178+
std::vector<VkFence> imagesInFlight;
178179
size_t currentFrame = 0;
179180

180181
bool framebufferResized = false;
@@ -1137,6 +1138,7 @@ class HelloTriangleApplication {
11371138
imageAvailableSemaphores.resize(MAX_FRAMES_IN_FLIGHT);
11381139
renderFinishedSemaphores.resize(MAX_FRAMES_IN_FLIGHT);
11391140
inFlightFences.resize(MAX_FRAMES_IN_FLIGHT);
1141+
imagesInFlight.resize(swapChainImages.size(), VK_NULL_HANDLE);
11401142

11411143
VkSemaphoreCreateInfo semaphoreInfo = {};
11421144
semaphoreInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
@@ -1187,6 +1189,11 @@ class HelloTriangleApplication {
11871189

11881190
updateUniformBuffer(imageIndex);
11891191

1192+
if (imagesInFlight[imageIndex] != VK_NULL_HANDLE) {
1193+
vkWaitForFences(device, 1, &imagesInFlight[imageIndex], VK_TRUE, UINT64_MAX);
1194+
}
1195+
imagesInFlight[imageIndex] = inFlightFences[currentFrame];
1196+
11901197
VkSubmitInfo submitInfo = {};
11911198
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
11921199

0 commit comments

Comments
 (0)