IOReturn IOAccelCreateSurface( io_service_t accelerator, UInt32 wID, eIOAccelSurfaceModeBits modebits, IOAccelConnect *connect ) { IOReturn kr; io_connect_t window = MACH_PORT_NULL; *connect = NULL; /* Create a context */ kr = IOServiceOpen( accelerator, mach_task_self(), kIOAccelSurfaceClientType, &window ); if( kr != kIOReturnSuccess) { return kr; } /* Set the window id */ uint64_t data[] = { wID, modebits }; kr = IOConnectCallScalarMethod(window, kIOAccelSurfaceSetIDMode, data, arrayCnt(data), NULL, NULL); if(kr != kIOReturnSuccess) { IOServiceClose(window); return kr; } *connect = (IOAccelConnect) (uintptr_t) window; return kIOReturnSuccess; }
/* Flush surface to visible region */ IOReturn IOAccelFlushSurfaceOnFramebuffers( IOAccelConnect connect, IOOptionBits options, UInt32 framebufferMask ) { uint64_t inData[] = { framebufferMask, options }; return IOConnectCallMethod((io_connect_t) (uintptr_t) connect, kIOAccelSurfaceFlush, inData, arrayCnt(inData), NULL, 0,// input NULL, NULL, NULL, NULL); // output }
IOReturn IOAccelCreateAccelID(IOOptionBits options, IOAccelID * identifier) { IOReturn err; if (!idConnect) { io_service_t service = IORegistryEntryFromPath(kIOMasterPortDefault, kIOServicePlane ":/IOResources/IODisplayWrangler"); if (service) { err = IOServiceOpen(service, mach_task_self(), 0, &idConnect); IOObjectRelease(service); } } if (!idConnect) return (kIOReturnNotReady); uint64_t inData[] = { options, *identifier }; uint64_t outData; uint32_t outLen = 1; err = IOConnectCallScalarMethod(idConnect, kAlloc, inData, arrayCnt(inData), &outData, &outLen); *identifier = (IOAccelID) outData; return (err); }
IOReturn IOAccelSetSurfaceFramebufferShape( IOAccelConnect connect, IOAccelDeviceRegion *rgn, eIOAccelSurfaceShapeBits options, UInt32 framebufferIndex ) { uint64_t inData[] = { options, framebufferIndex }; IOReturn result; size_t rgnSize = regionSize(rgn); result = IOConnectCallMethod((io_connect_t) (uintptr_t) connect, kIOAccelSurfaceSetShape, inData, arrayCnt(inData), rgn, rgnSize, NULL, NULL, NULL, NULL); // no output return result; }
IOReturn IOAccelSurfaceControl( IOAccelConnect connect, UInt32 selector, UInt32 arg, UInt32 * result) { uint64_t inData[] = { selector, arg }; uint64_t outData; uint32_t outSize = 1; IOReturn err = IOConnectCallScalarMethod((io_connect_t) (uintptr_t)connect, kIOAccelSurfaceControl, inData, arrayCnt(inData), &outData, &outSize); *result = (UInt32) outData; return( err ); }
IOReturn IOAccelDestroyAccelID(IOOptionBits options, IOAccelID identifier) { IOReturn err; if (!idConnect) return (kIOReturnNotReady); uint64_t inData[] = { options, identifier }; err = IOConnectCallScalarMethod(idConnect, kFree, inData, arrayCnt(inData), NULL, NULL); return (err); }
IOReturn IOAccelSetSurfaceFramebufferShapeWithBackingAndLength( IOAccelConnect connect, IOAccelDeviceRegion *rgn, eIOAccelSurfaceShapeBits options, UInt32 framebufferIndex, IOVirtualAddress backing, UInt32 rowbytes, UInt32 backingLength ) { IOReturn err; uint64_t inData[] = { options, framebufferIndex, backing, rowbytes, backingLength }; size_t rgnSize = regionSize(rgn); err = IOConnectCallMethod((io_connect_t) (uintptr_t) connect, kIOAccelSurfaceSetShapeBackingAndLength, inData, arrayCnt(inData), rgn, rgnSize, NULL, NULL, NULL, NULL); // no output return (err); }
IOReturn IOPMSetAggressiveness ( io_connect_t fb, unsigned long type, unsigned long aggressiveness ) { uint64_t inData[] = { type, aggressiveness }; uint64_t rtn = 0; uint32_t len = 1; kern_return_t err = IOConnectCallScalarMethod(fb, kPMSetAggressiveness, inData, arrayCnt(inData), &rtn, &len); if (err) return kIOReturnError; else return (IOReturn) rtn; }