index buffer

main
Benjamin Kraft 2 weeks ago
parent 405411337c
commit f12a9bf441
  1. 23
      src/vulkan/application.cpp
  2. 2
      src/vulkan/application.hpp
  3. 22
      src/vulkan/buffer.cpp
  4. 15
      src/vulkan/buffer.hpp

@ -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;
}

@ -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);

@ -5,12 +5,6 @@
#include "instance.hpp"
#include "command_pool.hpp"
const std::vector<Vertex> 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<void**>(&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;

@ -2,6 +2,18 @@
#include <vulkan/vulkan_core.h>
#include <stdexcept>
#include "vertex.hpp"
const std::vector<Vertex> 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<uint32_t> 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);

Loading…
Cancel
Save