|
1 | | -/* Copyright (c) 2023-2025, NVIDIA |
| 1 | +/* Copyright (c) 2023-2026, NVIDIA |
2 | 2 | * |
3 | 3 | * SPDX-License-Identifier: Apache-2.0 |
4 | 4 | * |
|
20 | 20 | HPPOITLinkedLists::HPPOITLinkedLists() |
21 | 21 | { |
22 | 22 | title = "HPP OIT linked lists"; |
| 23 | + |
| 24 | + add_device_extension(vk::KHRSynchronization2ExtensionName); |
23 | 25 | } |
24 | 26 |
|
25 | 27 | HPPOITLinkedLists::~HPPOITLinkedLists() |
@@ -94,6 +96,8 @@ void HPPOITLinkedLists::request_gpu_features(vkb::core::PhysicalDeviceCpp &gpu) |
94 | 96 | { |
95 | 97 | requested_features.samplerAnisotropy = true; |
96 | 98 | } |
| 99 | + |
| 100 | + REQUEST_REQUIRED_FEATURE(gpu, vk::PhysicalDeviceSynchronization2FeaturesKHR, synchronization2); |
97 | 101 | } |
98 | 102 |
|
99 | 103 | void HPPOITLinkedLists::build_command_buffers() |
@@ -132,15 +136,18 @@ void HPPOITLinkedLists::build_command_buffers() |
132 | 136 | } |
133 | 137 | command_buffer.endRenderPass(); |
134 | 138 |
|
135 | | - vkb::common::image_layout_transition(command_buffer, |
136 | | - linked_list_head_image->get_handle(), |
137 | | - vk::PipelineStageFlagBits::eFragmentShader, |
138 | | - vk::PipelineStageFlagBits::eFragmentShader, |
139 | | - vk::AccessFlagBits::eShaderWrite, |
140 | | - vk::AccessFlagBits::eShaderRead, |
141 | | - vk::ImageLayout::eGeneral, |
142 | | - vk::ImageLayout::eGeneral, |
143 | | - {vk::ImageAspectFlagBits::eColor, 0, 1, 0, 1}); |
| 139 | + // Insert a pipeline barrier to ensure that all writes to the fragment buffer performed in the gather pass are made available before reading from it in the combine pass |
| 140 | + vk::BufferMemoryBarrier2 buffer_barrier{.srcStageMask = vk::PipelineStageFlagBits2::eFragmentShader, |
| 141 | + .srcAccessMask = vk::AccessFlagBits2::eShaderStorageWrite, |
| 142 | + .dstStageMask = vk::PipelineStageFlagBits2::eFragmentShader, |
| 143 | + .dstAccessMask = vk::AccessFlagBits2::eShaderStorageRead, |
| 144 | + .srcQueueFamilyIndex = vk::QueueFamilyIgnored, |
| 145 | + .dstQueueFamilyIndex = vk::QueueFamilyIgnored, |
| 146 | + .buffer = fragment_buffer->get_handle(), |
| 147 | + .offset = 0, |
| 148 | + .size = vk::WholeSize}; |
| 149 | + vk::DependencyInfo dependency_info{.dependencyFlags = vk::DependencyFlagBits::eByRegion, .bufferMemoryBarrierCount = 1, .pBufferMemoryBarriers = &buffer_barrier}; |
| 150 | + command_buffer.pipelineBarrier2(dependency_info); |
144 | 151 |
|
145 | 152 | // Combine pass |
146 | 153 | combine_render_pass_begin_info.framebuffer = framebuffers[i]; |
@@ -270,21 +277,26 @@ void HPPOITLinkedLists::create_fragment_resources(vk::Extent2D const &extent) |
270 | 277 | { |
271 | 278 | const vk::Extent3D image_extent{extent.width, extent.height, 1}; |
272 | 279 | const vk::Format image_format{vk::Format::eR32Uint}; |
273 | | - linked_list_head_image = std::make_unique<vkb::core::HPPImage>(get_device(), |
274 | | - image_extent, |
275 | | - image_format, |
276 | | - vk::ImageUsageFlagBits::eStorage | vk::ImageUsageFlagBits::eTransferDst, |
277 | | - VMA_MEMORY_USAGE_GPU_ONLY, |
278 | | - vk::SampleCountFlagBits::e1); |
| 280 | + linked_list_head_image = std::make_unique<vkb::core::HPPImage>(get_device(), |
| 281 | + image_extent, |
| 282 | + image_format, |
| 283 | + vk::ImageUsageFlagBits::eStorage | vk::ImageUsageFlagBits::eTransferDst, |
| 284 | + VMA_MEMORY_USAGE_GPU_ONLY, |
| 285 | + vk::SampleCountFlagBits::e1); |
| 286 | + linked_list_head_image->set_debug_name("linked_list_head_image"); |
| 287 | + |
279 | 288 | linked_list_head_image_view = std::make_unique<vkb::core::HPPImageView>(*linked_list_head_image, vk::ImageViewType::e2D, image_format); |
| 289 | + linked_list_head_image_view->set_debug_name("linked_list_head_image_view"); |
280 | 290 |
|
281 | 291 | fragment_max_count = extent.width * extent.height * kFragmentsPerPixelAverage; |
282 | 292 | const uint32_t fragment_buffer_size = sizeof(glm::uvec3) * fragment_max_count; |
283 | 293 | fragment_buffer = |
284 | 294 | std::make_unique<vkb::core::BufferCpp>(get_device(), fragment_buffer_size, vk::BufferUsageFlagBits::eStorageBuffer, VMA_MEMORY_USAGE_GPU_ONLY); |
| 295 | + fragment_buffer->set_debug_name("fragment_buffer"); |
285 | 296 |
|
286 | 297 | fragment_counter = std::make_unique<vkb::core::BufferCpp>( |
287 | 298 | get_device(), sizeof(glm::uint), vk::BufferUsageFlagBits::eStorageBuffer | vk::BufferUsageFlagBits::eTransferDst, VMA_MEMORY_USAGE_GPU_ONLY); |
| 299 | + fragment_counter->set_debug_name("fragment_counter"); |
288 | 300 | } |
289 | 301 |
|
290 | 302 | void HPPOITLinkedLists::create_gather_pass_objects(vk::Extent2D const &extent) |
@@ -448,8 +460,8 @@ void HPPOITLinkedLists::update_descriptors() |
448 | 460 | vk::DescriptorBufferInfo fragment_buffer_descriptor{fragment_buffer->get_handle(), 0, vk::WholeSize}; |
449 | 461 | vk::DescriptorBufferInfo fragment_counter_descriptor{fragment_counter->get_handle(), 0, vk::WholeSize}; |
450 | 462 | vk::DescriptorImageInfo background_texture_descriptor{background_texture.sampler, |
451 | | - background_texture.image->get_vk_image_view().get_handle(), |
452 | | - descriptor_type_to_image_layout(vk::DescriptorType::eCombinedImageSampler, |
| 463 | + background_texture.image->get_vk_image_view().get_handle(), |
| 464 | + descriptor_type_to_image_layout(vk::DescriptorType::eCombinedImageSampler, |
453 | 465 | background_texture.image->get_vk_image_view().get_format())}; |
454 | 466 |
|
455 | 467 | std::array<vk::WriteDescriptorSet, 6> write_descriptor_sets = {{{.dstSet = descriptor_set, |
|
0 commit comments