Skip to content

Commit 8797428

Browse files
committed
Align docu in 01_Descriptor_pool_and_sets.adoc and sources in 23_descriptor_sets.cpp
1 parent aa561ee commit 8797428

2 files changed

Lines changed: 149 additions & 108 deletions

File tree

attachments/23_descriptor_sets.cpp

Lines changed: 73 additions & 58 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

@@ -141,7 +140,7 @@ class HelloTriangleApplication
141140

142141
static void framebufferResizeCallback(GLFWwindow *window, int width, int height)
143142
{
144-
auto app = static_cast<HelloTriangleApplication *>(glfwGetWindowUserPointer(window));
143+
auto app = reinterpret_cast<HelloTriangleApplication *>(glfwGetWindowUserPointer(window));
145144
app->framebufferResized = true;
146145
}
147146

@@ -266,7 +265,7 @@ class HelloTriangleApplication
266265
vk::DebugUtilsMessageSeverityFlagsEXT severityFlags(vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning |
267266
vk::DebugUtilsMessageSeverityFlagBitsEXT::eError);
268267
vk::DebugUtilsMessageTypeFlagsEXT messageTypeFlags(
269-
vk::DebugUtilsMessageTypeFlagBitsEXT::eGeneral | vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance | vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation);
268+
vk::DebugUtilsMessageTypeFlagBitsEXT::eGeneral | vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance | vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation);
270269
vk::DebugUtilsMessengerCreateInfoEXT debugUtilsMessengerCreateInfoEXT{.messageSeverity = severityFlags,
271270
.messageType = messageTypeFlags,
272271
.pfnUserCallback = &debugCallback};
@@ -308,6 +307,7 @@ class HelloTriangleApplication
308307
vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>();
309308
bool supportsRequiredFeatures = features.template get<vk::PhysicalDeviceVulkan11Features>().shaderDrawParameters &&
310309
features.template get<vk::PhysicalDeviceVulkan13Features>().dynamicRendering &&
310+
features.template get<vk::PhysicalDeviceVulkan13Features>().synchronization2 &&
311311
features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState;
312312

313313
// Return true if the physicalDevice meets all the criteria
@@ -346,12 +346,16 @@ class HelloTriangleApplication
346346
}
347347

348348
// query for required features (Vulkan 1.1 and 1.3)
349-
vk::StructureChain<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan11Features, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT> featureChain = {
350-
{}, // vk::PhysicalDeviceFeatures2
351-
{.shaderDrawParameters = true}, // vk::PhysicalDeviceVulkan11Features
352-
{.synchronization2 = true, .dynamicRendering = true}, // vk::PhysicalDeviceVulkan13Features
353-
{.extendedDynamicState = true} // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT
354-
};
349+
vk::StructureChain<vk::PhysicalDeviceFeatures2,
350+
vk::PhysicalDeviceVulkan11Features,
351+
vk::PhysicalDeviceVulkan13Features,
352+
vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>
353+
featureChain = {
354+
{}, // vk::PhysicalDeviceFeatures2
355+
{.shaderDrawParameters = true}, // vk::PhysicalDeviceVulkan11Features
356+
{.synchronization2 = true, .dynamicRendering = true}, // vk::PhysicalDeviceVulkan13Features
357+
{.extendedDynamicState = true} // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT
358+
};
355359

356360
// create a Device
357361
float queuePriority = 0.5f;
@@ -411,7 +415,8 @@ class HelloTriangleApplication
411415

412416
void createDescriptorSetLayout()
413417
{
414-
vk::DescriptorSetLayoutBinding uboLayoutBinding(0, vk::DescriptorType::eUniformBuffer, 1, vk::ShaderStageFlagBits::eVertex, nullptr);
418+
vk::DescriptorSetLayoutBinding uboLayoutBinding{
419+
.binding = 0, .descriptorType = vk::DescriptorType::eUniformBuffer, .descriptorCount = 1, .stageFlags = vk::ShaderStageFlagBits::eVertex};
415420
vk::DescriptorSetLayoutCreateInfo layoutInfo{.bindingCount = 1, .pBindings = &uboLayoutBinding};
416421
descriptorSetLayout = vk::raii::DescriptorSetLayout(device, layoutInfo);
417422
}
@@ -426,7 +431,10 @@ class HelloTriangleApplication
426431

