Compare commits

..

No commits in common. "master" and "v0.1" have entirely different histories.
master ... v0.1

6 changed files with 38 additions and 190 deletions

View File

@ -1,15 +0,0 @@
#ifndef I_MODEL_H
#define I_MODEL_H
#include <vulkan/vulkan.h>
class I_Model
{
public:
virtual ~I_Model() {}; // Виртуальный деструктор для корректной работы деструкторов в полиморфизме
virtual void render(VkCommandBuffer commandBuffer) = 0;
protected:
virtual void bindBuffers(VkCommandBuffer commandBuffer) = 0;
};
#endif // I_MODEL_H

View File

@ -1,35 +0,0 @@
#ifndef MODEL_H
#define MODEL_H
#include "I_Model.h"
#include "Vertex.h"
// Класс модели без индексов
class Model_wo_indexes : public I_Model
{
public:
Model_wo_indexes(Vertex* vertexArray, uint32_t verteciesCount);
virtual ~Model_wo_indexes();
virtual void render(VkCommandBuffer commandBuffer);
protected:
void bindBuffers(VkCommandBuffer commandBuffer); // привязка используемых буферов данных
private:
uint32_t verteciesCount; // Количество вершин
VkBuffer vertexBuffer; // Буфер вершин
};
// Класс модели с индексами
class Model_w_indexes : public Model_wo_indexes
{
public:
Model_w_indexes(Vertex* vertexArray, uint32_t verteciesCount, uint32_t* indexArray, uint32_t indeciesCount);
virtual ~Model_w_indexes();
virtual void render(VkCommandBuffer commandBuffer);
protected:
void bindBuffers(VkCommandBuffer commandBuffer); // привязка используемых буферов данных
private:
uint32_t indeciesCount; // Количество индексов
VkBuffer indexBuffer; // Буфер индексов
};
#endif // MODEL_H

View File

@ -9,9 +9,6 @@
#include "Queue.h"
#include <map>
#include <list>
#include "Model.h"
class Vulkan
{
@ -19,13 +16,8 @@ class Vulkan
void init(GLFWwindow* window); // инициализация
void destroy(); // завершение работы
void renderFrame(); // рендер кадра
void renderBegin(); // Начало рендера кадра
void renderEnd(); // Окончание рендера кадра
VkBuffer createDataBuffer(void* data, VkDeviceSize size, VkBufferUsageFlags usage); // Создание буфера данных
void destroyBuffer(VkBuffer buffer); // Уничтожение буфера и освобождение его памяти
void addToRenderList(I_Model* model); // Добавление модели в список рендера
void removeFromRenderList(I_Model* model); // Удалеие модели из список рендера
void clearRenderList(); // Очистка списка рендера моделей
private:
VkInstance instance; // Экземпляр Vulkan
PhysicalDevice physicalDevice; // Физическое устройство
@ -41,6 +33,8 @@ class Vulkan
VkPipeline graphicsPipeline; // Графический конвейер
VkCommandPool commandPool; // Пул команд
std::vector<VkCommandBuffer> commandBuffers; // Буферы команд
VkBuffer vertexBuffer; // Буфер вершин
VkBuffer indexBuffer; // Буфер индексов
std::vector<VkSemaphore> imageAvailableSemaphores; // семафор доступности изображения
std::vector<VkSemaphore> renderFinishedSemaphores; // семафор окончания рендера
std::vector<VkFence> inWorkFences; // барьер кадра в работе
@ -48,7 +42,6 @@ class Vulkan
uint32_t imageIndex; // Текущее изображение из списка показа
std::map<VkBuffer, std::pair<VkDevice, VkDeviceMemory>> databuffers; // Словарь для сопоставления дескриптору буфера дескрипторов лог. устройства и памяти
std::list<I_Model*> renderList; // Спискок моделей для рендера
// Структура для хранения флагов
struct
@ -71,6 +64,8 @@ class Vulkan
void copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size); // Копирование между буферами данных
void createSyncObjects(); // Создание объектов синхронизации
void createFramebuffers(); // Создание буферов кадра
void renderBegin(); // Начало рендера кадра
void renderEnd(); // Окончание рендера кадра
};
#endif // VK_H

