[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)

This commit is contained in:
Martin Fouilleul 2023-07-10 11:28:49 +02:00
parent 7573c40c56
commit a65b0cc1bb
1 changed files with 22 additions and 2 deletions

View File

@ -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<id<MTLDevice>>* devices = MTLCopyAllDevices();
for(id<MTLDevice> 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];