先日,Windows 10 Fall Creatorsがリリースされビルド1709向けの新しいDirect3D12 APIが加わりました.
Direct3D12の新機能のリリースノート
https://msdn.microsoft.com/en-us/library/windows/desktop/mt748631(v=vs.85).aspx
今回加わった新機能のほかに,1つ前の大型アップデートであるCreators Updateなどで加わった新機能の一部についてDirectX Developer Blogで紹介されています.Xbox One Xの話題が少し序文で触れられているので,これらの機能はその開発でも役に立つのかもしれません.
Announcing new DirectX 12 features
https://blogs.msdn.microsoft.com/directx/2017/11/07/announcing-new-directx-12-features/
Fall Creators Updateでの更新では,Direct3D12がCPUにとって低遅延なAPIになったことで,CPUはGPUにコマンドを送ったらハードウェア(GPU)上で何が起きているか把握するのが難しくなりました.特にGPUクラッシュなどは原因の追及が難しくなっています.
改善された機能については,データとコマンドの観点で新しいAPIが紹介されています.
- ID3D12Device3::OpenExistingHeapFromAddress
- ID3D12GraphicsCommandList2::WriteBufferImmediat
Id3d12device3::OpenExistingHeapFromAddress
https://msdn.microsoft.com/en-us/library/windows/desktop/mt813612(v=vs.85).aspx
ID3D12GraphicsCommandList2::WriteBufferImmediate method
https://msdn.microsoft.com/en-us/library/windows/desktop/mt844818(v=vs.85).aspx
データに関しては,リソースメモリに対してアクセスできるID3D12Device3::OpenExistingHeapFromAddressという関数が追加されたようですね.これを使うと診断用のDescriptor Heapが取れるようで,システムメモリ上に作られるようなのでGPUのクラッシュやデバイスロスト時でも見ることができるようですね.
コマンドという観点でいうとID3D12GraphicsCommandList2::WriteBufferImmediate をCPUから送られたコマンドが実行されたかどうかや実行中かというところがわかるマーカーを打てるようになったようですね.これはクラッシュ時でも取れるようなので,実際にクラッシュしたコマンドを把握するのに便利なようです.
Creators Updateで追加されたものに関しては,以下の2つについて紹介されています.
- Depth Bounds Testing
- Programmable MSAA
Depth Bounds Testingはピクセルがカメラからどれだけ離れているかテストする機能であまりに遠すぎるものは破棄するなどができるようになります(設定できる値はmin,maxなので一定の範囲より手前のものも設定はできます).この機能自体は,昔からGPUで備わっていましたが,Direct3D12の初期段階ではAPIがなかったため使えませんでした(過去の世代では使えていました).
Depth Bounds Testingに関しては,GitHubでサンプルが公開されています.
サンプル
https://github.com/Microsoft/DirectX-Graphics-Samples
Programmable MSAAではアンチエイリアス処理の制御をより柔軟にするためにサブピクセルの動作を指定するような命令が加わったようで,フレームごとにずらすことでTemporal AAなどの悪い影響を防ぐようなことにつかえるようですね.
APIとしてはID3D12GraphicsCommandList1::SetSamplePositionsに対応するようです.
ID3D12GraphicsCommandList1::SetSamplePositions method
https://msdn.microsoft.com/en-us/library/windows/desktop/mt492660(v=vs.85).aspx