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);
30 vkMapMemory(logicalDevice, stagingBufferMemory, 0, bufferSize, 0, &data);
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);
37 mRenderer->
CopyBuffer(stagingBuffer, mVertexBuffer, bufferSize);
40 vkDestroyBuffer(logicalDevice, stagingBuffer,
nullptr);
41 vkFreeMemory(logicalDevice, stagingBufferMemory,
nullptr);
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);
56 vkMapMemory(logicalDevice, stagingBufferMemory, 0, bufferSize, 0, &data);
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);
63 mRenderer->
CopyBuffer(stagingBuffer, mVertexBuffer, bufferSize);
66 vkDestroyBuffer(logicalDevice, stagingBuffer,
nullptr);
67 vkFreeMemory(logicalDevice, stagingBufferMemory,
nullptr);
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);
82 vkMapMemory(logicalDevice, stagingBufferMemory, 0, bufferSize, 0, &data);
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);
89 mRenderer->
CopyBuffer(stagingBuffer, mVertexBuffer, bufferSize);
92 vkDestroyBuffer(logicalDevice, stagingBuffer,
nullptr);
93 vkFreeMemory(logicalDevice, stagingBufferMemory,
nullptr);
100 VkDeviceSize bufferSize =
sizeof(indices[0]) * indices.size();
101 mIndexBufferSize =
static_cast<size_t>(bufferSize);
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);
108 vkMapMemory(logicalDevice, stagingBufferMemory, 0, bufferSize, 0, &data);
109 memcpy(data, indices.data(), mIndexBufferSize);
110 vkUnmapMemory(logicalDevice, stagingBufferMemory);
112 mRenderer->
CreateBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, mIndexBuffer, mIndexBufferMemory);
114 mRenderer->
CopyBuffer(stagingBuffer, mIndexBuffer, bufferSize);
116 vkDestroyBuffer(logicalDevice, stagingBuffer,
nullptr);
117 vkFreeMemory(logicalDevice, stagingBufferMemory,
nullptr);
129 indexBuffer.
buffer = mIndexBuffer;
131 mIndexBuffer = VK_NULL_HANDLE;
135 indexBufferMemory.
memory = mIndexBufferMemory;
137 mIndexBufferMemory = VK_NULL_HANDLE;
141 vertexBuffer.
buffer = mVertexBuffer;
143 mVertexBuffer = VK_NULL_HANDLE;
147 vertexBufferMemory.
memory = mVertexBufferMemory;
149 mVertexBufferMemory = VK_NULL_HANDLE;
156 return mVertexBuffer;
166 return mVertexBufferSize;
171 return mIndexBufferSize;
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)