From d1d57ab682c191208ad5cc1656e4a9bbe07a4588 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Sun, 7 Dec 2025 23:26:21 -0500 Subject: [PATCH] Big cleanup to utilize C++20 designated initializers https://en.cppreference.com/w/cpp/language/aggregate_initialization.html#Designated_initializers --- vk_descriptors.cpp | 51 +++++------ vk_images.cpp | 91 ++++++++++--------- vk_initializers.cpp | 213 +++++++++++++++++++------------------------- vk_pipelines.cpp | 14 +-- 4 files changed, 170 insertions(+), 199 deletions(-) diff --git a/vk_descriptors.cpp b/vk_descriptors.cpp index bfad725..a8aca8b 100644 --- a/vk_descriptors.cpp +++ b/vk_descriptors.cpp @@ -3,10 +3,11 @@ void DescriptorLayoutBuilder::add_binding(uint32_t binding, VkDescriptorType type) { - VkDescriptorSetLayoutBinding newbind {}; - newbind.binding = binding; - newbind.descriptorCount = 1; - newbind.descriptorType = type; + VkDescriptorSetLayoutBinding newbind{ + .binding = binding, + .descriptorType = type, + .descriptorCount = 1, + }; bindings.push_back(newbind); } @@ -25,18 +26,16 @@ VkDescriptorSetLayout DescriptorLayoutBuilder::build(VkDevice device, b.stageFlags |= shaderStages; } - VkDescriptorSetLayoutCreateInfo info = { - .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO + VkDescriptorSetLayoutCreateInfo info{ + .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, + .pNext = pNext, + .flags = flags, + .bindingCount = (uint32_t)bindings.size(), + .pBindings = bindings.data(), }; - info.pNext = pNext; - - info.pBindings = bindings.data(); - info.bindingCount = (uint32_t)bindings.size(); - info.flags = flags; VkDescriptorSetLayout set; - VK_CHECK(vkCreateDescriptorSetLayout(device, - &info, nullptr, &set)); + VK_CHECK(vkCreateDescriptorSetLayout(device, &info, nullptr, &set)); return set; } @@ -46,19 +45,19 @@ void DescriptorAllocator::init_pool(VkDevice device, uint32_t maxSets, { std::vector poolSizes; for(PoolSizeRatio ratio : poolRatios) { - poolSizes.push_back(VkDescriptorPoolSize{ + poolSizes.push_back({ .type = ratio.type, .descriptorCount = uint32_t(ratio.ratio * maxSets) }); } - VkDescriptorPoolCreateInfo pool_info = { - .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO + VkDescriptorPoolCreateInfo pool_info{ + .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, + .flags = 0, + .maxSets = maxSets, + .poolSizeCount = (uint32_t)poolSizes.size(), + .pPoolSizes = poolSizes.data(), }; - pool_info.flags = 0; - pool_info.maxSets = maxSets; - pool_info.poolSizeCount = (uint32_t)poolSizes.size(); - pool_info.pPoolSizes = poolSizes.data(); vkCreateDescriptorPool(device, &pool_info, nullptr, &pool); } @@ -75,15 +74,13 @@ void DescriptorAllocator::destroy_pool(VkDevice device) VkDescriptorSet DescriptorAllocator::allocate(VkDevice device, VkDescriptorSetLayout layout) { - VkDescriptorSetAllocateInfo allocInfo = { - .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO + VkDescriptorSetAllocateInfo allocInfo{ + .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, + .descriptorPool = pool, + .descriptorSetCount = 1, + .pSetLayouts = &layout, }; - allocInfo.pNext = nullptr; - allocInfo.descriptorPool = pool; - allocInfo.descriptorSetCount = 1; - allocInfo.pSetLayouts = &layout; - VkDescriptorSet ds; VK_CHECK(vkAllocateDescriptorSets(device, &allocInfo, &ds)); diff --git a/vk_images.cpp b/vk_images.cpp index a457d61..c97537e 100644 --- a/vk_images.cpp +++ b/vk_images.cpp @@ -3,28 +3,25 @@ void vkutil::transition_image(VkCommandBuffer cmd, VkImage image, VkImageLayout currentLayout, VkImageLayout newLayout) { - VkImageMemoryBarrier2 imageBarrier{}; - imageBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2; - imageBarrier.pNext = nullptr; - - imageBarrier.srcStageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT; - imageBarrier.srcAccessMask = VK_ACCESS_2_MEMORY_WRITE_BIT; - imageBarrier.dstStageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT; - imageBarrier.dstAccessMask = VK_ACCESS_2_MEMORY_WRITE_BIT | VK_ACCESS_2_MEMORY_READ_BIT; - - - imageBarrier.oldLayout = currentLayout; - imageBarrier.newLayout = newLayout; - VkImageAspectFlags aspectMask = (newLayout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL) ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_COLOR_BIT; - imageBarrier.subresourceRange = vkinit::image_subresource_range(aspectMask); - imageBarrier.image = image; - VkDependencyInfo depInfo{}; - depInfo.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO; - depInfo.pNext = nullptr; - depInfo.imageMemoryBarrierCount = 1; - depInfo.pImageMemoryBarriers = &imageBarrier; + VkImageMemoryBarrier2 imageBarrier{ + .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2, + .srcStageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT, + .srcAccessMask = VK_ACCESS_2_MEMORY_WRITE_BIT, + .dstStageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT, + .dstAccessMask = VK_ACCESS_2_MEMORY_WRITE_BIT | VK_ACCESS_2_MEMORY_READ_BIT, + .oldLayout = currentLayout, + .newLayout = newLayout, + .image = image, + .subresourceRange = vkinit::image_subresource_range(aspectMask), + }; + + VkDependencyInfo depInfo{ + .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO, + .imageMemoryBarrierCount = 1, + .pImageMemoryBarriers = &imageBarrier, + }; vkCmdPipelineBarrier2(cmd, &depInfo); } @@ -33,39 +30,45 @@ void vkutil::copy_image_to_image(VkCommandBuffer cmd, VkImage source, VkImage de { VkImageBlit2 blitRegion{ .sType = VK_STRUCTURE_TYPE_IMAGE_BLIT_2, - .pNext = nullptr }; - blitRegion.srcOffsets[1].x = srcSize.width; - blitRegion.srcOffsets[1].y = srcSize.height; - blitRegion.srcOffsets[1].z = 1; + blitRegion.srcSubresource = { + .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, + .mipLevel = 0, + .baseArrayLayer = 0, + .layerCount = 1, + }; - blitRegion.dstOffsets[1].x = dstSize.width; - blitRegion.dstOffsets[1].y = dstSize.height; - blitRegion.dstOffsets[1].z = 1; + blitRegion.dstSubresource = { + .aspectMask=VK_IMAGE_ASPECT_COLOR_BIT, + .mipLevel=0, + .baseArrayLayer=0, + .layerCount=1, + }; - blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - blitRegion.srcSubresource.baseArrayLayer = 0; - blitRegion.srcSubresource.layerCount = 1; - blitRegion.srcSubresource.mipLevel = 0; + blitRegion.srcOffsets[1] = { + .x = int32_t(srcSize.width), + .y = int32_t(srcSize.height), + .z = 1, + }; - blitRegion.dstSubresource.aspectMask=VK_IMAGE_ASPECT_COLOR_BIT; - blitRegion.dstSubresource.baseArrayLayer=0; - blitRegion.dstSubresource.layerCount=1; - blitRegion.dstSubresource.mipLevel=0; + blitRegion.dstOffsets[1] = { + .x = int32_t(dstSize.width), + .y = int32_t(dstSize.height), + .z = 1, + }; VkBlitImageInfo2 blitInfo{ - .sType = VK_STRUCTURE_TYPE_BLIT_IMAGE_INFO_2, .pNext = nullptr + .sType = VK_STRUCTURE_TYPE_BLIT_IMAGE_INFO_2, + .srcImage = source, + .srcImageLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, + .dstImage = destination, + .dstImageLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + .regionCount = 1, + .pRegions = &blitRegion, + .filter = VK_FILTER_LINEAR, }; - blitInfo.dstImage = destination; - blitInfo.dstImageLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; - blitInfo.srcImage = source; - blitInfo.srcImageLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; - blitInfo.filter = VK_FILTER_LINEAR; - blitInfo.regionCount = 1; - blitInfo.pRegions = &blitRegion; - vkCmdBlitImage2(cmd, &blitInfo); } diff --git a/vk_initializers.cpp b/vk_initializers.cpp index 3c30974..f54839b 100644 --- a/vk_initializers.cpp +++ b/vk_initializers.cpp @@ -3,163 +3,137 @@ VkCommandPoolCreateInfo vkinit::command_pool_create_info(uint32_t queueFamilyIndex, VkCommandPoolCreateFlags flags /*= 0*/) { - VkCommandPoolCreateInfo info = {}; - info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; - info.pNext = nullptr; - info.queueFamilyIndex = queueFamilyIndex; - info.flags = flags; - return info; + return { + .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, + .flags = flags, + .queueFamilyIndex = queueFamilyIndex, + }; } VkCommandBufferAllocateInfo vkinit::command_buffer_allocate_info( VkCommandPool pool, uint32_t count /*= 1*/) { - VkCommandBufferAllocateInfo info = {}; - info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; - info.pNext = nullptr; - - info.commandPool = pool; - info.commandBufferCount = count; - info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; - return info; + return { + .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, + .commandPool = pool, + .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY, + .commandBufferCount = count, + }; } VkFenceCreateInfo vkinit::fence_create_info(VkFenceCreateFlags flags /*=0*/) { - VkFenceCreateInfo info = {}; - info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; - info.pNext = nullptr; - info.flags = flags; - return info; + return { + .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, + .flags = flags + }; } VkSemaphoreCreateInfo vkinit::semaphore_create_info(VkSemaphoreCreateFlags flags/*=0*/) { - VkSemaphoreCreateInfo info = {}; - info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; - info.pNext = nullptr; - info.flags = flags; - return info; + return { + .sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, + .flags = flags, + }; } VkCommandBufferBeginInfo vkinit::command_buffer_begin_info(VkCommandBufferUsageFlags flags /*= 0*/) { - VkCommandBufferBeginInfo info = {}; - info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; - info.pNext = nullptr; - - info.pInheritanceInfo = nullptr; - info.flags = flags; - return info; + return { + .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, + .flags = flags, + .pInheritanceInfo = nullptr, + }; } VkImageSubresourceRange vkinit::image_subresource_range(VkImageAspectFlags aspectMask) { - VkImageSubresourceRange subImage {}; - subImage.aspectMask = aspectMask; - subImage.baseMipLevel = 0; - subImage.levelCount = VK_REMAINING_MIP_LEVELS; - subImage.baseArrayLayer = 0; - subImage.layerCount = VK_REMAINING_ARRAY_LAYERS; - - return subImage; + return { + .aspectMask = aspectMask, + .baseMipLevel = 0, + .levelCount = VK_REMAINING_MIP_LEVELS, + .baseArrayLayer = 0, + .layerCount = VK_REMAINING_ARRAY_LAYERS, + }; } VkSemaphoreSubmitInfo vkinit::semaphore_submit_info(VkPipelineStageFlags2 stageMask, VkSemaphore semaphore) { - VkSemaphoreSubmitInfo submitInfo{}; - submitInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO; - submitInfo.pNext = nullptr; - submitInfo.semaphore = semaphore; - submitInfo.stageMask = stageMask; - submitInfo.deviceIndex = 0; - submitInfo.value = 1; - - return submitInfo; + return { + .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO, + .semaphore = semaphore, + .value = 1, + .stageMask = stageMask, + .deviceIndex = 0, + }; } VkCommandBufferSubmitInfo vkinit::command_buffer_submit_info(VkCommandBuffer cmd) { - VkCommandBufferSubmitInfo info{}; - info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO; - info.pNext = nullptr; - info.commandBuffer = cmd; - info.deviceMask = 0; - - return info; + return { + .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO, + .commandBuffer = cmd, + .deviceMask = 0, + }; } VkSubmitInfo2 vkinit::submit_info(VkCommandBufferSubmitInfo* cmd, VkSemaphoreSubmitInfo* signalSemaphoreInfo, VkSemaphoreSubmitInfo* waitSemaphoreInfo) { - VkSubmitInfo2 info = {}; - info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO_2; - info.pNext = nullptr; - - info.waitSemaphoreInfoCount = waitSemaphoreInfo == nullptr ? 0 : 1; - info.pWaitSemaphoreInfos = waitSemaphoreInfo; - - info.signalSemaphoreInfoCount = signalSemaphoreInfo == nullptr ? 0 : 1; - info.pSignalSemaphoreInfos = signalSemaphoreInfo; - - info.commandBufferInfoCount = 1; - info.pCommandBufferInfos = cmd; - - return info; + return { + .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO_2, + .waitSemaphoreInfoCount = (waitSemaphoreInfo == nullptr ? 0u : 1u), + .pWaitSemaphoreInfos = waitSemaphoreInfo, + .commandBufferInfoCount = 1, + .pCommandBufferInfos = cmd, + .signalSemaphoreInfoCount = (signalSemaphoreInfo == nullptr ? 0u : 1u), + .pSignalSemaphoreInfos = signalSemaphoreInfo, + }; } VkImageCreateInfo vkinit::image_create_info(VkFormat format, VkImageUsageFlags usageFlags, VkExtent3D extent) { - VkImageCreateInfo info{}; - info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; - info.pNext = nullptr; - - info.imageType = VK_IMAGE_TYPE_2D; - - info.format = format; - info.extent = extent; - - info.mipLevels = 1; - info.arrayLayers = 1; - - info.samples = VK_SAMPLE_COUNT_1_BIT; - - info.tiling = VK_IMAGE_TILING_OPTIMAL; - info.usage = usageFlags; - - return info; + return { + .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, + .imageType = VK_IMAGE_TYPE_2D, + .format = format, + .extent = extent, + .mipLevels = 1, + .arrayLayers = 1, + .samples = VK_SAMPLE_COUNT_1_BIT, + .tiling = VK_IMAGE_TILING_OPTIMAL, + .usage = usageFlags, + }; } VkImageViewCreateInfo vkinit::imageview_create_info(VkFormat format, VkImage image, VkImageAspectFlags aspectFlags) { - VkImageViewCreateInfo info{}; - info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; - info.pNext = nullptr; - - info.viewType = VK_IMAGE_VIEW_TYPE_2D; - info.image = image; - info.format = format; - info.subresourceRange.baseMipLevel = 0; - info.subresourceRange.levelCount = 1; - info.subresourceRange.baseArrayLayer = 0; - info.subresourceRange.layerCount = 1; - info.subresourceRange.aspectMask = aspectFlags; - - return info; + return { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .image = image, + .viewType = VK_IMAGE_VIEW_TYPE_2D, + .format = format, + .subresourceRange = { + .aspectMask = aspectFlags, + .baseMipLevel = 0, + .levelCount = 1, + .baseArrayLayer = 0, + .layerCount = 1, + } + }; } VkRenderingAttachmentInfo vkinit::attachment_info( VkImageView view, VkClearValue* clear ,VkImageLayout layout /*= VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL*/) { - VkRenderingAttachmentInfo colorAttachment {}; - colorAttachment.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO; - colorAttachment.pNext = nullptr; - - colorAttachment.imageView = view; - colorAttachment.imageLayout = layout; - colorAttachment.loadOp = clear ? VK_ATTACHMENT_LOAD_OP_CLEAR : VK_ATTACHMENT_LOAD_OP_LOAD; - colorAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE; + VkRenderingAttachmentInfo colorAttachment{ + .sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO, + .imageView = view, + .imageLayout = layout, + .loadOp = clear ? VK_ATTACHMENT_LOAD_OP_CLEAR : VK_ATTACHMENT_LOAD_OP_LOAD, + .storeOp = VK_ATTACHMENT_STORE_OP_STORE, + }; if (clear) { colorAttachment.clearValue = *clear; @@ -172,16 +146,13 @@ VkRenderingAttachmentInfo vkinit::attachment_info( VkRenderingInfo vkinit::rendering_info(VkExtent2D renderExtent, VkRenderingAttachmentInfo* colorAttachment, VkRenderingAttachmentInfo* depthAttachment) { - VkRenderingInfo renderInfo {}; - renderInfo.sType = VK_STRUCTURE_TYPE_RENDERING_INFO; - renderInfo.pNext = nullptr; - - renderInfo.renderArea = VkRect2D { VkOffset2D { 0, 0 }, renderExtent }; - renderInfo.layerCount = 1; - renderInfo.colorAttachmentCount = 1; - renderInfo.pColorAttachments = colorAttachment; - renderInfo.pDepthAttachment = depthAttachment; - renderInfo.pStencilAttachment = nullptr; - - return renderInfo; + return { + .sType = VK_STRUCTURE_TYPE_RENDERING_INFO, + .renderArea = VkRect2D { VkOffset2D { 0, 0 }, renderExtent }, + .layerCount = 1, + .colorAttachmentCount = 1, + .pColorAttachments = colorAttachment, + .pDepthAttachment = depthAttachment, + .pStencilAttachment = nullptr, + }; } diff --git a/vk_pipelines.cpp b/vk_pipelines.cpp index 4067f1d..acecc80 100644 --- a/vk_pipelines.cpp +++ b/vk_pipelines.cpp @@ -23,13 +23,13 @@ bool vkutil::load_shader_module(const char* filePath, file.close(); - VkShaderModuleCreateInfo createInfo = {}; - createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; - createInfo.pNext = nullptr; - - // codeSize has to be in bytes - createInfo.codeSize = buffer.size() * sizeof(uint32_t); - createInfo.pCode = buffer.data(); + VkShaderModuleCreateInfo createInfo = { + .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, + .pNext = nullptr, + // codeSize has to be in bytes + .codeSize = buffer.size() * sizeof(uint32_t), + .pCode = buffer.data(), + }; VkShaderModule shaderModule; if(vkCreateShaderModule(device, &createInfo, nullptr, &shaderModule) != VK_SUCCESS) {