Add index buffer
This commit is contained in:
1 parent
f8b32717f3
commit
a94e7a95f5
2 files changed
+81
-16
No files matched your search
@@ -9,7 +9,8 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
#ifndef RSE_GRAPHICS_VULKANBASE_HPP
|
||||||
|
#define RSE_GRAPHICS_VULKANBASE_HPP
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
@@ -37,4 +38,6 @@ void deinitVulkan();
|
|||||||
*/
|
*/
|
||||||
void drawFrame();
|
void drawFrame();
|
||||||
|
|
||||||
} /* namespace rse::graphics::vulkanbase */
|
} /* namespace rse::graphics::vulkanbase */
|
||||||
|
|
||||||
|
#endif /* RSE_GRAPHICS_VULKANBASE_HPP */
|
||||||
+76
-14
@@ -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
|
||||||
@@ -239,7 +247,7 @@ static uint8_t copyBuffer(VkBuffer src, VkBuffer dst, VkDeviceSize size);
|
|||||||
* @brief Create the Vulkan Instance object
|
* @brief Create the Vulkan Instance object
|
||||||
*
|
*
|
||||||
* @return uint8_t VULKAN_ERROR_NO_ERROR on success. Possible errors:
|
* @return uint8_t VULKAN_ERROR_NO_ERROR on success. Possible errors:
|
||||||
* VULKAN_ERROR_INSTANCE_INIT_FAILED
|
* VULKAN_ERROR_INSTANCE_INIT_FAILED
|
||||||
*/
|
*/
|
||||||
static uint8_t createInstance();
|
static uint8_t createInstance();
|
||||||
|
|
||||||
@@ -254,8 +262,8 @@ static uint8_t createSurface();
|
|||||||
* @brief Choose physical device. Used later for vkDevice
|
* @brief Choose physical device. Used later for vkDevice
|
||||||
*
|
*
|
||||||
* @return uint8_t VULKAN_ERROR_NO_ERROR on success. Possible errors:
|
* @return uint8_t VULKAN_ERROR_NO_ERROR on success. Possible errors:
|
||||||
* VULKAN_ERROR_NO_PHYSICAL_DEVICE_FOUND
|
* VULKAN_ERROR_NO_PHYSICAL_DEVICE_FOUND
|
||||||
* VULKAN_ERROR_NO_SUITABLE_PHYSICAL_DEVICE_FOUND
|
* VULKAN_ERROR_NO_SUITABLE_PHYSICAL_DEVICE_FOUND
|
||||||
*/
|
*/
|
||||||
static uint8_t pickPhysicalDevice();
|
static uint8_t pickPhysicalDevice();
|
||||||
|
|
||||||
@@ -263,8 +271,8 @@ static uint8_t pickPhysicalDevice();
|
|||||||
* @brief Create vkDevice object
|
* @brief Create vkDevice object
|
||||||
*
|
*
|
||||||
* @return uint8_t VULKAN_ERROR_NO_ERROR on success. Possible errors:
|
* @return uint8_t VULKAN_ERROR_NO_ERROR on success. Possible errors:
|
||||||
* VULKAN_ERROR_QUEUE_NOT_SUPPORTED
|
* VULKAN_ERROR_QUEUE_NOT_SUPPORTED
|
||||||
* VULKAN_ERROR_DEVICE_CREATION_FAILED
|
* VULKAN_ERROR_DEVICE_CREATION_FAILED
|
||||||
*/
|
*/
|
||||||
static uint8_t createDevice();
|
static uint8_t createDevice();
|
||||||
|
|
||||||
@@ -279,7 +287,7 @@ static void setupDebugMessenger();
|
|||||||
* @brief Create a Memory Allocator object
|
* @brief Create a Memory Allocator object
|
||||||
*
|
*
|
||||||
* @return uint8_t VULKAN_ERROR_NO_ERROR on success. Possible errors:
|
* @return uint8_t VULKAN_ERROR_NO_ERROR on success. Possible errors:
|
||||||
* VULKAN_ERROR_ALLOCATOR_CREATION_FAILED
|
* VULKAN_ERROR_ALLOCATOR_CREATION_FAILED
|
||||||
*/
|
*/
|
||||||
static uint8_t createMemoryAllocator();
|
static uint8_t createMemoryAllocator();
|
||||||
|
|
||||||
@@ -287,7 +295,7 @@ static uint8_t createMemoryAllocator();
|
|||||||
* @brief Create Command Pools
|
* @brief Create Command Pools
|
||||||
*
|
*
|
||||||
* @return uint8_t VULKAN_ERROR_NO_ERROR on success. Possible errors:
|
* @return uint8_t VULKAN_ERROR_NO_ERROR on success. Possible errors:
|
||||||
* VULKAN_ERROR_COMMAND_POOL_CREATION_FAILED
|
* VULKAN_ERROR_COMMAND_POOL_CREATION_FAILED
|
||||||
*/
|
*/
|
||||||
static uint8_t createCommandPools();
|
static uint8_t createCommandPools();
|
||||||
|
|
||||||
@@ -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);
|
||||||
|
|||||||
Reference in new issue
Block a user