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

Skip to content

Commit d1888da

Browse files
committed
Fix descriptor pool not being recreated after swap chain recreation
1 parent 494583b commit d1888da

12 files changed

Lines changed: 133 additions & 70 deletions

05_Uniform_buffers/00_Descriptor_layout_and_buffer.md

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -270,21 +270,28 @@ void createUniformBuffers() {
270270

271271
We're going to write a separate function that updates the uniform buffer with a
272272
new transformation every frame, so there will be no `vkMapMemory` here. The
273-
uniform data will be used for all draw calls, so the buffer containing it should
274-
only be destroyed at the end:
273+
uniform data will be used for all draw calls, so the buffer containing it should only be destroyed when we stop rendering. Since it also depends on the number of swap chain images, which could change after a recreation, we'll clean it up in `cleanupSwapChain`:
275274

276275
```c++
277-
void cleanup() {
278-
cleanupSwapChain();
279-
280-
vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr);
276+
void cleanupSwapChain() {
277+
...
281278

282279
for (size_t i = 0; i < swapChainImages.size(); i++) {
283280
vkDestroyBuffer(device, uniformBuffers[i], nullptr);
284281
vkFreeMemory(device, uniformBuffersMemory[i], nullptr);
285282
}
283+
}
284+
```
285+
286+
This means that we also need to recreate it in `recreateSwapChain`:
286287

288+
```c++
289+
void recreateSwapChain() {
287290
...
291+
292+
createFramebuffers();
293+
createUniformBuffers();
294+
createCommandBuffers();
288295
}
289296
```
290297

05_Uniform_buffers/01_Descriptor_pool_and_sets.md

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,15 +72,30 @@ if (vkCreateDescriptorPool(device, &poolInfo, nullptr, &descriptorPool) != VK_SU
7272

7373
Add a new class member to store the handle of the descriptor pool and call
7474
`vkCreateDescriptorPool` to create it. The descriptor pool should be destroyed
75-
only at the end of the program, much like the other drawing related resources:
75+
when the swap chain is recreated because it depends on the number of images:
7676

7777
```c++
78-
void cleanup() {
79-
cleanupSwapChain();
78+
void cleanupSwapChain() {
79+
...
80+
81+
for (size_t i = 0; i < swapChainImages.size(); i++) {
82+
vkDestroyBuffer(device, uniformBuffers[i], nullptr);
83+
vkFreeMemory(device, uniformBuffersMemory[i], nullptr);
84+
}
8085

8186
vkDestroyDescriptorPool(device, descriptorPool, nullptr);
87+
}
88+
```
8289

90+
And recreated in `recreateSwapChain`:
91+
92+
```c++
93+
void recreateSwapChain() {
8394
...
95+
96+
createUniformBuffers();
97+
createDescriptorPool();
98+
createCommandBuffers();
8499
}
85100
```
86101

@@ -97,6 +112,13 @@ void initVulkan() {
97112
...
98113
}
99114

115+
void recreateSwapChain() {
116+
...
117+
createDescriptorPool();
118+
createDescriptorSets();
119+
...
120+
}
121+
100122
...
101123

102124
void createDescriptorSets() {

07_Depth_buffering.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,12 @@ function to recreate the depth resources in that case:
546546

547547
```c++
548548
void recreateSwapChain() {
549+
int width = 0, height = 0;
550+
while (width == 0 || height == 0) {
551+
glfwGetFramebufferSize(window, &width, &height);
552+
glfwWaitEvents();
553+
}
554+
549555
vkDeviceWaitIdle(device);
550556

551557
cleanupSwapChain();
@@ -556,6 +562,9 @@ void recreateSwapChain() {
556562
createGraphicsPipeline();
557563
createDepthResources();
558564
createFramebuffers();
565+
createUniformBuffers();
566+
createDescriptorPool();
567+
createDescriptorSets();
559568
createCommandBuffers();
560569
}
561570
```

code/21_descriptor_layout.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -227,18 +227,18 @@ class HelloTriangleApplication {
227227
}
228228

229229
vkDestroySwapchainKHR(device, swapChain, nullptr);
230+
231+
for (size_t i = 0; i < swapChainImages.size(); i++) {
232+
vkDestroyBuffer(device, uniformBuffers[i], nullptr);
233+
vkFreeMemory(device, uniformBuffersMemory[i], nullptr);
234+
}
230235
}
231236

232237
void cleanup() {
233238
cleanupSwapChain();
234239

235240
vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr);
236241

237-
for (size_t i = 0; i < swapChainImages.size(); i++) {
238-
vkDestroyBuffer(device, uniformBuffers[i], nullptr);
239-
vkFreeMemory(device, uniformBuffersMemory[i], nullptr);
240-
}
241-
242242
vkDestroyBuffer(device, indexBuffer, nullptr);
243243
vkFreeMemory(device, indexBufferMemory, nullptr);
244244

@@ -283,6 +283,7 @@ class HelloTriangleApplication {
283283
createRenderPass();
284284
createGraphicsPipeline();
285285
createFramebuffers();
286+
createUniformBuffers();
286287
createCommandBuffers();
287288
}
288289

code/22_descriptor_sets.cpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -232,20 +232,20 @@ class HelloTriangleApplication {
232232
}
233233

234234
vkDestroySwapchainKHR(device, swapChain, nullptr);
235+
236+
for (size_t i = 0; i < swapChainImages.size(); i++) {
237+
vkDestroyBuffer(device, uniformBuffers[i], nullptr);
238+
vkFreeMemory(device, uniformBuffersMemory[i], nullptr);
239+
}
240+
241+
vkDestroyDescriptorPool(device, descriptorPool, nullptr);
235242
}
236243

237244
void cleanup() {
238245
cleanupSwapChain();
239246

240-
vkDestroyDescriptorPool(device, descriptorPool, nullptr);
241-
242247
vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr);
243248

244-
for (size_t i = 0; i < swapChainImages.size(); i++) {
245-
vkDestroyBuffer(device, uniformBuffers[i], nullptr);
246-
vkFreeMemory(device, uniformBuffersMemory[i], nullptr);
247-
}
248-
249249
vkDestroyBuffer(device, indexBuffer, nullptr);
250250
vkFreeMemory(device, indexBufferMemory, nullptr);
251251

@@ -290,6 +290,9 @@ class HelloTriangleApplication {
290290
createRenderPass();
291291
createGraphicsPipeline();
292292
createFramebuffers();
293+
createUniformBuffers();
294+
createDescriptorPool();
295+
createDescriptorSets();
293296
createCommandBuffers();
294297
}
295298

code/23_texture_image.cpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,13 @@ class HelloTriangleApplication {
239239
}
240240

241241
vkDestroySwapchainKHR(device, swapChain, nullptr);
242+
243+
for (size_t i = 0; i < swapChainImages.size(); i++) {
244+
vkDestroyBuffer(device, uniformBuffers[i], nullptr);
245+
vkFreeMemory(device, uniformBuffersMemory[i], nullptr);
246+
}
247+
248+
vkDestroyDescriptorPool(device, descriptorPool, nullptr);
242249
}
243250

