From 9bfae2c4e8f87af77e27b5396b01ec6bd5333de5 Mon Sep 17 00:00:00 2001 From: Martin Fouilleul Date: Fri, 7 Jul 2023 10:41:17 +0200 Subject: [PATCH] [osx, metal] Set metal layer's device to layer.preferredDevice instead of calling MTLCreateDefaultSystemDevice(). This fixes issue 15 so we can use Discord's screen sharing while using Orca. This will need to be revisited when we want to actually use a different metal device. --- src/graphics_surface.c | 4 ++-- src/mtl_surface.m | 12 +++++++++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/graphics_surface.c b/src/graphics_surface.c index fb8a9cf..5715f89 100644 --- a/src/graphics_surface.c +++ b/src/graphics_surface.c @@ -153,7 +153,7 @@ mg_surface mg_surface_create_for_window(mp_window window, mg_surface_api api) mg_surface mg_surface_create_remote(u32 width, u32 height, mg_surface_api api) { - if(__mgData.init) + if(!__mgData.init) { mg_init(); } @@ -180,7 +180,7 @@ mg_surface mg_surface_create_remote(u32 width, u32 height, mg_surface_api api) mg_surface mg_surface_create_host(mp_window window) { - if(__mgData.init) + if(!__mgData.init) { mg_init(); } diff --git a/src/mtl_surface.m b/src/mtl_surface.m index bba001c..e310030 100644 --- a/src/mtl_surface.m +++ b/src/mtl_surface.m @@ -170,12 +170,18 @@ mg_surface_data* mg_mtl_surface_create_for_window(mp_window window) //NOTE(martin): create a mtl device and a mtl layer and //----------------------------------------------------------- - surface->device = MTLCreateSystemDefaultDevice(); - [surface->device retain]; + /*WARN(martin): + Calling MTLCreateDefaultSystemDevice(), as advised by the doc, hangs Discord's screen sharing... + The workaround I found, which doesn't make sense, is to set the mtlLayer.device to mtlLayer.preferredDevice, + even if mtlLayer.preferredDevice is the same value as returned by MTLCreateDefaultSystemDevice(). + 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->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]; [surface->interface.layer.caLayer addSublayer: (CALayer*)surface->mtlLayer];