Skip to content

Commit 6f3b26c

Browse files
committed
examples: Resolve VUID-vkQueueSubmit-pSignalSemaphores-00067
https://docs.vulkan.org/guide/latest/swapchain_semaphore_reuse.html A unique semaphore should be used per swapchain image, because the presentation engine may still reference and use it before the image index it was used with is returned out of `acquire_next_image()` again. Alternatives include waiting for the `Fence` from presentation in `VkSwapchainPresentFenceInfoKHR`, added by the `VK_EXT_swapchain_maintenance1`/`VK_KHR_swapchain_maintenance1` extension but this is less performant than just using a unique semaphore per swapchain image.
1 parent b6a9b53 commit 6f3b26c

File tree

3 files changed

+23
-12
lines changed

3 files changed

+23
-12
lines changed

ash-examples/src/bin/texture.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -711,6 +711,9 @@ fn main() -> Result<(), Box<dyn Error>> {
711711
},
712712
];
713713

714+
let rendering_complete_semaphore =
715+
base.rendering_complete_semaphores[present_index as usize];
716+
714717
let render_pass_begin_info = vk::RenderPassBeginInfo::default()
715718
.render_pass(renderpass)
716719
.framebuffer(framebuffers[present_index as usize])
@@ -724,7 +727,7 @@ fn main() -> Result<(), Box<dyn Error>> {
724727
base.present_queue,
725728
&[vk::PipelineStageFlags::BOTTOM_OF_PIPE],
726729
&[base.present_complete_semaphore],
727-
&[base.rendering_complete_semaphore],
730+
&[rendering_complete_semaphore],
728731
|device, draw_command_buffer| {
729732
device.cmd_begin_render_pass(
730733
draw_command_buffer,
@@ -773,7 +776,7 @@ fn main() -> Result<(), Box<dyn Error>> {
773776
);
774777
let present_info = vk::PresentInfoKHR {
775778
wait_semaphore_count: 1,
776-
p_wait_semaphores: &base.rendering_complete_semaphore,
779+
p_wait_semaphores: &rendering_complete_semaphore,
777780
swapchain_count: 1,
778781
p_swapchains: &base.swapchain,
779782
p_image_indices: &present_index,

ash-examples/src/bin/triangle.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,9 @@ fn main() -> Result<(), Box<dyn Error>> {
373373
},
374374
];
375375

376+
let rendering_complete_semaphore =
377+
base.rendering_complete_semaphores[present_index as usize];
378+
376379
let render_pass_begin_info = vk::RenderPassBeginInfo::default()
377380
.render_pass(renderpass)
378381
.framebuffer(framebuffers[present_index as usize])
@@ -386,7 +389,7 @@ fn main() -> Result<(), Box<dyn Error>> {
386389
base.present_queue,
387390
&[vk::PipelineStageFlags::COLOR_ATTACHMENT_OUTPUT],
388391
&[base.present_complete_semaphore],
389-
&[base.rendering_complete_semaphore],
392+
&[rendering_complete_semaphore],
390393
|device, draw_command_buffer| {
391394
device.cmd_begin_render_pass(
392395
draw_command_buffer,
@@ -425,7 +428,7 @@ fn main() -> Result<(), Box<dyn Error>> {
425428
device.cmd_end_render_pass(draw_command_buffer);
426429
},
427430
);
428-
let wait_semaphors = [base.rendering_complete_semaphore];
431+
let wait_semaphors = [rendering_complete_semaphore];
429432
let swapchains = [base.swapchain];
430433
let image_indices = [present_index];
431434
let present_info = vk::PresentInfoKHR::default()

ash-examples/src/lib.rs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ pub struct ExampleBase {
167167
pub depth_image_memory: vk::DeviceMemory,
168168

169169
pub present_complete_semaphore: vk::Semaphore,
170-
pub rendering_complete_semaphore: vk::Semaphore,
170+
pub rendering_complete_semaphores: Vec<vk::Semaphore>,
171171

172172
pub draw_commands_reuse_fence: vk::Fence,
173173
pub setup_commands_reuse_fence: vk::Fence,
@@ -533,9 +533,13 @@ impl ExampleBase {
533533
let present_complete_semaphore = device
534534
.create_semaphore(&semaphore_create_info, None)
535535
.unwrap();
536-
let rendering_complete_semaphore = device
537-
.create_semaphore(&semaphore_create_info, None)
538-
.unwrap();
536+
let rendering_complete_semaphores = (0..present_images.len())
537+
.map(|_| {
538+
device
539+
.create_semaphore(&semaphore_create_info, None)
540+
.unwrap()
541+
})
542+
.collect();
539543

540544
Ok(Self {
541545
event_loop: RefCell::new(event_loop),
@@ -560,7 +564,7 @@ impl ExampleBase {
560564
depth_image,
561565
depth_image_view,
562566
present_complete_semaphore,
563-
rendering_complete_semaphore,
567+
rendering_complete_semaphores,
564568
draw_commands_reuse_fence,
565569
setup_commands_reuse_fence,
566570
surface,
@@ -578,16 +582,17 @@ impl Drop for ExampleBase {
578582
self.device.device_wait_idle().unwrap();
579583
self.device
580584
.destroy_semaphore(self.present_complete_semaphore, None);
581-
self.device
582-
.destroy_semaphore(self.rendering_complete_semaphore, None);
585+
for &semaphore in &self.rendering_complete_semaphores {
586+
self.device.destroy_semaphore(semaphore, None);
587+
}
583588
self.device
584589
.destroy_fence(self.draw_commands_reuse_fence, None);
585590
self.device
586591
.destroy_fence(self.setup_commands_reuse_fence, None);
587592
self.device.free_memory(self.depth_image_memory, None);
588593
self.device.destroy_image_view(self.depth_image_view, None);
589594
self.device.destroy_image(self.depth_image, None);
590-
for &image_view in self.present_image_views.iter() {
595+
for &image_view in &self.present_image_views {
591596
self.device.destroy_image_view(image_view, None);
592597
}
593598
self.device.destroy_command_pool(self.pool, None);

0 commit comments

Comments
 (0)