syghの新フラグメント置き場

プログラミングTipsやコード断片の保管場所です。お絵描きもときどき載せます。

NVIDIA/AMDのDirectX 11.x/12対応に関して

NVIDIAの場合

GeForce GTX 970のメモリ3.5GB問題で、嘘スペック(なんちゃって4GB他)を公表していたがために訴訟を起こされてしまったNVIDIAですが、実はDirectX (Direct3D) 対応レベルに関してもわりとあこぎなことをやっているというか実際詐欺です。

Fermi/Kepler/Maxwell世代でDirectX 12に対応するとの報道がありますが、少なくともFermi/Keplerに関してはGTX TITAN Zですら機能レベル (Feature Level) 11_0にとどまっており、「DirectX 11.1対応」や「DirectX 11.2対応」を謳っている製品でも実際にフルサポートしているのはDirectX 11.0までの機能となっています。

ASUSやEVGAはきちんとFeature Levelに言及していて正直なんですが、NVIDIA Japan公式サイトの780/750/Titan Blackはアウトですね。980のDirectX対応表記も「12 API」となっていますが、肝心の機能レベルへの言及がありません。ELSAは「Shader Model 5.0」と表記しており、たぶんDirectX 11.0までの対応だと言いたかったんだと思いますが、実はShader Model 5.1仕様に関してMicrosoftからの公式情報はありません(MSDNDirect3D APIヘルプには一切書かれていないし、Windows SDK 8.0/8.1付属のシェーダーコンパイラーfxc.exeにもvs_5_1やps_5_1のようなプロファイルは存在しない)。DirectX 11.1/11.2であってもShader Model自体は5.0のままであり、ELSAが想定しているであろうShader Model 5.1というのは幻です。

なんでこんなわけの分からないことになっているのかというと、Fermi/KeplerはドライバーレベルでDirectX 11.1やDirectX 11.2のAPI自体はサポートしていて、またDirectX 11.1の機能のうち実際にいくつかはサポートしているんですが、すべてではないため、Direct3D 11 APIを使ってデバイスの機能レベルを取得すると11_1 (D3D_FEATURE_LEVEL_11_1) ではなく11_0 (D3D_FEATURE_LEVEL_11_0) となります。これに関しては実際に手元にあるKepler世代のGTX 760や770で試したことがあり、実証済みです。

DirectX 11.1のCapsは下記構造体です。

DirectX 11.2のCapsは下記構造体です。末尾の数字が2じゃなくて1なのがまぎらわしくてウザい感じです。

ちなみにD3D_FEATURE_LEVEL_11_2はありませんのであしからず。なおDirect3D 11.1/11.2の各機能対応状況は、Windows SDK 8.1付属のDirectX Caps Viewer (dxcapsviewer.exe) で確認することもできます。またGPU-Zの最新版を使うことで、DirectXのフルサポートバージョンを簡単に調べることができます。

DirectX 10世代の古いカード(G80)とかでも最新版の対応ドライバーをインストールすることで、Windows Vista SP2 Platform Update/Windows 7以降であればDirectX 11.0 API自体はFeature Level 10_0で使えますよね? それと一緒です。下記の公式ブログにおける「all Fermi, Kepler, and Maxwell GPUs will fully support the DX12 API」という表現も、そういう意味を含めたうえでの発言でしょう(おそらくDirectX 12によるマルチスレッドレンダリングやコンピュートタスクの効率向上はFermi/Keplerでも享受できるはず)。

DirectX 12およびDirectX 11.3に関しては先行プログラムに参加しているベンダーや開発者のみが詳細を知っている状態で、まだ一般公開されていないステータスであるためはっきりとしたことは言えませんが、GTX 900シリーズ(第2世代Maxwell)に関しては少なくともDirectX 12/DirectX 11.3の新機能のうちいくつかはサポートしているよ、とNVIDIAの中の人がフォーラムで言及しているようです。機能レベルがどうなるのかは不明です。

2015-03-23追記:
GDC 2015で発表された情報によると、DirectX 12では12_0および12_1という機能レベルが実装されるそうです(スライドではFeature Level 12.0および12.1と表記されています)。

個人的に特に残念なのは、ROV (Rasterizer Ordered View) が確実に使えるのは12_1のほうで、12_0以下では使えない(オプション扱い)という点でしょうか。早くも格差が生まれてしまったという悲壮感が漂います。

ちなみに英語版Wikipediaの「Direct3D」の記事には、「AMD GCN 1.1/1.2では機能レベル12_0となる」「NVIDIA GeForce 900シリーズ(TITAN Xも含む)では機能レベル12_1となる」と2015年3月時点で記載されているんですが、DirectX 11.3/DirectX 12およびWindows 10の正式版はまだリリースされておらず、MSDNライブラリの正式ドキュメントすら準備されていない現状、機能レベルに関する引用はChannel 9のビデオだけで、かなりフライングしています。
マイクロソフトおよびハードウェアベンダー(メーカー)からの最終的な正式情報(特に文字情報の検索が可能なドキュメント)を待つべきだと思うんですが……