View File

@ -1,70 +0,0 @@
#include "Model.h"
#include "vk.h"
#include <iostream>
// Конструктор класса без индексов - принимает массив вершин
Model_wo_indexes::Model_wo_indexes(Vertex* vertexArray, uint32_t count) : verteciesCount(count)
{
extern Vulkan vulkan;
// Создание и инициализация буфера вершин
vertexBuffer = vulkan.createDataBuffer(vertexArray, verteciesCount * sizeof(Vertex), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
}
// Деструктор класса без индексов
Model_wo_indexes::~Model_wo_indexes()
{
extern Vulkan vulkan;
vulkan.destroyBuffer(vertexBuffer);
}
// привзка используемых буферов данных
void Model_wo_indexes::bindBuffers(VkCommandBuffer commandBuffer)
{
VkBuffer vertexBuffers[] = {vertexBuffer};
VkDeviceSize offsets[] = {0};
vkCmdBindVertexBuffers(commandBuffer, 0, 1, vertexBuffers, offsets);
}
// Рендер модели без индексов
void Model_wo_indexes::render(VkCommandBuffer commandBuffer)
{
bindBuffers(commandBuffer);
vkCmdDraw(commandBuffer, verteciesCount, 1, 0, 0);
}
// Конструктор класса с индексами - принимает массивы вершин и индексов
Model_w_indexes::Model_w_indexes(Vertex* vertexArray, uint32_t vCount, uint32_t* indexArray, uint32_t iCount)
: Model_wo_indexes(vertexArray, vCount), indeciesCount(iCount)
{
extern Vulkan vulkan;
// Создание и инициализация буфера индексов
indexBuffer = vulkan.createDataBuffer(indexArray, indeciesCount * sizeof(uint32_t), VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
}
// Деструктор класса с индексами
Model_w_indexes::~Model_w_indexes()
{
extern Vulkan vulkan;
vulkan.destroyBuffer(indexBuffer);
}
// привзка используемых буферов данных
void Model_w_indexes::bindBuffers(VkCommandBuffer commandBuffer)
{
// Привязка родительских буферов
Model_wo_indexes::bindBuffers(commandBuffer);
// Привязка индексного буфера
vkCmdBindIndexBuffer(commandBuffer, indexBuffer, 0, VK_INDEX_TYPE_UINT32);
}
// Рендер модели с индексами
void Model_w_indexes::render(VkCommandBuffer commandBuffer)
{
bindBuffers(commandBuffer);
vkCmdDrawIndexed(commandBuffer, indeciesCount, 1, 0, 0, 0);
}

View File

@ -1,26 +1,11 @@
#include "vk.h"
#include <iostream>
#include "Model.h"
void vkInit();
int main(int argc, char* argv[])
{
// объект класса-обертки Vulkan API
extern Vulkan vulkan;
//Вершины, записываемые в буфер
Vertex vertices[] = {
{ {-0.5f, -0.5f}, {1.0f, 0.0f, 0.0f} },
{ { 0.5f, -0.5f}, {0.0f, 1.0f, 0.0f} },
{ { 0.5f, 0.5f}, {0.0f, 0.0f, 1.0f} },
{ {-0.5f, 0.5f}, {1.0f, 1.0f, 1.0f} }
};
// Индексы, записываемые в буфер
uint32_t indices[] = {0, 1, 2, 2, 3, 0};
I_Model * model;
int main(int argc, char* argv[]) {
// Инициализация GLFW
glfwInit();
@ -28,6 +13,9 @@ int main(int argc, char* argv[])
// Проверка доступности Vulkan
if (glfwVulkanSupported())
{
// объект класса-обертки Vulkan API
Vulkan vulkan;
// Отключим создание контекста
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
// Отключим возможность изменения размеров окна
@ -38,19 +26,13 @@ int main(int argc, char* argv[])
// Инициализация Vulkan API
vulkan.init(window);
model = new Model_w_indexes(vertices, 4, indices, 6);
vulkan.addToRenderList(model);
// Жизненный цикл
while(!glfwWindowShouldClose(window))
{
while(!glfwWindowShouldClose(window)) {
// Обработка событий
glfwPollEvents();
vulkan.renderFrame();
}
delete model;
// Уничтожение окна
glfwDestroyWindow(window);

View File

@ -7,9 +7,6 @@
#include "macroses.h"
// объект класса-обертки Vulkan API
Vulkan vulkan;
// инициализация
void Vulkan::init(GLFWwindow* window)
{
@ -24,6 +21,23 @@ void Vulkan::init(GLFWwindow* window)
createFramebuffers(); // Создание буферов кадра
createGraphicPipeline(); // Создание графического конвейера
createCommandPool(); // Создание пула команд
//Вершины, записываемые в буфер
Vertex vertices[] = {
{ {-0.5f, -0.5f}, {1.0f, 0.0f, 0.0f} },
{ { 0.5f, -0.5f}, {0.0f, 1.0f, 0.0f} },
{ { 0.5f, 0.5f}, {0.0f, 0.0f, 1.0f} },
{ {-0.5f, 0.5f}, {1.0f, 1.0f, 1.0f} }
};
// Размер буфера в байтах
VkDeviceSize bufferSize = sizeof(Vertex) * 4;
vertexBuffer = createDataBuffer(vertices, bufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT); // Создание буфера вершин
// Индексы, записываемые в буфер
uint16_t indices[] = {0, 1, 2, 2, 3, 0};
// Размер буфера в байтах
bufferSize = sizeof(uint16_t) * 6;
indexBuffer = createDataBuffer(indices, bufferSize, VK_BUFFER_USAGE_INDEX_BUFFER_BIT); // Создание буфера индексов
createSyncObjects(); // Создание объектов синхронизации
}
@ -809,15 +823,9 @@ void Vulkan::createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryP
// Уничтожение буфера и освобождение его памяти
void Vulkan::destroyBuffer(VkBuffer buffer)
{
// Проверка что такой буфер ещё существует
if (databuffers.find(buffer) != databuffers.end())
{
vkDeviceWaitIdle(logicalDevice); // Ожидание окончания асинхронных задач
vkDestroyBuffer(databuffers[buffer].first /*logicalDevice*/, buffer, nullptr); // Уничтожение буфера
vkFreeMemory(databuffers[buffer].first /*logicalDevice*/, databuffers[buffer].second /*VkDeviceMemory*/, nullptr); // Освобождение памяти буфера
databuffers.erase(buffer); // Удалим ключ из словаря
}
vkDestroyBuffer(databuffers[buffer].first /*logicalDevice*/, buffer, nullptr); // Уничтожение буфера
vkFreeMemory(databuffers[buffer].first /*logicalDevice*/, databuffers[buffer].second /*VkDeviceMemory*/, nullptr); // Освобождение памяти буфера
databuffers.erase(buffer); // Удалим ключ из словаря
}
// Создание пула команд
@ -980,10 +988,13 @@ void Vulkan::renderFrame()
{
renderBegin(); // Начало рендера
for (auto const& model : renderList)
{
model->render(commandBuffers[currentFrame]);
}
VkBuffer vertexBuffers[] = {vertexBuffer};
VkDeviceSize offsets[] = {0};
vkCmdBindVertexBuffers(commandBuffers[currentFrame], 0, 1, vertexBuffers, offsets);
vkCmdBindIndexBuffer(commandBuffers[currentFrame], indexBuffer, 0, VK_INDEX_TYPE_UINT16);
vkCmdDrawIndexed(commandBuffers[currentFrame], 6, 1, 0, 0, 0);
renderEnd(); // Конец рендера
}
@ -1085,23 +1096,3 @@ void Vulkan::renderEnd()
throw std::runtime_error("Unable to present swap chain image");
}
}
// Добавление модели в список рендера
void Vulkan::addToRenderList(I_Model* model)
{
if (model)
renderList.push_back(model);
}
// Удаление модели из список рендера
void Vulkan::removeFromRenderList(I_Model* model)
{
if (model)
renderList.remove(model);
}
// Очистка списка рендера моделей
void Vulkan::clearRenderList()
{
renderList.clear();
}