Skip to content

Commit be752d2

Browse files
committed
Resolved synchronization issues in extensions sample calibrated_timestamps
1 parent fa2cf45 commit be752d2

File tree

1 file changed

+42
-4
lines changed

1 file changed

+42
-4
lines changed

samples/extensions/calibrated_timestamps/calibrated_timestamps.cpp

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

9599
void 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

Comments
 (0)