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

Skip to content

Commit 8bd0a5e

Browse files
committed
Fix chooseSwapExtent for HDPI/retina displays
When using an HDPI display, using the window size `{WIDTH, HEIGHT}` to determine swapchain image size is incorrect. See the following links: * https://www.glfw.org/docs/latest/window.html#window_size * https://www.glfw.org/docs/latest/window.html#window_fbsize * https://www.glfw.org/faq.html#43---why-is-my-output-in-the-lower-left-corner-of-the-window Instead, the framebuffer size is now used to determine the swapchain extent. Using the implementation of `chooseSwapExtent` from `16_swap_chain_recreation.cpp` seemed appropriate. Beyond "Swap chain recreation" no changes are necessary.
1 parent 69bc7a2 commit 8bd0a5e

10 files changed

Lines changed: 70 additions & 10 deletions

code/06_swap_chain_creation.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,13 @@ class HelloTriangleApplication {
334334
if (capabilities.currentExtent.width != UINT32_MAX) {
335335
return capabilities.currentExtent;
336336
} else {
337-
VkExtent2D actualExtent = {WIDTH, HEIGHT};
337+
int width, height;
338+
glfwGetFramebufferSize(window, &width, &height);
339+
340+
VkExtent2D actualExtent = {
341+
static_cast<uint32_t>(width),
342+
static_cast<uint32_t>(height)
343+
};
338344

339345
actualExtent.width = std::max(capabilities.minImageExtent.width, std::min(capabilities.maxImageExtent.width, actualExtent.width));
340346
actualExtent.height = std::max(capabilities.minImageExtent.height, std::min(capabilities.maxImageExtent.height, actualExtent.height));

code/07_image_views.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,13 @@ class HelloTriangleApplication {
365365
if (capabilities.currentExtent.width != UINT32_MAX) {
366366
return capabilities.currentExtent;
367367
} else {
368-
VkExtent2D actualExtent = {WIDTH, HEIGHT};
368+
int width, height;
369+
glfwGetFramebufferSize(window, &width, &height);
370+
371+
VkExtent2D actualExtent = {
372+
static_cast<uint32_t>(width),
373+
static_cast<uint32_t>(height)
374+
};
369375

370376
actualExtent.width = std::max(capabilities.minImageExtent.width, std::min(capabilities.maxImageExtent.width, actualExtent.width));
371377
actualExtent.height = std::max(capabilities.minImageExtent.height, std::min(capabilities.maxImageExtent.height, actualExtent.height));

code/08_graphics_pipeline.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,13 @@ class HelloTriangleApplication {
370370
if (capabilities.currentExtent.width != UINT32_MAX) {
371371
return capabilities.currentExtent;
372372
} else {
373-
VkExtent2D actualExtent = {WIDTH, HEIGHT};
373+
int width, height;
374+
glfwGetFramebufferSize(window, &width, &height);
375+
376+
VkExtent2D actualExtent = {
377+
static_cast<uint32_t>(width),
378+
static_cast<uint32_t>(height)
379+
};
374380

375381
actualExtent.width = std::max(capabilities.minImageExtent.width, std::min(capabilities.maxImageExtent.width, actualExtent.width));
376382
actualExtent.height = std::max(capabilities.minImageExtent.height, std::min(capabilities.maxImageExtent.height, actualExtent.height));

code/09_shader_modules.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,13 @@ class HelloTriangleApplication {
406406
if (capabilities.currentExtent.width != UINT32_MAX) {
407407
return capabilities.currentExtent;
408408
} else {
409-
VkExtent2D actualExtent = {WIDTH, HEIGHT};
409+
int width, height;
410+
glfwGetFramebufferSize(window, &width, &height);
411+
412+
VkExtent2D actualExtent = {
413+
static_cast<uint32_t>(width),
414+
static_cast<uint32_t>(height)
415+
};
410416

411417
actualExtent.width = std::max(capabilities.minImageExtent.width, std::min(capabilities.maxImageExtent.width, actualExtent.width));
412418
actualExtent.height = std::max(capabilities.minImageExtent.height, std::min(capabilities.maxImageExtent.height, actualExtent.height));

code/10_fixed_functions.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -478,7 +478,13 @@ class HelloTriangleApplication {
478478
if (capabilities.currentExtent.width != UINT32_MAX) {
479479
return capabilities.currentExtent;
480480
} else {
481-
VkExtent2D actualExtent = {WIDTH, HEIGHT};
481+
int width, height;
482+
glfwGetFramebufferSize(window, &width, &height);
483+
484+
VkExtent2D actualExtent = {
485+
static_cast<uint32_t>(width),
486+
static_cast<uint32_t>(height)
487+
};
482488

483489
actualExtent.width = std::max(capabilities.minImageExtent.width, std::min(capabilities.maxImageExtent.width, actualExtent.width));
484490
actualExtent.height = std::max(capabilities.minImageExtent.height, std::min(capabilities.maxImageExtent.height, actualExtent.height));

code/11_render_passes.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,13 @@ class HelloTriangleApplication {
513513
if (capabilities.currentExtent.width != UINT32_MAX) {
514514
return capabilities.currentExtent;
515515
} else {
516-
VkExtent2D actualExtent = {WIDTH, HEIGHT};
516+
int width, height;
517+
glfwGetFramebufferSize(window, &width, &height);
518+
519+
VkExtent2D actualExtent = {
520+
static_cast<uint32_t>(width),
521+
static_cast<uint32_t>(height)
522+
};
517523

518524
actualExtent.width = std::max(capabilities.minImageExtent.width, std::min(capabilities.maxImageExtent.width, actualExtent.width));
519525
actualExtent.height = std::max(capabilities.minImageExtent.height, std::min(capabilities.maxImageExtent.height, actualExtent.height));

code/12_graphics_pipeline_complete.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -534,7 +534,13 @@ class HelloTriangleApplication {
534534
if (capabilities.currentExtent.width != UINT32_MAX) {
535535
return capabilities.currentExtent;
536536
} else {
537-
VkExtent2D actualExtent = {WIDTH, HEIGHT};
537+
int width, height;
538+
glfwGetFramebufferSize(window, &width, &height);
539+
540+
VkExtent2D actualExtent = {
541+
static_cast<uint32_t>(width),
542+
static_cast<uint32_t>(height)
543+
};
538544

539545
actualExtent.width = std::max(capabilities.minImageExtent.width, std::min(capabilities.maxImageExtent.width, actualExtent.width));
540546
actualExtent.height = std::max(capabilities.minImageExtent.height, std::min(capabilities.maxImageExtent.height, actualExtent.height));

code/13_framebuffers.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -563,7 +563,13 @@ class HelloTriangleApplication {
563563
if (capabilities.currentExtent.width != UINT32_MAX) {
564564
return capabilities.currentExtent;
565565
} else {
566-
VkExtent2D actualExtent = {WIDTH, HEIGHT};
566+
int width, height;
567+
glfwGetFramebufferSize(window, &width, &height);
568+
569+
VkExtent2D actualExtent = {
570+
static_cast<uint32_t>(width),
571+
static_cast<uint32_t>(height)
572+
};
567573

568574
actualExtent.width = std::max(capabilities.minImageExtent.width, std::min(capabilities.maxImageExtent.width, actualExtent.width));
569575
actualExtent.height = std::max(capabilities.minImageExtent.height, std::min(capabilities.maxImageExtent.height, actualExtent.height));

code/14_command_buffers.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -628,7 +628,13 @@ class HelloTriangleApplication {
628628
if (capabilities.currentExtent.width != UINT32_MAX) {
629629
return capabilities.currentExtent;
630630
} else {
631-
VkExtent2D actualExtent = {WIDTH, HEIGHT};
631+
int width, height;
632+
glfwGetFramebufferSize(window, &width, &height);
633+
634+
VkExtent2D actualExtent = {
635+
static_cast<uint32_t>(width),
636+
static_cast<uint32_t>(height)
637+
};
632638

633639
actualExtent.width = std::max(capabilities.minImageExtent.width, std::min(capabilities.maxImageExtent.width, actualExtent.width));
634640
actualExtent.height = std::max(capabilities.minImageExtent.height, std::min(capabilities.maxImageExtent.height, actualExtent.height));

code/15_hello_triangle.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -728,7 +728,13 @@ class HelloTriangleApplication {
728728
if (capabilities.currentExtent.width != UINT32_MAX) {
729729
return capabilities.currentExtent;
730730
} else {
731-
VkExtent2D actualExtent = {WIDTH, HEIGHT};
731+
int width, height;
732+
glfwGetFramebufferSize(window, &width, &height);
733+
734+
VkExtent2D actualExtent = {
735+
static_cast<uint32_t>(width),
736+
static_cast<uint32_t>(height)
737+
};
732738

733739
actualExtent.width = std::max(capabilities.minImageExtent.width, std::min(capabilities.maxImageExtent.width, actualExtent.width));
734740
actualExtent.height = std::max(capabilities.minImageExtent.height, std::min(capabilities.maxImageExtent.height, actualExtent.height));

0 commit comments

Comments
 (0)