Skip to content

Commit 76cd80e

Browse files
authored
Align docu in 02_Staging_buffer.adoc with sources in 20_staging_buffer.cpp (#352)
1 parent aa561ee commit 76cd80e

2 files changed

Lines changed: 110 additions & 113 deletions

File tree

attachments/20_staging_buffer.cpp

Lines changed: 51 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,13 @@ struct Vertex
4040

4141
static vk::VertexInputBindingDescription getBindingDescription()
4242
{
43-
return {0, sizeof(Vertex), vk::VertexInputRate::eVertex};
43+
return {.binding = 0, .stride = sizeof(Vertex), .inputRate = vk::VertexInputRate::eVertex};
4444
}
4545

4646
static std::array<vk::VertexInputAttributeDescription, 2> getAttributeDescriptions()
4747
{
48-
return {
49-
vk::VertexInputAttributeDescription(0, 0, vk::Format::eR32G32Sfloat, offsetof(Vertex, pos)),
50-
vk::VertexInputAttributeDescription(1, 0, vk::Format::eR32G32B32Sfloat, offsetof(Vertex, color))};
48+
return {{{.location = 0, .binding = 0, .format = vk::Format::eR32G32Sfloat, .offset = offsetof(Vertex, pos)},
49+
{.location = 1, .binding = 0, .format = vk::Format::eR32G32B32Sfloat, .offset = offsetof(Vertex, color)}}};
5150
}
5251
};
5352

@@ -116,7 +115,7 @@ class HelloTriangleApplication
116115

117116
static void framebufferResizeCallback(GLFWwindow *window, int width, int height)
118117
{
119-
auto app = static_cast<HelloTriangleApplication *>(glfwGetWindowUserPointer(window));
118+
auto app = reinterpret_cast<HelloTriangleApplication *>(glfwGetWindowUserPointer(window));
120119
app->framebufferResized = true;
121120
}
122121

@@ -236,7 +235,7 @@ class HelloTriangleApplication
236235
vk::DebugUtilsMessageSeverityFlagsEXT severityFlags(vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning |
237236
vk::DebugUtilsMessageSeverityFlagBitsEXT::eError);
238237
vk::DebugUtilsMessageTypeFlagsEXT messageTypeFlags(
239-
vk::DebugUtilsMessageTypeFlagBitsEXT::eGeneral | vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance | vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation);
238+
vk::DebugUtilsMessageTypeFlagBitsEXT::eGeneral | vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance | vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation);
240239
vk::DebugUtilsMessengerCreateInfoEXT debugUtilsMessengerCreateInfoEXT{.messageSeverity = severityFlags,
241240
.messageType = messageTypeFlags,
242241
.pfnUserCallback = &debugCallback};
@@ -278,6 +277,7 @@ class HelloTriangleApplication
278277
vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>();
279278
bool supportsRequiredFeatures = features.template get<vk::PhysicalDeviceVulkan11Features>().shaderDrawParameters &&
280279
features.template get<vk::PhysicalDeviceVulkan13Features>().dynamicRendering &&
280+
features.template get<vk::PhysicalDeviceVulkan13Features>().synchronization2 &&
281281
features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState;
282282

283283
// Return true if the physicalDevice meets all the criteria
@@ -316,12 +316,16 @@ class HelloTriangleApplication
316316
}
317317

318318
// query for required features (Vulkan 1.1 and 1.3)
319-
vk::StructureChain<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan11Features, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT> featureChain = {
320-
{}, // vk::PhysicalDeviceFeatures2
321-
{.shaderDrawParameters = true}, // vk::PhysicalDeviceVulkan11Features
322-
{.synchronization2 = true, .dynamicRendering = true}, // vk::PhysicalDeviceVulkan13Features
323-
{.extendedDynamicState = true} // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT
324-
};
319+
vk::StructureChain<vk::PhysicalDeviceFeatures2,
320+
vk::PhysicalDeviceVulkan11Features,
321+
vk::PhysicalDeviceVulkan13Features,
322+
vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>
323+
featureChain = {
324+
{}, // vk::PhysicalDeviceFeatures2
325+
{.shaderDrawParameters = true}, // vk::PhysicalDeviceVulkan11Features
326+
{.synchronization2 = true, .dynamicRendering = true}, // vk::PhysicalDeviceVulkan13Features
327+
{.extendedDynamicState = true} // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT
328+
};
325329