427432
auto bindingDescription = Vertex::getBindingDescription();
428433
auto attributeDescriptions = Vertex::getAttributeDescriptions();
429-
vk::PipelineVertexInputStateCreateInfo vertexInputInfo{.vertexBindingDescriptionCount = 1, .pVertexBindingDescriptions = &bindingDescription, .vertexAttributeDescriptionCount = static_cast<uint32_t>(attributeDescriptions.size()), .pVertexAttributeDescriptions = attributeDescriptions.data()};
434+
vk::PipelineVertexInputStateCreateInfo vertexInputInfo{.vertexBindingDescriptionCount = 1,
435+
.pVertexBindingDescriptions = &bindingDescription,
436+
.vertexAttributeDescriptionCount = static_cast<uint32_t>(attributeDescriptions.size()),
437+
.pVertexAttributeDescriptions = attributeDescriptions.data()};
430438
vk::PipelineInputAssemblyStateCreateInfo inputAssembly{.topology = vk::PrimitiveTopology::eTriangleList};
431439
vk::PipelineViewportStateCreateInfo viewportState{.viewportCount = 1, .scissorCount = 1};
432440

@@ -450,7 +458,7 @@ class HelloTriangleApplication
450458
std::vector<vk::DynamicState> dynamicStates = {vk::DynamicState::eViewport, vk::DynamicState::eScissor};
451459
vk::PipelineDynamicStateCreateInfo dynamicState{.dynamicStateCount = static_cast<uint32_t>(dynamicStates.size()), .pDynamicStates = dynamicStates.data()};
452460

453-
vk::PipelineLayoutCreateInfo pipelineLayoutInfo{.setLayoutCount = 0, .pushConstantRangeCount = 0};
461+
vk::PipelineLayoutCreateInfo pipelineLayoutInfo{.setLayoutCount = 1, .pSetLayouts = &*descriptorSetLayout, .pushConstantRangeCount = 0};
454462
pipelineLayout = vk::raii::PipelineLayout(device, pipelineLayoutInfo);
455463

456464
vk::StructureChain<vk::GraphicsPipelineCreateInfo, vk::PipelineRenderingCreateInfo> pipelineCreateInfoChain = {
@@ -477,18 +485,30 @@ class HelloTriangleApplication
477485
commandPool = vk::raii::CommandPool(device, poolInfo);
478486
}
479487

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

487506
void *dataStaging = stagingBufferMemory.mapMemory(0, bufferSize);
488507
memcpy(dataStaging, vertices.data(), bufferSize);
489508
stagingBufferMemory.unmapMemory();
490509

491-
createBuffer(bufferSize, vk::BufferUsageFlagBits::eTransferDst | vk::BufferUsageFlagBits::eVertexBuffer, vk::MemoryPropertyFlagBits::eDeviceLocal, vertexBuffer, vertexBufferMemory);
510+
std::tie(vertexBuffer, vertexBufferMemory) =
511+
createBuffer(bufferSize, vk::BufferUsageFlagBits::eVertexBuffer | vk::BufferUsageFlagBits::eTransferDst, vk::MemoryPropertyFlagBits::eDeviceLocal);
492512

493513
copyBuffer(stagingBuffer, vertexBuffer, bufferSize);
494514
}
@@ -497,74 +517,66 @@ class HelloTriangleApplication
497517
{
498518
vk::DeviceSize bufferSize = sizeof(indices[0]) * indices.size();
499519

500-
vk::raii::Buffer stagingBuffer({});
501-
vk::raii::DeviceMemory stagingBufferMemory({});
502-
createBuffer(bufferSize, vk::BufferUsageFlagBits::eTransferSrc, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent, stagingBuffer, stagingBufferMemory);
520+
auto [stagingBuffer, stagingBufferMemory] =
521+
createBuffer(bufferSize, vk::BufferUsageFlagBits::eTransferSrc, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent);
503522

504523
void *data = stagingBufferMemory.mapMemory(0, bufferSize);
505524
memcpy(data, indices.data(), (size_t) bufferSize);
506525
stagingBufferMemory.unmapMemory();
507526

508-
createBuffer(bufferSize, vk::BufferUsageFlagBits::eTransferDst | vk::BufferUsageFlagBits::eIndexBuffer, vk::MemoryPropertyFlagBits::eDeviceLocal, indexBuffer, indexBufferMemory);
527+
std::tie(indexBuffer, indexBufferMemory) =
528+
createBuffer(bufferSize, vk::BufferUsageFlagBits::eIndexBuffer | vk::BufferUsageFlagBits::eTransferDst, vk::MemoryPropertyFlagBits::eDeviceLocal);
509529

510530
copyBuffer(stagingBuffer, indexBuffer, bufferSize);
511531
}
512532

