alpha2_native_gpu/
memory_budget.rs1#[must_use]
9pub fn adapter_memory_budget(adapter: &wgpu::Adapter) -> Option<u64> {
10 platform_budget(adapter).filter(|bytes| *bytes > 0)
11}
12
13#[cfg(target_os = "linux")]
15fn platform_budget(adapter: &wgpu::Adapter) -> Option<u64> {
16 use ash::vk;
17
18 let hal = unsafe { adapter.as_hal::<wgpu_hal::api::Vulkan>() }?;
20 let physical = hal.raw_physical_device();
21 let instance = hal.shared_instance().raw_instance();
22 let extensions = unsafe { instance.enumerate_device_extension_properties(physical) }.ok()?;
24 let has_budget = extensions
25 .iter()
26 .any(|extension| extension.extension_name_as_c_str() == Ok(ash::ext::memory_budget::NAME));
27 if !has_budget {
28 return None;
29 }
30 let mut budget = vk::PhysicalDeviceMemoryBudgetPropertiesEXT::default();
31 let mut properties = vk::PhysicalDeviceMemoryProperties2::default().push_next(&mut budget);
32 unsafe { instance.get_physical_device_memory_properties2(physical, &mut properties) };
35 let heaps = properties.memory_properties;
36 let count = usize::try_from(heaps.memory_heap_count).ok()?;
37 let total = heaps.memory_heaps[..count.min(heaps.memory_heaps.len())]
38 .iter()
39 .zip(budget.heap_budget)
40 .filter(|(heap, _)| heap.flags.contains(vk::MemoryHeapFlags::DEVICE_LOCAL))
41 .map(|(_, bytes)| bytes)
42 .fold(0_u64, u64::saturating_add);
43 Some(total)
44}
45
46#[cfg(target_os = "windows")]
48fn platform_budget(adapter: &wgpu::Adapter) -> Option<u64> {
49 let hal = unsafe { adapter.as_hal::<wgpu_hal::api::Dx12>() }?;
51 let info = hal
52 .raw_adapter()
53 .query_video_memory_info(windows::Win32::Graphics::Dxgi::DXGI_MEMORY_SEGMENT_GROUP_LOCAL)
54 .ok()?;
55 Some(info.Budget)
56}
57
58#[cfg(target_os = "macos")]
59fn platform_budget(adapter: &wgpu::Adapter) -> Option<u64> {
60 use objc2_metal::MTLDevice;
61
62 let hal = unsafe { adapter.as_hal::<wgpu_hal::api::Metal>() }?;
64 Some(hal.raw_device().recommendedMaxWorkingSetSize())
65}
66
67#[cfg(not(any(target_os = "linux", target_os = "windows", target_os = "macos")))]
68fn platform_budget(_: &wgpu::Adapter) -> Option<u64> {
69 None
70}