Получение данных для создание списка показа

This commit is contained in:
parent 873a4762ef
commit f7ff84fab0
4 changed files with 62 additions and 0 deletions

View File

@ -11,6 +11,11 @@ typedef struct _Surface
VkSurfaceCapabilitiesKHR capabilities; // общая информация
std::vector<VkSurfaceFormatKHR> formats; // формат поверхности
std::vector<VkPresentModeKHR> presentModes; // режим показа
// Данные о списке показа
VkSurfaceFormatKHR selectedFormat; // выбранный формат поверхности
VkPresentModeKHR selectedPresentMode; // выбранный режим показа
VkExtent2D selectedExtent; // выбранное разрешение
uint32_t imageCount; // количество изображений
} Surface;
#endif // SURFACE_H

1
include/macroses.h Normal file
View File

@ -0,0 +1 @@
#define CLAMP(min, value, max) (value > min) ? min : (max < value) ? max : value;

View File

@ -30,6 +30,7 @@ class Vulkan
void selectPhysicalDevice(std::vector<const char*> &deviceExtensions); // Выбор физического устройства
void createLogicalDevice(std::vector<const char*> &deviceExtensions); // Создание логического устройства
void createWindowSurface(GLFWwindow* window); // Создание поверхности окна
void createSwapchain(GLFWwindow* window); // Создание цепочки показа
};
#endif // VK_H

View File

@ -4,6 +4,8 @@
#include <vector>
#include <stdexcept>
#include "macroses.h"
// инициализация
void Vulkan::init(GLFWwindow* window)
{
@ -13,6 +15,7 @@ void Vulkan::init(GLFWwindow* window)
std::vector<const char*> 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;
//
}