513533
void createUniformBuffers()
514534
{
515-
uniformBuffers.clear();
516-
uniformBuffersMemory.clear();
517-
uniformBuffersMapped.clear();
518-
519535
for (size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++)
520536
{
521-
vk::DeviceSize bufferSize = sizeof(UniformBufferObject);
522-
vk::raii::Buffer buffer({});
523-
vk::raii::DeviceMemory bufferMem({});
524-
createBuffer(bufferSize, vk::BufferUsageFlagBits::eUniformBuffer, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent, buffer, bufferMem);
537+
vk::DeviceSize bufferSize = sizeof(UniformBufferObject);
538+
auto [buffer, bufferMem] = createBuffer(
539+
bufferSize, vk::BufferUsageFlagBits::eUniformBuffer, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent);
525540
uniformBuffers.emplace_back(std::move(buffer));
526541
uniformBuffersMemory.emplace_back(std::move(bufferMem));
527-
uniformBuffersMapped.emplace_back(uniformBuffersMemory[i].mapMemory(0, bufferSize));
542+
uniformBuffersMapped.emplace_back(uniformBuffersMemory.back().mapMemory(0, bufferSize));
528543
}
529544
}
530545

531546
void createDescriptorPool()
532547
{
533-
vk::DescriptorPoolSize poolSize(vk::DescriptorType::eUniformBuffer, MAX_FRAMES_IN_FLIGHT);
548+
vk::DescriptorPoolSize poolSize{.type = vk::DescriptorType::eUniformBuffer, .descriptorCount = MAX_FRAMES_IN_FLIGHT};
534549
vk::DescriptorPoolCreateInfo poolInfo{.flags = vk::DescriptorPoolCreateFlagBits::eFreeDescriptorSet, .maxSets = MAX_FRAMES_IN_FLIGHT, .poolSizeCount = 1, .pPoolSizes = &poolSize};
535550
descriptorPool = vk::raii::DescriptorPool(device, poolInfo);
536551
}
537552

538553
void createDescriptorSets()
539554
{
540555
std::vector<vk::DescriptorSetLayout> layouts(MAX_FRAMES_IN_FLIGHT, *descriptorSetLayout);
541-
vk::DescriptorSetAllocateInfo allocInfo{.descriptorPool = descriptorPool, .descriptorSetCount = static_cast<uint32_t>(layouts.size()), .pSetLayouts = layouts.data()};
556+
vk::DescriptorSetAllocateInfo allocInfo{.descriptorPool = descriptorPool,
557+
.descriptorSetCount = static_cast<uint32_t>(layouts.size()),
558+
.pSetLayouts = layouts.data()};
542559

543560
descriptorSets = device.allocateDescriptorSets(allocInfo);
544561

545562
for (size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++)
546563
{
547564
vk::DescriptorBufferInfo bufferInfo{.buffer = uniformBuffers[i], .offset = 0, .range = sizeof(UniformBufferObject)};
548-
vk::WriteDescriptorSet descriptorWrite{.dstSet = descriptorSets[i], .dstBinding = 0, .dstArrayElement = 0, .descriptorCount = 1, .descriptorType = vk::DescriptorType::eUniformBuffer, .pBufferInfo = &bufferInfo};
565+
vk::WriteDescriptorSet descriptorWrite{.dstSet = descriptorSets[i],
566+
.dstBinding = 0,
567+
.dstArrayElement = 0,
568+
.descriptorCount = 1,
569+
.descriptorType = vk::DescriptorType::eUniformBuffer,
570+
.pBufferInfo = &bufferInfo};
549571
device.updateDescriptorSets(descriptorWrite, {});
550572
}
551573
}
552574

