From 2ad51b32a606cc6edf07c7900652356af910ec2c Mon Sep 17 00:00:00 2001 From: Jinlei Li Date: Wed, 23 Feb 2022 22:25:19 +0800 Subject: [PATCH 1/2] metal: set `max_buffer_size` by the correct physical device limits, M1 Max can support up to 36GB --- wgpu-hal/src/metal/adapter.rs | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/wgpu-hal/src/metal/adapter.rs b/wgpu-hal/src/metal/adapter.rs index 1a08596699..9da58bcebe 100644 --- a/wgpu-hal/src/metal/adapter.rs +++ b/wgpu-hal/src/metal/adapter.rs @@ -1,5 +1,9 @@ use mtl::{MTLFeatureSet, MTLGPUFamily, MTLLanguageVersion}; -use objc::{class, msg_send, sel, sel_impl}; +use objc::{ + class, msg_send, + runtime::{BOOL, YES}, + sel, sel_impl, +}; use parking_lot::Mutex; use wgt::{AstcBlock, AstcChannel}; @@ -819,10 +823,18 @@ impl super::PrivateCapabilities { max_textures_per_stage: if os_is_mac { 128 } else { 31 }, max_samplers_per_stage: 16, buffer_alignment: if os_is_mac { 256 } else { 64 }, - max_buffer_size: if device.supports_feature_set(MTLFeatureSet::macOS_GPUFamily1_v2) { - 1 << 30 // 1GB on macOS 1.2 and up - } else { - 1 << 28 // 256MB otherwise + max_buffer_size: unsafe { + let sel = sel!(maxBufferLength); + let can_use: BOOL = msg_send![device.as_ref(), respondsToSelector: sel]; + if can_use == YES { + // maxBufferLength available on macOS 10.14+ and iOS 12.0+ + let buffer_size: mtl::NSInteger = msg_send![device.as_ref(), maxBufferLength]; + buffer_size as _ + } else if os_is_mac { + 1 << 30 // 1GB on macOS 10.11 and up + } else { + 1 << 28 // 256MB on iOS 8.0+ + } }, max_texture_size: if Self::supports_any( device, From 669ec769fd6097657e298b4e01c1738578b04511 Mon Sep 17 00:00:00 2001 From: Jinlei Li Date: Wed, 23 Feb 2022 23:10:42 +0800 Subject: [PATCH 2/2] metal: simplify surface `fn dimensions()` --- wgpu-hal/src/metal/surface.rs | 30 ++++++------------------------ 1 file changed, 6 insertions(+), 24 deletions(-) diff --git a/wgpu-hal/src/metal/surface.rs b/wgpu-hal/src/metal/surface.rs index 35651a7f82..124cf910f3 100644 --- a/wgpu-hal/src/metal/surface.rs +++ b/wgpu-hal/src/metal/surface.rs @@ -134,30 +134,12 @@ impl super::Surface { } pub(super) fn dimensions(&self) -> wgt::Extent3d { - let (size, scale): (CGSize, CGFloat) = match self.view { - Some(view) if !cfg!(target_os = "macos") => unsafe { - let bounds: CGRect = msg_send![view.as_ptr(), bounds]; - let window: Option> = msg_send![view.as_ptr(), window]; - let screen = window.and_then(|window| -> Option> { - msg_send![window.as_ptr(), screen] - }); - match screen { - Some(screen) => { - let screen_space: *mut Object = msg_send![screen.as_ptr(), coordinateSpace]; - let rect: CGRect = msg_send![view.as_ptr(), convertRect:bounds toCoordinateSpace:screen_space]; - let scale_factor: CGFloat = msg_send![screen.as_ptr(), nativeScale]; - (rect.size, scale_factor) - } - None => (bounds.size, 1.0), - } - }, - _ => unsafe { - let render_layer_borrow = self.render_layer.lock(); - let render_layer = render_layer_borrow.as_ref(); - let bounds: CGRect = msg_send![render_layer, bounds]; - let contents_scale: CGFloat = msg_send![render_layer, contentsScale]; - (bounds.size, contents_scale) - }, + let (size, scale): (CGSize, CGFloat) = unsafe { + let render_layer_borrow = self.render_layer.lock(); + let render_layer = render_layer_borrow.as_ref(); + let bounds: CGRect = msg_send![render_layer, bounds]; + let contents_scale: CGFloat = msg_send![render_layer, contentsScale]; + (bounds.size, contents_scale) }; wgt::Extent3d {