フォト

Google AdSense

  • AdSense
無料ブログはココログ

2016.12.10

MicrosoftのPBRシェーダのサンプル

Shader.jpで書いたネタではありますが、MicrosoftのATGの方が出してるサンプルはベーシックなものが多かったのと非グラフィックスが多かったのであまりチェックしていなかったのですが、現在よく使われているDisneyベースのDiffuse、Specular、IBLのシェーダのサンプルがあとは。

SimplePBR12
https://github.com/Microsoft/Xbox-ATG-Samples/tree/master/Samples/Graphics/SimplePBR12

とりあえず、ちょっとしたネタや教育用途でよいんじゃないかとは思います。

20161210


2016.06.23

GeForce GTX 1080でGPU-Z

職場は1080で仕事してるんですが、さすがにそこからの情報をネタにしづらいのではありますが、自宅も1080にしたのでしばらく1080のネタをやっていきます。

Gpuz


2016.05.17

Visual Studio 2015から直接GPUViewって開けたのね

最近人から教えてもらったのですが、Visual Studio 2015から直接GPUViewが開けたんですね。

※無印Visual Studio 2015とかではだめかもしれません。Update 1とか2かもしれないです(今回はUpdate 2で)。

Visual Studio 2015のメニューの「デバッグ」から「デバッグなしで診断ツールを開始(R)...」すると下のような画面が出るので、赤丸で囲ったようにGPUにチェック入れます。

Gpuview001
クリックすると大きなサイズになります

そしたらキャプチャしたいプログラムが起動すると思いますが、その時にVisual Studio 2015の画面としては下記のようになってるのでプログラムを閉じるか、Visual Studio内の「コレクションを停止」ってリンクをクリックします。

Gpuview004
クリックすると大きなサイズになります

すると下記のような感じになるのですが、右下に赤丸で囲ったところに「GPUViewで開く」と「WPAで開く」ってのがありますね。ここで一度、診断のデータを.diagsessionファイルを保存します(GPUViewがログのファイルから起動するので)。保存したら「GPUViewで開く」をクリックします。

Gpuview002
クリックすると大きなサイズになります

クリックしたらプログラムの起動時から停止までの期間のGPUViewが開きました。

Gpuview003
クリックすると大きなサイズになります

これは、今まで見たくGPUViewのログをとるコマンドをいちいち起動しないでいいのがいいですね。

余談ですが、キャプチャしたPCはOptimus機でIntel HD 4600とGeForce GTX 870が搭載なのですが、このケースではIntel HD 4600が動いているのがわかります。

2016.03.08

GeForceでWHQLドライバでVulkanサポートがきた

NVIDIA R364.47 WHQL Graphics Drivers with Vulkan Support
http://www.geeks3d.com/20160307/nvidia-r364-47-whql-graphics-drivers-with-vulkan-support/

おお、WHQLドライバでVulkanのサポートが入ってきたんですね。

これで、Direct3D12やOculusなどほかのアプリケーションにとっても安定してそうなドライバでVulkan開発もできる。

20160308

2016.02.27

Vulkanを動かす用に購入したAndroid TVのSHIELD到着

Android TVのSHIELDにAndroid 6.0 Marshmallowが配信されたのですが、この端末だけVulkanが動くようなのでアメリカのAmazonが発送してくれたので購入しました。

Leader of the Pack: SHIELD Update Brings Marshmallow, Vulkan into the Living Room - See more at: http://blogs.nvidia.com/blog/2016/02/22/shield-marshmallow-vulkan/#sthash.9vefKeyi.dpuf
http://blogs.nvidia.com/blog/2016/02/22/shield-marshmallow-vulkan/

アメリカのAmazon
http://www.amazon.com/NVIDIA-SHIELD-Pro-Streaming-Chromecast-Performance/dp/B00XO7AK1U/

Shield

とりあえず、NVIDIAのサンプルの"Vulkan Threaded Rendering"がビルド済みのapkあるので入れてみました。