553-
void createBuffer(vk::DeviceSize size, vk::BufferUsageFlags usage, vk::MemoryPropertyFlags properties, vk::raii::Buffer &buffer, vk::raii::DeviceMemory &bufferMemory)
554-
{
555-
vk::BufferCreateInfo bufferInfo{.size = size, .usage = usage, .sharingMode = vk::SharingMode::eExclusive};
556-
buffer = vk::raii::Buffer(device, bufferInfo);
557-
vk::MemoryRequirements memRequirements = buffer.getMemoryRequirements();
558-
vk::MemoryAllocateInfo allocInfo{.allocationSize = memRequirements.size, .memoryTypeIndex = findMemoryType(memRequirements.memoryTypeBits, properties)};
559-
bufferMemory = vk::raii::DeviceMemory(device, allocInfo);
560-
buffer.bindMemory(bufferMemory, 0);
561-
}
562-
563575
void copyBuffer(vk::raii::Buffer &srcBuffer, vk::raii::Buffer &dstBuffer, vk::DeviceSize size)
564576
{
565577
vk::CommandBufferAllocateInfo allocInfo{.commandPool = commandPool, .level = vk::CommandBufferLevel::ePrimary, .commandBufferCount = 1};
566578
vk::raii::CommandBuffer commandCopyBuffer = std::move(device.allocateCommandBuffers(allocInfo).front());
567-
commandCopyBuffer.begin(vk::CommandBufferBeginInfo{.flags = vk::CommandBufferUsageFlagBits::eOneTimeSubmit});
579+
commandCopyBuffer.begin({.flags = vk::CommandBufferUsageFlagBits::eOneTimeSubmit});
568580
commandCopyBuffer.copyBuffer(*srcBuffer, *dstBuffer, vk::BufferCopy(0, 0, size));
569581
commandCopyBuffer.end();
570582
queue.submit(vk::SubmitInfo{.commandBufferCount = 1, .pCommandBuffers = &*commandCopyBuffer}, nullptr);
@@ -597,7 +609,8 @@ class HelloTriangleApplication
597609
{
598610
auto &commandBuffer = commandBuffers[frameIndex];
599611
commandBuffer.begin({});
600-
// Before starting rendering, transition the swapchain image to COLOR_ATTACHMENT_OPTIMAL
612+
613+
// Before starting rendering, transition the swapchain image to vk::ImageLayout::eColorAttachmentOptimal
601614
transition_image_layout(
602615
imageIndex,
603616
vk::ImageLayout::eUndefined,
@@ -624,11 +637,12 @@ class HelloTriangleApplication
624637
commandBuffer.setViewport(0, vk::Viewport(0.0f, 0.0f, static_cast<float>(swapChainExtent.width), static_cast<float>(swapChainExtent.height), 0.0f, 1.0f));
625638
commandBuffer.setScissor(0, vk::Rect2D(vk::Offset2D(0, 0), swapChainExtent));
626639
commandBuffer.bindVertexBuffers(0, *vertexBuffer, {0});
627-
commandBuffer.bindIndexBuffer(*indexBuffer, 0, vk::IndexType::eUint16);
640+
commandBuffer.bindIndexBuffer(*indexBuffer, 0, vk::IndexTypeValue<decltype(indices)::value_type>::value);
628641
commandBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, pipelineLayout, 0, *descriptorSets[frameIndex], nullptr);
629-
commandBuffer.drawIndexed(indices.size(), 1, 0, 0, 0);
642+
commandBuffer.drawIndexed(static_cast<uint32_t>(indices.size()), 1, 0, 0, 0);
630643
commandBuffer.endRendering();
631-
// After rendering, transition the swapchain image to PRESENT_SRC
644+
645+
// After rendering, transition the swapchain image to vk::ImageLayout::ePresentSrcKHR
632646
transition_image_layout(
633647
imageIndex,
634648
vk::ImageLayout::eColorAttachmentOptimal,
@@ -661,11 +675,11 @@ class HelloTriangleApplication
661675
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
662676
.image = swapChainImages[imageIndex],
663677
.subresourceRange = {
664-
.aspectMask = vk::ImageAspectFlagBits::eColor,
665-
.baseMipLevel = 0,
666-
.levelCount = 1,
667-
.baseArrayLayer = 0,
668-
.layerCount = 1}};
678+
.aspectMask = vk::ImageAspectFlagBits::eColor,
679+
.baseMipLevel = 0,
680+
.levelCount = 1,
681+
.baseArrayLayer = 0,
682+
.layerCount = 1}};
669683
vk::DependencyInfo dependency_info = {
670684
.dependencyFlags = {},
671685
.imageMemoryBarrierCount = 1,
@@ -699,7 +713,8 @@ class HelloTriangleApplication
699713
UniformBufferObject ubo{};
700714
ubo.model = rotate(glm::mat4(1.0f), time * glm::radians(90.0f), glm::vec3(0.0f, 0.0f, 1.0f));
701715
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));
702-
ubo.proj = glm::perspective(glm::radians(45.0f), static_cast<float>(swapChainExtent.width) / static_cast<float>(swapChainExtent.height), 0.1f, 10.0f);
716+
ubo.proj =
717+
glm::perspective(glm::radians(45.0f), static_cast<float>(swapChainExtent.width) / static_cast<float>(swapChainExtent.height), 0.1f, 10.0f);
703718
ubo.proj[1][1] *= -1;
704719

705720
memcpy(uniformBuffersMapped[currentImage], &ubo, sizeof(ubo));
@@ -806,7 +821,7 @@ class HelloTriangleApplication
806821
vk::PresentModeKHR::eFifo;
807822
}
808823

809-
vk::Extent2D chooseSwapExtent(const vk::SurfaceCapabilitiesKHR &capabilities)
824+
vk::Extent2D chooseSwapExtent(vk::SurfaceCapabilitiesKHR const &capabilities)
810825
{
811826
if (capabilities.currentExtent.width != std::numeric_limits<uint32_t>::max())
812827
{

0 commit comments

Comments
 (0)