326330
// create a Device
327331
float queuePriority = 0.5f;
@@ -389,7 +393,10 @@ class HelloTriangleApplication
389393

390394
auto bindingDescription = Vertex::getBindingDescription();
391395
auto attributeDescriptions = Vertex::getAttributeDescriptions();
392-
vk::PipelineVertexInputStateCreateInfo vertexInputInfo{.vertexBindingDescriptionCount = 1, .pVertexBindingDescriptions = &bindingDescription, .vertexAttributeDescriptionCount = static_cast<uint32_t>(attributeDescriptions.size()), .pVertexAttributeDescriptions = attributeDescriptions.data()};
396+
vk::PipelineVertexInputStateCreateInfo vertexInputInfo{.vertexBindingDescriptionCount = 1,
397+
.pVertexBindingDescriptions = &bindingDescription,
398+
.vertexAttributeDescriptionCount = static_cast<uint32_t>(attributeDescriptions.size()),
399+
.pVertexAttributeDescriptions = attributeDescriptions.data()};
393400
vk::PipelineInputAssemblyStateCreateInfo inputAssembly{.topology = vk::PrimitiveTopology::eTriangleList};
394401
vk::PipelineViewportStateCreateInfo viewportState{.viewportCount = 1, .scissorCount = 1};
395402

@@ -440,36 +447,39 @@ class HelloTriangleApplication
440447
commandPool = vk::raii::CommandPool(device, poolInfo);
441448
}
442449

443-
void createVertexBuffer()
450+
std::pair<vk::raii::Buffer, vk::raii::DeviceMemory> createBuffer(vk::DeviceSize size, vk::BufferUsageFlags usage, vk::MemoryPropertyFlags properties)
444451
{
445-
vk::BufferCreateInfo stagingInfo{.size = sizeof(vertices[0]) * vertices.size(), .usage = vk::BufferUsageFlagBits::eTransferSrc, .sharingMode = vk::SharingMode::eExclusive};
446-
vk::raii::Buffer stagingBuffer(device, stagingInfo);
447-
vk::MemoryRequirements memRequirementsStaging = stagingBuffer.getMemoryRequirements();
448-
vk::MemoryAllocateInfo memoryAllocateInfoStaging{.allocationSize = memRequirementsStaging.size, .memoryTypeIndex = findMemoryType(memRequirementsStaging.memoryTypeBits, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent)};
449-
vk::raii::DeviceMemory stagingBufferMemory(device, memoryAllocateInfoStaging);
452+
vk::BufferCreateInfo bufferInfo{.size = size, .usage = usage, .sharingMode = vk::SharingMode::eExclusive};
453+
vk::raii::Buffer buffer = vk::raii::Buffer(device, bufferInfo);
454+
vk::MemoryRequirements memRequirements = buffer.getMemoryRequirements();
455+
vk::MemoryAllocateInfo allocInfo{.allocationSize = memRequirements.size, .memoryTypeIndex = findMemoryType(memRequirements.memoryTypeBits, properties)};
456+
vk::raii::DeviceMemory bufferMemory = vk::raii::DeviceMemory(device, allocInfo);
457+
buffer.bindMemory(*bufferMemory, 0);
458+
return {std::move(buffer), std::move(bufferMemory)};
459+
}
450460

451-
stagingBuffer.bindMemory(stagingBufferMemory, 0);
452-
void *dataStaging = stagingBufferMemory.mapMemory(0, stagingInfo.size);
453-
memcpy(dataStaging, vertices.data(), stagingInfo.size);
454-
stagingBufferMemory.unmapMemory();
461+
void createVertexBuffer()
462+
{
463+
vk::DeviceSize bufferSize = sizeof(vertices[0]) * vertices.size();
455464

456-
vk::BufferCreateInfo bufferInfo{.size = sizeof(vertices[0]) * vertices.size(), .usage = vk::BufferUsageFlagBits::eVertexBuffer | vk::BufferUsageFlagBits::eTransferDst, .sharingMode = vk::SharingMode::eExclusive};
457-
vertexBuffer = vk::raii::Buffer(device, bufferInfo);
465+
auto [stagingBuffer, stagingBufferMemory] =
466+
createBuffer(bufferSize, vk::BufferUsageFlagBits::eTransferSrc, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent);
458467

459-
vk::MemoryRequirements memRequirements = vertexBuffer.getMemoryRequirements();
460-
vk::MemoryAllocateInfo memoryAllocateInfo{.allocationSize = memRequirements.size, .memoryTypeIndex = findMemoryType(memRequirements.memoryTypeBits, vk::MemoryPropertyFlagBits::eDeviceLocal)};
461-
vertexBufferMemory = vk::raii::DeviceMemory(device, memoryAllocateInfo);
468+
void *dataStaging = stagingBufferMemory.mapMemory(0, bufferSize);
469+
memcpy(dataStaging, vertices.data(), bufferSize);
470+
stagingBufferMemory.unmapMemory();
462471

463-
vertexBuffer.bindMemory(*vertexBufferMemory, 0);
472+
std::tie(vertexBuffer, vertexBufferMemory) =
473+
createBuffer(bufferSize, vk::BufferUsageFlagBits::eVertexBuffer | vk::BufferUsageFlagBits::eTransferDst, vk::MemoryPropertyFlagBits::eDeviceLocal);
464474

465-
copyBuffer(stagingBuffer, vertexBuffer, stagingInfo.size);
475+
copyBuffer(stagingBuffer, vertexBuffer, bufferSize);
466476
}
467477

468478
void copyBuffer(vk::raii::Buffer &srcBuffer, vk::raii::Buffer &dstBuffer, vk::DeviceSize size)
469479
{
470480
vk::CommandBufferAllocateInfo allocInfo{.commandPool = commandPool, .level = vk::CommandBufferLevel::ePrimary, .commandBufferCount = 1};
471481
vk::raii::CommandBuffer commandCopyBuffer = std::move(device.allocateCommandBuffers(allocInfo).front());
472-
commandCopyBuffer.begin(vk::CommandBufferBeginInfo{.flags = vk::CommandBufferUsageFlagBits::eOneTimeSubmit});
482+
commandCopyBuffer.begin({.flags = vk::CommandBufferUsageFlagBits::eOneTimeSubmit});
473483
commandCopyBuffer.copyBuffer(*srcBuffer, *dstBuffer, vk::BufferCopy(0, 0, size));
474484
commandCopyBuffer.end();
475485
queue.submit(vk::SubmitInfo{.commandBufferCount = 1, .pCommandBuffers = &*commandCopyBuffer}, nullptr);
@@ -502,7 +512,8 @@ class HelloTriangleApplication
502512
{
503513
auto &commandBuffer = commandBuffers[frameIndex];
504514
commandBuffer.begin({});
505-
// Before starting rendering, transition the swapchain image to COLOR_ATTACHMENT_OPTIMAL
515+
516+
// Before starting rendering, transition the swapchain image to vk::ImageLayout::eColorAttachmentOptimal
506517
transition_image_layout(
507518
imageIndex,
508519
vk::ImageLayout::eUndefined,
@@ -529,9 +540,10 @@ class HelloTriangleApplication
529540
commandBuffer.setViewport(0, vk::Viewport(0.0f, 0.0f, static_cast<float>(swapChainExtent.width), static_cast<float>(swapChainExtent.height), 0.0f, 1.0f));
530541
commandBuffer.setScissor(0, vk::Rect2D(vk::Offset2D(0, 0), swapChainExtent));
531542
commandBuffer.bindVertexBuffers(0, *vertexBuffer, {0});
532-
commandBuffer.draw(3, 1, 0, 0);
543+
commandBuffer.draw(static_cast<uint32_t>(vertices.size()), 1, 0, 0);
533544
commandBuffer.endRendering();
534-
// After rendering, transition the swapchain image to PRESENT_SRC
545+
546+
// After rendering, transition the swapchain image to vk::ImageLayout::ePresentSrcKHR
535547
transition_image_layout(
536548
imageIndex,
537549
vk::ImageLayout::eColorAttachmentOptimal,
@@ -564,11 +576,11 @@ class HelloTriangleApplication
564576
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
565577
.image = swapChainImages[imageIndex],
566578
.subresourceRange = {
567-
.aspectMask = vk::ImageAspectFlagBits::eColor,
568-
.baseMipLevel = 0,
569-
.levelCount = 1,
570-
.baseArrayLayer = 0,
571-
.layerCount = 1}};
579+
.aspectMask = vk::ImageAspectFlagBits::eColor,
580+
.baseMipLevel = 0,
581+
.levelCount = 1,
582+
.baseArrayLayer = 0,
583+
.layerCount = 1}};
572584
vk::DependencyInfo dependency_info = {
573585
.dependencyFlags = {},
574586
.imageMemoryBarrierCount = 1,

0 commit comments

Comments
 (0)