IOCoreSurfaceRoot

From iPhone Development Wiki
Jump to: navigation, search

IOCoreSurfaceRoot is a kernel-extension for managing pixel buffers. It is controlled by the user-land framework IOSurface. You should use the IOSurface framework instead of directly operating on this service.

When opening the service, you can specify a non-0 type to open a surface-specific connection corresponding whose IOSurfaceID is equal to the type you specified.

Methods

For iOS 3.x and up:

Selector Action Input Output
0 create struct IOSurfaceCreateArg struct IOSurfaceData
1 release IOSurfaceID surfaceID -
2 lock struct IOSurfaceLockArg struct IOSurfaceData
3 unlock struct IOSurfaceLockArg struct IOSurfaceLockSeedArg
4 lockPlane struct IOSurfaceLockArg struct IOSurfaceData
5 unlockPlane struct IOSurfaceLockArg struct IOSurfaceLockSeedArg
6 lookup IOSurfaceID surfaceID struct IOSurfaceData
7 setYCbCrMatrix IOSurfaceID surfaceID, uint32_t YCbCrMatrix -
8 wrapClientImage struct IOSurfaceWrapArg struct IOSurfaceData
9 wrapClientMemory void* param0, void* param1 1,208 bytes of stuff
10 getYCbCrMatrix IOSurfaceID surfaceID uint32_t YCbCrMatrix
11 setValue struct IOSurfaceSetValueArg -
12 copyValue struct IOSurfaceCopyValueArg struct IOSurfaceCopyValueRetArg
13 kIOSurfaceMethodRemoveValue ? -
14 bindAccel IOSurfaceID surfaceID, void* unknown0, void* unknown4 -
15 bindAccelOnPlane IOSurfaceID surfaceID, void* param1, void* param2, size_t planeIndex -
16 readLimits - struct IOSurfaceLimits
17 kIOSurfaceMethodIncrementUseCount IOSurfaceID surfaceID -
18 kIOSurfaceMethodDecrementUseCount IOSurfaceID surfaceID -
19 ? void* ??? void* ???
20 setSurfaceNotify 24 bytes of stuff -
21 removeSurfaceNotify 24 bytes of stuff -
22 ? ? ?
23 ? ? ?
24 setTiled IOSurfaceID surfaceID, uint32_t tileMode -
25 isTiled IOSurfaceID surfaceID uint32_t tileMode

For iOS 3.x and up, surface-specific connection:

Selector Action Input Output
0 lookupFromMachPort - struct IOSurfaceData

For iOS 2.x only:

Selector Action Input Output
0 create struct IOSurfaceCreateArg IOSurfaceID surfaceID
1 release IOSurfaceID surfaceID -
2 lock struct IOCoreSurfaceLockArg struct IOSurfaceData
3 unlock struct IOCoreSurfaceLockArg -
4 lookup IOSurfaceID surfaceID -
5 ? ? ?
6 wrapClientImage struct IOSurfaceWrapArg IOSurfaceID surfaceID
7 ? ? ?
8 getYCbCrMatrix IOSurfaceID surfaceID uint32_t YCbCrMatrix

where

struct IOSurfaceData {

#if IOS_VERSION >= 5.0
  uint64_t address;
#else
  size_t address;
#endif

#if IOS_VERSION >= 6.0
  uint64_t sharedData; // pointer to IOSurfaceSharedData, driver-mapped
#endif

#if IOS_VERSION >= 3.0
  IOSurfaceID surfaceId;
#endif

  uint32_t allocSize;
  uint32_t width;
  uint32_t height;
  uint32_t rowBytes;
  uint32_t offset;
  uint32_t format; // 4cc, e.g. 'BGRA'
  uint32_t ???; // might be allocSize, rounded up to page size?
  uint32_t numPlanes;
  uint32_t ???;

#if IOS_VERSION >= 3.0
  uint16_t elementBytes;
  uint8_t elementWidth;
  uint8_t elementHeight;

#if IOS_VERSION >= 6.0
  uint32_t cacheMode;
  uint32_t ???[2]; // one of these might be 'seed'
#else
  uint32_t seed;
#endif

#if IOS_VERSION < 6.0
#if IOS_VERSION >= 5.0
  uint64_t sharedData; // pointer to IOSurfaceSharedData, driver-mapped
#else
  uint32_t sharedData; // pointer to IOSurfaceSharedData, driver-mapped
#endif
#endif

#endif

  struct IOSurfacePlaneData planes[32]; // only 'numPlanes' planes are populated

#if IOS_VERSION >= 3.2 && IOS_VERSION < 5.0
  uint32_t isTiled;
#endif
};

struct IOSurfacePlaneData {

#if IOS_VERSION >= 5.0
  uint64_t sharedData; // pointer to IOSurfaceSharedData, driver-mapped
#else
  uint32_t sharedData; // pointer to IOSurfaceSharedData, driver-mapped
#endif

  uint32_t width;
  uint32_t height;
  uint32_t ???;
  uint32_t offset;
  uint32_t rowBytes;
  uint32_t ???;

#if IOS_VERSION >= 3.0
  uint16_t elementBytes;
  uint8_t elementWidth;
  uint8_t elementHeight;

  uint32_t seed;
#endif

  // The ??? are likely the plane base & plane size
};

struct IOSurfaceLimits {
  uint32_t addressAlignMask; // e.g. 3 for 4-byte alignment
  uint32_t rowBytesAlignMask; // e.g. 3 for 4-byte alignment
  uint32_t rowBytesMax;
  uint32_t widthMax;
  uint32_t heightMax;
};

// This struct resides in driver-mapped memory, it's presumably read-only in user mode
// (Note - not all these fields will exist in older iOS versions)
struct IOSurfaceSharedData {
  uint32_t ???[2]; // related to IOAccelerator
  uint32_t seed;
  uint32_t useCount;
  uint32_t YCbCrMatrix;
  uint32_t maxValueSizeHint; // hint - maximum serialized size of any surface value (aka - those set via setValue)
};

struct IOSrufaceWrapArg {
#if IOS_VERSION >= 6.0
  uint64_t address;
#endif
  uint32_t width;
  uint32_t height;
  uint32_t format; // 4cc code, e.g. 'BGRA'
#if IOS_VERSION >= 3.0
  uint32_t elementBytes;
#endif
  uint32_t rowBytes;
  uint32_t allocSize;
#if IOS_VERSION < 6.0
  size_t address;
#endif
};

struct IOSurfaceCreateArg {
  // XML PList dictionary with keys:
  //   IOSurfaceWidth
  //   IOSurfaceHeight
  //   IOSurfaceBytesPerRow
  //   IOSurfaceBytesPerElement
  //   IOSurfaceElementWidth
  //   IOSurfaceElementHeight
  //   IOSurfacePixelFormat
  //   IOSurfaceAllocSize
  //   IOSurfaceTileMode (also IOSurfaceBufferTileMode?)
  //   IOSurfaceCacheMode
  //   IOSurfaceOffset
  //   IOSurfaceIsGlobal
  //   IOSurfaceMemoryRegion
  //   IOSurfacePurgeWhenNotInUse
  //   IOSurfacePlaneInfo - array of dictionaries with keys:
  //     IOSurfacePlaneWidth
  //     IOSurfacePlaneHeight
  //     IOSurfacePlaneBytesPerRow
  //     IOSurfacePlaneBytesPerElement
  //     IOSurfacePlaneElementWidth
  //     IOSurfacePlaneElementHeight
  //     IOSurfacePlaneOffset
  //     IOSurfacePlaneBase
  //     IOSurfacePlaneSize
  char createPList[0];
};

struct IOSurfaceSetValueArg {
  IOSurfaceID surfaceID

  // XML PList - array of size 2
  //   [0] - value (any object)
  //   [1] - key (string)  
  char setValuePList[0];
};

struct IOSurfaceCopyValueArg {
  IOSurfaceID surfaceID 
  char keyName[0];
};

struct IOSurfaceCopyValueRetArg {
  // XML PList - value (any object)
  char copyValuePList[0];
};

struct IOSurfaceLockArg {
  IOSurfaceID surfaceID;
  uint32_t    lockOptions;
  size_t      planeIndex;
};

struct IOSurfaceLockSeedArg {
  uint32_t    seed;
};

#if IOS_VERSION < 3.0
struct IOCoreSurfaceLockArg {
  IOSurfaceID surfaceID;
  uint32_t    lockType; // 1 - none, just get data, 2 - read, 3 - read/write
};
#endif