From f7ff84fab0930ea66eb483b92f33438f5d5e8df2 Mon Sep 17 00:00:00 2001 From: "re.kovalev" Date: Thu, 17 Feb 2022 09:59:57 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B0=20=D0=BF=D0=BE=D0=BA?= =?UTF-8?q?=D0=B0=D0=B7=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/Surface.h | 5 +++++ include/macroses.h | 1 + include/vk.h | 1 + src/vk.cpp | 55 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 62 insertions(+) create mode 100644 include/macroses.h diff --git a/include/Surface.h b/include/Surface.h index d1cdd25..1946e48 100644 --- a/include/Surface.h +++ b/include/Surface.h @@ -11,6 +11,11 @@ typedef struct _Surface VkSurfaceCapabilitiesKHR capabilities; // общая информация std::vector formats; // формат поверхности std::vector presentModes; // режим показа + // Данные о списке показа + VkSurfaceFormatKHR selectedFormat; // выбранный формат поверхности + VkPresentModeKHR selectedPresentMode; // выбранный режим показа + VkExtent2D selectedExtent; // выбранное разрешение + uint32_t imageCount; // количество изображений } Surface; #endif // SURFACE_H \ No newline at end of file diff --git a/include/macroses.h b/include/macroses.h new file mode 100644 index 0000000..70bd360 --- /dev/null +++ b/include/macroses.h @@ -0,0 +1 @@ +#define CLAMP(min, value, max) (value > min) ? min : (max < value) ? max : value; \ No newline at end of file diff --git a/include/vk.h b/include/vk.h index 2d81d85..310f042 100644 --- a/include/vk.h +++ b/include/vk.h @@ -30,6 +30,7 @@ class Vulkan void selectPhysicalDevice(std::vector &deviceExtensions); // Выбор физического устройства void createLogicalDevice(std::vector &deviceExtensions); // Создание логического устройства void createWindowSurface(GLFWwindow* window); // Создание поверхности окна + void createSwapchain(GLFWwindow* window); // Создание цепочки показа }; #endif // VK_H \ No newline at end of file diff --git a/src/vk.cpp b/src/vk.cpp index 8c42de9..85b1d51 100644 --- a/src/vk.cpp +++ b/src/vk.cpp @@ -4,6 +4,8 @@ #include #include +#include "macroses.h" + // инициализация void Vulkan::init(GLFWwindow* window) { @@ -13,6 +15,7 @@ void Vulkan::init(GLFWwindow* window) std::vector deviceExtensions({"VK_KHR_swapchain"}); selectPhysicalDevice(deviceExtensions); // Выбор физического устройства createLogicalDevice(deviceExtensions); // Создание физического устройства + createSwapchain(window); // Создание списка показа } // завершение работы @@ -322,3 +325,55 @@ void Vulkan::createWindowSurface(GLFWwindow* window) throw std::runtime_error("Unable to create window surface"); } } + +// Создание цепочки показа +void Vulkan::createSwapchain(GLFWwindow* window) +{ + // Выбор формата + surface.selectedFormat = surface.formats[0]; + for (auto& format : surface.formats) + { + if (format.format == VK_FORMAT_B8G8R8A8_SRGB + && format.colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR) + { + surface.selectedFormat = format; + break; + } + } + + // Выбор режима показа + surface.selectedPresentMode = VK_PRESENT_MODE_FIFO_KHR; + for (auto& presentMode : surface.presentModes) + { + if (presentMode == VK_PRESENT_MODE_MAILBOX_KHR) + { + surface.selectedPresentMode = presentMode; + break; + } + } + + // Выбор разрешения изображений + // Разрешение окна + int width, height; + glfwGetFramebufferSize(window, &width, &height); + // Выберем разрешение исходя из ограничений физического устройства + surface.selectedExtent.width = CLAMP( surface.capabilities.minImageExtent.width + , width + , surface.capabilities.maxImageExtent.width + ); + surface.selectedExtent.width = CLAMP( surface.capabilities.minImageExtent.height + , height + , surface.capabilities.maxImageExtent.height + ); + + // Выбор количества изображений в списке показа + surface.imageCount = surface.capabilities.minImageCount + 1; + // Если есть ограничение по максимуму изображений - применим его + if (surface.capabilities.maxImageCount) + surface.imageCount %= surface.capabilities.maxImageCount; + + + + + // +}