244251
void cleanup() {
@@ -247,15 +254,8 @@ class HelloTriangleApplication {
247254
vkDestroyImage(device, textureImage, nullptr);
248255
vkFreeMemory(device, textureImageMemory, nullptr);
249256

250-
vkDestroyDescriptorPool(device, descriptorPool, nullptr);
251-
252257
vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr);
253258

254-
for (size_t i = 0; i < swapChainImages.size(); i++) {
255-
vkDestroyBuffer(device, uniformBuffers[i], nullptr);
256-
vkFreeMemory(device, uniformBuffersMemory[i], nullptr);
257-
}
258-
259259
vkDestroyBuffer(device, indexBuffer, nullptr);
260260
vkFreeMemory(device, indexBufferMemory, nullptr);
261261

@@ -300,6 +300,9 @@ class HelloTriangleApplication {
300300
createRenderPass();
301301
createGraphicsPipeline();
302302
createFramebuffers();
303+
createUniformBuffers();
304+
createDescriptorPool();
305+
createDescriptorSets();
303306
createCommandBuffers();
304307
}
305308

code/24_sampler.cpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,13 @@ class HelloTriangleApplication {
243243
}
244244

245245
vkDestroySwapchainKHR(device, swapChain, nullptr);
246+
247+
for (size_t i = 0; i < swapChainImages.size(); i++) {
248+
vkDestroyBuffer(device, uniformBuffers[i], nullptr);
249+
vkFreeMemory(device, uniformBuffersMemory[i], nullptr);
250+
}
251+
252+
vkDestroyDescriptorPool(device, descriptorPool, nullptr);
246253
}
247254

248255
void cleanup() {
@@ -254,15 +261,8 @@ class HelloTriangleApplication {
254261
vkDestroyImage(device, textureImage, nullptr);
255262
vkFreeMemory(device, textureImageMemory, nullptr);
256263

257-
vkDestroyDescriptorPool(device, descriptorPool, nullptr);
258-
259264
vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr);
260265

261-
for (size_t i = 0; i < swapChainImages.size(); i++) {
262-
vkDestroyBuffer(device, uniformBuffers[i], nullptr);
263-
vkFreeMemory(device, uniformBuffersMemory[i], nullptr);
264-
}
265-
266266
vkDestroyBuffer(device, indexBuffer, nullptr);
267267
vkFreeMemory(device, indexBufferMemory, nullptr);
268268

@@ -307,6 +307,9 @@ class HelloTriangleApplication {
307307
createRenderPass();
308308
createGraphicsPipeline();
309309
createFramebuffers();
310+
createUniformBuffers();
311+
createDescriptorPool();
312+
createDescriptorSets();
310313
createCommandBuffers();
311314
}
312315

code/25_texture_mapping.cpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,13 @@ class HelloTriangleApplication {
249249
}
250250

251251
vkDestroySwapchainKHR(device, swapChain, nullptr);
252+
253+
for (size_t i = 0; i < swapChainImages.size(); i++) {
254+
vkDestroyBuffer(device, uniformBuffers[i], nullptr);
255+
vkFreeMemory(device, uniformBuffersMemory[i], nullptr);
256+
}
257+
258+
vkDestroyDescriptorPool(device, descriptorPool, nullptr);
252259
}
253260