2015-04-08追記:
Windows 10 Technical Preview上でVisual Studio 2015 Preview付属のWindows SDK 10を用いることで、一般の開発者でもDirect3D 11.3およびDirect3D 12を使えるようになっているようで、各々の暫定ドキュメントがMSDNライブラリにて公開されています。ただし実行にはWDDM 2.0対応ドライバーを導入する必要があります。最終的な仕様はまた変更される可能性はありますが、大枠はすでに固まっているものと思われます。

DirectX 11.3のCapsは下記構造体です。

DirectX 12のCapsは下記構造体です。

今回もD3D_FEATURE_LEVEL列挙体のメンバーに変動はなさそうです。

2015-05-12追記:
2015年4月末にリリースされたVisual Studio 2015 RC付属のWindows SDK 10では、D3D_FEATURE_LEVEL_12_0およびD3D_FEATURE_LEVEL_12_1が追加されているようです。また、同SDK付属のシェーダーコンパイラーfxc.exeには、幻と思われていたシェーダーモデル5.1のプロファイル(cs_5_1, ds_5_1, gs_5_1, hs_5_1, ps_5_1, vs_5_1)が実装されているようです。シェーダーモデル5.1自体はDirect3D 12 APIをドライバーレベルでサポートするハードウェアであれば、D3D12/D3D11 APIを通して使用可能らしいですが、5.1で新しく追加されたROVに関するオブジェクト(RasterizerOrderedBufferほか)は、ROVに対応するハードウェアのみで使用可能となるはずです。

AMDの場合

AMDに関しては、GCNでFeature Level 11_1をフルサポートするという話だったんですが、結局どうなっているんでしょうか?

また、Radeon HD 7000シリーズにおけるDirectX 11.2に関しても、ドライバーレベルで対応可能という話だったんですが、これも実際のところどうなっているんでしょうか?

ASUSによると「DirectX 11.1対応」「DirectX 11.2対応」とかいいつつ実はFeature Level 11_0どまりとなっています。ASUS JAPANのサイトが更新をサボっているだけ?

SAPPHIREのサイトでは「GCNベース製品はすべてDirectX 12対応予定」と書かれているだけで、Feature Levelへの言及はありません。
NVIDIA同様、最終的にDirectX 12 API自体の対応がなされるだけで、旧製品に関してはFeature Level 12_0/12_1ではなくなるのでは? 新型Radeonに搭載される予定のFijiあたりは12_1にフル対応してきそうですが……

結論

問題は何をもって「11.1対応」「11.2対応」「12対応」と称するべきか、なんですが、個人的にはまともにフル機能をサポートしていない中途半端な製品なのに「DirectX ○○対応!!」とかいう詐欺商法は即刻やめて欲しいです。エンドユーザーがガッカリするのはもちろんのこと、開発者もCaps絡みで苦しむだけです。個別の機能が使えるかどうかいちいちフラグをチェックする必要があるなんていう三流仕様はOpenGLだけにしてください。ていうかDirectX機能レベルというものの存在に関して、ベンダーはもっと説明責任を果たすべきでしょう。かつてDirect3D 9全盛期の頃、グラフィックスカードのベンダー各社はDirectX 9.0c対応を謳いつつも、浮動小数バッファのアンチエイリアスATIだけがサポート、VTFはNVIDIAだけがサポート、というようなひどい状況になっていたことがありましたが、そういった細かい機能のサポート有無は非常に重要な情報であるにもかかわらずスペックシートには一切書かれていませんでした。

2015-06-03追記:
現行のGeForceシリーズにおけるDirectX機能レベル対応度に関しては、NVIDIAからGeForce GTX 980 Tiとともに公式の解説が発表されました。Maxwell第2世代以降でFeature Level 12_0と12_1にフル対応するようです。当該ハードウェアを所持していて、Windows 10 Preview BuildとWDDM 2.0対応ドライバーをインストールできる人は実際に試してみるとよいでしょう。

AMDも新型Radeonシリーズの発表の際には、GCNアーキテクチャの世代とDirectX機能レベルに関して言及してくるものと思われます。

※2015-06-21追記:
The Era of PC Gamingで発表されたように、新しいRadeonはR9 Furyシリーズ(R9 Fury X、R9 Fury、R9 Nano)のみがFiji(GCN 1.2? 1.3?)を搭載するようです。R9 380/390/390Xのほうはすべてリネーム(リブランド)で、HawaiiやTongaなど(GCN 1.1/1.2)を採用するものと思われます。機能レベルに関する言及はありません。