From a65b0cc1bb44ff79ca159ab4d495d93f4895c544 Mon Sep 17 00:00:00 2001 From: Martin Fouilleul Date: Mon, 10 Jul 2023 11:28:49 +0200 Subject: [PATCH] [osx, surface] Query list of available metal devices, and select a discrete GPU if available. This way we avoid calling MTLCreateSystemDefaultDevice() which messes with Discord's screen sharing, while also being able to take GPU frame captures in XCode (which was broken by 9bfae2c4e8) --- src/mtl_surface.m | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/mtl_surface.m b/src/mtl_surface.m index e310030..c4811ba 100644 --- a/src/mtl_surface.m +++ b/src/mtl_surface.m @@ -177,10 +177,30 @@ mg_surface_data* mg_mtl_surface_create_for_window(mp_window window) This works for now and allows screen sharing while using orca, but we'll have to revisit this when we want more control over what GPU gets used. */ + surface->device = nil; + + //Select a discrete GPU, if possible + NSArray>* devices = MTLCopyAllDevices(); + for(id device in devices) + { + if(!device.isRemovable && !device.isLowPower) + { + surface->device = device; + break; + } + } + if(surface->device == nil) + { + log_warning("Couldn't select a discrete GPU, using first available device\n"); + surface->device = devices[0]; + } + + //surface->device = MTLCreateSystemDefaultDevice(); + surface->mtlLayer = [CAMetalLayer layer]; [surface->mtlLayer retain]; - surface->mtlLayer.device = surface->mtlLayer.preferredDevice; - surface->device = surface->mtlLayer.device; + surface->mtlLayer.device = surface->device; + [surface->mtlLayer setOpaque:NO];