[PATCH 1/2] winemac.drv: Use Metal to get a display's GPU info if possible.
Zhiyi Zhang
zzhang at codeweavers.com
Wed Nov 18 21:22:09 CST 2020
On 11/19/20 7:54 AM, Brendan Shanks wrote:
> 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 <bshanks at codeweavers.com>
> ---
> dlls/winemac.drv/cocoa_display.m | 32 ++++++++++++++++++++++++++++++--
> 1 file changed, 30 insertions(+), 2 deletions(-)
>
> diff --git a/dlls/winemac.drv/cocoa_display.m b/dlls/winemac.drv/cocoa_display.m
> index e769772feaa..1125d29839c 100644
> --- a/dlls/winemac.drv/cocoa_display.m
> +++ b/dlls/winemac.drv/cocoa_display.m
> @@ -330,6 +330,21 @@ 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<MTLDevice> device = [CGDirectDisplayCopyCurrentMetalDevice(display_id) autorelease];
> + if (!device || ![device respondsToSelector:@selector(registryID)])
> + return -1;
> + return macdrv_get_gpu_info_from_registry_id(gpu, device.registryID);
> +}
> +
> #else
>
> static int macdrv_get_gpus_from_metal(struct macdrv_gpu** new_gpus, int* count)
> @@ -337,6 +352,11 @@ 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
>
> /***********************************************************************
> @@ -349,8 +369,16 @@ static int macdrv_get_gpus_from_metal(struct macdrv_gpu** new_gpus, int* count)
> */
> static int macdrv_get_gpu_info_from_display_id(struct macdrv_gpu* gpu, CGDirectDisplayID display_id)
Let's update/move the comment "This is a fallback for 32bit build or older Mac OS version where Metal is unavailable."
for this function since it can be used when Metal is available.
> {
> - 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;
> }
>
> /***********************************************************************
More information about the wine-devel
mailing list