Skip to content

Commit bd881ae

Browse files
author
Vasily Galkin
committed
Initial busy-wait implementation
1 parent 8392199 commit bd881ae

1 file changed

Lines changed: 26 additions & 3 deletions

File tree

src/main.rs

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,16 @@ impl<T> MapErrRetryWithLowerMemory for erupt::utils::VulkanResult<T> {
487487
}
488488
}
489489

490+
fn map_not_ready_to_false(
491+
vk_result: erupt::utils::VulkanResult<()>,
492+
) -> erupt::utils::VulkanResult<bool> {
493+
if vk_result.raw == vk::Result::NOT_READY {
494+
erupt::utils::VulkanResult::new(vk::Result::SUCCESS, false)
495+
} else {
496+
erupt::utils::VulkanResult::new(vk_result.raw, true)
497+
}
498+
}
499+
490500
unsafe extern "system" fn debug_callback(
491501
_message_severity: vk::DebugUtilsMessageSeverityFlagBitsEXT,
492502
_message_types: vk::DebugUtilsMessageTypeFlagsEXT,
@@ -823,6 +833,12 @@ fn test_device<Writer: std::io::Write>(
823833
let submit_info = &[vk::SubmitInfoBuilder::new().command_buffers(&cmd_bufs)];
824834
//all preparations except huge buffer allocation done. Now allocate huge buffer as a last step to minize chance of allocation failure for small structures
825835

836+
//by default load cpu for faster wait on platforms where cpu load shouldn't affect cpu speed.
837+
let load_cpu_during_wait = physical_props.device_type == vk::PhysicalDeviceType::DISCRETE_GPU
838+
&& std::env::consts::ARCH == "x86_64";
839+
// but this may be override from environment var_os
840+
let load_cpu_during_wait = env::var("MEMTEST_VULKAN_EMULATE_LOAD_CPU_DURING_WAIT")
841+
.map_or(load_cpu_during_wait, |s| s != "0");
826842
let mut test_memory = None;
827843
let mut test_buffer = None;
828844
let mut test_window_count;
@@ -914,9 +930,16 @@ fn test_device<Writer: std::io::Write>(
914930
device
915931
.queue_submit(queue, submit_info, fence)
916932
.err_retry_with_lower_memory(env, "queue_submit")?;
917-
device
918-
.wait_for_fences(&[fence], true, u64::MAX)
919-
.err_retry_with_lower_memory(env, "wait_for_fences")?;
933+
if load_cpu_during_wait {
934+
loop {
935+
let fence_signaled = map_not_ready_to_false(device.get_fence_status(fence)).err_retry_with_lower_memory(env, "get_fence_status")?;
936+
if fence_signaled {break;}
937+
}
938+
} else {
939+
device
940+
.wait_for_fences(&[fence], true, u64::MAX)
941+
.err_retry_with_lower_memory(env, "wait_for_fences")?;
942+
}
920943
device.reset_fences(&[fence]).err_retry_with_lower_memory(env, "reset_fences")?;
921944
Ok(())
922945
}

0 commit comments

Comments
 (0)