RADEON 7970が出たようなので久々にDirect3D11.1の話題でも。
以前からなんどか話題にしてるけど、Direct3D11.1の新機能などはすでに発表されていて、現時点ではWindows 8のPreview版やSDKなどでは動きそうな感じのようです(今まではGPUがなかったので実際に動くかは謎でしたが)。
Direct3D 11.1 Features
http://msdn.microsoft.com/en-us/library/hh404562(v=VS.85).aspx
とりあえず、新機能は下記のような感じですね。
・Shader tracing
・Direct3D device sharing
・Check support of new Direct3D 11.1 features and formats
・Create larger constant buffers than a shader can access
・Use logical operations in a render target
・Force the sample count to create a rasterizer state
・Process video resources with shaders
・Change subresources with new copy options
・Discard resources and resource views
・Support a larger number of UAVs
・Bind a subrange of a constant buffer to a shader
・Retrieve the subrange of a constant buffer that is bound to a shader
・Clear all or part of a resource view
・Map SRVs of dynamic buffers with NO_OVERWRITE
・Use UAVs at every pipeline stage
結構、細かい新機能の追加は多いです。シェーダステージの追加などはありません。
このあと、順番にメモを書いていきます(現状、新機能が加わることで何が変わるかよくわからないところは簡易メモ)。気になるところやこう仕えそうなど。なお、従来のDirect3D 11の各種リソースの制限などを見返すためMSDNのリンクを貼っておきます。
Resource Limits (Direct3D 11)
http://msdn.microsoft.com/en-us/library/windows/desktop/ff819065(v=vs.85).aspx
なお、新機能では、従来の機能から使えるリソースが増えたりアクセスできるメモリ量が増えたりとかありますが、その辺の具体的な数値に関しては書かれてないものも結構あります。
・Shader tracing
シェーダのトレース機能。パフォーマンス解析などに便利そうな関数が追加になってます。
・Direct3D device sharing
Direct3D11.1では、1つのレンダリングデバイスからDirect3D10と11のAPIの呼び出しができるようですね。おそらく、Direct3D10ベースの他のAPI(Direct2DとかDirectWriteとか)との連携を考慮して、とかかな?
・Check support of new Direct3D 11.1 features and formats
新しいフォーマットや機能のサポート。DXGI はバージョン1.2。
後述の論理演算向けのサポートのチェックとかビデオリソース(ビデオのデコード結果をDirect3D11.1では簡単に使える?)まわりの話とか色々と。あと、Feature Level 9.3向けの精度に関するモノとか。
・Create larger constant buffers than a shader can access
従来より大きなコンスタントバッファを生成してシェーダからアクセスできる。
ただし、シェーダがアクセスできるコンスタントバッファの範囲は1スロットで4096要素(32bit* 4 * 4096 = 64KB)のまま。
これは1つのコンスタントバッファを大きく確保して、オフセットを指定してその中からどの4096要素を使うかというのを決めてバインドするってことなんでしょうね...というかセットとかゲット周りは後述。
・Use logical operations in a render target
レンダーターゲットに対する論理演算のサポート。
レンダーターゲットのブレンディングの段階で論理演算ができるみたいです。ちなみに、複数の論理演算処理を一回でやることはできないとのこと。
どう使うかはあんまり思いついてないんですが、テクスチャに対して論理演算的な処理ができるハードも世の中には無いわけでは無いのでそういうところで使われてるテクニックを持ってくるってところでしょうか?
・Force the sample count to create a rasterizer state
サンプルカウントを強制化をラスタライザーステートで指定できる。
D3D11_RASTERIZER_DESC1のForcedSampleCountを見ているとUAVをレンダーターゲットにした際に使うことになりそうですねぇ。
http://msdn.microsoft.com/en-us/library/hh404489(v=VS.85).aspx
・Process video resources with shaders
ビデオ処理したリソースへのシェーダアクセス。
Direct3D11.1では、どうやらビデオ処理(ビデオをデコードした)したリソースを使えるようでSRV/RTV/UAVのビューでアクセスも出来るようですね。
ただ、ビデオ側のAPIはどうなってるのかは謎ですが。
・Change subresources with new copy options
UpdateSubresourceとかCopySubresourceRegionなどのリソースコピーや更新関数に新しいコピーフラグが追加とのことですね。引数が増えた新しい関数ができてます。
・Discard resources and resource views
リソースやビューの破棄。専用の関数が用意されてます。
・Support a larger number of UAVs
従来よりも多くのUAVの利用ができるようになる。
DX11では、8枚でしたが具体的な枚数は不明。
・Bind a subrange of a constant buffer to a shader
・Retrieve the subrange of a constant buffer that is bound to a shader
この2つはセットで、コンスタントバッファのバインド時にサブレンジを指定してセットとゲットができる。
これは前述の"Create larger constant buffers than a shader can acces"ともセットで大きなコンスタントバッファを作った場合にどの範囲を使用するかやどの範囲を取り出すかなどの指定がSetConstantBuffers1系関数でできるようになったとのこと。
・Clear all or part of a resource view
すべてのビュー、もしくは単一のビューのクリア関数の追加。
ID3D11DeviceContext1::ClearViewと言う関数でビューに対するクリアができるようですね。
・Map SRVs of dynamic buffers with NO_OVERWRITE
動的バッファのShader Resource ViewでもD3D11_MAP_WRITE_NO_OVERWRITEを指定して生成ができるように(従来は頂点バッファとインデックスバッファのみ)。
D3D11_MAP_WRITE_NO_OVERWRITEについてはここ
http://msdn.microsoft.com/ja-jp/library/ee416245(v=vs.85).aspx
・Use UAVs at every pipeline stage
UAVがどのシェーダステージからでも利用可能。
最後に来たコレが個人的には、一番大きな機能追加だと思っています。UAVって従来までCompute Shaderと制限付きでPixel Shaderからアクセスが出来たわけですが、これでジオメトリを処理するようなステージでもUAVが使えるようになるわけですね。Compute Shaderの演算結果をジオメトリ側で使う場合の選択肢が増えるわけですね。
個人的には、この機能追加が地形のジオメトリ処理とかスキンアニメーションのボーンの持たせ方、GPUパーティクルのデータの持たせ方や処理方法で新しいテクニックが出てくると期待してます。
一方で、UAVは読み出すだけならいいんですが書き込むことを考えるとマルチスレッドでの同期周りが色々と頭痛い問題になりそうなのですが、Compute Shaderと同じくアトミック命令は使えるようですが...。
・まとめ
Direct3D11.1は、バージョン的には0.1しか違わないのですが、個人的には結構大きいアップデートだと思ってます。UAVまわりの機能強化はどう使っていくかが楽しみですね。
Windows 8専用っぽいのが、ちょっとアレですが、今年はこのあたりの追加機能を含めて今後のエンジン作りや新しいグラフィックスのテクニックを考えていかないとなぁ。
最近のコメント