Skip to content

Commit 960751f

Browse files
committed
Align docu in 00_Descriptor_set_layout_and_buffer.adoc and sources in 22_descriptor_layout.cpp
1 parent aa561ee commit 960751f

2 files changed

Lines changed: 116 additions & 126 deletions

File tree

attachments/22_descriptor_layout.cpp

Lines changed: 60 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,13 @@ struct Vertex
4444

4545
static vk::VertexInputBindingDescription getBindingDescription()
4646
{
47-
return {0, sizeof(Vertex), vk::VertexInputRate::eVertex};
47+
return {.binding = 0, .stride = sizeof(Vertex), .inputRate = vk::VertexInputRate::eVertex};
4848
}
4949

5050
static std::array<vk::VertexInputAttributeDescription, 2> getAttributeDescriptions()
5151
{
52-
return {
53-
vk::VertexInputAttributeDescription(0, 0, vk::Format::eR32G32Sfloat, offsetof(Vertex, pos)),
54-
vk::VertexInputAttributeDescription(1, 0, vk::Format::eR32G32B32Sfloat, offsetof(Vertex, color))};
52+
return {{{.location = 0, .binding = 0, .format = vk::Format::eR32G32Sfloat, .offset = offsetof(Vertex, pos)},
53+
{.location = 1, .binding = 0, .format = vk::Format::eR32G32B32Sfloat, .offset = offsetof(Vertex, color)}}};
5554
}
5655
};
5756

@@ -138,7 +137,7 @@ class HelloTriangleApplication
138137

139138
static void framebufferResizeCallback(GLFWwindow *window, int width, int height)
140139
{
141-
auto app = static_cast<HelloTriangleApplication *>(glfwGetWindowUserPointer(window));
140+
auto app = reinterpret_cast<HelloTriangleApplication *>(glfwGetWindowUserPointer(window));
142141
app->framebufferResized = true;
143142
}
144143

@@ -261,7 +260,7 @@ class HelloTriangleApplication
261260
vk::DebugUtilsMessageSeverityFlagsEXT severityFlags(vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning |
262261
vk::DebugUtilsMessageSeverityFlagBitsEXT::eError);
263262
vk::DebugUtilsMessageTypeFlagsEXT messageTypeFlags(
264-
vk::DebugUtilsMessageTypeFlagBitsEXT::eGeneral | vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance | vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation);
263+
vk::DebugUtilsMessageTypeFlagBitsEXT::eGeneral | vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance | vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation);
265264
vk::DebugUtilsMessengerCreateInfoEXT debugUtilsMessengerCreateInfoEXT{.messageSeverity = severityFlags,
266265
.messageType = messageTypeFlags,
267266
.pfnUserCallback = &debugCallback};
@@ -303,6 +302,7 @@ class HelloTriangleApplication
303302
vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>();
304303
bool supportsRequiredFeatures = features.template get<vk::PhysicalDeviceVulkan11Features>().shaderDrawParameters &&
305304
features.template get<vk::PhysicalDeviceVulkan13Features>().dynamicRendering &&
305+
features.template get<vk::PhysicalDeviceVulkan13Features>().synchronization2 &&
306306
features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState;
307307

308308
// Return true if the physicalDevice meets all the criteria
@@ -341,12 +341,16 @@ class HelloTriangleApplication
341341
}
342342

343343
// query for required features (Vulkan 1.1 and 1.3)
344-
vk::StructureChain<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan11Features, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT> featureChain = {
345-
{}, // vk::PhysicalDeviceFeatures2
346-
{.shaderDrawParameters = true}, // vk::PhysicalDeviceVulkan11Features
347-
{.synchronization2 = true, .dynamicRendering = true}, // vk::PhysicalDeviceVulkan13Features
348-
{.extendedDynamicState = true} // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT
349-
};
344+
vk::StructureChain<vk::PhysicalDeviceFeatures2,
345+
vk::PhysicalDeviceVulkan11Features,
346+
vk::PhysicalDeviceVulkan13Features,
347+
vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>
348+
featureChain = {
349+
{}, // vk::PhysicalDeviceFeatures2
350+
{.shaderDrawParameters = true}, // vk::PhysicalDeviceVulkan11Features
351+
{.synchronization2 = true, .dynamicRendering = true}, // vk::PhysicalDeviceVulkan13Features
352+
{.extendedDynamicState = true} // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT
353+
};
350354

351355
// create a Device
352356
float queuePriority = 0.5f;
@@ -406,7 +410,8 @@ class HelloTriangleApplication
406410

