VivekParamasivam VivekParamasivam - 1 month ago 19
iOS Question

iOS code to identify metal support in runtime?

Usually, I use the below code to identify the iOS version of the device.

if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0)


In a similar way, I'm trying to find Metal support for the device. Metal is supported for Apple devices with the A7 (or better) GPU and iOS 8.0.

This is the way I expect my code to work:

if (MetalSupported == true) {
// metal programming
} else {
// opengles2 programming
}


How do I get the value for the Boolean variable
MetalSupported
?

Answer

It's good that you're looking for something specific to Metal — generally, iOS version checks and hardware name checks are fragile, because they rely on your app knowing all of the OS versions and devices that could ever run it. If Apple were to go back and release an iOS 7.x version that added Metal support (okay, seems unlikely), or a device that supports Metal but isn't one of the hardware names you're looking at (seems much more likely), you'd be stuck having to track all of those things down and update your app to manage them.

Anyway, the best way to check whether the device you're running on is Metal enough for your awesome graphics code? Just try to get a MTLDevice object:

id<MTLDevice> device = MTLCreateSystemDefaultDevice();
if (device) {
    // ready to rock
} else {
    // back to OpenGL
}

Note that just testing for the presence of a Metal framework class doesn't help — those classes are there on any device running iOS 8 (all the way back to iPhone 4s & iPad 2), regardless of whether that device has a Metal-capable GPU.

Also note that there is no Metal framework in the iOS Simulator, so you need to put some #ifs around this and any other Metal code if you'll be doing simulator testing (of the parts of your app that don't use GPU APIs, because the simulator is a poor imitator of device GPU performance even for GL).