diff --git a/include/vk.h b/include/vk.h index be2db0a..e8d2c38 100644 --- a/include/vk.h +++ b/include/vk.h @@ -27,6 +27,8 @@ class Vulkan VkPipeline graphicsPipeline; // Графический конвейер VkCommandPool commandPool; // Пул команд std::vector commandBuffers; // Буферы команд + VkBuffer vertexBuffer; // Буфер вершин + VkDeviceMemory vertexBufferMemory; // Память буфера вершин // Структура для хранения флагов struct @@ -47,6 +49,7 @@ class Vulkan void createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer& buffer, VkDeviceMemory& bufferMemory); // Создание произвольного буфера данных void createCommandPool(); // Создание пула команд void copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size); // Копирование между буферами данных + void createVertexBuffer(); // Создание буфера вершин }; #endif // VK_H \ No newline at end of file diff --git a/src/vk.cpp b/src/vk.cpp index 9bf9b4f..ddb86bd 100644 --- a/src/vk.cpp +++ b/src/vk.cpp @@ -20,11 +20,15 @@ void Vulkan::init(GLFWwindow* window) createRenderpass(); // Создание проходов рендера createGraphicPipeline(); // Создание графического конвейера createCommandPool(); // Создание пула команд + createVertexBuffer(); // Создание буфера вершин } // завершение работы void Vulkan::destroy() { + vkDestroyBuffer(logicalDevice, vertexBuffer, nullptr); // Уничтожение буфера вершин + vkFreeMemory(logicalDevice, vertexBufferMemory, nullptr); // Освобождение памяти буфера вершин + vkDestroyCommandPool(logicalDevice, commandPool, nullptr); // Уничтожение командного пула vkDestroyPipeline(logicalDevice, graphicsPipeline, nullptr); // Уничтожение графического конвейера @@ -845,3 +849,39 @@ void Vulkan::copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize siz // Освобождение командного буфера копирования vkFreeCommandBuffers(logicalDevice, commandPool, 1, &commandBuffer); } + +// Создание вершинного буфера +void Vulkan::createVertexBuffer() +{ + //Вершины, записываемые в буфер + 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; + + // Промежуточный буфер для переноса на устройство + VkBuffer stagingBuffer; + VkDeviceMemory stagingBufferMemory; + createBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, stagingBuffer, stagingBufferMemory); + + // Отображение памяти буфера + void* data; + vkMapMemory(logicalDevice, stagingBufferMemory, 0, bufferSize, 0, &data); + // Копирование вершин в промежуточный буфер + memcpy(data, vertices, (size_t) bufferSize); + // Прекращение отображения памяти буфера + vkUnmapMemory(logicalDevice, stagingBufferMemory); + + // Создание буфера вершин + createBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, vertexBuffer, vertexBufferMemory); + // Копирование из промежуточного в буфер вершин + copyBuffer(stagingBuffer, vertexBuffer, bufferSize); + + // Освобождение памяти и уничтожение буферов + vkDestroyBuffer(logicalDevice, stagingBuffer, nullptr); + vkFreeMemory(logicalDevice, stagingBufferMemory, nullptr); +}