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