Shader Model 6.5ではMesh ShaderとAmplification Shaderが新機能で加わる?

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のジオメトリ処理が大きく変わる流れになりそうですね.