407411
void createDescriptorSetLayout()
408412
{
409-
vk::DescriptorSetLayoutBinding uboLayoutBinding(0, vk::DescriptorType::eUniformBuffer, 1, vk::ShaderStageFlagBits::eVertex, nullptr);
413+
vk::DescriptorSetLayoutBinding uboLayoutBinding{
414+
.binding = 0, .descriptorType = vk::DescriptorType::eUniformBuffer, .descriptorCount = 1, .stageFlags = vk::ShaderStageFlagBits::eVertex};
410415
vk::DescriptorSetLayoutCreateInfo layoutInfo{.bindingCount = 1, .pBindings = &uboLayoutBinding};
411416
descriptorSetLayout = vk::raii::DescriptorSetLayout(device, layoutInfo);
412417
}
@@ -421,7 +426,10 @@ class HelloTriangleApplication
421426

422427
auto bindingDescription = Vertex::getBindingDescription();
423428
auto attributeDescriptions = Vertex::getAttributeDescriptions();
424-
vk::PipelineVertexInputStateCreateInfo vertexInputInfo{.vertexBindingDescriptionCount = 1, .pVertexBindingDescriptions = &bindingDescription, .vertexAttributeDescriptionCount = static_cast<uint32_t>(attributeDescriptions.size()), .pVertexAttributeDescriptions = attributeDescriptions.data()};
429+
vk::PipelineVertexInputStateCreateInfo vertexInputInfo{.vertexBindingDescriptionCount = 1,
430+
.pVertexBindingDescriptions = &bindingDescription,
431+
.vertexAttributeDescriptionCount = static_cast<uint32_t>(attributeDescriptions.size()),
432+
.pVertexAttributeDescriptions = attributeDescriptions.data()};
425433
vk::PipelineInputAssemblyStateCreateInfo inputAssembly{.topology = vk::PrimitiveTopology::eTriangleList};
426434
vk::PipelineViewportStateCreateInfo viewportState{.viewportCount = 1, .scissorCount = 1};
427435

@@ -445,7 +453,7 @@ class HelloTriangleApplication
445453
std::vector<vk::DynamicState> dynamicStates = {vk::DynamicState::eViewport, vk::DynamicState::eScissor};
446454
vk::PipelineDynamicStateCreateInfo dynamicState{.dynamicStateCount = static_cast<uint32_t>(dynamicStates.size()), .pDynamicStates = dynamicStates.data()};
447455

448-
vk::PipelineLayoutCreateInfo pipelineLayoutInfo{.setLayoutCount = 0, .pushConstantRangeCount = 0};
456+
vk::PipelineLayoutCreateInfo pipelineLayoutInfo{.setLayoutCount = 1, .pSetLayouts = &*descriptorSetLayout, .pushConstantRangeCount = 0};
449457
pipelineLayout = vk::raii::PipelineLayout(device, pipelineLayoutInfo);
450458

451459
vk::StructureChain<vk::GraphicsPipelineCreateInfo, vk::PipelineRenderingCreateInfo> pipelineCreateInfoChain = {
@@ -472,18 +480,30 @@ class HelloTriangleApplication
472480
commandPool = vk::raii::CommandPool(device, poolInfo);
473481
}
474482

