Skip to content

Commit 5954035

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

1 file changed

Lines changed: 50 additions & 12 deletions

File tree

samples/extensions/calibrated_timestamps/calibrated_timestamps.cpp

Lines changed: 50 additions & 12 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

@@ -532,10 +570,10 @@ void CalibratedTimestamps::setup_descriptor_sets()
532570
VkDescriptorImageInfo environment_image_descriptor = create_descriptor(textures.environment_map);
533571
VkDescriptorBufferInfo params_buffer_descriptor = create_descriptor(*uniform_buffers.params);
534572
std::vector<VkWriteDescriptorSet> write_descriptor_sets = {
535-
vkb::initializers::write_descriptor_set(descriptor_sets.object, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, &matrix_buffer_descriptor),
536-
vkb::initializers::write_descriptor_set(descriptor_sets.object, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, &environment_image_descriptor),
537-
vkb::initializers::write_descriptor_set(descriptor_sets.object, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 2, &params_buffer_descriptor),
538-
};
573+
vkb::initializers::write_descriptor_set(descriptor_sets.object, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, &matrix_buffer_descriptor),
574+
vkb::initializers::write_descriptor_set(descriptor_sets.object, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, &environment_image_descriptor),
575+
vkb::initializers::write_descriptor_set(descriptor_sets.object, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 2, &params_buffer_descriptor),
576+
};
539577
vkUpdateDescriptorSets(get_device().get_handle(), static_cast<uint32_t>(write_descriptor_sets.size()), write_descriptor_sets.data(), 0, nullptr);
540578

541579
VK_CHECK(vkAllocateDescriptorSets(get_device().get_handle(), &alloc_info, &descriptor_sets.skybox));
@@ -544,10 +582,10 @@ void CalibratedTimestamps::setup_descriptor_sets()
544582
environment_image_descriptor = create_descriptor(textures.environment_map);
545583
params_buffer_descriptor = create_descriptor(*uniform_buffers.params);
546584
write_descriptor_sets = {
547-
vkb::initializers::write_descriptor_set(descriptor_sets.skybox, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, &matrix_buffer_descriptor),
548-
vkb::initializers::write_descriptor_set(descriptor_sets.skybox, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, &environment_image_descriptor),
549-
vkb::initializers::write_descriptor_set(descriptor_sets.skybox, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 2, &params_buffer_descriptor),
550-
};
585+
vkb::initializers::write_descriptor_set(descriptor_sets.skybox, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, &matrix_buffer_descriptor),
586+
vkb::initializers::write_descriptor_set(descriptor_sets.skybox, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, &environment_image_descriptor),
587+
vkb::initializers::write_descriptor_set(descriptor_sets.skybox, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 2, &params_buffer_descriptor),
588+
};
551589
vkUpdateDescriptorSets(get_device().get_handle(), static_cast<uint32_t>(write_descriptor_sets.size()), write_descriptor_sets.data(), 0, nullptr);
552590

553591
alloc_info = vkb::initializers::descriptor_set_allocate_info(descriptor_pool, &descriptor_set_layouts.bloom_filter, 1);

0 commit comments

Comments
 (0)