Coelacanth's Dream

GPUOpenドライバーアップデート ―― Task/Mesh Shader に対応

GPUOpenドライバー とそれを構成する各種ソフトウェア (LLPC, XGL, PAL) がアップデートされた。
AMDVLKドライバーでは、RADV ドライバーとの切り換えが可能となった。1
他には、Sienna Cichlid/Navi21 への最適化、各種問題の修正、ヘッダーのアップデート、そして Task/Mesh Shader の対応が行なわれている。

以前、ACOバックエンド を開発する、Valve の Timur Kristóf 氏が、XDC2020 の発表にて、Mesh Shader は NGG で実行できる 可能性 がある、と述べていた。

NGG/Primitve Shader はハードウェア側に新設されたシェーダーステージであり、それまでのバーテックスシェーダー (Vertex Shader, VS)、ジオメトリシェーダー (Geometry Shader, GS) が統合されており、それらを置き換えるものとなる。
ACOバックエンドでも NGG をサポートする動き | Coelacanth’s Dream ハードウェア側のシェーダーステージは NGG が有効な場合、LSHS (Local Shader + Hull Shader) 、NGG 、Pixel Shader の 3段と短くなる。
また、NGG では早期カリング機能として、 NGG Culling が存在する。

そう多くを読み取れてはいないが、今回のアップデートで追加された部分から、Mesh Shader をハードウェア側では ジオメトリシェーダー部で処理しているものと思われ、
上述したように、NGG には ジオメトリシェーダー部も統合されている。

  #if (PAL_CLIENT_INTERFACE_MAJOR_VERSION >= 574)
          if (HasMeshShader())
          {
              // HasMeshShader(): PipelineMesh
              // API Shader -> Hardware Stage
              // PS -> PS
              // MS -> GS
  
              CalcDynamicStageInfo(graphicsInfo.ms, &pStageInfos->gs);
          }
          else
  #endif

ただ、判定に NGG の存在や GPU の世代が使われていないため、RDNA 2/GFX10.3 以外、Vega/GFX9RDNA/GFX10 でも Mesh Shader をサポートする可能性が浮かぶが、実際の所は不明。
Mesa3D (RadeonSI, RADV) ドライバーで Task/Mesh Shader の本格的な実装が始まれば、断片として、また少し詳細が明らかにされるかもしれない。

   // Mesh shaders are not supported on Gfx6/7/8.
   PAL_ASSERT((metadata.pipeline.hasEntry.meshScratchMemorySize == 0) ||
              (metadata.pipeline.meshScratchMemorySize == 0));
   // Register address for passing the 32-bit GPU virtual address of a buffer storing the shader-emulated task+mesh
   // pipeline stats query.
   uint16  taskPipeStatsBufRegAddr;
    MeshPipeStatsBuf  = 0x10000014, ///< 32-bit GPU virtual address of a buffer storing the shader-emulated mesh
                                   ///  pipeline stats query.

参考リンク