Rendering Engine 0.2.9
Modular Graphics Rendering Engine | v0.2.9
vulkan_mesh_resources.cpp
Go to the documentation of this file.
2#include "vulkan_renderer.hpp"
3
4#include <cstring>
5
6namespace rendering_engine
7{
8
10 :
11 mRenderer(renderer),
12 bIsOnGPU(false),
13 mVertexBufferSize(0),
14 mIndexBufferSize(0)
15{
16}
17
18void VulkanMeshResources::CreateVertexBuffer(std::vector<Vertex2D> vertices)
19{
20 auto logicalDevice = mRenderer->GetLogicalDevice();
21
22 VkDeviceSize bufferSize = sizeof(vertices[0]) * vertices.size();
23 mVertexBufferSize = static_cast<size_t>(bufferSize);
24 VkBuffer stagingBuffer;
25 VkDeviceMemory stagingBufferMemory;
26 mRenderer->CreateBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
27 stagingBuffer, stagingBufferMemory);
28
29 void* data;
30 vkMapMemory(logicalDevice, stagingBufferMemory, 0, bufferSize, 0, &data);
31
32 memcpy(data, vertices.data(), mVertexBufferSize);
33 vkUnmapMemory(logicalDevice, stagingBufferMemory);
34 mRenderer->CreateBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
35 mVertexBuffer, mVertexBufferMemory);
36
37 mRenderer->CopyBuffer(stagingBuffer, mVertexBuffer, bufferSize);
38
39 bIsOnGPU = true;
40 vkDestroyBuffer(logicalDevice, stagingBuffer, nullptr);
41 vkFreeMemory(logicalDevice, stagingBufferMemory, nullptr);
42}
43
44void VulkanMeshResources::CreateVertexBuffer(std::vector<VertexPositionColorTexture> vertices)
45{
46 auto logicalDevice = mRenderer->GetLogicalDevice();
47
48 VkDeviceSize bufferSize = sizeof(vertices[0]) * vertices.size();
49 mVertexBufferSize = static_cast<size_t>(bufferSize);
50 VkBuffer stagingBuffer;
51 VkDeviceMemory stagingBufferMemory;
52 mRenderer->CreateBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
53 stagingBuffer, stagingBufferMemory);
54
55 void* data;
56 vkMapMemory(logicalDevice, stagingBufferMemory, 0, bufferSize, 0, &data);
57
58 memcpy(data, vertices.data(), mVertexBufferSize);
59 vkUnmapMemory(logicalDevice, stagingBufferMemory);
60 mRenderer->CreateBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
61 mVertexBuffer, mVertexBufferMemory);
62
63 mRenderer->CopyBuffer(stagingBuffer, mVertexBuffer, bufferSize);
64
65 bIsOnGPU = true;
66 vkDestroyBuffer(logicalDevice, stagingBuffer, nullptr);
67 vkFreeMemory(logicalDevice, stagingBufferMemory, nullptr);
68}
69
70void VulkanMeshResources::CreateVertexBuffer(std::vector<VertexPositionColorTextureNormalTangent> vertices)
71{
72 auto logicalDevice = mRenderer->GetLogicalDevice();
73
74 VkDeviceSize bufferSize = sizeof(vertices[0]) * vertices.size();
75 mVertexBufferSize = static_cast<size_t>(bufferSize);
76 VkBuffer stagingBuffer;
77 VkDeviceMemory stagingBufferMemory;
78 mRenderer->CreateBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
79 stagingBuffer, stagingBufferMemory);
80
81 void* data;
82 vkMapMemory(logicalDevice, stagingBufferMemory, 0, bufferSize, 0, &data);
83
84 memcpy(data, vertices.data(), mVertexBufferSize);
85 vkUnmapMemory(logicalDevice, stagingBufferMemory);
86 mRenderer->CreateBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
87 mVertexBuffer, mVertexBufferMemory);
88
89 mRenderer->CopyBuffer(stagingBuffer, mVertexBuffer, bufferSize);
90
91 bIsOnGPU = true;
92 vkDestroyBuffer(logicalDevice, stagingBuffer, nullptr);
93 vkFreeMemory(logicalDevice, stagingBufferMemory, nullptr);
94}
95
96void VulkanMeshResources::CreateIndexBuffer(std::vector<uint32_t> indices)
97{
98 auto logicalDevice = mRenderer->GetLogicalDevice();
99
100 VkDeviceSize bufferSize = sizeof(indices[0]) * indices.size();
101 mIndexBufferSize = static_cast<size_t>(bufferSize);
102
103 VkBuffer stagingBuffer;
104 VkDeviceMemory stagingBufferMemory;
105 mRenderer->CreateBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, stagingBuffer, stagingBufferMemory);
106
107 void* data;
108 vkMapMemory(logicalDevice, stagingBufferMemory, 0, bufferSize, 0, &data);
109 memcpy(data, indices.data(), mIndexBufferSize);
110 vkUnmapMemory(logicalDevice, stagingBufferMemory);
111
112 mRenderer->CreateBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, mIndexBuffer, mIndexBufferMemory);
113
114 mRenderer->CopyBuffer(stagingBuffer, mIndexBuffer, bufferSize);
115
116 vkDestroyBuffer(logicalDevice, stagingBuffer, nullptr);
117 vkFreeMemory(logicalDevice, stagingBufferMemory, nullptr);
118}
119
121{
122 return bIsOnGPU;
123}
124
126{
127 DeferredItem indexBuffer;
128 indexBuffer.type = DeferredType::Buffer;
129 indexBuffer.buffer = mIndexBuffer;
130 mRenderer->AddDeferredDestroy(indexBuffer);
131 mIndexBuffer = VK_NULL_HANDLE;
132
133 DeferredItem indexBufferMemory;
134 indexBufferMemory.type = DeferredType::Memory;
135 indexBufferMemory.memory = mIndexBufferMemory;
136 mRenderer->AddDeferredDestroy(indexBufferMemory);
137 mIndexBufferMemory = VK_NULL_HANDLE;
138
139 DeferredItem vertexBuffer;
140 vertexBuffer.type = DeferredType::Buffer;
141 vertexBuffer.buffer = mVertexBuffer;
142 mRenderer->AddDeferredDestroy(vertexBuffer);
143 mVertexBuffer = VK_NULL_HANDLE;
144
145 DeferredItem vertexBufferMemory;
146 vertexBufferMemory.type = DeferredType::Memory;
147 vertexBufferMemory.memory = mVertexBufferMemory;
148 mRenderer->AddDeferredDestroy(vertexBufferMemory);
149 mVertexBufferMemory = VK_NULL_HANDLE;
150
151 bIsOnGPU = false;
152}
153
155{
156 return mVertexBuffer;
157}
158
160{
161 return mIndexBuffer;
162}
163
165{
166 return mVertexBufferSize;
167}
168
170{
171 return mIndexBufferSize;
172}
173
174} // namespace rendering_engine
bool IsOnGPU() const override
Query whether buffers are currently resident on the GPU.
void Shutdown() override
Release all GPU resources associated with this mesh.
void CreateIndexBuffer(std::vector< uint32_t > indices) override
Create a GPU index buffer.
VulkanMeshResources(VulkanRenderer *renderer)
Construct Vulkan mesh resources.
size_t GetVertexBufferSize() const override
Get the size (in bytes) of the GPU vertex buffer.
size_t GetIndexBufferSize() const override
Get the size (in bytes) of the GPU index buffer.
VkBuffer GetIndexBuffer() const
Get the Vulkan index buffer handle.
void CreateVertexBuffer(std::vector< Vertex2D > vertices) override
Create a GPU vertex buffer from 2D vertex data.
VkBuffer GetVertexBuffer() const
Get the Vulkan vertex buffer handle.
Vulkan-based implementation of the IRenderer interface.
VkDevice & GetLogicalDevice()
Returns reference to the logical Vulkan device.
void CopyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size)
Copies data from one buffer to another using a temporary command buffer.
void CreateBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer &buffer, VkDeviceMemory &bufferMemory)
Creates a new Vulkan buffer with the specified usage and memory properties.
void AddDeferredDestroy(DeferredItem deferredItem)