@@ -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