Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 7 additions & 4 deletions ash-examples/src/bin/texture.rs
Original file line number Diff line number Diff line change
Expand Up @@ -352,8 +352,8 @@ fn main() -> Result<(), Box<dyn Error>> {

record_submit_commandbuffer(
&base.device,
base.setup_command_buffer,
base.setup_commands_reuse_fence,
base.app_setup_command_buffer,
vk::Fence::null(),
base.present_queue,
&[],
&[],
Expand Down Expand Up @@ -711,6 +711,9 @@ fn main() -> Result<(), Box<dyn Error>> {
},
];

let rendering_complete_semaphore =
base.rendering_complete_semaphores[present_index as usize];

let render_pass_begin_info = vk::RenderPassBeginInfo::default()
.render_pass(renderpass)
.framebuffer(framebuffers[present_index as usize])
Expand All @@ -724,7 +727,7 @@ fn main() -> Result<(), Box<dyn Error>> {
base.present_queue,
&[vk::PipelineStageFlags::BOTTOM_OF_PIPE],
&[base.present_complete_semaphore],
&[base.rendering_complete_semaphore],
&[rendering_complete_semaphore],
|device, draw_command_buffer| {
device.cmd_begin_render_pass(
draw_command_buffer,
Expand Down Expand Up @@ -773,7 +776,7 @@ fn main() -> Result<(), Box<dyn Error>> {
);
let present_info = vk::PresentInfoKHR {
wait_semaphore_count: 1,
p_wait_semaphores: &base.rendering_complete_semaphore,
p_wait_semaphores: &rendering_complete_semaphore,
swapchain_count: 1,
p_swapchains: &base.swapchain,
p_image_indices: &present_index,
Expand Down
7 changes: 5 additions & 2 deletions ash-examples/src/bin/triangle.rs
Original file line number Diff line number Diff line change
Expand Up @@ -373,6 +373,9 @@ fn main() -> Result<(), Box<dyn Error>> {
},
];

let rendering_complete_semaphore =
base.rendering_complete_semaphores[present_index as usize];

let render_pass_begin_info = vk::RenderPassBeginInfo::default()
.render_pass(renderpass)
.framebuffer(framebuffers[present_index as usize])
Expand All @@ -386,7 +389,7 @@ fn main() -> Result<(), Box<dyn Error>> {
base.present_queue,
&[vk::PipelineStageFlags::COLOR_ATTACHMENT_OUTPUT],
&[base.present_complete_semaphore],
&[base.rendering_complete_semaphore],
&[rendering_complete_semaphore],
|device, draw_command_buffer| {
device.cmd_begin_render_pass(
draw_command_buffer,
Expand Down Expand Up @@ -425,7 +428,7 @@ fn main() -> Result<(), Box<dyn Error>> {
device.cmd_end_render_pass(draw_command_buffer);
},
);
let wait_semaphors = [base.rendering_complete_semaphore];
let wait_semaphors = [rendering_complete_semaphore];
let swapchains = [base.swapchain];
let image_indices = [present_index];
let present_info = vk::PresentInfoKHR::default()
Expand Down
65 changes: 35 additions & 30 deletions ash-examples/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,7 @@ macro_rules! offset_of {
}
}};
}
/// Helper function for submitting command buffers. Immediately waits for the fence before the command buffer
/// is executed. That way we can delay the waiting for the fences by 1 frame which is good for performance.
/// Make sure to create the fence in a signaled state on the first use.

#[allow(clippy::too_many_arguments)]
pub fn record_submit_commandbuffer<F: FnOnce(&Device, vk::CommandBuffer)>(
device: &Device,
Expand All @@ -51,14 +49,6 @@ pub fn record_submit_commandbuffer<F: FnOnce(&Device, vk::CommandBuffer)>(
f: F,
) {
unsafe {
device
.wait_for_fences(&[command_buffer_reuse_fence], true, u64::MAX)
.expect("Wait for fence failed.");

device
.reset_fences(&[command_buffer_reuse_fence])
.expect("Reset fences failed.");

device
.reset_command_buffer(
command_buffer,
Expand Down Expand Up @@ -161,16 +151,16 @@ pub struct ExampleBase {
pub pool: vk::CommandPool,
pub draw_command_buffer: vk::CommandBuffer,
pub setup_command_buffer: vk::CommandBuffer,
pub app_setup_command_buffer: vk::CommandBuffer,

pub depth_image: vk::Image,
pub depth_image_view: vk::ImageView,
pub depth_image_memory: vk::DeviceMemory,

pub present_complete_semaphore: vk::Semaphore,
pub rendering_complete_semaphore: vk::Semaphore,
pub rendering_complete_semaphores: Vec<vk::Semaphore>,

pub draw_commands_reuse_fence: vk::Fence,
pub setup_commands_reuse_fence: vk::Fence,
}

impl ExampleBase {
Expand All @@ -194,7 +184,21 @@ impl ExampleBase {
} => {
elwp.exit();
}
Event::AboutToWait => f(),
Event::AboutToWait => {
unsafe {
self.device.wait_for_fences(
&[self.draw_commands_reuse_fence],
true,
u64::MAX,
)
}
.expect("Wait for fence failed.");

unsafe { self.device.reset_fences(&[self.draw_commands_reuse_fence]) }
.expect("Reset fences failed.");

f()
}
_ => (),
}
})
Expand Down Expand Up @@ -400,15 +404,16 @@ impl ExampleBase {
let pool = device.create_command_pool(&pool_create_info, None).unwrap();

let command_buffer_allocate_info = vk::CommandBufferAllocateInfo::default()
.command_buffer_count(2)
.command_buffer_count(3)
.command_pool(pool)
.level(vk::CommandBufferLevel::PRIMARY);

let command_buffers = device
.allocate_command_buffers(&command_buffer_allocate_info)
.unwrap();
let setup_command_buffer = command_buffers[0];
let draw_command_buffer = command_buffers[1];
let app_setup_command_buffer = command_buffers[1];
let draw_command_buffer = command_buffers[2];

let present_images = swapchain_loader.get_swapchain_images(swapchain).unwrap();
let present_image_views: Vec<vk::ImageView> = present_images
Expand Down Expand Up @@ -473,14 +478,11 @@ impl ExampleBase {
let draw_commands_reuse_fence = device
.create_fence(&fence_create_info, None)
.expect("Create fence failed.");
let setup_commands_reuse_fence = device
.create_fence(&fence_create_info, None)
.expect("Create fence failed.");

record_submit_commandbuffer(
&device,
setup_command_buffer,
setup_commands_reuse_fence,
vk::Fence::null(),
present_queue,
&[],
&[],
Expand Down Expand Up @@ -533,9 +535,13 @@ impl ExampleBase {
let present_complete_semaphore = device
.create_semaphore(&semaphore_create_info, None)
.unwrap();
let rendering_complete_semaphore = device
.create_semaphore(&semaphore_create_info, None)
.unwrap();
let rendering_complete_semaphores = (0..present_images.len())
.map(|_| {
device
.create_semaphore(&semaphore_create_info, None)
.unwrap()
})
.collect();

Ok(Self {
event_loop: RefCell::new(event_loop),
Expand All @@ -557,12 +563,12 @@ impl ExampleBase {
pool,
draw_command_buffer,
setup_command_buffer,
app_setup_command_buffer,
depth_image,
depth_image_view,
present_complete_semaphore,
rendering_complete_semaphore,
rendering_complete_semaphores,
draw_commands_reuse_fence,
setup_commands_reuse_fence,
surface,
debug_call_back,
debug_utils_loader,
Expand All @@ -578,16 +584,15 @@ impl Drop for ExampleBase {
self.device.device_wait_idle().unwrap();
self.device
.destroy_semaphore(self.present_complete_semaphore, None);
self.device
.destroy_semaphore(self.rendering_complete_semaphore, None);
for &semaphore in &self.rendering_complete_semaphores {
self.device.destroy_semaphore(semaphore, None);
}
self.device
.destroy_fence(self.draw_commands_reuse_fence, None);
self.device
.destroy_fence(self.setup_commands_reuse_fence, None);
self.device.free_memory(self.depth_image_memory, None);
self.device.destroy_image_view(self.depth_image_view, None);
self.device.destroy_image(self.depth_image, None);
for &image_view in self.present_image_views.iter() {
for &image_view in &self.present_image_views {
self.device.destroy_image_view(image_view, None);
}
self.device.destroy_command_pool(self.pool, None);
Expand Down