Add index buffer

This commit is contained in:
Piotr Krygier committed 2022-12-17 21:57:11 +01:00
1 parent f8b32717f3
commit a94e7a95f5
2 files changed
+73 -8

No files matched your search

+4 -1
View File
@@ -9,7 +9,8 @@
* *
*/ */
#pragma once #ifndef RSE_GRAPHICS_VULKANBASE_HPP
#define RSE_GRAPHICS_VULKANBASE_HPP
#include <cstdint> #include <cstdint>
@@ -38,3 +39,5 @@ void deinitVulkan();
void drawFrame(); void drawFrame();
} /* namespace rse::graphics::vulkanbase */ } /* namespace rse::graphics::vulkanbase */
#endif /* RSE_GRAPHICS_VULKANBASE_HPP */
+69 -7
View File
@@ -15,7 +15,7 @@
#include "vulkanBase.hpp" #include "vulkanBase.hpp"
#include <vulkan/vulkan.h> #include <vulkan/vulkan.hpp>
#pragma GCC diagnostic push #pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-function" #pragma GCC diagnostic ignored "-Wunused-function"
#pragma GCC diagnostic ignored "-Wunused-variable" #pragma GCC diagnostic ignored "-Wunused-variable"
@@ -143,9 +143,15 @@ struct Buffer
// FIXME: Temporary array of vertices, for testing purposes // FIXME: Temporary array of vertices, for testing purposes
const std::vector<Vertex> vertices = { const std::vector<Vertex> vertices = {
{{0.0f, -0.5f}, {1.0f, 0.0f, 0.0f}}, {{-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, 1.0f, 0.0f}},
{{-0.5f, 0.5f}, {0.0f, 0.0f, 1.0f}} {{0.5f, 0.5f}, {0.0f, 0.0f, 1.0f}},
{{-0.5f, 0.5f}, {1.0f, 1.0f, 1.0f}}
};
// FIXME: Temporary array of vertices, for testing purposes
std::vector<uint16_t> indices = {
0, 1, 2, 2, 3, 0
}; };
/* Define Validation Layers for debug build */ /* Define Validation Layers for debug build */
@@ -210,6 +216,8 @@ std::vector<VkFence> gInFlightFences = {};
Buffer gVertexBuffer = {}; Buffer gVertexBuffer = {};
/* CPU visible buffer. TODO: Do we need this global? */ /* CPU visible buffer. TODO: Do we need this global? */
Buffer gVertexStagingBuffer = {}; Buffer gVertexStagingBuffer = {};
Buffer gIndexBuffer = {};
Buffer gIndexStagingBuffer = {};
/** /**
* @brief Helper function. Creates a buffer object * @brief Helper function. Creates a buffer object
@@ -296,10 +304,18 @@ static uint8_t createCommandPools();
* *
* @return uint8_t VULKAN_ERROR_NO_ERROR on success. Possible errors: * @return uint8_t VULKAN_ERROR_NO_ERROR on success. Possible errors:
* VULKAN_ERROR_BUFFER_CREATION_FAILED * VULKAN_ERROR_BUFFER_CREATION_FAILED
* VULKAN_ERROR_VERTEX_BUFFER_MAPPING_FAILED * VULKAN_ERROR_VERTEX_BUFFER_MAPPING_FAILED
*/ */
static uint8_t createVertexBuffer(); static uint8_t createVertexBuffer();
/**
* @brief Create an index buffer, connected with vertex buffer
*
* @return uint8_t VULKAN_ERROR_NO_ERROR on success. Possible errors:
* VULKAN_ERROR_BUFFER_CREATION_FAILED
*/
static uint8_t createIndexBuffer();
/** /**
* @brief Allocate Command Buffers * @brief Allocate Command Buffers
* *
@@ -876,7 +892,6 @@ static uint8_t createVertexBuffer()
return VULKAN_ERROR_BUFFER_CREATION_FAILED; return VULKAN_ERROR_BUFFER_CREATION_FAILED;
} }
/* Fill staging buffer */ /* Fill staging buffer */
if (VK_SUCCESS != vmaMapMemory(gAllocator, gVertexStagingBuffer.allocation, &mappedData)) if (VK_SUCCESS != vmaMapMemory(gAllocator, gVertexStagingBuffer.allocation, &mappedData))
{ {
@@ -891,6 +906,48 @@ static uint8_t createVertexBuffer()
return VULKAN_ERROR_NO_ERROR; return VULKAN_ERROR_NO_ERROR;
} }
static uint8_t createIndexBuffer()
{
void* mappedData;
VkDeviceSize bufferSize;
bufferSize = sizeof(indices[0]) * indices.size();
/* Creating staging buffer*/
if (VK_SUCCESS != createBuffer(bufferSize,
VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
VMA_MEMORY_USAGE_AUTO_PREFER_HOST,
VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT,
gIndexStagingBuffer)) {
LOGF << vulkanErrorMesssages[VULKAN_BUFFER_CREATION_FAILED];
return VULKAN_ERROR_BUFFER_CREATION_FAILED;
}
/* Create Vertex Buffer*/
if (VK_SUCCESS != createBuffer(bufferSize,
VK_BUFFER_USAGE_TRANSFER_DST_BIT
| VK_BUFFER_USAGE_INDEX_BUFFER_BIT,
VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE,
0, /* Will not be mapped with vmaMapMemory */
gIndexBuffer)) {
LOGF << vulkanErrorMesssages[VULKAN_BUFFER_CREATION_FAILED];
return VULKAN_ERROR_BUFFER_CREATION_FAILED;
}
/* Fill staging buffer */
if (VK_SUCCESS != vmaMapMemory(gAllocator, gIndexStagingBuffer.allocation, &mappedData))
{
LOGF << vulkanErrorMesssages[VULKAN_VERTEX_BUFFER_MAPPING_FAILED];
return VULKAN_ERROR_VERTEX_BUFFER_MAPPING_FAILED;
}
memcpy(mappedData, indices.data(), static_cast<size_t>(bufferSize));
vmaUnmapMemory(gAllocator, gIndexStagingBuffer.allocation);
copyBuffer(gIndexStagingBuffer.buffer, gIndexBuffer.buffer, bufferSize);
return VULKAN_ERROR_NO_ERROR;
}
static uint8_t allocateCommandBuffers() static uint8_t allocateCommandBuffers()
{ {
VkCommandBufferAllocateInfo allocateInfo; VkCommandBufferAllocateInfo allocateInfo;
@@ -1419,7 +1476,9 @@ static uint8_t recordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t image
vkCmdSetScissor(commandBuffer, 0, 1, &scissor); vkCmdSetScissor(commandBuffer, 0, 1, &scissor);
vkCmdBindVertexBuffers(commandBuffer, 0, 1, vertexBuffers, offsets); vkCmdBindVertexBuffers(commandBuffer, 0, 1, vertexBuffers, offsets);
vkCmdDraw(commandBuffer, static_cast<uint32_t>(vertices.size()), 1, 0, 0); vkCmdBindIndexBuffer(commandBuffer, gIndexBuffer.buffer, 0, VK_INDEX_TYPE_UINT16);
vkCmdDrawIndexed(commandBuffer, static_cast<uint32_t>(indices.size()), 1, 0, 0, 0);
vkCmdEndRenderPass(commandBuffer); vkCmdEndRenderPass(commandBuffer);
@@ -1493,6 +1552,7 @@ uint8_t initVulkan()
STATUS_CHECK(createMemoryAllocator()); STATUS_CHECK(createMemoryAllocator());
STATUS_CHECK(createCommandPools()); STATUS_CHECK(createCommandPools());
STATUS_CHECK(createVertexBuffer()); STATUS_CHECK(createVertexBuffer());
STATUS_CHECK(createIndexBuffer());
STATUS_CHECK(allocateCommandBuffers()); STATUS_CHECK(allocateCommandBuffers());
STATUS_CHECK(createSwapchain()); STATUS_CHECK(createSwapchain());
STATUS_CHECK(createSwapchainImageViews()); STATUS_CHECK(createSwapchainImageViews());
@@ -1569,6 +1629,8 @@ void deinitVulkan()
vmaDestroyBuffer(gAllocator, gVertexBuffer.buffer, gVertexBuffer.allocation); vmaDestroyBuffer(gAllocator, gVertexBuffer.buffer, gVertexBuffer.allocation);
vmaDestroyBuffer(gAllocator, gVertexStagingBuffer.buffer, gVertexStagingBuffer.allocation); vmaDestroyBuffer(gAllocator, gVertexStagingBuffer.buffer, gVertexStagingBuffer.allocation);
vmaDestroyBuffer(gAllocator, gIndexBuffer.buffer, gIndexBuffer.allocation);
vmaDestroyBuffer(gAllocator, gIndexStagingBuffer.buffer, gIndexStagingBuffer.allocation);
for (size_t i = 0; i < SWAP_BUFFER_COUNT; ++i) { for (size_t i = 0; i < SWAP_BUFFER_COUNT; ++i) {
vkDestroySemaphore(gDevice, gImageAvailableSemaphores[i], nullptr); vkDestroySemaphore(gDevice, gImageAvailableSemaphores[i], nullptr);
vkDestroySemaphore(gDevice, gRenderFinishedSemaphores[i], nullptr); vkDestroySemaphore(gDevice, gRenderFinishedSemaphores[i], nullptr);