日別アーカイブ: 2015年7月12日

3D 低レベル API の現状 Direct3D 12/Metal

もうすぐ Windows 10 のリリースとともに DirectX 12 も使えるようになります。
Mantle から始まった新しい API への流れは、昨年の iOS Metal を経ていよいよ Desktop GPU でも起ころうとしています。

新しい API がこれまでと異なっているのは CPU の負担を大きく減らす事ができるということ。もう一つは GPU の世代交代タイミングと一致していないことです。
以前までの DirectX は GPU の新機能に合わせた API セットの追従でした。
新しい API は GPU の世代交代を必ずしも必要としていません。

・CPU の性能をより引き出せる。最適化の余地が生じる。
・GPU の世代交代タイミングが異なる。対応していれば現状の GPU のまま効果あり。

低レベル API とはいわば、これまで JavaScript や Python で書かれていたアプリケーションを C言語で書き直すようなものです。同じプロセッサの上で走らせても、その都度翻訳する手間が省けるためより効率よく実行できるようになります。

その反面、使える命令はより低レベルになるので、メモリ管理など多くの部分がアプリケーション側の負担となります。また従来の API と互換性が無いので、コードを大きく書き換える必要も生じます。

● Metal

Metal は iOS 向けに昨年(2014)リリースされておりすでに利用可能です。
対応している GPU は下記の通り。
iOS に採用された GPU としては 4世代目以降になります。

GPU                                 OpenGL         Metal iOS
-------------------------------------------------------------------
PowerVR MBX                         OpenGL ES 1.1
PowerVR Series 5    SGX535          OpenGL ES 2.0
PowerVR Series 5XT  SGX543MP/554MP  OpenGL ES 2.0
PowerVR Series 6    G6430           OpenGL ES 3.0  Metal GPUFamily1
PowerVR Series 6XT  GX6450/GX6650   OpenGL ES 3.0  Metal GPUFamily2

PowerVR 専用だった Metal ですが、Mac OS X (10.11 El Capitan) でも採用が発表されました。El Capitan 対応 Mac の中には D3D10 世代の GPU 搭載機種も含まれています。Metal の適用範囲がどこまでかは未確認です。

GPU                             OpenGL        Metal OSX
-------------------------------------------------------
GeForce 9400M                   OpenGL 3.3    ?
Intel HD Graphics 4000 (Gen7)   OpenGL 4.1    Metal

Intel HD Graphics 4000 (Ivy Bridge) は Direct3D 12 には対応していませんが、Metal では利用可能なことがわかりました。低レベル API は GPU の世代と直接関係ないため、API の種類によって対応する GPU も異なっています。HD 4000 に限っては Windows より OSX の方が性能を引き出せる可能性があります。

Metal のこれまでの問題は対応ハードウエアが限られていたことです。iPhone Simulator でも使えなかったので、Metal を使ったアプリケーション開発には iPhone 5s 以降か iPad Air/mini retina の実機が必要でした。Mac OS X の対応により開発のハードルが大きく下がります。また将来的には Simulator でも Metal を実行できるようになるかもしれません。

なお Metal はもともと Mobile GPU 向けに設計されており、想定している GPU は OpenGL ES 3.1 世代となっています。ComputeShader はありますが GeometryShader/Tessellator 等はないので、Desktop 向けとは言え OpenGL 4.x の完全な置換えにはなっていません。今後 OpenGL 4.x 相当まで拡張されるのか、それとも iOS と機能面の歩調を合わせて成長させていくのかは不明です。

● Direct3D 12

Mobile GPU から始まった Metal とは逆に、Direct3D は最初から Desktop GPU 向けにリリースされます。

例えば Metal では PowerVR (TBDR) を想定した RenderPass / CommandEncoder がありました。D3D12 には TB を想定した RenderTarget Group は特になく、その代わり RTV -> SRV のように依存が発生する場合のリソースバリアを自分で設定します。

リソースの上限も撤廃されており、RADEON GCN (Mantle) の仕様が API に影響を与えていると思われます。そのため D3D11 世代でも GCN 以外の D3D12 対応 GPU では仕様に完全に対応出来ていないものがあります。

同じ D3D11 世代でも RADEON HD5000/6000, Intel HD Graphics 2500/4000(Ivy Bridge/BayTrail) は D3D12 非対応となっています。ハード的な制約だけでなくドライバのサポート上の都合もあるのかもしれません。

GPU                               OpenGL  ES          D3D12
-----------------------------------------------------------
Intel HD Graphcis Gen7.5 Haswell    4.3   ES 3.1      D3D12
Intel HD Graphcis Gen8   Broadwell  4.4   ES 3.1 AEP  D3D12
GeForce Fermi                       4.5   ES 3.1 AEP  対応予定
GeForce Kepler                      4.5   ES 3.1 AEP  D3D12
GeForce Maxwell                     4.5   ES 3.1 AEP  D3D12
RADEON  GCN 1.0                     4.5   ES 3.1      D3D12
RADEON  GCN 1.1                     4.5   ES 3.1      D3D12

● Android

Windows, iOS/OSX 共に Mobile/Desktop 区別なく新しい API への移行が始まっています。
しかしながら Android では未だ Graphics 向けの Low Level API への対応が行われていません。SHIELD など Android ベースの Game Console もいくつか登場しているので、同等の API への要望は決して少なくはないでしょう。

ゲーム専用機は互換性を考える必要が無いため 3D API のオーバーヘッドが小さく、汎用 OS に対する利点の一つとなっていました。
低レベル API (Low Overhead API) の登場でその差が縮まります。汎用 OS を使った Console も実現しやすくなると同時に、性能だけ見れば専用機の必要性も薄れてくると思われます。

おそらく Khronos の Vulkan が採用されるのではないかと思いますが、Android が今後どのようなタイミングで新しい API に対応してくるか注目です。

関連エントリ
CPU 負荷が低い 新しい 3D API