DirectX12でWARPデバイス

VMWareの中に仮想マシンとしてインストールした Windows 10 でも実は DirectX12 を初期化して動くのを確認できていました。その時にアダプタが複数見つかって、別アダプタを使ったのがきっかけだったのですが、その時のデバイス(アダプタ)は Microsoft Basic Render Driver となってました。実はコレが、WARPデバイスでした。先日 Microsoft から Direct3D 12 UWP Sample という公式なサンプルが公開されたのでこれと比べてみたところ判明しました。

サンプルでは IDXGIFactory4::EnumWarpAdapter で比較的簡単に WARP デバイスを取得できます。この取得したアダプタの情報を見てみたところ、 “Microsoft Basic Render Driver”, VendorID=5140, DeviceID=140 となっていました。
これはVMWare環境下でうまく使えたというアダプタ2つめとも一致していました。

DXGI Overview - Win32 apps
This topic contains the following sections.

このページの New info about enumerating adapters for Windows 8 の節にもあるように描画専用のアダプタです。

このアダプタを使うと以前の RADEON 環境でもうまく動くのを確認できています。WARPアダプタを使って動いている状態になるので当たり前といえば当たり前ですが・・・。

以下の環境で WARP デバイスを使ってとりあえず DirectX12 の開発を進められることは確認できました。

  • VirtualBox
  • VMware
  • ドライバ不正なRADEON環境

dx12sample_in_vm

VMware Player の中で一応テクスチャ実験のためのサンプルが手元で動いています。

WARPデバイスの取得

サンプルでは IDXGIFactory4 の EnumWarpAdapter を使って取得していますが、以前の IDXGIFactory3 あたりでもちゃんと取得は可能です。単に EnumAdapters で DXGI_ERROR_NOT_FOUND が返ってくるまでインデックスを増やして検索すればOKです。
このときに、指定された VendorId, DeviceId がくるか見ておけばOKです。


ComPtr adapter;
for( int index=0;indexEnumAdapters(index, adapter.GetAddressOf());
  if( SUCCEEDED(hr) ) {
    adapter->GetDesc(&desc);
    if( desc.VendorId == 0x1414 && desc.DeviceId == 0x8c ) {
      // this is WARP Device !!
      break;
    }
  }
} while(hr != DXGI_ERROR_NOT_FOUND );

これで仮想環境でも実験を始められるので、気軽に DirectX12 を触り始めてみることが出来ますね!

DirectX
すらりんをフォローする
すらりん日記

コメント

タイトルとURLをコピーしました