483+
std::pair<vk::raii::Buffer, vk::raii::DeviceMemory> createBuffer(vk::DeviceSize size, vk::BufferUsageFlags usage, vk::MemoryPropertyFlags properties)
484+
{
485+
vk::BufferCreateInfo bufferInfo{.size = size, .usage = usage, .sharingMode = vk::SharingMode::eExclusive};
486+
vk::raii::Buffer buffer = vk::raii::Buffer(device, bufferInfo);
487+
vk::MemoryRequirements memRequirements = buffer.getMemoryRequirements();
488+
vk::MemoryAllocateInfo allocInfo{.allocationSize = memRequirements.size, .memoryTypeIndex = findMemoryType(memRequirements.memoryTypeBits, properties)};
489+
vk::raii::DeviceMemory bufferMemory = vk::raii::DeviceMemory(device, allocInfo);
490+
buffer.bindMemory(*bufferMemory, 0);
491+
return {std::move(buffer), std::move(bufferMemory)};
492+
}
493+
475494
void createVertexBuffer()
476495
{
477-
vk::DeviceSize bufferSize = sizeof(vertices[0]) * vertices.size();
478-
vk::raii::Buffer stagingBuffer({});
479-
vk::raii::DeviceMemory stagingBufferMemory({});
480-
createBuffer(bufferSize, vk::BufferUsageFlagBits::eTransferSrc, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent, stagingBuffer, stagingBufferMemory);
496+
vk::DeviceSize bufferSize = sizeof(vertices[0]) * vertices.size();
497+
498+
auto [stagingBuffer, stagingBufferMemory] =
499+
createBuffer(bufferSize, vk::BufferUsageFlagBits::eTransferSrc, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent);
481500

482501
void *dataStaging = stagingBufferMemory.mapMemory(0, bufferSize);
483502
memcpy(dataStaging, vertices.data(), bufferSize);
484503
stagingBufferMemory.unmapMemory();
485504

486-
createBuffer(bufferSize, vk::BufferUsageFlagBits::eTransferDst | vk::BufferUsageFlagBits::eVertexBuffer, vk::MemoryPropertyFlagBits::eDeviceLocal, vertexBuffer, vertexBufferMemory);
505+
std::tie(vertexBuffer, vertexBufferMemory) =
506+
createBuffer(bufferSize, vk::BufferUsageFlagBits::eVertexBuffer | vk::BufferUsageFlagBits::eTransferDst, vk::MemoryPropertyFlagBits::eDeviceLocal);
487507

488508
copyBuffer(stagingBuffer, vertexBuffer, bufferSize);
489509
}
@@ -492,52 +512,37 @@ class HelloTriangleApplication
492512
{
493513
vk::DeviceSize bufferSize = sizeof(indices[0]) * indices.size();
494514

495-
vk::raii::Buffer stagingBuffer({});
496-
vk::raii::DeviceMemory stagingBufferMemory({});
497-
createBuffer(bufferSize, vk::BufferUsageFlagBits::eTransferSrc, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent, stagingBuffer, stagingBufferMemory);
515+
auto [stagingBuffer, stagingBufferMemory] =
516+
createBuffer(bufferSize, vk::BufferUsageFlagBits::eTransferSrc, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent);
498517

499518
void *data = stagingBufferMemory.mapMemory(0, bufferSize);
500519
memcpy(data, indices.data(), (size_t) bufferSize);
501520
stagingBufferMemory.unmapMemory();
502521

503-
createBuffer(bufferSize, vk::BufferUsageFlagBits::eTransferDst | vk::BufferUsageFlagBits::eIndexBuffer, vk::MemoryPropertyFlagBits::eDeviceLocal, indexBuffer, indexBufferMemory);
522+
std::tie(indexBuffer, indexBufferMemory) =
523+
createBuffer(bufferSize, vk::BufferUsageFlagBits::eIndexBuffer | vk::BufferUsageFlagBits::eTransferDst, vk::MemoryPropertyFlagBits::eDeviceLocal);
504524

505525
copyBuffer(stagingBuffer, indexBuffer, bufferSize);
506526
}
507527

508528
void createUniformBuffers()
509529
{
510-
uniformBuffers.clear();
511-
uniformBuffersMemory.clear();
512-
uniformBuffersMapped.clear();
513-
514530
for (size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++)
515531
{
516532
vk::DeviceSize bufferSize = sizeof(UniformBufferObject);
517-
vk::raii::Buffer buffer({});
518-
vk::raii::DeviceMemory bufferMem({});
519-
createBuffer(bufferSize, vk::BufferUsageFlagBits::eUniformBuffer, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent, buffer, bufferMem);
533+
auto [buffer, bufferMem] = createBuffer(
534+
bufferSize, vk::BufferUsageFlagBits::eUniformBuffer, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent);
520535
uniformBuffers.emplace_back(std::move(buffer));
521536
uniformBuffersMemory.emplace_back(std::move(bufferMem));
522-
uniformBuffersMapped.emplace_back(uniformBuffersMemory[i].mapMemory(0, bufferSize));
537+
uniformBuffersMapped.emplace_back(uniformBuffersMemory.back().mapMemory(0, bufferSize));
523538
}
524539
}
525540

