From f12a9bf4417a3d17ca0a37159a0c859c7d8ec692 Mon Sep 17 00:00:00 2001 From: Benjamin Kraft Date: Thu, 5 Sep 2024 08:38:49 +0200 Subject: [PATCH] index buffer --- src/vulkan/application.cpp | 23 ++++++++++++++++++----- src/vulkan/application.hpp | 2 +- src/vulkan/buffer.cpp | 22 +++++++++++++++------- src/vulkan/buffer.hpp | 15 ++++++++++++++- 4 files changed, 48 insertions(+), 14 deletions(-) diff --git a/src/vulkan/application.cpp b/src/vulkan/application.cpp index 1564711..25e92cf 100644 --- a/src/vulkan/application.cpp +++ b/src/vulkan/application.cpp @@ -9,12 +9,23 @@ Application::Application() { instance = new Instance; swapchain = new Swapchain(instance); pipeline = new Pipeline(instance, swapchain->renderPass); - stagingBuffer = Buffer::createStagingBuffer(instance); - vertexBuffer = new Buffer(instance, stagingBuffer->size, + auto stagedVertexBuffer = Buffer::createStagedVertexBuffer(instance); + vertexBuffer = new Buffer(instance, stagedVertexBuffer->size, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + + auto stagedIndexBuffer = Buffer::createStagedIndexBuffer(instance); + indexBuffer = new Buffer(instance, stagedIndexBuffer->size, + VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + commandPool = new CommandPool(instance); - stagingBuffer->copyTo(vertexBuffer, commandPool); + + stagedVertexBuffer->copyTo(vertexBuffer, commandPool); + stagedIndexBuffer->copyTo(indexBuffer, commandPool); + + delete stagedVertexBuffer; + delete stagedIndexBuffer; createSyncObjects(); @@ -137,7 +148,9 @@ void Application::recordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t im VkDeviceSize offsets[] = {0}; vkCmdBindVertexBuffers(commandBuffer, 0, 1, buffers, offsets); - vkCmdDraw(commandBuffer, 3, 1, 0, 0); + vkCmdBindIndexBuffer(commandBuffer, indexBuffer->handle, 0, VK_INDEX_TYPE_UINT32); + + vkCmdDrawIndexed(commandBuffer, indices.size(), 1, 0, 0, 0); vkCmdEndRenderPass(commandBuffer); vkEndCommandBuffer(commandBuffer); @@ -151,8 +164,8 @@ Application::~Application() { vkDestroyFence(instance->device, inFlightFences[i], nullptr); } delete commandPool; - delete stagingBuffer; delete vertexBuffer; + delete indexBuffer; delete pipeline; delete instance; } diff --git a/src/vulkan/application.hpp b/src/vulkan/application.hpp index 1168a2d..603bf58 100644 --- a/src/vulkan/application.hpp +++ b/src/vulkan/application.hpp @@ -45,8 +45,8 @@ private: Instance* instance = nullptr; Swapchain* swapchain = nullptr; Pipeline* pipeline = nullptr; - Buffer* stagingBuffer = nullptr; Buffer* vertexBuffer = nullptr; + Buffer* indexBuffer = nullptr; CommandPool* commandPool = nullptr; void recordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex); diff --git a/src/vulkan/buffer.cpp b/src/vulkan/buffer.cpp index 12a8023..87c77ef 100644 --- a/src/vulkan/buffer.cpp +++ b/src/vulkan/buffer.cpp @@ -5,12 +5,6 @@ #include "instance.hpp" #include "command_pool.hpp" -const std::vector vertices = { - {{0.0, -0.5}, {1, 0, 0}}, - {{0.5, 0.5}, {0, 1, 0}}, - {{-0.5, 0.5}, {0, 0, 1}} -}; - Buffer::Buffer(Instance* instance, VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties) : instance(instance), size(size){ VkBufferCreateInfo bufferInfo{}; bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; @@ -51,7 +45,7 @@ Buffer::~Buffer() { vkDestroyBuffer(instance->device, handle, nullptr); } -Buffer* Buffer::createStagingBuffer(Instance* instance) { +Buffer* Buffer::createStagedVertexBuffer(Instance* instance) { VkDeviceSize size = vertices.size() * sizeof(Vertex); VkBufferUsageFlags usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT; VkMemoryPropertyFlags properties = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; @@ -66,6 +60,20 @@ Buffer* Buffer::createStagingBuffer(Instance* instance) { return stagingBuffer; } +Buffer *Buffer::createStagedIndexBuffer(Instance *instance) { + VkDeviceSize size = indices.size() * sizeof(uint32_t); + VkBufferUsageFlags usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT; + VkMemoryPropertyFlags properties = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; + auto stagingBuffer = new Buffer(instance, size, usage, properties); + + uint32_t *data; + vkMapMemory(instance->device, stagingBuffer->memory, 0, size, 0, reinterpret_cast(&data)); + memcpy(data, indices.data(), sizeof(uint32_t) * indices.size()); + vkUnmapMemory(instance->device, stagingBuffer->memory); + + return stagingBuffer; +} + void Buffer::copyTo(Buffer *dst, CommandPool* commandPool) { VkCommandBufferAllocateInfo allocateInfo {}; allocateInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; diff --git a/src/vulkan/buffer.hpp b/src/vulkan/buffer.hpp index b176e8b..d45226b 100644 --- a/src/vulkan/buffer.hpp +++ b/src/vulkan/buffer.hpp @@ -2,6 +2,18 @@ #include #include +#include "vertex.hpp" + +const std::vector vertices = { + {{0.0, -0.5}, {1, 0, 0}}, + {{0.5, 0.5}, {0, 1, 0}}, + {{-0.5, 0.5}, {0, 0, 1}}, + {{0.8, -0.5}, {1, 1, 1}} +}; + +const std::vector indices = { + 0, 1, 2, 0, 3, 1 +}; class Instance; class CommandPool; @@ -14,7 +26,8 @@ public: VkDeviceMemory memory = VK_NULL_HANDLE; VkDeviceSize size; - static Buffer* createStagingBuffer(Instance* instance); + static Buffer* createStagedVertexBuffer(Instance* instance); + static Buffer* createStagedIndexBuffer(Instance* instance); void copyTo(Buffer* dst, CommandPool* commandPool);