Vulkan on Android
https://developer.nvidia.com/vulkan-android

無事に動きましたね。Vulkan自体を動かすのはPCで全然問題ないとは思うのですがAndroidで動く機種でいろいろと検証してみたいところですね。

Shield002

2016.02.17

Direct3D12のデバッグを助けるID3D12Object::SetName

MiniEngineをグラフィックス診断をしていてDescriptorHeapを見ていて気づいたのですが、Direct3D12ではID3D12Resouce(テクスチャ、バッファ、コンスタントバッファ、UAV)などのリソースに任意の名前が付けられるんですね(下図の赤枠)。名前がついてると、DescriptorHeapに大量にリソースがセットされていても内容がチェックしやすくて便利ですね。

debug002
クリックすると大きなサイズになります

ちょっと気になったので、確認のためグラフィックスオブジェクトテーブルを見てみます。

debug003
クリックすると大きなサイズになります

なるほど、Direct3D11時代のときのように従来の「オブジェクト:〇〇」(〇〇は数字)のような表記もあるんですね。

では、名前がついてるものと「オブジェクト:〇〇」表記は何が違うんでしょうか?

・・・ということで、調べてみたところID3D12Objectインターフェイスのメンバ関数のSetName関数で名前をつけたものが表示されることがわかりました。

ID3D12Object::SetName
https://msdn.microsoft.com/ja-jp/library/windows/desktop/dn788701(v=vs.85).aspx

MSDNを見ていると

Associates a name with the device object. This name is for use in debug diagnostics and tools.

とあるので、基本的にデバッグやツールなどで使用するものとして用意されているようですね。

Direct3D12の各種インターフェイスの継承は下記のような構造になっているのですが、

IUnknown - ID3D12Object - ID3D12DeviceChild - ID3D12~インターフェイス

これがDirect3D11だと下記のような構造だったので、新設されたみたいですね。

IUnknown -  ID3D11DeviceChild - ID3D11~インターフェイス

さて、ほかのMicrosoftのサンプル(D3D12HelloWorldのHelloTexture)でDesciptorHeapを見てみます。これはやはりSetNameしていないのでテクスチャのSRVが「オブジェクト:15」という自動的につく名前のままですね。このサンプルはテクスチャを1枚張ってるだけだからいいですが、これが実際のゲーム開発で大量のオブジェクトを使うようになるとこれでは見分けるのが難しいですね。

やはり任意の名前がついてた方がいいので、Direct3D12でID3D12~のインターフェイスに名前が付けられるのはありがたいですね。

debug004

さらに、ID3D12Object::SetName で名前を付けておくことで便利なのがインターフェイスの解放忘れの時ですね。

リークを出すためにD3D12HelloWorldのHelloTextureサンプルのD3D12HelloTexture.hのD3D12HelloTextureのメンバであるm_textureをスマートポインタではなく、

ID3D12Resource* m_texture;

に変えて、Releaseしないでおきます。

Direct3D11の時からありますが、たとえば、Direct3D12ではサンプルにあるような下記のコードのようにDebugLayerを有効にします。

ComPtr<ID3D12Debug> debugController;

if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(&debugController))))
{
 debugController->EnableDebugLayer();
}

そのあとに、テクスチャのインターフェイスをわざとReleaseしないでアプリケーションを閉じて、Visual Studio 2015の出力を見ると下記のように解放忘れを報告してくれます。

