From: Brendan Shanks Subject: [PATCH v2 1/2] winemac.drv: Use Metal to get a display's GPU info if possible. Message-Id: <20201119184256.16739-1-bshanks@codeweavers.com> Date: Thu, 19 Nov 2020 10:42:55 -0800 Fixes an Apple Silicon issue where CGDisplayIOServicePort() returns a fake AMD GPU "compatibility" node rather than the real GPU node. Signed-off-by: Brendan Shanks --- v2: - Remove now-inaccurate comment (thanks Zhiyi) - macdrv_get_gpu_info_from_display_id_using_metal() needs an autorelease pool dlls/winemac.drv/cocoa_display.m | 39 +++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/dlls/winemac.drv/cocoa_display.m b/dlls/winemac.drv/cocoa_display.m index e769772feaa..2e50b67c7d1 100644 --- a/dlls/winemac.drv/cocoa_display.m +++ b/dlls/winemac.drv/cocoa_display.m @@ -330,6 +330,27 @@ static int macdrv_get_gpus_from_metal(struct macdrv_gpu** new_gpus, int* count) return ret; } +/*********************************************************************** + * macdrv_get_gpu_info_from_display_id_using_metal + * + * Get GPU information for a CG display id using Metal. + * + * Returns non-zero value on failure. + */ +static int macdrv_get_gpu_info_from_display_id_using_metal(struct macdrv_gpu* gpu, CGDirectDisplayID display_id) +{ + id device; + int ret = -1; + NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; + + device = [CGDirectDisplayCopyCurrentMetalDevice(display_id) autorelease]; + if (device && [device respondsToSelector:@selector(registryID)]) + ret = macdrv_get_gpu_info_from_registry_id(gpu, device.registryID); + + [pool release]; + return ret; +} + #else static int macdrv_get_gpus_from_metal(struct macdrv_gpu** new_gpus, int* count) @@ -337,20 +358,32 @@ static int macdrv_get_gpus_from_metal(struct macdrv_gpu** new_gpus, int* count) return -1; } +static int macdrv_get_gpu_info_from_display_id_using_metal(struct macdrv_gpu* gpu, CGDirectDisplayID display_id) +{ + return -1; +} + #endif /*********************************************************************** * macdrv_get_gpu_info_from_display_id * * Get GPU information from a display id. - * This is a fallback for 32bit build or older Mac OS version where Metal is unavailable. * * Returns non-zero value on failure. */ static int macdrv_get_gpu_info_from_display_id(struct macdrv_gpu* gpu, CGDirectDisplayID display_id) { - io_registry_entry_t entry = CGDisplayIOServicePort(display_id); - return macdrv_get_gpu_info_from_entry(gpu, entry); + int ret; + io_registry_entry_t entry; + + ret = macdrv_get_gpu_info_from_display_id_using_metal(gpu, display_id); + if (ret) + { + entry = CGDisplayIOServicePort(display_id); + ret = macdrv_get_gpu_info_from_entry(gpu, entry); + } + return ret; } /*********************************************************************** -- 2.26.2