MCPcopy Create free account
hub / github.com/Rust-GPU/rust-gpu / record_submit_commandbuffer

Method record_submit_commandbuffer

examples/runners/ash/src/main.rs:1033–1093  ·  view source on GitHub ↗

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,
    )

Source from the content-addressed store, hash-verified

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 )

Callers 1

drawMethod · 0.80

Calls 3

expectMethod · 0.80
fFunction · 0.50
buildMethod · 0.45

Tested by

no test coverage detected