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