@@ -42,6 +42,7 @@ constexpr uint32_t kStorageBufferCount = 20;
4242constexpr uint32_t kStorageImageCount = 20 ;
4343constexpr uint32_t kCombinedImageSamplerCount = 20 ;
4444constexpr uint32_t kMaxTextures = 20 ;
45+ constexpr uint32_t kUniformBufferCount = 20 ;
4546
4647VulkanRenderer::VulkanRenderer (Window* window, ResourceManager& resource_manager, EventManager& event_manager) :
4748 window_(window), event_manager_(&event_manager)
@@ -125,7 +126,8 @@ VulkanRenderer::VulkanRenderer(Window* window, ResourceManager& resource_manager
125126 descriptor_pool_info.pool_sizes = {
126127 {.type = vk::DescriptorType::eCombinedImageSampler, .descriptorCount = kCombinedImageSamplerCount },
127128 {.type = vk::DescriptorType::eStorageBuffer, .descriptorCount = kStorageBufferCount },
128- {.type = vk::DescriptorType::eStorageImage, .descriptorCount = kStorageImageCount }};
129+ {.type = vk::DescriptorType::eStorageImage, .descriptorCount = kStorageImageCount },
130+ {.type = vk::DescriptorType::eUniformBuffer, .descriptorCount = kUniformBufferCount }};
129131
130132 descriptor_pool_ = std::make_unique<VulkanDescriptorPool>(device_->get (), descriptor_pool_info);
131133
@@ -159,27 +161,35 @@ VulkanRenderer::VulkanRenderer(Window* window, ResourceManager& resource_manager
159161 .binding = 4 ,
160162 .descriptorType = vk::DescriptorType::eStorageImage,
161163 .descriptorCount = 1 ,
162- .stageFlags = vk::ShaderStageFlagBits::eCompute}},
164+ .stageFlags = vk::ShaderStageFlagBits::eCompute},
165+ vk::DescriptorSetLayoutBinding{// Overdraw
166+ .binding = 5 ,
167+ .descriptorType = vk::DescriptorType::eStorageImage,
168+ .descriptorCount = 1 ,
169+ .stageFlags = vk::ShaderStageFlagBits::eFragment}},
163170 std::vector<vk::DescriptorBindingFlags>{}, vk::DescriptorSetLayoutCreateFlags{});
164171
165172 static_descriptor_set_layout_ = std::make_unique<VulkanDescriptorSetLayout>(
166173 device_->get (),
167- std::vector{
168- vk::DescriptorSetLayoutBinding{
169- // Mesh infos
170- .binding = 0 ,
171- .descriptorType = vk::DescriptorType::eStorageBuffer,
172- .descriptorCount = 1 ,
173- .stageFlags = vk::ShaderStageFlagBits::eCompute | vk::ShaderStageFlagBits::eVertex},
174- vk::DescriptorSetLayoutBinding{
175- // Textures
176- .binding = 1 ,
177- .descriptorType = vk::DescriptorType::eCombinedImageSampler,
178- .descriptorCount = kMaxTextures ,
179- .stageFlags = vk::ShaderStageFlagBits::eFragment | vk::ShaderStageFlagBits::eCompute},
180- },
181- std::vector<vk::DescriptorBindingFlags>{vk::DescriptorBindingFlags{},
182- vk::DescriptorBindingFlagBits::ePartiallyBound},
174+ std::vector{vk::DescriptorSetLayoutBinding{
175+ // Mesh infos
176+ .binding = 0 ,
177+ .descriptorType = vk::DescriptorType::eStorageBuffer,
178+ .descriptorCount = 1 ,
179+ .stageFlags = vk::ShaderStageFlagBits::eCompute | vk::ShaderStageFlagBits::eVertex},
180+ vk::DescriptorSetLayoutBinding{
181+ // Textures
182+ .binding = 1 ,
183+ .descriptorType = vk::DescriptorType::eCombinedImageSampler,
184+ .descriptorCount = kMaxTextures ,
185+ .stageFlags = vk::ShaderStageFlagBits::eFragment | vk::ShaderStageFlagBits::eCompute},
186+ vk::DescriptorSetLayoutBinding{// ubo
187+ .binding = 3 ,
188+ .descriptorType = vk::DescriptorType::eUniformBuffer,
189+ .descriptorCount = 1 ,
190+ .stageFlags = vk::ShaderStageFlagBits::eFragment}},
191+ std::vector<vk::DescriptorBindingFlags>{
192+ vk::DescriptorBindingFlags{}, vk::DescriptorBindingFlagBits::ePartiallyBound, vk::DescriptorBindingFlags{}},
183193 vk::DescriptorSetLayoutCreateFlags{});
184194
185195 static_descriptor_set_ = descriptor_pool_->allocate (static_descriptor_set_layout_->get ());
@@ -580,6 +590,20 @@ void VulkanRenderer::run(glm::mat4 world, float fov)
580590 constexpr vk::DebugUtilsLabelEXT label_info2{.pLabelName = " MeshPass" };
581591 cmd.beginDebugUtilsLabelEXT (label_info2, instance_->getDynamicLoader ());
582592
593+ VulkanImage::TransitionImageLayout (frame->Overdraw ()->get (), cmd, vk::ImageLayout::eGeneral,
594+ vk::ImageLayout::eTransferDstOptimal);
595+
596+ vk::ImageSubresourceRange range{.aspectMask = vk::ImageAspectFlagBits::eColor,
597+ .baseMipLevel = 0 ,
598+ .levelCount = 1 ,
599+ .baseArrayLayer = 0 ,
600+ .layerCount = 1 };
601+ vk::ClearColorValue clearValue{std::array<float , 4 >{0 .f , 0 .f , 0 .f , 0 .f }};
602+ cmd.clearColorImage (frame->Overdraw ()->get (), vk::ImageLayout::eTransferDstOptimal, clearValue, range);
603+
604+ VulkanImage::TransitionImageLayout (frame->Overdraw ()->get (), cmd, vk::ImageLayout::eTransferDstOptimal,
605+ vk::ImageLayout::eGeneral);
606+
583607 VulkanImage::TransitionImageLayout (frame->RenderImage ()->get (), cmd, vk::ImageLayout::eTransferSrcOptimal,
584608 vk::ImageLayout::eColorAttachmentOptimal);
585609
@@ -1049,10 +1073,77 @@ void VulkanRenderer::RecreateSwapChain()
10491073 aspect_ratio_ = static_cast <float >(width) / static_cast <float >(height);
10501074}
10511075
1052- void VulkanRenderer::RecreateFrameImages (const uint32_t width, const uint32_t height) const
1076+ void VulkanRenderer::RecreateFrameImages (const uint32_t width, const uint32_t height)
10531077{
1078+ std::vector<vk::WriteDescriptorSet> writes;
1079+ std::vector<vk::DescriptorImageInfo> image_infos;
1080+
1081+ image_infos.reserve (frames_.size ());
1082+
1083+ vk::DescriptorBufferInfo ubo_buffer_info{.buffer = nullptr , .offset = 0 , .range = vk::WholeSize};
1084+
1085+ if (!uniform_buffer_)
1086+ {
1087+ constexpr BufferInfo info{.size = sizeof (UniformBuffer),
1088+ .usage = vk::BufferUsageFlagBits::eUniformBuffer,
1089+ .memoryUsage = VMA_MEMORY_USAGE_CPU_TO_GPU ,
1090+ .memoryFlags = VMA_ALLOCATION_CREATE_MAPPED_BIT };
1091+ uniform_buffer_ = std::make_unique<VulkanBuffer>(info, allocator_->get (), device_.get ());
1092+
1093+ ubo_buffer_info.buffer = uniform_buffer_->get ();
1094+ const vk::WriteDescriptorSet ubo_write{.dstSet = static_descriptor_set_,
1095+ .dstBinding = 3 ,
1096+ .dstArrayElement = 0 ,
1097+ .descriptorCount = 1 ,
1098+ .descriptorType = vk::DescriptorType::eUniformBuffer,
1099+ .pBufferInfo = &ubo_buffer_info};
1100+ writes.reserve (frames_.size () * 2 );
1101+
1102+ writes.push_back (ubo_write);
1103+ } else
1104+ {
1105+ writes.reserve (frames_.size ());
1106+ }
1107+
1108+ uniform_buffer_->map ();
1109+ auto * ubo = uniform_buffer_->GetMappedDataAs <UniformBuffer>();
1110+ ubo->viewport .x = static_cast <float >(width);
1111+ ubo->viewport .y = static_cast <float >(height);
1112+ uniform_buffer_->unmap ();
1113+
10541114 for (const auto & frame: frames_)
10551115 {
10561116 frame->RecreateFrameImages (width, height);
1117+
1118+ image_infos.push_back (
1119+ {.sampler = nullptr , .imageView = frame->Overdraw ()->view (), .imageLayout = vk::ImageLayout::eGeneral});
1120+
1121+ const vk::WriteDescriptorSet write{.dstSet = frame->DescriptorSet (),
1122+ .dstBinding = 5 ,
1123+ .dstArrayElement = 0 ,
1124+ .descriptorCount = 1 ,
1125+ .descriptorType = vk::DescriptorType::eStorageImage,
1126+ .pImageInfo = &image_infos.back ()};
1127+
1128+ writes.push_back (write);
1129+ }
1130+
1131+ device_->get ().updateDescriptorSets (static_cast <uint32_t >(writes.size ()), writes.data (), 0 , nullptr );
1132+
1133+ auto cmd = util::BeginSingleTimeCommandBuffer (*graphics_pool_);
1134+ for (const auto & image: swap_chain_->images ())
1135+ {
1136+ VulkanImage::TransitionImageLayout (image, cmd, vk::ImageLayout::eUndefined, vk::ImageLayout::ePresentSrcKHR);
1137+ }
1138+
1139+ for (const auto & frame: frames_)
1140+ {
1141+ VulkanImage::TransitionImageLayout (frame->RenderImage ()->get (), cmd, vk::ImageLayout::eUndefined,
1142+ vk::ImageLayout::eTransferSrcOptimal);
1143+ VulkanImage::TransitionImageLayout (frame->DepthImage ()->get (), cmd, vk::ImageLayout::eUndefined,
1144+ vk::ImageLayout::eDepthAttachmentOptimal);
1145+ VulkanImage::TransitionImageLayout (frame->Overdraw ()->get (), cmd, vk::ImageLayout::eUndefined,
1146+ vk::ImageLayout::eGeneral);
10571147 }
1148+ util::EndSingleTimeCommandBuffer (cmd, device_->GraphicsQueue (), *graphics_pool_);
10581149}
0 commit comments