526-
void createBuffer(vk::DeviceSize size, vk::BufferUsageFlags usage, vk::MemoryPropertyFlags properties, vk::raii::Buffer &buffer, vk::raii::DeviceMemory &bufferMemory)
527-
{
528-
vk::BufferCreateInfo bufferInfo{.size = size, .usage = usage, .sharingMode = vk::SharingMode::eExclusive};
529-
buffer = vk::raii::Buffer(device, bufferInfo);
530-
vk::MemoryRequirements memRequirements = buffer.getMemoryRequirements();
531-
vk::MemoryAllocateInfo allocInfo{.allocationSize = memRequirements.size, .memoryTypeIndex = findMemoryType(memRequirements.memoryTypeBits, properties)};
532-
bufferMemory = vk::raii::DeviceMemory(device, allocInfo);
533-
buffer.bindMemory(bufferMemory, 0);
534-
}
535-
536541
void copyBuffer(vk::raii::Buffer &srcBuffer, vk::raii::Buffer &dstBuffer, vk::DeviceSize size)
537542
{
538543
vk::CommandBufferAllocateInfo allocInfo{.commandPool = commandPool, .level = vk::CommandBufferLevel::ePrimary, .commandBufferCount = 1};
539544
vk::raii::CommandBuffer commandCopyBuffer = std::move(device.allocateCommandBuffers(allocInfo).front());
540-
commandCopyBuffer.begin(vk::CommandBufferBeginInfo{.flags = vk::CommandBufferUsageFlagBits::eOneTimeSubmit});
545+
commandCopyBuffer.begin({.flags = vk::CommandBufferUsageFlagBits::eOneTimeSubmit});
541546
commandCopyBuffer.copyBuffer(*srcBuffer, *dstBuffer, vk::BufferCopy(0, 0, size));
542547
commandCopyBuffer.end();
543548
queue.submit(vk::SubmitInfo{.commandBufferCount = 1, .pCommandBuffers = &*commandCopyBuffer}, nullptr);
@@ -570,7 +575,8 @@ class HelloTriangleApplication
570575
{
571576
auto &commandBuffer = commandBuffers[frameIndex];
572577
commandBuffer.begin({});
573-
// Before starting rendering, transition the swapchain image to COLOR_ATTACHMENT_OPTIMAL
578+
579+
// Before starting rendering, transition the swapchain image to vk::ImageLayout::eColorAttachmentOptimal
574580
transition_image_layout(
575581
imageIndex,
576582
vk::ImageLayout::eUndefined,
@@ -598,9 +604,10 @@ class HelloTriangleApplication
598604
commandBuffer.setScissor(0, vk::Rect2D(vk::Offset2D(0, 0), swapChainExtent));
599605
commandBuffer.bindVertexBuffers(0, *vertexBuffer, {0});
600606
commandBuffer.bindIndexBuffer(*indexBuffer, 0, vk::IndexTypeValue<decltype(indices)::value_type>::value);
601-
commandBuffer.drawIndexed(indices.size(), 1, 0, 0, 0);
607+
commandBuffer.drawIndexed(static_cast<uint32_t>(indices.size()), 1, 0, 0, 0);
602608
commandBuffer.endRendering();
603-
// After rendering, transition the swapchain image to PRESENT_SRC
609+
610+
// After rendering, transition the swapchain image to vk::ImageLayout::ePresentSrcKHR
604611
transition_image_layout(
605612
imageIndex,
606613
vk::ImageLayout::eColorAttachmentOptimal,
@@ -633,11 +640,11 @@ class HelloTriangleApplication
633640
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
634641
.image = swapChainImages[imageIndex],
635642
.subresourceRange = {
636-
.aspectMask = vk::ImageAspectFlagBits::eColor,
637-
.baseMipLevel = 0,
638-
.levelCount = 1,
639-
.baseArrayLayer = 0,
640-
.layerCount = 1}};
643+
.aspectMask = vk::ImageAspectFlagBits::eColor,
644+
.baseMipLevel = 0,
645+
.levelCount = 1,
646+
.baseArrayLayer = 0,
647+
.layerCount = 1}};
641648
vk::DependencyInfo dependency_info = {
642649
.dependencyFlags = {},
643650
.imageMemoryBarrierCount = 1,
@@ -671,7 +678,8 @@ class HelloTriangleApplication
671678
UniformBufferObject ubo{};
672679
ubo.model = rotate(glm::mat4(1.0f), time * glm::radians(90.0f), glm::vec3(0.0f, 0.0f, 1.0f));
673680
ubo.view = lookAt(glm::vec3(2.0f, 2.0f, 2.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 0.0f, 1.0f));
674-
ubo.proj = glm::perspective(glm::radians(45.0f), static_cast<float>(swapChainExtent.width) / static_cast<float>(swapChainExtent.height), 0.1f, 10.0f);
681+
ubo.proj =
682+
glm::perspective(glm::radians(45.0f), static_cast<float>(swapChainExtent.width) / static_cast<float>(swapChainExtent.height), 0.1f, 10.0f);
675683
ubo.proj[1][1] *= -1;
676684

677685
memcpy(uniformBuffersMapped[currentImage], &ubo, sizeof(ubo));

0 commit comments

Comments
 (0)