254261
void cleanup() {
@@ -260,15 +267,8 @@ class HelloTriangleApplication {
260267
vkDestroyImage(device, textureImage, nullptr);
261268
vkFreeMemory(device, textureImageMemory, nullptr);
262269

263-
vkDestroyDescriptorPool(device, descriptorPool, nullptr);
264-
265270
vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr);
266271

267-
for (size_t i = 0; i < swapChainImages.size(); i++) {
268-
vkDestroyBuffer(device, uniformBuffers[i], nullptr);
269-
vkFreeMemory(device, uniformBuffersMemory[i], nullptr);
270-
}
271-
272272
vkDestroyBuffer(device, indexBuffer, nullptr);
273273
vkFreeMemory(device, indexBufferMemory, nullptr);
274274

@@ -313,6 +313,9 @@ class HelloTriangleApplication {
313313
createRenderPass();
314314
createGraphicsPipeline();
315315
createFramebuffers();
316+
createUniformBuffers();
317+
createDescriptorPool();
318+
createDescriptorSets();
316319
createCommandBuffers();
317320
}
318321

code/26_depth_buffering.cpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,13 @@ class HelloTriangleApplication {
265265
}
266266

267267
vkDestroySwapchainKHR(device, swapChain, nullptr);
268+
269+
for (size_t i = 0; i < swapChainImages.size(); i++) {
270+
vkDestroyBuffer(device, uniformBuffers[i], nullptr);
271+
vkFreeMemory(device, uniformBuffersMemory[i], nullptr);
272+
}
273+
274+
vkDestroyDescriptorPool(device, descriptorPool, nullptr);
268275
}
269276

270277
void cleanup() {
@@ -276,15 +283,8 @@ class HelloTriangleApplication {
276283
vkDestroyImage(device, textureImage, nullptr);
277284
vkFreeMemory(device, textureImageMemory, nullptr);
278285

279-
vkDestroyDescriptorPool(device, descriptorPool, nullptr);
280-
281286
vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr);
282287

283-
for (size_t i = 0; i < swapChainImages.size(); i++) {
284-
vkDestroyBuffer(device, uniformBuffers[i], nullptr);
285-
vkFreeMemory(device, uniformBuffersMemory[i], nullptr);
286-
}
287-
288288
vkDestroyBuffer(device, indexBuffer, nullptr);
289289
vkFreeMemory(device, indexBufferMemory, nullptr);
290290

@@ -330,6 +330,9 @@ class HelloTriangleApplication {
330330
createGraphicsPipeline();
331331
createDepthResources();
332332
createFramebuffers();
333+
createUniformBuffers();
334+
createDescriptorPool();
335+
createDescriptorSets();
333336
createCommandBuffers();
334337
}
335338

code/27_model_loading.cpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,13 @@ class HelloTriangleApplication {
272272
}
273273

274274
vkDestroySwapchainKHR(device, swapChain, nullptr);
275+
276+
for (size_t i = 0; i < swapChainImages.size(); i++) {
277+
vkDestroyBuffer(device, uniformBuffers[i], nullptr);
278+
vkFreeMemory(device, uniformBuffersMemory[i], nullptr);
279+
}
280+
281+
vkDestroyDescriptorPool(device, descriptorPool, nullptr);
275282
}
276283

277284
void cleanup() {
@@ -283,15 +290,8 @@ class HelloTriangleApplication {
283290
vkDestroyImage(device, textureImage, nullptr);
284291
vkFreeMemory(device, textureImageMemory, nullptr);
285292

286-
vkDestroyDescriptorPool(device, descriptorPool, nullptr);
287-
288293
vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr);
289294

290-
for (size_t i = 0; i < swapChainImages.size(); i++) {
291-
vkDestroyBuffer(device, uniformBuffers[i], nullptr);
292-
vkFreeMemory(device, uniformBuffersMemory[i], nullptr);
293-
}
294-
295295
vkDestroyBuffer(device, indexBuffer, nullptr);
296296
vkFreeMemory(device, indexBufferMemory, nullptr);
297297

@@ -337,6 +337,9 @@ class HelloTriangleApplication {
337337
createGraphicsPipeline();
338338
createDepthResources();
339339
createFramebuffers();
340+
createUniformBuffers();
341+
createDescriptorPool();
342+
createDescriptorSets();
340343
createCommandBuffers();
341344
}
342345

0 commit comments

Comments
 (0)