From 7bc7098d98ec06d63de93a1b61c9ba37869ab030 Mon Sep 17 00:00:00 2001 From: "re.kovalev" Date: Fri, 4 Mar 2022 21:29:57 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=B1=D1=83=D1=84=D0=B5=D1=80=D0=B0=20=D0=B8=D0=BD?= =?UTF-8?q?=D0=B4=D0=B5=D0=BA=D1=81=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/vk.h | 3 +++ src/vk.cpp | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/include/vk.h b/include/vk.h index e8d2c38..1119179 100644 --- a/include/vk.h +++ b/include/vk.h @@ -29,6 +29,8 @@ class Vulkan std::vector commandBuffers; // Буферы команд VkBuffer vertexBuffer; // Буфер вершин VkDeviceMemory vertexBufferMemory; // Память буфера вершин + VkBuffer indexBuffer; // Буфер индексов + VkDeviceMemory indexBufferMemory; // Память буфера индексов // Структура для хранения флагов struct @@ -50,6 +52,7 @@ class Vulkan void createCommandPool(); // Создание пула команд void copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size); // Копирование между буферами данных void createVertexBuffer(); // Создание буфера вершин + void createIndexBuffer(); // Создание буфера индексов }; #endif // VK_H \ No newline at end of file diff --git a/src/vk.cpp b/src/vk.cpp index ddb86bd..e766e15 100644 --- a/src/vk.cpp +++ b/src/vk.cpp @@ -21,11 +21,15 @@ void Vulkan::init(GLFWwindow* window) createGraphicPipeline(); // Создание графического конвейера createCommandPool(); // Создание пула команд createVertexBuffer(); // Создание буфера вершин + createIndexBuffer(); // Создание буфера индексов } // завершение работы void Vulkan::destroy() { + vkDestroyBuffer(logicalDevice, indexBuffer, nullptr); // Уничтожение буфера индексов + vkFreeMemory(logicalDevice, indexBufferMemory, nullptr); // Освобождение памяти буфера индексов + vkDestroyBuffer(logicalDevice, vertexBuffer, nullptr); // Уничтожение буфера вершин vkFreeMemory(logicalDevice, vertexBufferMemory, nullptr); // Освобождение памяти буфера вершин @@ -885,3 +889,34 @@ void Vulkan::createVertexBuffer() vkDestroyBuffer(logicalDevice, stagingBuffer, nullptr); vkFreeMemory(logicalDevice, stagingBufferMemory, nullptr); } + +// Создание буфера индексов +void Vulkan::createIndexBuffer() +{ + // Индексы, записываемые в буфер + uint16_t indices[] = {0, 1, 2, 2, 3, 0}; + // Размер буфера в байтах + VkDeviceSize bufferSize = sizeof(uint16_t) * 6; + + // Промежуточный буфер для переноса на устройство + 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, indices, (size_t) bufferSize); + // Прекращение отображения памяти буфера + vkUnmapMemory(logicalDevice, stagingBufferMemory); + + // Создание буфера вершин + createBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, indexBuffer, indexBufferMemory); + // Копирование из промежуточного в буфер вершин + copyBuffer(stagingBuffer, indexBuffer, bufferSize); + + // Освобождение памяти и уничтожение буферов + vkDestroyBuffer(logicalDevice, stagingBuffer, nullptr); + vkFreeMemory(logicalDevice, stagingBufferMemory, nullptr); +}