2022-04-06 15:33:19 +00:00
|
|
|
|
#ifndef VK_H
|
|
|
|
|
#define VK_H
|
|
|
|
|
|
|
|
|
|
#include <vulkan/vulkan.h>
|
|
|
|
|
#include <GLFW/glfw3.h>
|
|
|
|
|
|
|
|
|
|
#include "PhysicalDevice.h"
|
|
|
|
|
#include "Surface.h"
|
|
|
|
|
#include "Queue.h"
|
|
|
|
|
|
2022-04-07 06:01:43 +00:00
|
|
|
|
#include <map>
|
2022-04-07 10:17:05 +00:00
|
|
|
|
#include <list>
|
|
|
|
|
|
|
|
|
|
#include "Model.h"
|
2022-04-07 06:01:43 +00:00
|
|
|
|
|
2022-04-06 15:33:19 +00:00
|
|
|
|
class Vulkan
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
void init(GLFWwindow* window); // инициализация
|
|
|
|
|
void destroy(); // завершение работы
|
|
|
|
|
void renderFrame(); // рендер кадра
|
2022-04-07 09:31:44 +00:00
|
|
|
|
void renderBegin(); // Начало рендера кадра
|
|
|
|
|
void renderEnd(); // Окончание рендера кадра
|
2022-04-07 06:24:28 +00:00
|
|
|
|
VkBuffer createDataBuffer(void* data, VkDeviceSize size, VkBufferUsageFlags usage); // Создание буфера данных
|
|
|
|
|
void destroyBuffer(VkBuffer buffer); // Уничтожение буфера и освобождение его памяти
|
2022-04-07 10:17:05 +00:00
|
|
|
|
void addToRenderList(I_Model* model); // Добавление модели в список рендера
|
|
|
|
|
void removeFromRenderList(I_Model* model); // Удалеие модели из список рендера
|
|
|
|
|
void clearRenderList(); // Очистка списка рендера моделей
|
2022-04-06 15:33:19 +00:00
|
|
|
|
private:
|
|
|
|
|
VkInstance instance; // Экземпляр Vulkan
|
|
|
|
|
PhysicalDevice physicalDevice; // Физическое устройство
|
|
|
|
|
VkDevice logicalDevice; // логическое устройство
|
|
|
|
|
Queue queue; // очередь
|
|
|
|
|
Surface surface; // Поверхность окна
|
|
|
|
|
VkSwapchainKHR swapChain; // Список показа
|
|
|
|
|
std::vector<VkImage> swapChainImages; // Изображения из списка показа
|
|
|
|
|
std::vector<VkImageView> swapChainImageViews; // Информация об изображениях из списка показа
|
|
|
|
|
std::vector<VkFramebuffer> swapChainFramebuffers; // Буферы кадра из списка показа
|
|
|
|
|
VkRenderPass renderPass; // Проходы рендера
|
|
|
|
|
VkPipelineLayout pipelineLayout; // Раскладка конвейера
|
|
|
|
|
VkPipeline graphicsPipeline; // Графический конвейер
|
|
|
|
|
VkCommandPool commandPool; // Пул команд
|
|
|
|
|
std::vector<VkCommandBuffer> commandBuffers; // Буферы команд
|
|
|
|
|
std::vector<VkSemaphore> imageAvailableSemaphores; // семафор доступности изображения
|
|
|
|
|
std::vector<VkSemaphore> renderFinishedSemaphores; // семафор окончания рендера
|
|
|
|
|
std::vector<VkFence> inWorkFences; // барьер кадра в работе
|
|
|
|
|
uint32_t currentFrame = 0; // Текущий кадр рендера
|
2022-04-07 06:11:09 +00:00
|
|
|
|
uint32_t imageIndex; // Текущее изображение из списка показа
|
2022-04-07 06:01:43 +00:00
|
|
|
|
|
|
|
|
|
std::map<VkBuffer, std::pair<VkDevice, VkDeviceMemory>> databuffers; // Словарь для сопоставления дескриптору буфера дескрипторов лог. устройства и памяти
|
2022-04-07 10:17:05 +00:00
|
|
|
|
std::list<I_Model*> renderList; // Спискок моделей для рендера
|
2022-04-06 15:33:19 +00:00
|
|
|
|
|
|
|
|
|
// Структура для хранения флагов
|
|
|
|
|
struct
|
|
|
|
|
{
|
|
|
|
|
const bool VALIDATION = true; // Использование слоев проверки
|
|
|
|
|
} states;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void createInstance(); // Создание экземпяра Vulkan
|
|
|
|
|
void selectPhysicalDevice(std::vector<const char*> &deviceExtensions); // Выбор физического устройства
|
|
|
|
|
void pickQueues(); // Выбор очередей
|
|
|
|
|
void createLogicalDevice(std::vector<const char*> &deviceExtensions); // Создание логического устройства
|
|
|
|
|
void createWindowSurface(GLFWwindow* window); // Создание поверхности окна
|
|
|
|
|
void createSwapchain(GLFWwindow* window); // Создание цепочки показа
|
|
|
|
|
void createRenderpass(); // Создание проходов рендера
|
|
|
|
|
VkShaderModule createShaderModule(const char * filename); // Создание шейдерного модуля
|
|
|
|
|
void createGraphicPipeline(); // Создание графического конвеера
|
2022-04-07 06:01:43 +00:00
|
|
|
|
void createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer& buffer); // Создание произвольного буфера данных
|
2022-04-06 15:33:19 +00:00
|
|
|
|
void createCommandPool(); // Создание пула команд
|
|
|
|
|
void copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size); // Копирование между буферами данных
|
|
|
|
|
void createSyncObjects(); // Создание объектов синхронизации
|
|
|
|
|
void createFramebuffers(); // Создание буферов кадра
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#endif // VK_H
|