Microsoftが外部接続GPUのためのサンプルxGPUを準備中

MicrosoftがDirect3D12のサンプルに外部接続GPUのためのサンプルxGPUを用意しているようですね.

https://github.com/Microsoft/DirectX-Graphics-Samples/tree/xGPUupdateReadme

最近はThunderbolt 3やSurface Bookのような取り外しができるディスクリートGPU環境が少し増えてきたので,それらに対応したサンプルということのようですね.

以前よりSLIやOptimusのようなLinkedGpusサンプルみたいなものはありましたが,xGPUサンプルでは外部接続GPUの検出やアプリケーションの動作中の接続や接続解除が考慮されているようですね.


GPU Zen 2執筆者募集とDX12/Vulkan/Metal 2対応フレームワーク The Forge

Wolfgang Engel氏が編集を務めるGPU Zen 2の執筆者募集が始まっています.出版はGDC 2019の時期を目指すようですね.

http://gpuzen.blogspot.jp/2018/01/gpu-zen-2-call-for-authors.html

今回はサンプルコードを実装するサンプルのためのフレームワークとしてThe Forgeというのが公開されています.

https://github.com/ConfettiFX/The-Forge

このThe Forgeは,DX12/Vulkan/Metal 2(PS4も対応予定)に対応し,サンプルにはVisibility Bufferがあります.Visibility Bufferの実装例を見てみるにはいいかもしれませんね.


新規記事:HLSLからSPIR-Vバイナリを生成する

2018年最初の記事として,新規記事”HLSLからSPIR-Vバイナリを生成する”をArticlesに書きました.

HLSLからSPIR-Vバイナリを生成する
http://www.shader.jp/?page_id=2176

実行環境としてVulkanを使う際,マルチプラットフォームで開発する際にシェーダの言語は1つの言語にしたいというときにHLSLのコード資産を生かしたいということはあると思います.

そうした場合に,Khronos groupが標準的なSIPR-Vの生成環境として用意しているglslangValidatorがどうなのかついて紹介してみました.

今後このサイトでもVulkanでコードサンプルを提供する場合などでは使うかもしれませんね.


GAPID:GoogleのOpenGL ES, VulkanのグラフィックスAPIデバッガ

GoogleがOpenGL ES, VulkanのグラフィックスAPIデバッガ GAPIDを公開しています.

このツールは,Android,Windows, Linux,OS XでOpenGL ES, Vulkan上でグラフィックスAPIの呼び出しをデバッグできるツールです.

Save development time with our new 3D debugging tool
https://www.blog.google/products/google-vr/save-development-time-our-new-3d-debugging-tool/

ツール概要
https://developers.google.com/vr/develop/android/gapid

ソース
https://github.com/google/gapid

OSごとに取得できるものは違います(OS XはVulkanがいけない)が,PC上でも取れるので実機に行く前にPC環境で動作を調べたりなどに便利そうですね.

Android Windows macOS Linux
OpenGL ES Trace
OpenGL ES Replay
Vulkan Trace
Vulkan Replay
(Must be performed on the same device used to trace)

DirectXShaderCompilerのシェーダバージョンやシェーダモデル6.xの機能

HLSL 6.0からシェーダコンパイラがDirectXShaderCompilerに代わりますが,言語のバージョンの違いやSM 6.xの機能の違いなどがWikiにまとめられるようになりました.

Language VersionsではDirectXShaderCompilerのコマンドライン引数で渡すバージョンについて書かれています.Creators Updateの時のHLSL 2015とFall Creators UpdateのHLSL 2016と今後のロードマップがあります.

Language Versions
https://github.com/Microsoft/DirectXShaderCompiler/wiki/Language-Versions

SM 6.xは,6.0~6.2がありますが,6.2は現在使用策定中ですが16bit floatのサポートが入るようですね.

Shader Models
https://github.com/Microsoft/DirectXShaderCompiler/wiki/Shader-Models

今後もこのページは更新されそうなので,ここをチェックするとよさそうですね。


Creators Update以降のDirect3D12の更新やXbox One Xのフィーチャーに関する記事

先日,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


Draco : Googleによるオープンソースの3Dデータ圧縮ライブラリ

Googleが3Dデータ向けの圧縮のためのオープンソースライブラリDracoを公開していました.

Draco
https://google.github.io/draco/

リポジトリ
https://github.com/google/draco

3DグラフィックスAPI向けにデータを流しやすくということのようですね.通信がありブラウザで使われるWebGL(Three.jsで対応)やglTF, WebVRなどの分野では圧縮は意義がありそうですね.

Dracoについては,glTF 2.0の圧縮形式としてKHR_draco_geometry_compression拡張が提案されているようですね.

Comment period for Draco extension
https://github.com/KhronosGroup/glTF/issues/1114


Direct3D12 OpenEXR読み込みサンプルを追加しました

ArticlesにDirect3D12 でOpenEXRの画像を直接読み込むサンプルを追加しました.

以前の記事でDDSの読み込みをやったので通常はDDSがあれば足りるのですが,ツールなどで直接開きたいなどの時のために直接のロード処理を書きました.

次回のDirect3D12ネタはいったんテクスチャを離れる予定ですが,このネタに関しては将来的にHDRディスプレイ上でHDRフォーマットのテクスチャを表示するようなネタに昇華していく予定です.

DirectXTex : OpenEXRのテクスチャへの読み込み


CppCon 2017 : Design Patterns for Low-Level Real-Time Rendering

CppCon 2017でDesign Patterns for Low-Level Real-Time Renderingというセッションがあったようですね.

Design Patterns for Low-Level Real-Time Rendering(スライドアリ)
https://cppcon2017.sched.com/event/BgtO?iframe=no

Vulkan, Direct3D 12, Metalといった並列処理対応グラフィックスAPIにおいて

  • メモリ管理
  • コマンドリスト
  • Descriptors
  • リングバッファ
  • 並列コマンドレコーディング
  • GPU処理の並列化とメモリのスケジューリング

などの話題がメインのようです.

参考文献などを見ているとやはりGDC 2017のEA DICEのFrameGraphの影響は大きそうですね.