Получение данных для создание списка показа
This commit is contained in:
parent
873a4762ef
commit
f7ff84fab0
|
@ -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
|
|
@ -0,0 +1 @@
|
|||
#define CLAMP(min, value, max) (value > min) ? min : (max < value) ? max : value;
|
|
@ -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
|
55
src/vk.cpp
55
src/vk.cpp
|
@ -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;
|
||||
|
||||
|
||||
|
||||
|
||||
//
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue