Windows 10 Anniversary Updateに関連したDirect3D12のアップデート HLSL 6.0など

GDC 2016でDirectX 12 AdvancementsのセッションでDirect3D12の将来のアップデートのことが話題として取り上げられましたが,Windows 10 Anniversary Updateのビルドで新しい機能がリリースされるようです.
スライド
http://1drv.ms/1T8iew9
下記のMSDNのドキュメントによるとWindows 10, version 1607でDirect3D12にいくつかの新機能が来るようです.
New Releases
https://msdn.microsoft.com/en-us/library/windows/desktop/mt748631(v=vs.85).aspx
個人的にWindows Insider Previewを入れているのですが,Windows 10, version 1607はWindows 10 Anniversary Updateのビルドのようですね.
2016-08-02
新機能の方は以下のような機能が追加されたようです.

  • ID3D12Device1
  • ID3D12PipelineStateをまとめておけてシリアライズも可能なID3D12PipelineLibrary
  • Root Signature Version 1.1とID3D12VersionedRootSignatureDeserializer
  • HLSL 6.0
  • HDR Displayへの対応とDXGI 1.5
  • Direct3D11.4・・・詳細な説明はここでは割愛します.Direct3D11.4周りのドキュメント

追加のインターフェイスクラスを加えた新しい階層図というのが下記に公開されています.
https://msdn.microsoft.com/en-us/library/windows/desktop/mt613238.aspx
ID3D12Device1に関しては,新しい機能を使うDirect3D12デバイスですね.
ID3D12PipelineLibraryはID3D12PipelineStateをまとめて管理できるもののようです.ID3D12PipelineStateで作成したものをメンバのID3D12PipelineLibrary::StorePipelineでどんどん格納して,ID3D12PipelineLibrary::LoadGraphicsPipelineやID3D12PipelineLibrary::LoadComputePipelineで取り出すようですね(名前でセットして名前で取り出せる).これだけなら管理するだけのものなんですが,どうもシリアライズに対応しているようでStoreした後にシリアライズしてファイルなどに書き出しておけば,それをのちのち読み込んだりというようなことができるようですね.これなら自分たちのツールなどでID3D12PipelineStateをデザインしてデータやライブラリ化しておくとかできそうでよいですね.
ID3D12PipelineLibrary
https://msdn.microsoft.com/en-us/library/windows/desktop/mt709145(v=vs.85).aspx
ID3D12VersionedRootSignatureDeserializerに関しては,Root Signature Version 1.1が登場したことでそれに関連したものですね.重要なことは,Root Signature Version 1.1の方ですね.
Root Signature Version 1.1
https://msdn.microsoft.com/en-us/library/windows/desktop/mt709473(v=vs.85).aspx
それからHLSL 6.0も意外と早くリリースされてるようです.今回はCompute ShaderやPixerl Shaderにおけるマルチスレッド処理の強化がメインみたいですね.Terminologyを見るとGPUベンダーごとにまちまちだった用語などがDirect3D12的な用語統一が図られています.
HLSL 6.0 Overview
https://msdn.microsoft.com/en-us/library/windows/desktop/mt733232(v=vs.85).aspx

用語の統一で主要なものとして

  • Lane(レーン)…GPUが処理する1スレッドのことをShader Moder 6.0ではこう呼ぶ
  • Wave…Laneを一定の数でまとめた単位.NVIDIAではWarp,AMDではWavefrontと呼んでるものです.Direct3D12では今後はWaveと呼ぶようですね
  • Quad…4 Lane.特にPixel Shaderなどで2×2ピクセルを扱うLaneをまとめた単位

となります.HLSL 6.0ではこれらに対するアクセスができる関数が用意されています.これらを利用すると従来のスレッドグループ共有メモリと同期を使った方法とは違った形でほかのLaneとデータのやり取りなどができるようになるようです.ちょうど先日,下記の記事で書きましたが,NVIDIAのKeplar以降のWarp shufleやWarp Voteのようなことはできるようです(AMDでも同様の仕組みはあるようですが,ちょっと把握できていません).
Direct3DやOpenGL、VulkanでWarp shuffle
http://masafumi.cocolog-nifty.com/masafumis_diary/2016/08/direct3dopenglv.html
HLSL 6.0のドキュメントではこれらの機能の活用を下記のように書いています.
Potential use cases include: stream compaction, reductions, block transpose, bitonic sort or Fast Fourier Transforms (FFT), binning, stream de-duplication, and similar scenarios.
まずはCUDAなどで用いられてるアルゴリズムを持ってくるのがいいのかもしれないですね.
そして最後に,4KディスプレイやテレビではHDR対応したものがどんどんでてきますが,それに合わせた対応としてDXGI 1.5とHDRの規格への対応が来ていますね.いよいよWindows 10からHDR対応ですね.
High Dynamic Range and Wide Color Gamut
https://msdn.microsoft.com/en-us/library/windows/desktop/mt742103(v=vs.85).aspx
DXGI 1.5 Improvements
https://msdn.microsoft.com/en-us/library/windows/desktop/mt661818(v=vs.85).aspx
とりあえず,Windows 10のSDK 1607向けが出たら見ていきたいですね.
動画