## Summary / 概要 計算側には、画素シェーダー向けの組み込み(`Clip` や微分など)を計算シェーダーの本文で呼ぶと `CMPW0112` で断つ解析器があります。Direct2D 側にはその対がありません。計算シェーダー向けの同期の組み込みを画素シェーダーの本文で呼ぶと、生成器は診断を出さずに書き出し、FXC の `X3664: ps_5_0 does not support thread synchronization operations` が `CMPWD2D0034` としてシェーダー型の位置へ転送されるだけになります。文は組み込みの名前を含みますが、位置は呼び出しではなくシェーダー型です。 ## Measured / 測ったこと `main`(`c050699d`)で、`Hlsl.GroupMemoryBarrierWithGroupSync()` を `Execute` に置いた画素シェーダーを Direct2D の生成器に通すと、報告は `CMPWD2D0034` の1件で、位置はシェーダー型でした。共有の `Hlsl` 型が持つ同期の組み込み6つを FXC(Windows SDK 10.0.26100.0)の `ps_5_0` で1つずつ建てると、`DeviceMemoryBarrier` だけが通り、残る5つは `X3664` で落ちます。 | 組み込み | `ps_4_0_level_9_1` と `ps_4_0_level_9_3` | `ps_4_0`、`ps_4_1`、`ps_5_0` | | --- | --- | --- | | `AllMemoryBarrier` | `X3664` | `X3664` | | `AllMemoryBarrierWithGroupSync` | `X3664` | `X3664` | | `DeviceMemoryBarrier` | `X3664` | 通る | | `DeviceMemoryBarrierWithGroupSync` | `X3664` | `X3664` | | `GroupMemoryBarrier` | `X3664` | `X3664` | | `GroupMemoryBarrierWithGroupSync` | `X3664` | `X3664` | level 9 の2つのプロファイルは後から測りました。`DeviceMemoryBarrier` だけがプロファイルで変わります。 ## Proposal / 提案 どのプロファイルでも落ちる5つを断つ診断を Direct2D 側に1つ足します。`DeviceMemoryBarrier` は `ps_4_0` 以上で FXC が受け付け、書き換え器はプロファイルを知らないので断たず、level 9 では FXC の転送に任せます。同期のほかに計算側だけの組み込みが `Hlsl` 型に無いかは数えていません。 置く層は共有の書き換え器の Direct2D 側の分岐にします。計算側が out 引数の組み込みへ渡す行列を自分の記号の下で断っているのと同じ形です。最初は計算側の `CMPW0112` と同じ解析器を考えましたが、解析器はコンパイル単位の全ての呼び出しを見るので、計算と Direct2D の両方を参照するプロジェクトでは計算シェーダーの同期の組み込みまで断ってしまいます。書き換え器は Direct2D の生成器が書き出す本文しか通りません。生成器の試験が「書き換え器は通しシェーダーコンパイラだけが断る入力」として同期の組み込みを使っていた分は、`Hlsl.Abort()`(連結を有効にした既定の選択肢で FXC がライブラリの側で `X4602` として断る)へ移します。
Activity