Avoid panic when unable to access a GPU

Max Brunsfeld and Nathan Sobo created

This will remove noise from our panic logs.

Co-authored-by: Nathan Sobo <nathan@zed.dev>

Change summary

crates/gpui/src/platform/mac/window.rs | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)

Detailed changes

crates/gpui/src/platform/mac/window.rs 🔗

@@ -11,8 +11,8 @@ use crate::{
 use block::ConcreteBlock;
 use cocoa::{
     appkit::{
-        CGPoint, NSApplication, NSBackingStoreBuffered, NSScreen, NSView, NSViewHeightSizable,
-        NSViewWidthSizable, NSWindow, NSWindowButton, NSWindowStyleMask,
+        CGPoint, NSApplication, NSBackingStoreBuffered, NSModalResponse, NSScreen, NSView,
+        NSViewHeightSizable, NSViewWidthSizable, NSWindow, NSWindowButton, NSWindowStyleMask,
     },
     base::{id, nil},
     foundation::{NSAutoreleasePool, NSInteger, NSSize, NSString},
@@ -228,8 +228,16 @@ impl Window {
                 native_window.setFrame_display_(screen.visibleFrame(), YES);
             }
 
-            let device =
-                metal::Device::system_default().expect("could not find default metal device");
+            let device = if let Some(device) = metal::Device::system_default() {
+                device
+            } else {
+                let alert: id = msg_send![class!(NSAlert), alloc];
+                let _: () = msg_send![alert, init];
+                let _: () = msg_send![alert, setAlertStyle: 2];
+                let _: () = msg_send![alert, setMessageText: ns_string("Unable to access a compatible graphics device")];
+                let _: NSModalResponse = msg_send![alert, runModal];
+                std::process::exit(1);
+            };
 
             let layer: id = msg_send![class!(CAMetalLayer), layer];
             let _: () = msg_send![layer, setDevice: device.as_ptr()];