Repository navigation
画素段階の組み込みの断りを解析器から生成器へ移す - #261
Conversation
PRレビュー / PR review変更 9 ファイル、コミット 4 件。 / 9 files, 4 commits. 検証の要否 / Verification required以下を走らせ、失敗した試験の名前と失敗の様子を変更前と突き合わせてください。総数だけで判断しないでください。 dotnet build ComputeWeave.sln -c Release -p:Platform=x64
dotnet test tests/ComputeWeave.Tests.SourceGenerators/ComputeWeave.Tests.SourceGenerators.csproj -c Release -p:Platform=x64
dotnet test tests/ComputeWeave.Tests.Internals/ComputeWeave.Tests.Internals.csproj -c Release -p:Platform=x64
dotnet test tests/ComputeWeave.Tests/ComputeWeave.Tests.csproj -c Release -p:Platform=x64
dotnet test tests/ComputeWeave.Tests.DeviceLost/ComputeWeave.Tests.DeviceLost.csproj -c Release -p:Platform=x64
dotnet test tests/ComputeWeave.D2D1.Tests.SourceGenerators/ComputeWeave.D2D1.Tests.SourceGenerators.csproj -c Release -p:Platform=x64
dotnet test tests/ComputeWeave.D2D1.Tests/ComputeWeave.D2D1.Tests.csproj -c Release -p:Platform=x64
dotnet test tests/ComputeWeave.D2D1.Tests.AssemblyLevelAttributes/ComputeWeave.D2D1.Tests.AssemblyLevelAttributes.csproj -c Release -p:Platform=x64ビルドエラーを出す診断を変えた場合は、アナライザーの試験に加えて解全体の検証が要ります。 慎重を要する箇所 / Guarded areas touched
寿命の追跡と危険の追跡は別々の保証です。一方を保っても他方が保たれるとは限りません。 公開APIまたは生成される記述子を変えた場合は、該当部分の互換性、生成の決定性、基準データの検査を走らせてください。 確認できた点 / Confirmed
これは自動の確認で、査読の代わりにはなりません。指摘は判断の材料であって、従う義務はありません。 |
…lStageIntrinsicsInGenerator # Conflicts: # CONTRIBUTING.md
Summary / 概要
計算シェーダーで使えない画素段階の組み込み9つ(
Abort、Clip、微分の6つ、Fwidth)は、これまで計算側の解析器がCMPW0112で断っていました。解析器はコンパイル単位の全ての呼び出しを見て、呼び出しを持つ型を読みません。計算と Direct2D の両方を参照するプロジェクトでは、Direct2D の画素シェーダーがClipや微分を使う正しい形にもCMPW0112が誤りとして出て、構築が止まります。断りを解析器から共有の書き換え器の計算側の分岐へ移し、識別子と文はそのままにしました。書き換え器は計算の生成器が書き出す本文しか通らないので、両方を参照するプロジェクトでも Direct2D の画素シェーダーには届きません。Linked issue / 関連する課題
Closes #259
Kind / 種別
Behavior change / 挙動の変更
3つ変わります。両方を参照するプロジェクトの Direct2D の画素シェーダーが
Clipや微分を使う形は、誤りが出なくなり、これまでどおり FXC を通って建ちます。計算シェーダーが9つのどれかを使う形は、これまで解析器のCMPW0112に、生成器が DXC の断りを転送するCMPW0046が並んでいました(生成器は解析器の報告を知らず、DXC が断るまで書き出していました)。変更後はCMPW0112の1件だけが呼び出しの位置に出て、生成器はバイトコードのコンパイルを飛ばします。解析器が消えたので、報告は生成器が出します。生成器は構築時にも編集中にも走ります。文は変わらず、組み込みの名前と理由を含みます。識別子は増えず減らず、CMPW0112は生成器の診断として残ります。Verification / 検証
dotnet build <project> -t:Rebuild -c Release -p:Platform=x64 -p:EmitCompilerGeneratedFiles=trueスイートは、生成器が走る11プロジェクトを1本ずつ
-t:Rebuildで建ててから、建てた dll を直接起こして走らせました。土台は枝の先端ae1e15a8(#258 を含むmainの4e654727に載せたもの)です。判定は失敗した試験の名前で行い、いずれのスイートにも失敗の名前はありません。ComputeWeave.Tests.GlobalStatementsは実行可能形式で、Test passed successfully!と終了状態0でした。走らせていないのはComputeWeave.Tests.NativeLibrariesResolverの1本で、出荷経路のワークフローが回します。変更前の値は #258 の先端(mainの4e654727と同じsrc)を同じ手順で建てて測ったもので、8本とも失敗は0件、計算側の生成器は616件でした。626件との差の10件は、消した解析器の試験4件と足した14件の差です。 #252、#257、#260 を含むmain(dcfb38cf)を取り込んだ先端52e6ad33でも11プロジェクトを建て直して8本を回しました。失敗の名前は、計算側の生成器 645、ComputeWeave.Tests.Internals1085、ComputeWeave.Tests.DeviceLost43、ComputeWeave.D2D1.Tests206(省略1)、ComputeWeave.D2D1.Tests.AssemblyLevelAttributes4、ComputeWeave.Tests.DebugLayer14、ComputeWeave.Tests4189(省略52)のどれにもありません。Direct2D 側の生成器 252件は、1度目に118件がPackageExtractor.ExtractPackageAsyncのDirectoryNotFoundExceptionと、参照アセンブリのパッケージにnuspecが無いというPackagingExceptionで落ちました。試験の治具は参照アセンブリのパッケージを一時フォルダーへ展開して読みますが、その展開先が無くなっていました。何が消したかは特定していません。同じ dll を回し直すと、展開の途中で先頭のInvalidD2DEffectIdAttributeValue_NotAGuidの1件だけが同じ例外で落ち、もう一度回すと 252/252 でした。同じsrcを持つ別の木(#252、#257、#260 とこの枝を併せたもの)では 2026-09-17 に 645/645 と 252/252 で、この先端の CI も通っています。生成物の全数は取り込んだmainと 1078/1080 同じで、違うのは上と同じ Direct2D の記述子2件です。取り込みで衝突したのは乖離台帳の行だけで、mainの行を先に、この変更の行を後に置きました。生成物の全数比較は、#258 の先端と枝の先端を別の木で
-t:Rebuildし、generated配下の全ファイルの SHA-256 を突き合わせました。両方とも1080ファイルで、1078ファイルが同一、片方にしか無いものは0、違うのは同じコミットを2回建てても動く Direct2D の記述子2件だけです。計算側の生成器へ足した試験は、9つの組み込みごとに、報告が
CMPW0112の1件だけで位置が著者の書いた呼び出しそのものであることを見る行と、静的フィールドの初期化子に微分を書く1件、文が組み込みの名前と理由を含む1件、そして対照の3件です。対照は、計算シェーダーが使える組み込みが建つこと、同じ名前を持つ補助型のメソッドが断られないこと、計算シェーダーでない型がClipと微分を使っても何も出ないことを見ます。最後の対照が、両方を参照するプロジェクトの Direct2D の画素シェーダーに当たる形です。解析器の試験4件は消しました。Direct2D 側の実行時の試験の注釈は、解析器ではなく生成器の断りを指す形へ直しました。変異試験は、実装をコミットしてから3つの形で壊し、生成器の2スイートを全数で起こしました。土台は試験を載せた
aca4a827です。3つとも名指しで落ち、対照の3件はどの変異でも通ったままです。
Adapter and driver tested / 試したアダプターとドライバー
Intel(R) Iris(R) Xe Graphics, 32.0.101.7085
Design notes / 設計の記録
置く層は共有の書き換え器の計算側の分岐です。out 引数の組み込みへ渡す行列を断る
CMPW0123と同じ場所で、Direct2D 側が #258 で同期の組み込みを断つ分岐の対になります。断つ名前と理由は計算側の既知のメソッドの部分定義が持ち、書き換え器はそれを問い合わせるだけです。名前は解析器が使っていた単純名ではなく、写像と同じ完全なメタデータ名で照合します。報告は本文の書き換え器と初期化子の書き換え器の両方に置きました。微分は値を返すので、静的フィールドの初期化子にも書けます。
解析器を残して型を読む形は採りませんでした。シェーダーが取り込む補助型のメソッドは、シェーダー型の外にあるので解析器からは見えず、断りが届かなくなります。書き換え器は取り込んだ宣言も通るので、そこにも届きます。
前提が崩れるのは、計算シェーダーのプロファイルを
cs_6_6以上へ上げるときです。微分の7つは断る理由を失うので、1箇所にある一覧から外します。Not measured / 測っていないこと
両方を参照するプロジェクトそのものは建てていません。計算シェーダーでない型に
Clipと微分を置いた入力を計算の生成器に通して何も出ないことで代えています。編集中に報告が現れるまでの時間が解析器と生成器で違うかどうかは測っていません。Checklist / 確認
If this touches a guarded area / 慎重を要する箇所に触れる場合