Получение данных для создание списка показа
This commit is contained in:
parent
873a4762ef
commit
f7ff84fab0
|
@ -11,6 +11,11 @@ typedef struct _Surface
|
||||||
VkSurfaceCapabilitiesKHR capabilities; // общая информация
|
VkSurfaceCapabilitiesKHR capabilities; // общая информация
|
||||||
std::vector<VkSurfaceFormatKHR> formats; // формат поверхности
|
std::vector<VkSurfaceFormatKHR> formats; // формат поверхности
|
||||||
std::vector<VkPresentModeKHR> presentModes; // режим показа
|
std::vector<VkPresentModeKHR> presentModes; // режим показа
|
||||||
|
// Данные о списке показа
|
||||||
|
VkSurfaceFormatKHR selectedFormat; // выбранный формат поверхности
|
||||||
|
VkPresentModeKHR selectedPresentMode; // выбранный режим показа
|
||||||
|
VkExtent2D selectedExtent; // выбранное разрешение
|
||||||
|
uint32_t imageCount; // количество изображений
|
||||||
} Surface;
|
} Surface;
|
||||||
|
|
||||||
#endif // SURFACE_H
|
#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 selectPhysicalDevice(std::vector<const char*> &deviceExtensions); // Выбор физического устройства
|
||||||
void createLogicalDevice(std::vector<const char*> &deviceExtensions); // Создание логического устройства
|
void createLogicalDevice(std::vector<const char*> &deviceExtensions); // Создание логического устройства
|
||||||
void createWindowSurface(GLFWwindow* window); // Создание поверхности окна
|
void createWindowSurface(GLFWwindow* window); // Создание поверхности окна
|
||||||
|
void createSwapchain(GLFWwindow* window); // Создание цепочки показа
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // VK_H
|
#endif // VK_H
|
55
src/vk.cpp
55
src/vk.cpp
|
@ -4,6 +4,8 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
|
||||||
|
#include "macroses.h"
|
||||||
|
|
||||||
// инициализация
|
// инициализация
|
||||||
void Vulkan::init(GLFWwindow* window)
|
void Vulkan::init(GLFWwindow* window)
|
||||||
{
|
{
|
||||||
|
@ -13,6 +15,7 @@ void Vulkan::init(GLFWwindow* window)
|
||||||
std::vector<const char*> deviceExtensions({"VK_KHR_swapchain"});
|
std::vector<const char*> deviceExtensions({"VK_KHR_swapchain"});
|
||||||
selectPhysicalDevice(deviceExtensions); // Выбор физического устройства
|
selectPhysicalDevice(deviceExtensions); // Выбор физического устройства
|
||||||
createLogicalDevice(deviceExtensions); // Создание физического устройства
|
createLogicalDevice(deviceExtensions); // Создание физического устройства
|
||||||
|
createSwapchain(window); // Создание списка показа
|
||||||
}
|
}
|
||||||
|
|
||||||
// завершение работы
|
// завершение работы
|
||||||
|
@ -322,3 +325,55 @@ void Vulkan::createWindowSurface(GLFWwindow* window)
|
||||||
throw std::runtime_error("Unable to create window surface");
|
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