## Summary / 概要 計算側の解析器は、画素段階の組み込み(`Clip`、微分の7つ、`Abort`)の呼び出しを `CMPW0112` で断ちますが、呼び出しを持つ型を読みません。計算と Direct2D の両方を参照するプロジェクトでは、Direct2D の画素シェーダーが `Hlsl.Clip` や `Hlsl.DerivativeOfDx` を使う正しい形にも `CMPW0112` が誤りとして出て、構築が止まります。画素シェーダーにはこれらが使えることを、Direct2D 側の実行時の試験が固定しています。 ## Measured / 測ったこと `main`(`fa7f369e`)で、`IComputeShader` を実装しない型(`IPixelShaderLike` という自前のインターフェースを実装する構造体)の本文に `Hlsl.Clip(this.time)` と `Hlsl.DerivativeOfDx(this.time)` を置き、`UnsupportedHlslIntrinsicAnalyzer` に通しました。`CMPW0112` が2件出ます。解析器は `ComputeWeave.Hlsl` の静的メソッドの呼び出しであることと名前だけを見ており、型がシェーダーかどうかは読んでいません。 ```csharp public readonly partial struct Effect : IPixelShaderLike { private readonly float time; public float Execute() { Hlsl.Clip(this.time); return Hlsl.DerivativeOfDx(this.time); } } ``` Direct2D だけを参照するプロジェクトには計算側の解析器が読み込まれないので、この形は両方を参照するプロジェクトでだけ起きます。同じ組み込みが Direct2D の画素シェーダーで使えることは、Direct2D 側の実行時の試験(微分の7つと `Clip` が既定の選択肢で建ち、画像比較まで一致する)が固定しています。 ## Proposal / 提案 断りを解析器から生成器の書き換え器へ移します。共有の書き換え器は計算側のコンパイル記号の下で、out 引数の組み込みへ渡す行列を断っており(`CMPW0123`)、Direct2D 側の記号の下で同期の組み込みを断ちます(#258)。同じ場所で画素段階の組み込みを断てば、計算の生成器が書き出す本文にしか掛からず、両方を参照するプロジェクトでも Direct2D の画素シェーダーには届きません。`CMPW0112` の識別子はそのまま生成器から出す形にし、解析器を外します。解析器を残して型を読む形(`IComputeShader` を実装する型の中だけ)は、シェーダーが取り込む補助型のメソッドを見られないので採りません。 順序は #258 の後です。移す先の分岐と、断る名前を持つ部分定義の形が #258 で決まります。
Activity