見出し画像

MTLGPUFamilyとMTLFeatureSet

iOS 13でMTLGPUFamilyというenumが追加されていた。GPUファミリー区分を表すものだが、どうやらMTLFeatureSetに代わるものとして導入されたようだ。

MTLFeatureSetは「実質」deprecated?

MTLFeatureSetはdeprecatedになってはいないものの、リファレンスにこう書かれている:

If your app is running on an operating system that supports the supportsFamily(_:) method, use that method instead. 

(supportsFamilyを使えるOS上ではそっちを代わりにつかえ)

さらに、iOS_GPUFamily5_v1を最後として、A13以降向け、iOS 13以降向けのcaseが追加されていない

MTLGPUFamilyが使えるiOS 13以降では実質的にdeprecatedと考えてよさそう。

4種のMTLGPUFamily

MTLGPUFamilyはenum型で、以下ようにcaseが定義されている。

public enum MTLGPUFamily : Int {
   case apple1 = 1001
   case apple2 = 1002
   case apple3 = 1003
   case apple4 = 1004
   case apple5 = 1005
   case apple6 = 1006
   
   case mac1 = 2001
   case mac2 = 2002
   
   case common1 = 3001
   case common2 = 3002
   case common3 = 3003

   case macCatalyst1 = 4001
   case macCatalyst2 = 4002
}

caseは全13個あるが、大まかに分けるとapple, mac, common, macCatalystの4種がある。

公式ドキュメント"Detecting GPU Features and Metal Software Versions"には次のように書かれている。

・Use the Common family to create apps that target a range of GPUs on multiple platforms.
・Use the Apple family to create apps that target Apple GPUs.
・Use the Mac family to create apps that target GPUs on macOS systems.
・Use the Mac Catalyst family when building an iPadOS app to run on macOS.

この区分でいえばiOSデバイスのGPUはApple GPUに分類されそうだ。

さらに、GPUファミリーはGPUごとに1つが決まるわけではなく、複数になる場合もある(むしろ多くの場合複数になる)ようだ:

A GPU can be a member of more than one family; in most cases, a GPU supports one of the Common families and then one or more families specific to the build target. 
(1つのGPUは1つ以上のファミリーになり得る。ほとんどの場合、GPU はCommonファミリー 1 つをサポートし、次にビルドターゲットに特化した 1 つ以上のファミリをサポートする)

このあたりについては後ほど実機で検証する。

利用中のGPUファミリーを判定する

こんな感じでMTLDeviceのsupportsFamilyメソッドを使用する。

if device.supportsFamily(.apple6) {
   print("apple6")
}
More recent GPUs have higher version numbers and support larger feature sets. A higher GPU version is always a superset of an earlier version in the same GPU family. For details on the individual families and version numbers, see MTLGPUFamily.
(より新しいGPUは、より高いバージョン番号を持ち、より大きな機能セットをサポートしています。より高い GPU バージョンは、常に同じ GPU ファミリ内の以前のバージョンのスーパーセットです。個々のファミリとバージョン番号の詳細については、MTLGPUFamily を参照してください。)

とのことで、つまり.apple6の場合は基本的に.apple5以前の機能もサポートすると考えてよいらしい。

しかし一部機能についてはファミリーだけではサポートの有無が決まらないのものあるらしい。

if device.argumentBuffersSupport == .tier2
{
   // Enable tier 2 argument buffer support in renderer.
}

このあたりはまた別記事で追うことにする。

実機検証①iPhone 11 Pro

iPhone 11 Proでどのファミリーをサポートするかを調べてみた。

結果は、

・.apple6
・.common3

チップがA13なのでcommon, appleファミリーの現行で一番高いバージョンに属するというのは合点がいく。

実機検証②iPhone 11 Proのシミュレータ@Macbook Pro 16-inch

では、シミュレータではどうなのか。動いているMacのGPUファミリーとなるのか、iPhone 11 Proのシミュレータであればその実機と同じ結果を返すのか。最新のMBPで試してみた。OSはmacOS Catalina。

結果は、

ここから先は

749字
昨年は書籍という形にまとめましたが、今年はこのマガジンに集約することにしました。 最初は記事が少ないので格安から開始して、充実してくるごとに本来あるべき価格に戻していく予定です。というわけで早いうちに買うと非常にお得です。 昨年の書籍は約80ページ+本に載せなかった事項もたくさん、ということで最終的にはそれなりの量になるのではと思います。

堤がWWDC 2020およびiOS 14についてセッションやサンプルを見つつ勉強したことを記事にしていくマガジンです。NDAの都合上、Ap…

最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/