From 01893a1f1e00e6cb7fc282066d110de0995f26f2 Mon Sep 17 00:00:00 2001
From: blazQ
Date: Sun, 22 Mar 2026 12:35:33 +0100
Subject: [PATCH] Making use of the createBuffer abstraction in the Stabing
Buffer section of the Vertex Buffer chapter
---
en/04_Vertex_buffers/02_Staging_buffer.adoc | 36 +++++----------------
1 file changed, 8 insertions(+), 28 deletions(-)
diff --git a/en/04_Vertex_buffers/02_Staging_buffer.adoc b/en/04_Vertex_buffers/02_Staging_buffer.adoc
index e9dd93bc..ed02aa49 100644
--- a/en/04_Vertex_buffers/02_Staging_buffer.adoc
+++ b/en/04_Vertex_buffers/02_Staging_buffer.adoc
@@ -70,36 +70,23 @@ We're now going to change `createVertexBuffer` to only use a host visible buffer
----
void createVertexBuffer() {
vk::DeviceSize bufferSize = sizeof(vertices[0]) * vertices.size();
+ vk::raii::Buffer stagingBuffer(nullptr);
+ vk::raii::DeviceMemory stagingBufferMemory(nullptr);
- vk::BufferCreateInfo stagingInfo{ .size = bufferSize, .usage = vk::BufferUsageFlagBits::eTransferSrc, .sharingMode = vk::SharingMode::eExclusive };
- vk::raii::Buffer stagingBuffer(device, stagingInfo);
- vk::MemoryRequirements memRequirementsStaging = stagingBuffer.getMemoryRequirements();
- vk::MemoryAllocateInfo memoryAllocateInfoStaging{ .allocationSize = memRequirementsStaging.size, .memoryTypeIndex = findMemoryType(memRequirementsStaging.memoryTypeBits, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent) };
- vk::raii::DeviceMemory stagingBufferMemory(device, memoryAllocateInfoStaging);
+ createBuffer(bufferSize, vk::BufferUsageFlagBits::eTransferSrc, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent, stagingBuffer, stagingBufferMemory);
- stagingBuffer.bindMemory(stagingBufferMemory, 0);
- void* dataStaging = stagingBufferMemory.mapMemory(0, stagingInfo.size);
- memcpy(dataStaging, vertices.data(), stagingInfo.size);
+ void* data = stagingBufferMemory.mapMemory(0, bufferSize);
+ memcpy(data, vertices.data(), bufferSize);
stagingBufferMemory.unmapMemory();
- vk::BufferCreateInfo bufferInfo{ .size = bufferSize, .usage = vk::BufferUsageFlagBits::eVertexBuffer | vk::BufferUsageFlagBits::eTransferDst, .sharingMode = vk::SharingMode::eExclusive };
- vertexBuffer = vk::raii::Buffer(device, bufferInfo);
+ createBuffer(bufferSize, vk::BufferUsageFlagBits::eTransferDst | vk::BufferUsageFlagBits::eVertexBuffer, vk::MemoryPropertyFlagBits::eDeviceLocal, vertexBuffer, vertexBufferMemory);
- vk::MemoryRequirements memRequirements = vertexBuffer.getMemoryRequirements();
- vk::MemoryAllocateInfo memoryAllocateInfo{ .allocationSize = memRequirements.size, .memoryTypeIndex = findMemoryType(memRequirements.memoryTypeBits, vk::MemoryPropertyFlagBits::eDeviceLocal) };
- vertexBufferMemory = vk::raii::DeviceMemory( device, memoryAllocateInfo );
-
- vertexBuffer.bindMemory( *vertexBufferMemory, 0 );
-
- copyBuffer(stagingBuffer, vertexBuffer, stagingInfo.size);
+ copyBuffer(stagingBuffer, vertexBuffer, bufferSize);
}
----
We're now using a new `stagingBuffer` with `stagingBufferMemory` for mapping and copying the vertex data.
In this chapter, we're going to use two new buffer usage flags:
-Note, we have to create a temporary pointer to a new vk::raii::Buffer object
-because the vk::raii::Buffer has the constructor deleted and thus doesn't
-play well with std::make_unique, this is just a trick to get it to work.
* `VK_BUFFER_USAGE_TRANSFER_SRC_BIT`: Buffer can be used as source in a memory transfer operation.
* `VK_BUFFER_USAGE_TRANSFER_DST_BIT`: Buffer can be used as destination in a memory transfer operation.
@@ -175,14 +162,7 @@ We can now call `copyBuffer` from the `createVertexBuffer` function to move the
[,c++]
----
-vk::BufferCreateInfo bufferInfo{ .size = bufferSize, .usage = vk::BufferUsageFlagBits::eVertexBuffer | vk::BufferUsageFlagBits::eTransferDst, .sharingMode = vk::SharingMode::eExclusive };
-vertexBuffer = vk::raii::Buffer(device, bufferInfo);
-
-vk::MemoryRequirements memRequirements = vertexBuffer.getMemoryRequirements();
-vk::MemoryAllocateInfo memoryAllocateInfo{ .allocationSize = memRequirements.size, .memoryTypeIndex = findMemoryType(memRequirements.memoryTypeBits, vk::MemoryPropertyFlagBits::eDeviceLocal) };
-vertexBufferMemory = vk::raii::DeviceMemory( device, memoryAllocateInfo );
-
-vertexBuffer.bindMemory( *vertexBufferMemory, 0 );
+createBuffer(bufferSize, vk::BufferUsageFlagBits::eTransferDst | vk::BufferUsageFlagBits::eVertexBuffer, vk::MemoryPropertyFlagBits::eDeviceLocal, vertexBuffer, vertexBufferMemory);
copyBuffer(stagingBuffer, vertexBuffer, bufferSize);
----