[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