Rendering Engine 0.2.0
Modular Graphics Rendering Engine | v0.2.0
Loading...
Searching...
No Matches
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 auto logicalDevice = mRenderer->GetLogicalDevice();
128
129 vkDestroyBuffer(logicalDevice, mIndexBuffer, nullptr);
130 vkFreeMemory(logicalDevice, mIndexBufferMemory, nullptr);
131
132 vkDestroyBuffer(logicalDevice, mVertexBuffer, nullptr);
133 vkFreeMemory(logicalDevice, mVertexBufferMemory, nullptr);
134
135 bIsOnGPU = false;
136}
137
139{
140 return mVertexBuffer;
141}
142
144{
145 return mIndexBuffer;
146}
147
149{
150 return mVertexBufferSize;
151}
152
154{
155 return mIndexBufferSize;
156}
157
158} // 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.