Mesh/task (amplification) shader support just landed in DXC with DXIL and SPIRV support 🎉 Example HLSL mesh shader: https://t.co/NQIEG2aAVt
— Arseny Kapoulkine (@zeuxcg) 2019年7月15日
GitHubのDirectX Shader Compilerの更新からDXIL 1.5の更新でMesh ShaderとAmplification Shaderの2つのシェーダステージが加えられるような作業が行われているようですね.
DirectXShaderCompiler
https://github.com/microsoft/DirectXShaderCompiler
GitHubの更新を追っていくといくつか痕跡がありますね.DxilConstants.hの中を見てみるとenum class ShaderKindにMeshと Amplificationが追加されています.
DxilConstants.h
https://github.com/microsoft/DirectXShaderCompiler/blob/c41606c737a1a9c07757de0c9bd66af37d736c94/include/dxc/DXIL/DxilConstants.h
DxilShaderModel.cppでは,ms_6_5やas_6_5などがありますのでShader Model 6.5の機能のようですね.
DxilShaderModel.cpp
https://github.com/microsoft/DirectXShaderCompiler/blob/5268c51c06ce94f41db3165c94f64e5701a7b34e/lib/DXIL/DxilShaderModel.cpp
Mesh ShaderはNVIDIAのGeForce RTXシリーズのTuringアーキテクチャで追加された機能で頂点シェーダ,テセレーション,ジオメトリシェーダのステージを統合したようなシェーダステージです.
プリミティブ処理を統合化することで固定機能の影響が減り,シェーダユニットの効率化(同じような処理の繰り返しの防止),頂点の再利用の効率化,帯域の削減などのメリットがあります.
詳しいことは下記の記事が参考になります.
Introduction to Turing Mesh Shaders
https://devblogs.nvidia.com/introduction-turing-mesh-shaders/
Turingのアーキテクチャでは,Mesh Shaderの呼び出しの前にオプションでTask Shaderというのを呼び出すことができます.
Mesh ShaderとTask ShaderはどちらもCompute Shaderのルールに基づいた実装で,入力はWorkGropIDという引数をとり,このパラメータからメモリ上の頂点やインデックスにアクセスするようです.頂点シェーダは入力の頂点が1つでしたが,1つのシェーダでワークグループ内すべての頂点にアクセスできるようです. 上記記事ではそれを利用して,メッシュ単位のカリングを行うCluster Cullingの例が紹介されています.
Direct3DではMesh Shaderはそのままで呼ばれて, Task Shaderの方は Amplification Shader と呼ばれるようです.Taskという単語が幅広いことと特定のベンダーの機能としてあるものから様々なベンダーにとってニュートラルな用語にしたのかもしれませんね.
このリリースに関するC++側のAPIのアップデートがどういう形になるか不明ですが,Direct3D9の頂点シェーダ,Direct3D10のジオメトリシェーダ,Direct3D11のテセレーションと拡張されてきたGPUのジオメトリ処理が大きく変わる流れになりそうですね.