GraphicsChecksMac.cpp [plain text]
#include "config.h"
#include "GraphicsChecksMac.h"
#if PLATFORM(MAC)
#if HAVE(APPLE_GRAPHICS_CONTROL)
#include <sys/sysctl.h>
#endif
namespace WebCore {
#if HAVE(APPLE_GRAPHICS_CONTROL)
enum {
kAGCOpen,
kAGCClose
};
static io_connect_t attachToAppleGraphicsControl()
{
mach_port_t masterPort = MACH_PORT_NULL;
if (IOMasterPort(MACH_PORT_NULL, &masterPort) != KERN_SUCCESS)
return MACH_PORT_NULL;
CFDictionaryRef classToMatch = IOServiceMatching("AppleGraphicsControl");
if (!classToMatch)
return MACH_PORT_NULL;
kern_return_t kernResult;
io_iterator_t iterator;
if ((kernResult = IOServiceGetMatchingServices(masterPort, classToMatch, &iterator)) != KERN_SUCCESS)
return MACH_PORT_NULL;
io_service_t serviceObject = IOIteratorNext(iterator);
IOObjectRelease(iterator);
if (!serviceObject)
return MACH_PORT_NULL;
io_connect_t dataPort;
IOObjectRetain(serviceObject);
kernResult = IOServiceOpen(serviceObject, mach_task_self(), 0, &dataPort);
IOObjectRelease(serviceObject);
return (kernResult == KERN_SUCCESS) ? dataPort : MACH_PORT_NULL;
}
static bool hasMuxCapability()
{
io_connect_t dataPort = attachToAppleGraphicsControl();
if (dataPort == MACH_PORT_NULL)
return false;
bool result;
if (IOConnectCallScalarMethod(dataPort, kAGCOpen, nullptr, 0, nullptr, nullptr) == KERN_SUCCESS) {
IOConnectCallScalarMethod(dataPort, kAGCClose, nullptr, 0, nullptr, nullptr);
result = true;
} else
result = false;
IOServiceClose(dataPort);
if (result) {
int names[2] = { CTL_HW, HW_NCPU };
int cpuCount;
size_t cpuCountLength = sizeof(cpuCount);
sysctl(names, 2, &cpuCount, &cpuCountLength, nullptr, 0);
result = cpuCount > 4;
}
return result;
}
#endif // HAVE(APPLE_GRAPHICS_CONTROL)
bool hasLowAndHighPowerGPUs()
{
#if HAVE(APPLE_GRAPHICS_CONTROL)
static bool canMux = hasMuxCapability();
return canMux;
#else
return false;
#endif
}
}
#endif