Rendering Engine 0.2.9
Modular Graphics Rendering Engine | v0.2.9
rendering_engine::VulkanMeshResources Class Reference

Vulkan implementation of the mesh GPU resource interface. More...

#include <vulkan_mesh_resources.hpp>

Inherits rendering_engine::IMeshRenderResources.

Public Member Functions

 VulkanMeshResources (VulkanRenderer *renderer)
 Construct Vulkan mesh resources. More...
 
void CreateVertexBuffer (std::vector< Vertex2D > vertices) override
 Create a GPU vertex buffer from 2D vertex data. More...
 
void CreateVertexBuffer (std::vector< VertexPositionColorTexture > vertices) override
 Create a GPU vertex buffer from 3D unlit vertex data. More...
 
void CreateVertexBuffer (std::vector< VertexPositionColorTextureNormalTangent > vertices) override
 Create a GPU vertex buffer from 3D lit vertex data. More...
 
void CreateIndexBuffer (std::vector< uint32_t > indices) override
 Create a GPU index buffer. More...
 
bool IsOnGPU () const override
 Query whether buffers are currently resident on the GPU. More...
 
void Shutdown () override
 Release all GPU resources associated with this mesh. More...
 
VkBuffer GetVertexBuffer () const
 Get the Vulkan vertex buffer handle. More...
 
VkBuffer GetIndexBuffer () const
 Get the Vulkan index buffer handle. More...
 
size_t GetVertexBufferSize () const override
 Get the size (in bytes) of the GPU vertex buffer. More...
 
size_t GetIndexBufferSize () const override
 Get the size (in bytes) of the GPU index buffer. More...
 
- Public Member Functions inherited from rendering_engine::IMeshRenderResources
virtual ~IMeshRenderResources ()=default
 Virtual destructor. More...
 
virtual void CreateVertexBuffer (std::vector< Vertex2D > vertices)=0
 Create a GPU vertex buffer from 2D vertex data. More...
 
virtual void CreateVertexBuffer (std::vector< VertexPositionColorTexture > vertices)=0
 Create a GPU vertex buffer from 3D unlit vertex data. More...
 
virtual void CreateVertexBuffer (std::vector< VertexPositionColorTextureNormalTangent > vertices)=0
 Create a GPU vertex buffer from 3D lit vertex data. More...
 
virtual void CreateIndexBuffer (std::vector< uint32_t > indices)=0
 Create a GPU index buffer. More...
 
virtual bool IsOnGPU () const =0
 Check if the buffers are currently resident on the GPU. More...
 
virtual void Shutdown ()=0
 Release all GPU resources associated with this mesh. More...
 
virtual size_t GetVertexBufferSize () const =0
 Get the size (in bytes) of the GPU vertex buffer. More...
 
virtual size_t GetIndexBufferSize () const =0
 Get the size (in bytes) of the GPU index buffer. More...
 

Detailed Description

Vulkan implementation of the mesh GPU resource interface.

Manages Vulkan buffers and device memory for mesh vertex and index data. Supports multiple vertex types and provides direct access to underlying VkBuffer handles.

Definition at line 22 of file vulkan_mesh_resources.hpp.

Constructor & Destructor Documentation

◆ VulkanMeshResources()

rendering_engine::VulkanMeshResources::VulkanMeshResources ( VulkanRenderer renderer)

Construct Vulkan mesh resources.

Parameters
rendererPointer to the owning VulkanRenderer.

Definition at line 9 of file vulkan_mesh_resources.cpp.

10 :
11 mRenderer(renderer),
12 bIsOnGPU(false),
13 mVertexBufferSize(0),
14 mIndexBufferSize(0)
15{
16}

Member Function Documentation

◆ CreateIndexBuffer()

void rendering_engine::VulkanMeshResources::CreateIndexBuffer ( std::vector< uint32_t >  indices)
overridevirtual

Create a GPU index buffer.

Parameters
indicesVector of indices.

Implements rendering_engine::IMeshRenderResources.

Definition at line 96 of file vulkan_mesh_resources.cpp.

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}
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.

◆ CreateVertexBuffer() [1/3]

void rendering_engine::VulkanMeshResources::CreateVertexBuffer ( std::vector< Vertex2D vertices)
overridevirtual

Create a GPU vertex buffer from 2D vertex data.

Parameters
verticesVector of 2D vertex data.

Implements rendering_engine::IMeshRenderResources.

Definition at line 18 of file vulkan_mesh_resources.cpp.

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}

◆ CreateVertexBuffer() [2/3]

void rendering_engine::VulkanMeshResources::CreateVertexBuffer ( std::vector< VertexPositionColorTexture vertices)
overridevirtual

Create a GPU vertex buffer from 3D unlit vertex data.

Parameters
verticesVector of VertexPositionColorTexture data.

Implements rendering_engine::IMeshRenderResources.

Definition at line 44 of file vulkan_mesh_resources.cpp.

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}

◆ CreateVertexBuffer() [3/3]

void rendering_engine::VulkanMeshResources::CreateVertexBuffer ( std::vector< VertexPositionColorTextureNormalTangent vertices)
overridevirtual

Create a GPU vertex buffer from 3D lit vertex data.

Parameters
verticesVector of VertexPositionColorTextureNormalTangent data.

Implements rendering_engine::IMeshRenderResources.

Definition at line 70 of file vulkan_mesh_resources.cpp.

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}

◆ GetIndexBuffer()

VkBuffer rendering_engine::VulkanMeshResources::GetIndexBuffer ( ) const

Get the Vulkan index buffer handle.

Returns
VkBuffer handle for the index buffer.

Definition at line 159 of file vulkan_mesh_resources.cpp.

160{
161 return mIndexBuffer;
162}

◆ GetIndexBufferSize()

size_t rendering_engine::VulkanMeshResources::GetIndexBufferSize ( ) const
inlineoverridevirtual

Get the size (in bytes) of the GPU index buffer.

Returns
Size in bytes of the index buffer.

Implements rendering_engine::IMeshRenderResources.

Definition at line 169 of file vulkan_mesh_resources.cpp.

170{
171 return mIndexBufferSize;
172}

◆ GetVertexBuffer()

VkBuffer rendering_engine::VulkanMeshResources::GetVertexBuffer ( ) const

Get the Vulkan vertex buffer handle.

Returns
VkBuffer handle for the vertex buffer.

Definition at line 154 of file vulkan_mesh_resources.cpp.

155{
156 return mVertexBuffer;
157}

◆ GetVertexBufferSize()

size_t rendering_engine::VulkanMeshResources::GetVertexBufferSize ( ) const
inlineoverridevirtual

Get the size (in bytes) of the GPU vertex buffer.

Returns
Size in bytes of the vertex buffer.

Implements rendering_engine::IMeshRenderResources.

Definition at line 164 of file vulkan_mesh_resources.cpp.

165{
166 return mVertexBufferSize;
167}

◆ IsOnGPU()

bool rendering_engine::VulkanMeshResources::IsOnGPU ( ) const
inlineoverridevirtual

Query whether buffers are currently resident on the GPU.

Returns
True if buffers are allocated and uploaded, false otherwise.

Implements rendering_engine::IMeshRenderResources.

Definition at line 120 of file vulkan_mesh_resources.cpp.

121{
122 return bIsOnGPU;
123}

◆ Shutdown()

void rendering_engine::VulkanMeshResources::Shutdown ( )
overridevirtual

Release all GPU resources associated with this mesh.

Implements rendering_engine::IMeshRenderResources.

Definition at line 125 of file vulkan_mesh_resources.cpp.

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}
void AddDeferredDestroy(DeferredItem deferredItem)

The documentation for this class was generated from the following files: