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。
結果は、
ここから先は
#WWDC2020 の勉強メモ
堤がWWDC 2020およびiOS 14についてセッションやサンプルを見つつ勉強したことを記事にしていくマガジンです。NDAの都合上、Ap…
Amazonギフトカード5,000円分が当たる
最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/