winemac.drv: Handle non-PCI GPUs correctly.

Signed-off-by: Brendan Shanks <bshanks@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
(cherry picked from commit 5fbd40520d)
Signed-off-by: Michael Stefaniuc <mstefani@winehq.org>
This commit is contained in:
Brendan Shanks 2021-01-27 11:16:47 -08:00 committed by Michael Stefaniuc
parent cb9b17fa85
commit 5faad354d8
1 changed files with 15 additions and 7 deletions

View File

@ -183,7 +183,9 @@ static int get_entry_property_string(io_registry_entry_t entry, CFStringRef prop
/*********************************************************************** /***********************************************************************
* macdrv_get_gpu_info_from_entry * macdrv_get_gpu_info_from_entry
* *
* Starting from entry, search upwards to find the PCI GPU. And get GPU information from the PCI GPU entry. * Starting from entry (which must be the GPU or a child below the GPU),
* search upwards to find the IOPCIDevice and get information from it.
* In case the GPU is not a PCI device, get properties from 'entry'.
* *
* Returns non-zero value on failure. * Returns non-zero value on failure.
*/ */
@ -193,18 +195,21 @@ static int macdrv_get_gpu_info_from_entry(struct macdrv_gpu* gpu, io_registry_en
io_registry_entry_t gpu_entry; io_registry_entry_t gpu_entry;
kern_return_t result; kern_return_t result;
int ret = -1; int ret = -1;
char buffer[64];
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
gpu_entry = entry; gpu_entry = entry;
while (![@"IOPCIDevice" isEqualToString:[(NSString*)IOObjectCopyClass(gpu_entry) autorelease]] while (![@"IOPCIDevice" isEqualToString:[(NSString*)IOObjectCopyClass(gpu_entry) autorelease]])
|| get_entry_property_string(gpu_entry, CFSTR("IOName"), buffer, sizeof(buffer))
|| strcmp(buffer, "display"))
{ {
result = IORegistryEntryGetParentEntry(gpu_entry, kIOServicePlane, &parent_entry); result = IORegistryEntryGetParentEntry(gpu_entry, kIOServicePlane, &parent_entry);
if (gpu_entry != entry) if (gpu_entry != entry)
IOObjectRelease(gpu_entry); IOObjectRelease(gpu_entry);
if (result != kIOReturnSuccess) if (result == kIOReturnNoDevice)
{
/* If no IOPCIDevice node is found, get properties from the given entry. */
gpu_entry = entry;
break;
}
else if (result != kIOReturnSuccess)
{ {
[pool release]; [pool release];
return ret; return ret;
@ -409,6 +414,7 @@ static int macdrv_get_gpus_from_iokit(struct macdrv_gpu** new_gpus, int* count)
int integrated_index = -1; int integrated_index = -1;
int primary_index = 0; int primary_index = 0;
int gpu_count = 0; int gpu_count = 0;
char buffer[64];
int ret = -1; int ret = -1;
int i; int i;
@ -422,7 +428,9 @@ static int macdrv_get_gpus_from_iokit(struct macdrv_gpu** new_gpus, int* count)
while ((entry = IOIteratorNext(iterator))) while ((entry = IOIteratorNext(iterator)))
{ {
if (!macdrv_get_gpu_info_from_entry(&gpus[gpu_count], entry)) if (!get_entry_property_string(entry, CFSTR("IOName"), buffer, sizeof(buffer)) &&
!strcmp(buffer, "display") &&
!macdrv_get_gpu_info_from_entry(&gpus[gpu_count], entry))
{ {
gpu_count++; gpu_count++;
assert(gpu_count < MAX_GPUS); assert(gpu_count < MAX_GPUS);