use ash::vk;
#[allow(clippy::too_many_arguments)]
pub(crate) fn record_and_submit_command_buffer<F: FnOnce(&ash::Device, vk::CommandBuffer)>(
device: &ash::Device,
command_buffer: vk::CommandBuffer,
command_buffer_reuse_fence: vk::Fence,
submit_queue: vk::Queue,
wait_mask: &[vk::PipelineStageFlags],
wait_semaphores: &[vk::Semaphore],
signal_semaphores: &[vk::Semaphore],
f: F,
) {
unsafe { device.wait_for_fences(&[command_buffer_reuse_fence], true, u64::MAX) }.unwrap();
unsafe { device.reset_fences(&[command_buffer_reuse_fence]) }.unwrap();
unsafe {
device.reset_command_buffer(
command_buffer,
vk::CommandBufferResetFlags::RELEASE_RESOURCES,
)
}
.unwrap();
let command_buffer_begin_info =
vk::CommandBufferBeginInfo::builder().flags(vk::CommandBufferUsageFlags::ONE_TIME_SUBMIT);
unsafe { device.begin_command_buffer(command_buffer, &command_buffer_begin_info) }.unwrap();
f(device, command_buffer);
unsafe { device.end_command_buffer(command_buffer) }.unwrap();
let command_buffers = [command_buffer];
let submit_info = vk::SubmitInfo::builder()
.wait_semaphores(wait_semaphores)
.wait_dst_stage_mask(wait_mask)
.command_buffers(&command_buffers)
.signal_semaphores(signal_semaphores);
unsafe {
device.queue_submit(
submit_queue,
std::slice::from_ref(&submit_info),
command_buffer_reuse_fence,
)
}
.unwrap();
}