Skip to content

画素段階の組み込みの断りを解析器から生成器へ移す - #261

Merged
routersys merged 4 commits into
mainfrom
dev/ComputeWeave.PixelStageIntrinsicsInGenerator
Sep 20, 2026
Merged

routersys merged 4 commits into
mainfrom
dev/ComputeWeave.PixelStageIntrinsicsInGenerator

Conversation

@routersys

@routersys routersys commented Sep 17, 2026 •

Copy link
Copy Markdown
Owner

Summary / 概要

計算シェーダーで使えない画素段階の組み込み9つ(Abort、Clip、微分の6つ、Fwidth)は、これまで計算側の解析器が CMPW0112 で断っていました。解析器はコンパイル単位の全ての呼び出しを見て、呼び出しを持つ型を読みません。計算と Direct2D の両方を参照するプロジェクトでは、Direct2D の画素シェーダーが Clip や微分を使う正しい形にも CMPW0112 が誤りとして出て、構築が止まります。断りを解析器から共有の書き換え器の計算側の分岐へ移し、識別子と文はそのままにしました。書き換え器は計算の生成器が書き出す本文しか通らないので、両方を参照するプロジェクトでも Direct2D の画素シェーダーには届きません。

Linked issue / 関連する課題

Closes #259

Kind / 種別

  • Bug fix / 不具合修正
  • Analyzer or generator / アナライザーまたはジェネレーター

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 4189 0 4137 52
ComputeWeave.Tests.SourceGenerators 626 0 626 0
ComputeWeave.Tests.Internals 1085 0 1085 0
ComputeWeave.Tests.DeviceLost 43 0 43 0
ComputeWeave.D2D1.Tests 206 0 205 1
ComputeWeave.D2D1.Tests.SourceGenerators 247 0 247 0
ComputeWeave.D2D1.Tests.AssemblyLevelAttributes 4 0 4 0
ComputeWeave.Tests.DebugLayer 14 0 14 0

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.Internals 1085、ComputeWeave.Tests.DeviceLost 43、ComputeWeave.D2D1.Tests 206(省略1)、ComputeWeave.D2D1.Tests.AssemblyLevelAttributes 4、ComputeWeave.Tests.DebugLayer 14、ComputeWeave.Tests 4189(省略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 です。

変異 計算側の生成器 Direct2D 側の生成器
本文の報告を止める 10件(9つの行と文の1件) 0件
初期化子の報告を止める 1件(初期化子の行) 0件
断つ名前を1つ落とす 1件(落とした名前の行) 0件

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 / 確認

  • The pull request is one logical change, with no unrelated refactoring or formatting. / 一つの論理的な変更にまとまっており、無関係な整理や整形を含まない。
  • Every commit builds on its own. / 各コミットが単独でビルドできる。
  • Implementation changes and their verification tests are separate commits. / 実装の変更と検証テストを別のコミットに分けた。
  • No commit already merged into the default branch or referenced by a release tag was rewritten. / 既定ブランチへ入った、またはリリースタグが指すコミットを書き換えていない。
  • The change follows the implementation pattern already established in the subsystem. / 変更は、その部分で既に確立された実装パターンに従っている。
  • Existing documentation comments were preserved. / 既存のドキュメントコメントを維持した。
  • No silent fallback behavior or compatibility shim was introduced. / 暗黙の代替動作や互換性のための繕いを持ち込んでいない。
  • No unrelated dependency was updated. / 無関係な依存関係を更新していない。
  • If a file inherited from upstream changed, the divergence ledger in CONTRIBUTING.md was updated, or the change was judged not to be a divergence. / 上流から受け継いだファイルを変更した場合、CONTRIBUTING.md の乖離台帳を更新したか、乖離ではないと判断した。

If this touches a guarded area / 慎重を要する箇所に触れる場合

  • Tests exercise the guarded behavior itself, and I confirmed they fail when that behavior is deliberately broken. / 試験が守るべき挙動そのものを動かしており、その挙動を意図的に壊すと落ちることを確認した。
  • No test depends on arbitrary delays, fixed retry counts, or assumptions about how fast asynchronous work completes. / 任意の待ち時間、固定の再試行回数、非同期処理の速さへの仮定に依存する試験が無い。
  • For analyzer diagnostics that produce build errors, the complete solution was verified in addition to the analyzer tests. / ビルドエラーを出すアナライザー診断は、アナライザーの試験に加えて解全体を検証した。
  • For public API or generated descriptor changes, the compatibility, deterministic-generation or golden-data checks of the affected subsystem were run. / 公開APIまたは生成される記述子を変えた場合、該当部分の互換性、生成の決定性、または基準データの検査を走らせた。

@routersys routersys added bug Something isn't working / 不具合が起きている analyzer or generator Analyzer or generator / アナライザーまたはジェネレーター labels Sep 17, 2026
@github-actions

github-actions Bot commented Sep 17, 2026 •

Copy link
Copy Markdown

PRレビュー / PR review

変更 9 ファイル、コミット 4 件。 / 9 files, 4 commits.

検証の要否 / Verification required

以下を走らせ、失敗した試験の名前と失敗の様子を変更前と突き合わせてください。総数だけで判断しないでください。
Run the following and compare the names and failure modes against the same suites before your change. Do not judge by totals alone.

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

ビルドエラーを出す診断を変えた場合は、アナライザーの試験に加えて解全体の検証が要ります。
If a diagnostic that produces build errors changed, verify the complete solution as well.

慎重を要する箇所 / Guarded areas touched

  • 寿命と破棄 / lifetime and disposal
    • src/ComputeWeave.SourceGeneration.Hlsl/SyntaxRewriters/ShaderSourceRewriter.cs
    • src/ComputeWeave.SourceGeneration.Hlsl/SyntaxRewriters/StaticFieldRewriter.cs
  • 記述子と診断 / descriptors and diagnostics
    • src/ComputeWeave.SourceGenerators/Diagnostics/Analyzers/UnsupportedHlslIntrinsicAnalyzer.cs
    • src/ComputeWeave.SourceGenerators/Mappings/HlslKnownMethods.cs
    • src/ComputeWeave.SourceGenerators/SyntaxRewriters/HlslSourceRewriter.cs

寿命の追跡と危険の追跡は別々の保証です。一方を保っても他方が保たれるとは限りません。
Lifetime tracking and hazard tracking are separate guarantees; preserving one does not preserve the other.

公開APIまたは生成される記述子を変えた場合は、該当部分の互換性、生成の決定性、基準データの検査を走らせてください。
For public API or generated descriptor changes, run the compatibility, deterministic-generation or golden-data checks of the affected subsystem.

確認できた点 / Confirmed

  • 概要が書かれています。 / A summary is present.
  • 検証の結果が書かれています。 / Verification results are present.
  • 関連する課題が示されています。 / A linked issue is referenced.
  • 実装と検証テストが別のコミットに分かれています。 / Implementation and tests are in separate commits.

これは自動の確認で、査読の代わりにはなりません。指摘は判断の材料であって、従う義務はありません。
This is an automated check, not a substitute for review. Findings are input to a decision, not obligations.

…lStageIntrinsicsInGenerator

# Conflicts:
#	CONTRIBUTING.md
@routersys
routersys merged commit 0df349d into main Sep 20, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

analyzer or generator Analyzer or generator / アナライザーまたはジェネレーター bug Something isn't working / 不具合が起きている

Projects

None yet

1 participant