@@ -43,6 +43,8 @@ CalibratedTimestamps::CalibratedTimestamps() :
4343{
4444 title = " Calibrated Timestamps" ;
4545
46+ add_device_extension (VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME);
47+
4648 // NOTICE THAT: calibrated timestamps is a DEVICE extension!
4749 add_device_extension (VK_EXT_CALIBRATED_TIMESTAMPS_EXTENSION_NAME);
4850}
@@ -90,6 +92,8 @@ void CalibratedTimestamps::request_gpu_features(vkb::core::PhysicalDeviceC &gpu)
9092 {
9193 gpu.get_mutable_requested_features ().samplerAnisotropy = VK_TRUE;
9294 }
95+
96+ REQUEST_REQUIRED_FEATURE (gpu, VkPhysicalDeviceSynchronization2FeaturesKHR, synchronization2);
9397}
9498
9599void CalibratedTimestamps::build_command_buffers ()
@@ -151,15 +155,49 @@ void CalibratedTimestamps::build_command_buffers()
151155 vkCmdEndRenderPass (draw_cmd_buffers[i]);
152156 }
153157
158+ // Insert a pipeline barrier to ensure that the offscreen color attachment writes are finished before sampling from it in the filter and composition passes
159+ VkImageMemoryBarrier2KHR image_memory_barrier = {
160+ .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2_KHR,
161+ .pNext = nullptr ,
162+ .srcStageMask = VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT_KHR,
163+ .srcAccessMask = VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT_KHR,
164+ .dstStageMask = VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT_KHR,
165+ .dstAccessMask = VK_ACCESS_2_SHADER_READ_BIT_KHR,
166+ .oldLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
167+ .newLayout = VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL,
168+ .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
169+ .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
170+ .image = offscreen.color [0 ].image ,
171+ .subresourceRange = {.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, .baseMipLevel = 0 , .levelCount = 1 , .baseArrayLayer = 0 , .layerCount = 1 }};
172+ VkDependencyInfoKHR dependency_info = {
173+ .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO_KHR,
174+ .pNext = nullptr ,
175+ .dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT,
176+ .memoryBarrierCount = 0 ,
177+ .pMemoryBarriers = nullptr ,
178+ .bufferMemoryBarrierCount = 0 ,
179+ .pBufferMemoryBarriers = nullptr ,
180+ .imageMemoryBarrierCount = 1 ,
181+ .pImageMemoryBarriers = &image_memory_barrier};
182+ vkCmdPipelineBarrier2KHR (draw_cmd_buffers[i], &dependency_info);
183+
154184 if (bloom)
155185 {
186+ // Insert a pipeline barrier to ensure that the offscreen color attachment writes are finished before sampling from it in the filter pass
187+ image_memory_barrier.image = offscreen.color [1 ].image ;
188+ vkCmdPipelineBarrier2KHR (draw_cmd_buffers[i], &dependency_info);
189+
156190 vkCmdBeginRenderPass (draw_cmd_buffers[i], &filter_render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE);
157191 vkCmdSetViewport (draw_cmd_buffers[i], 0 , 1 , &filter_viewport);
158192 vkCmdSetScissor (draw_cmd_buffers[i], 0 , 1 , &filter_scissor);
159193 vkCmdBindDescriptorSets (draw_cmd_buffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layouts.bloom_filter , 0 , 1 , &descriptor_sets.bloom_filter , 0 , nullptr );
160194 vkCmdBindPipeline (draw_cmd_buffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.bloom [1 ]);
161195 vkCmdDraw (draw_cmd_buffers[i], 3 , 1 , 0 , 0 );
162196 vkCmdEndRenderPass (draw_cmd_buffers[i]);
197+
198+ // Insert a pipeline barrier to ensure that the filter pass color attachment writes are finished before sampling from it in the composition pass
199+ image_memory_barrier.image = filter_pass.color [0 ].image ;
200+ vkCmdPipelineBarrier2KHR (draw_cmd_buffers[i], &dependency_info);
163201 }
164202
165203 {
@@ -305,16 +343,16 @@ void CalibratedTimestamps::prepare_offscreen_buffer()
305343 dependencies[0 ].srcSubpass = VK_SUBPASS_EXTERNAL;
306344 dependencies[0 ].dstSubpass = 0 ;
307345 dependencies[0 ].srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
308- dependencies[0 ].dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
346+ dependencies[0 ].dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT ;
309347 dependencies[0 ].srcAccessMask = VK_ACCESS_MEMORY_READ_BIT;
310- dependencies[0 ].dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
348+ dependencies[0 ].dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT ;
311349 dependencies[0 ].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
312350
313351 dependencies[1 ].srcSubpass = 0 ;
314352 dependencies[1 ].dstSubpass = VK_SUBPASS_EXTERNAL;
315- dependencies[1 ].srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
353+ dependencies[1 ].srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT ;
316354 dependencies[1 ].dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
317- dependencies[1 ].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
355+ dependencies[1 ].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT ;
318356 dependencies[1 ].dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
319357 dependencies[1 ].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
320358
0 commit comments