Raspberry Pi 2 で D3D12 (正式版IoT Coreにて)

以前のプレビュー版のときには失敗してしまった DirectX12 (D3D12) の動作ですが、正式版になった今はどうだろうかと調べてみました。結論からすれば、うまく動作しているようで、さらにはデバッグ情報もきちんととれそうな感じなのでお遊びにすごくよさそうな印象です。

確認

このコマンドプロンプトが使えるようになったので、以前うまく動かなかった D3D12 についてどうだろうと確認してみました。とりあえずは d3d関連の DLL を確認してみたところ以下のようになっており、DirectX9 は完全に死滅しているようです。しかし D3D12 については今も DLL が新しいモノが入っているのでちょっと期待できそうです。
windows10-iot-core-rpi2-system32

早速コレを動作確認したいとおもいます。

まずは動作をテスト

では早速やってみましょう.

プロジェクトの作成

Visual C++ のテンプレートの中に、 DirectX 12 App (Universal Windows) というものがあり、こちらが ARM 版のビルドも出来そうだったのでこちらを使用します。
rpi2-d3d12-project

ビルドと設定

ビルド構成を Debug, ARM 構成に変更します。そして Raspberry PI 2 で動作させるために、リモートデバッグができるようにプロパティを変更します。具体的には、以下のように Remote Debug 選択したうえで、認証をなし、対象の IP アドレスを入力をします。
rpi2-d3d12-remote-debug

実行!

続いて普段と同じようにプログラムを実行させると Raspberry Pi 2 上でプログラムが動き出しました!
DSC_0413
このときの VisualStudio は以下のようになってました。メモリとかCPU使用グラフとかは動作しないようです。
rpi2-d3d12-vs

以前とは違い、 DirectX12 (D3D12) の API を使っても動作するようです。

デバイス情報

念のためアダプタの情報をとってみたところ、 “Microsoft Basic Render Driver” となっていました。 WRAP デバイスが動作しているようですね。

D3D12のデバッグについて

WARPデバイスが動くようになっていることは確認できたので VisualStudio 2015 付属の D3D12 のデバッガが使えるか確認してみます。通常の D3Dアプリと同様に Debug/Graphics/Start Diagnostics (Alt+F5) でデバッグ実行します。

このとき以下のように診断ツールが起動します。(下記画面はフレームをいくつかキャプチャ済みですが)
rpi2-d3d12-graphics-diag

そして各フレームの詳細情報も以下のような感じで取得が出来ました。
rpi2-d3d12-graphics-diag-2

またシェーダーのデバッグ(ここでは頂点シェーダー)を試してみた感じが以下です。
rpi2-d3d12-graphics-diag-3

感想

予想以上に Raspberry Pi 2 で DirectX12 のデバッグが出来ました。 WARPデバイスで動作しているようだったので、ちゃんとしたグラフィックデバイスではない点は残念でした。でも ARM 環境で DX12 というおもしろい環境であることは間違いないです。 DirectX12 を試してみたいけど、新しい PC は準備できないような時にはこれも選択肢に入ってくるんじゃないかと感じました。
最後になりましたが当然といえば当然ですが、あまり FPS は出ていないようです。これくらいのサンプルでも (1280×1024) 解像度で、 60FPS は出ませんでしたし、 30 FPS も出てないように思います。単に動作するといった感じですね。ですがいつの日か Adreno系のパワフルな GPU が対応してきたらとか考えるとワクワクしますね。