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.
(
&self,
wait_mask: &[vk::PipelineStageFlags],
f: F,
)
| 1031 | /// is executed. That way we can delay the waiting for the fences by 1 frame which is good for performance. |
| 1032 | /// Make sure to create the fence in a signaled state on the first use. |
| 1033 | pub fn record_submit_commandbuffer<F: FnOnce(&ash::Device, vk::CommandBuffer)>( |
| 1034 | &self, |
| 1035 | wait_mask: &[vk::PipelineStageFlags], |
| 1036 | f: F, |
| 1037 | ) { |
| 1038 | unsafe { |
| 1039 | self.base |
| 1040 | .device |
| 1041 | .wait_for_fences(&[self.sync.draw_commands_reuse_fence], true, std::u64::MAX) |
| 1042 | .expect("Wait for fence failed."); |
| 1043 | |
| 1044 | self.base |
| 1045 | .device |
| 1046 | .reset_fences(&[self.sync.draw_commands_reuse_fence]) |
| 1047 | .expect("Reset fences failed."); |
| 1048 | |
| 1049 | // As we only have a single command buffer, we can simply reset the entire pool instead of just the buffer. |
| 1050 | // Doing this is a little bit faster, see |
| 1051 | // https://arm-software.github.io/vulkan_best_practice_for_mobile_developers/samples/performance/command_buffer_usage/command_buffer_usage_tutorial.html#resetting-the-command-pool |
| 1052 | self.base |
| 1053 | .device |
| 1054 | .reset_command_pool(self.commands.pool, vk::CommandPoolResetFlags::empty()) |
| 1055 | .expect("Reset command pool failed."); |
| 1056 | |
| 1057 | let command_buffer_begin_info = vk::CommandBufferBeginInfo::builder() |
| 1058 | .flags(vk::CommandBufferUsageFlags::ONE_TIME_SUBMIT); |
| 1059 | |
| 1060 | self.base |
| 1061 | .device |
| 1062 | .begin_command_buffer( |
| 1063 | self.commands.draw_command_buffer, |
| 1064 | &command_buffer_begin_info, |
| 1065 | ) |
| 1066 | .expect("Begin commandbuffer"); |
| 1067 | |
| 1068 | f(&self.base.device, self.commands.draw_command_buffer); |
| 1069 | |
| 1070 | self.base |
| 1071 | .device |
| 1072 | .end_command_buffer(self.commands.draw_command_buffer) |
| 1073 | .expect("End commandbuffer"); |
| 1074 | |
| 1075 | let command_buffers = vec![self.commands.draw_command_buffer]; |
| 1076 | let wait_semaphores = &[self.sync.present_complete_semaphore]; |
| 1077 | let signal_semaphores = &[self.sync.rendering_complete_semaphore]; |
| 1078 | let submit_info = vk::SubmitInfo::builder() |
| 1079 | .wait_semaphores(wait_semaphores) |
| 1080 | .wait_dst_stage_mask(wait_mask) |
| 1081 | .command_buffers(&command_buffers) |
| 1082 | .signal_semaphores(signal_semaphores); |
| 1083 | |
| 1084 | self.base |
| 1085 | .device |
| 1086 | .queue_submit( |
| 1087 | self.base.present_queue, |
| 1088 | &[submit_info.build()], |
| 1089 | self.sync.draw_commands_reuse_fence, |
| 1090 | ) |