D3D12 WARNING: Process is terminating. Using simple reporting. Please call ReportLiveObjects() at runtime for standard reporting. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D12 WARNING: Live Producer at 0x000001376E4FB318, Refcount: 2. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D12 WARNING:  Live Object at 0x000001376E4E6E90, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D12 WARNING:  Live Object at 0x000001376E4E9AE0, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D12 WARNING:  Live Object at 0x000001376E523190, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D12 WARNING:  Live Object at 0x000001376E550510, Refcount: 1. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D12 WARNING:  Live Object at 0x000001376E54FFD0, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D12 WARNING: Live                         Object :      5 [ STATE_CREATION WARNING #0: UNKNOWN]

とはいえ、これでは何がリークしているか特定が難しいので、下記のコードを使います。

ID3D12DebugDevice* debugInterface;

if (SUCCEEDED(m_device.Get()->QueryInterface(&debugInterface)))
{
 debugInterface->ReportLiveDeviceObjects(D3D12_RLDO_DETAIL | D3D12_RLDO_IGNORE_INTERNAL);
 debugInterface->Release();
}

これは、Direct3D11の時だとID3D11Debug::ReportLiveDeviceObjectsであったと思います。

その結果、下記のような情報に変わります。これで、ID3D12~などのインターフェイスの型でRefcountがわかるようになりました。ここまでは、Direct3D11と同じですね。

D3D12 WARNING: Live ID3D12Device at 0x0000020303619330, Refcount: 23 [ STATE_CREATION WARNING #274: LIVE_DEVICE]
D3D12 WARNING:  Live ID3D12CommandQueue at 0x000002030364E280, Refcount: 5, IntRef: 0 [ STATE_CREATION WARNING #570: LIVE_COMMANDQUEUE]
D3D12 WARNING:  Live IDXGISwapChain at 0x0000020303643060, Refcount: 2 [ STATE_CREATION WARNING #275: LIVE_SWAPCHAIN]
D3D12 WARNING:  Live ID3D12Fence at 0x000002030364C690, Name: Internal DXGI Fence, Refcount: 1, IntRef: 0 [ STATE_CREATION WARNING #580: LIVE_MONITOREDFENCE]
D3D12 WARNING:  Live ID3D12CommandAllocator at 0x0000020303642010, Name: Internal DXGI CommandAllocator, Refcount: 1, IntRef: 1 [ STATE_CREATION WARNING #571: LIVE_COMMANDALLOCATOR]
D3D12 WARNING:  Live ID3D12GraphicsCommandList at 0x0000020303644800, Name: Internal DXGI CommandList, Refcount: 2, IntRef: 0 [ STATE_CREATION WARNING #573: LIVE_COMMANDLIST12]
D3D12 WARNING:  Live ID3D12Resource at 0x00000203036646B0, Refcount: 2, IntRef: 0 [ STATE_CREATION WARNING #575: LIVE_RESOURCE]
D3D12 WARNING:  Live ID3D12Resource at 0x0000020303665BD0, Refcount: 2, IntRef: 0 [ STATE_CREATION WARNING #575: LIVE_RESOURCE]
D3D12 WARNING:  Live ID3D12DescriptorHeap at 0x0000020303666BB0, Refcount: 1, IntRef: 0 [ STATE_CREATION WARNING #576: LIVE_DESCRIPTORHEAP]
D3D12 WARNING:  Live ID3D12DescriptorHeap at 0x0000020303666F40, Refcount: 1, IntRef: 0 [ STATE_CREATION WARNING #576: LIVE_DESCRIPTORHEAP]
D3D12 WARNING:  Live ID3D12CommandAllocator at 0x0000020303668180, Refcount: 1, IntRef: 1 [ STATE_CREATION WARNING #571: LIVE_COMMANDALLOCATOR]
D3D12 WARNING:  Live ID3D12RootSignature at 0x0000020303668550, Refcount: 1, IntRef: 1 [ STATE_CREATION WARNING #577: LIVE_ROOTSIGNATURE]
D3D12 WARNING:  Live ID3D12PipelineState at 0x00000203036706A0, Refcount: 1, IntRef: 0 [ STATE_CREATION WARNING #572: LIVE_PIPELINESTATE]
D3D12 WARNING:  Live ID3D12GraphicsCommandList at 0x00000203036A1A20, Refcount: 1, IntRef: 0 [ STATE_CREATION WARNING #573: LIVE_COMMANDLIST12]
D3D12 WARNING:  Live ID3D12Resource at 0x00000203036A0BC0, Refcount: 1, IntRef: 0 [ STATE_CREATION WARNING #575: LIVE_RESOURCE]
D3D12 WARNING:  Live ID3D12Resource at 0x00000203036B0200, Refcount: 1, IntRef: 0 [ STATE_CREATION WARNING #575: LIVE_RESOURCE]
D3D12 WARNING:  Live ID3D12Fence at 0x0000020303672C60, Refcount: 1, IntRef: 0 [ STATE_CREATION WARNING #580: LIVE_MONITOREDFENCE]
D3D12 WARNING:  Live ID3D12CommandAllocator at 0x00000203036828F0, Name: Internal DXGI CommandAllocator, Refcount: 1, IntRef: 0 [ STATE_CREATION WARNING #571: LIVE_COMMANDALLOCATOR]
D3D12 WARNING:  Live ID3D12CommandAllocator at 0x0000020303685CD0, Name: Internal DXGI CommandAllocator, Refcount: 1, IntRef: 0 [ STATE_CREATION WARNING #571: LIVE_COMMANDALLOCATOR]

で、続いてSetNameで名前を付けてみます。適当なところで、

m_texture->SetName(L"Texture");

としておくと、レポートが下記のようになります。「赤字」の箇所にちゃんとSetNameした名称が出てきています。そしてRefcount: 1.となっているところのアドレスの青字で対応をとると"Texture"はとりあえず解放忘れてるぞ、となるわけですね。

D3D12 WARNING: Live ID3D12Device at 0x0000025D68FCE1B0, Refcount: 23 [ STATE_CREATION WARNING #274: LIVE_DEVICE]
D3D12 WARNING:  Live ID3D12CommandQueue at 0x0000025D69012D80, Refcount: 5, IntRef: 0 [ STATE_CREATION WARNING #570: LIVE_COMMANDQUEUE]
D3D12 WARNING:  Live IDXGISwapChain at 0x0000025D690130D0, Refcount: 2 [ STATE_CREATION WARNING #275: LIVE_SWAPCHAIN]
D3D12 WARNING:  Live ID3D12Fence at 0x0000025D68FBF4F0, Name: Internal DXGI Fence, Refcount: 1, IntRef: 0 [ STATE_CREATION WARNING #580: LIVE_MONITOREDFENCE]
D3D12 WARNING:  Live ID3D12CommandAllocator at 0x0000025D69014870, Name: Internal DXGI CommandAllocator, Refcount: 1, IntRef: 0 [ STATE_CREATION WARNING #571: LIVE_COMMANDALLOCATOR]
D3D12 WARNING:  Live ID3D12GraphicsCommandList at 0x0000025D68FF7BB0, Name: Internal DXGI CommandList, Refcount: 2, IntRef: 0 [ STATE_CREATION WARNING #573: LIVE_COMMANDLIST12]
D3D12 WARNING:  Live ID3D12Resource at 0x0000025D69016260, Refcount: 2, IntRef: 0 [ STATE_CREATION WARNING #575: LIVE_RESOURCE]
D3D12 WARNING:  Live ID3D12Resource at 0x0000025D68FFC370, Refcount: 2, IntRef: 0 [ STATE_CREATION WARNING #575: LIVE_RESOURCE]
D3D12 WARNING:  Live ID3D12DescriptorHeap at 0x0000025D69016E00, Refcount: 1, IntRef: 0 [ STATE_CREATION WARNING #576: LIVE_DESCRIPTORHEAP]
D3D12 WARNING:  Live ID3D12DescriptorHeap at 0x0000025D68FFD350, Refcount: 1, IntRef: 0 [ STATE_CREATION WARNING #576: LIVE_DESCRIPTORHEAP]
D3D12 WARNING:  Live ID3D12CommandAllocator at 0x0000025D68FFDB20, Refcount: 1, IntRef: 1 [ STATE_CREATION WARNING #571: LIVE_COMMANDALLOCATOR]
D3D12 WARNING:  Live ID3D12RootSignature at 0x0000025D6901DB40, Refcount: 1, IntRef: 1 [ STATE_CREATION WARNING #577: LIVE_ROOTSIGNATURE]
D3D12 WARNING:  Live ID3D12PipelineState at 0x0000025D69025820, Refcount: 1, IntRef: 0 [ STATE_CREATION WARNING #572: LIVE_PIPELINESTATE]
D3D12 WARNING:  Live ID3D12GraphicsCommandList at 0x0000025D69057C90, Refcount: 1, IntRef: 0 [ STATE_CREATION WARNING #573: LIVE_COMMANDLIST12]
D3D12 WARNING:  Live ID3D12Resource at 0x0000025D69065F30, Refcount: 1, IntRef: 0 [ STATE_CREATION WARNING #575: LIVE_RESOURCE]
D3D12 WARNING:  Live ID3D12Resource at 0x0000025D69066A50, Name: Texture, Refcount: 1, IntRef: 0 [ STATE_CREATION WARNING #575: LIVE_RESOURCE]
D3D12 WARNING:  Live ID3D12Fence at 0x0000025D69026A30, Refcount: 1, IntRef: 0 [ STATE_CREATION WARNING #580: LIVE_MONITOREDFENCE]
D3D12 WARNING:  Live ID3D12CommandAllocator at 0x0000025D69056670, Name: Internal DXGI CommandAllocator, Refcount: 1, IntRef: 1 [ STATE_CREATION WARNING #571: LIVE_COMMANDALLOCATOR]
D3D12 WARNING:  Live ID3D12CommandAllocator at 0x0000025D69036810, Name: Internal DXGI CommandAllocator, Refcount: 1, IntRef: 0 [ STATE_CREATION WARNING #571: LIVE_COMMANDALLOCATOR]
D3D12 WARNING: Process is terminating. Using simple reporting. Please call ReportLiveObjects() at runtime for standard reporting. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D12 WARNING: Live Producer at 0x0000025D68FCE198, Refcount: 2. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D12 WARNING:  Live Object at 0x0000025D68FBBF60, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D12 WARNING:  Live Object at 0x0000025D68FF6000, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D12 WARNING:  Live Object at 0x0000025D690111B0, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D12 WARNING:  Live Object at 0x0000025D69066A50, Refcount: 1. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D12 WARNING:  Live Object at 0x0000025D69066510, Refcount: 0. [ STATE_CREATION WARNING #0: UNKNOWN]
D3D12 WARNING: Live                         Object :      5 [ STATE_CREATION WARNING #0: UNKNOWN]

まとめ
今回紹介した要素はちょっとした小さい機能追加ではあるのですが、ID3D12~に対して名前が付けられるようになることでデバッグや分析が楽になりそうな感じではありますね。
そんなわけで、開発のことを考えるとID3D12~のものは何かとSetNameして名前どんどん付けていくのがよいかもしれませんね。
ただし、これはこれでメモリの使用量が増えるのでギリギリで作ってるときは注意ではありますが、さすがに今後はこのぐらいのメモリが取れないということはないとは思います。

2016.02.07

Windows 10版のGPUViewでRadeon HD 7950をキャプチャ

Windows 10版のGPUView」の記事ではGeForce GTX 870M環境で取りましたが、自宅のRadeon HD 7950機でD3D12nBodyGravityの非同期Compute版でキャプチャしました。

なるほど~、GCN世代のGPUだとHardware Queueで"COMPUTE_0"というQueueが出てきますねぇ。これがCompute Queueなのね。とりあえず、GCNならDirect3D12で非同期Computeが使えるんだなぁ。

Radeon_2
クリックすると大きなサイズになります


2016.02.06

Windows 10版のGPUView

AMDのGPUOpenの"Maxing out GPU usage in nBodyGravity"の記事を読んでいたのですが、GPUViewのWindows 10版が出てたんですね。

Maxing out GPU usage in nBodyGravity
http://gpuopen.com/maxing-out-gpu-usage-in-nbodygravity/

サンプルコード(Microsoftのコードを非同期Compute対応したもの)
https://github.com/GPUOpen-LibrariesAndSDKs/nBodyD3D12/tree/master/Samples/D3D12nBodyGravity

上の記事では、MicrosoftのDirect3D12サンプルD3D12nBodyGravityを非同期Compute対応させたものではあるのですが、記事ではその動作やパフォーマンスを確認するためにGPUViewを使っています。

記事でGPUViewのHardware Queueが表示されてますが、その下に"3D"、"Copy"、"Compute"に分かれているのがわかります。こういう表示のされ方はWindows 8.1までのGPUViewにはなかった表記だと思います。

こうした表記の方法は、Direct3D12のMulti-Engine的な表記ですね。Direct3D12ではCommand Queueを3D用(グラフィックス処理とCompute、Copy)とCopy(GPUのメモリの読み書き用)とCompute(Compute処理専用)に分かれているのですが、それをMulti-Engineと言ってるわけですね。

https://msdn.microsoft.com/en-us/library/windows/desktop/dn899217(v=vs.85).aspx

・・・ってことは、Direct3D12に対応したのかな?ということで調べてみたところWindows 10版のGPUViewがありました。

Windows 10用のGPUViewは下記のページの「Windows ADK for Windows 10 をダウンロードする」からダウンロードできました。

Windows 10 用のキットとツールのダウンロード
https://msdn.microsoft.com/ja-jp/windows/hardware/dn913721.aspx

そんなわけで、自分の環境でもGPUViewやってみました。

下記に入ってるlog.cmdをコマンドラインを管理者権限で起動して実行します。Xperf.exeは今回はlog.cmdで実行されるようになってました。あと、エラーがでましたがこちらのサイトの方法で解決しました。

C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\gpuview

そんなわけで、自分のMSI GS60(Optimus搭載GeForce GTX 870Mモデル)でDirect3D12プログラムを実行したら下記のようになりました。

Gpuview
クリックすると大きなサイズになります

Windows 10用だとOptimus搭載機のIntel HD 4600とGeForce GTX 870Mの両方が見えますね。この2つのGPUはそれぞれHardwareの3D QueueとCopy Queueを持ってるのがわかりますね(ちなみにスクリーンショットないのですが、GeForce GTX 970機とGeForce GTX 970M機も試してみたんですがCopy Queueを2つもっていました)。

ちょっとAMD GPUを試せていないのですが、GPUOpenの記事を見てる感じではCompute Queueが表示されるんではないかと思います。

ひとまずWindows 10ではDirect3D12プログラムをGPUViewでモニタリングできそうな感じはわかってきたので活用していきたいところですね。

2015.11.30

Windows 10 Mobile端末あるのでUWPやDirect3D試してみた

MADOSMAのWindows 8.1版持っていたのですが、土曜日に秋葉原のマウスコンピューターのショップでWindows 10にしてきました。

で、やることといえば、Visual Studio 2015からUWPのビルドと実行ですね。

最初、USB接続で配置エラーでDEP6100 とか DEP6200 やらってエラーが出るので調べてみたら下記の記事があって、書かれてる通りレジストリ追加したら解決しました。

Visual Studio 2015でWindows 10 Mobile端末に配置できるようにする
http://morokoshi.hateblo.jp/entry/2015/11/08/214606

その後、UWPのDirect3D11 + XAMLをビルドして配置したら下記のように実行できました。とりあえず、60 fpsでてますね。

それから次にDirect3D12を試しましたが、こちらはデバッグランタイムないからかと思ってReleaseビルドもしましたがダメでした。WARP Adapterも起動せず。

まぁ、この機種はSnapdragon 410なのでAdreno 305がGPUなわけですね。

https://www.qualcomm.com/products/snapdragon/processors/410

GPUのスペック一覧を探してみるとFeature Level 9_3ですね。

Adreno™ Graphics Processing Units
https://developer.qualcomm.com/software/adreno-gpu-sdk/gpu

見た感じ、Adreno 400シリーズになるとFeature Level 11_2になるようですね。

ちょうど今日発表された下記の機種が、Adreno 405のようですね。

Continuum機能にも対応予定のWindows Phone「NuAns Neo」が2016年1月発売
http://www.4gamer.net/games/990/G999022/20151130018/

ただ、400シリーズでも430だけOpenGL ESのバージョンが違ったりしてるので、430あたり狙いたいところですね。今のWindows 10のスマホの日本向け端末は液晶解像度が1280x720が多いので1920x1080とか出たらにしたいですしねえ。

「NuAns Neo」は1月ですし、とりあえず、UWPに関しては、Direct3D11でしばらくはいろいろとノウハウを貯めたいところですね。

2015.10.29

Oculus DK2の新しい描画モードDXGI 2 Previewの話

うちでは、Windows 10はほとんどのPCがInsider Previewにして最新のビルドを使っていますが、先日OculusのRuntimeを0.8にしたらOptimusのノートPCでIntel GPUでDK2が動くようになりました。

なんで、Intel GPUで動き出したか謎だったのですが、それらしきものを見つけたのでメモしておきます。

まずは、Oculus Configuration UtilityでToolsのAdvancedのDiagnostic Log...します。

Oc001

そうすると下記のダイアログがでてきますが、そのままOKします。

Oc002

そうするとDebug Log Outputが出ますが、一度スクロールして一番上までスクロールします。

Oc003

ここで、Display Statusに注目してみます。

"Display Status": {
"Display Mode": 1,
"Win10 Native": {
"Capable": 1,
"Available": 1,
"ResultCode": 0,
"Status": "DXGI 2 Preview available"
},
"IHVDirect": {
"Capable": 0,
"Available": 0,
"ResultCode": -3014,
"Status": "No compatible GPU found for Direct Display"
},
"Legacy Direct": {
"Capable": 0,
"Available": 0,
"ResultCode": -3005,
"Status": "OVRDirect not supported on this OS. Please use one of the more supported modes"
},
"Summary ResultCode": 0,
"Summary Status": ""
},

ここの"Display Mode"はどうやらOculusを動かすためのモードで3つのモードがあります。

・Win10 Native…Windows 10のネイティブ機能での描画。0.8で新規に加わったっぽい。
・IHVDirect…GPUベンダーのドライバ側のDirect Mode。0.7で入ったやつ。
・Legacy Direct…Oculus 0.7以前(0.6.xとか)のDirect Mode

と推測しています。

さらに、各モードで

Capable…動作のための条件を満たしているか。1なら満たしている
Available…実際に動作するか。1ならこのモードで動作する。Capableが1でもここが0だと動かない。
ResultCode…0以外ならエラー。エラー番号の意味は不明。
Summary Status…状態をメッセージで書いてます。"No compatible GPU found for Direct Display"であればGPUが対応していない。"OVRDirect not supported on this OS. Please use one of the more supported modes"はOSがサポートしてません(Win 10では旧来のDirect未サポート)。

さて、今回気になってるのが"Win10 Native"ですね。これは初耳のモードですね。Statusを見るとどうやら"DXGI 2 Preview available"とあるので、DXGIの機能でOculusに対応しているようですね。

いろいろと試してみたところWindows 10の現在の製品ビルドでは使えずInsider Previewのビルドだと使えるようです。製品版ビルではCapable 1でAvailable 0でした。

今のところこちらの手元では、Intel GPUでこのモードでDK2が動いているのですが、パフォーマンスはあまりよくありません。今のところRelease Noteなどでもアナウンスされてないので正式なリリースではないのかもしれませねん。まだまだパフォーマンスでチューニングしてるのかもしれませんので、将来のバージョンでは高速化するのかもしれませんが。

ただ、今までOculusが使えなかったIntelで動いているので、GPUベンダー依存の少ないモードなのかもしれませんので、このモードというのは期待したいところですね(もしかしたらDX12はWin10 NativeでOpenGLやVulkanがIHVDirectというすみわけあるかも)。

より以前の記事一覧