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:
parent
cb9b17fa85
commit
5faad354d8
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue