Skip to content

画素シェーダーの同期の組み込みを診断で断つ - #258

Merged
routersys merged 7 commits into
mainfrom
dev/ComputeWeave.PixelShaderThreadSync
Sep 17, 2026
Merged

routersys merged 7 commits into
mainfrom
dev/ComputeWeave.PixelShaderThreadSync

Conversation

@routersys

@routersys routersys commented Sep 15, 2026 •

Copy link
Copy Markdown
Owner

Summary / 概要

共有の Hlsl 型が計算シェーダーのために持つ同期の組み込み(メモリバリア)を画素シェーダーの本文で呼ぶと、Direct2D 側の生成器は他の組み込みと同じ写像で書き出し、画素シェーダーには同期する群が無いので FXC が X3664 で断っていました。その誤りはシェーダー型の位置へ CMPWD2D0034 として転送されるだけで、組み込みの名前は文に出ますが、呼び出しの位置は示されません。共有の書き換え器が Direct2D 側の記号の下で、6つのうち FXC が断る5つを CMPWD2D0102 として呼び出しの位置へ報告します。

Linked issue / 関連する課題

Closes #255

Kind / 種別

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

Behavior change / 挙動の変更

画素シェーダーの本文(取り込む補助メソッドを含む)で Hlsl.AllMemoryBarrier、Hlsl.AllMemoryBarrierWithGroupSync、Hlsl.DeviceMemoryBarrierWithGroupSync、Hlsl.GroupMemoryBarrier、Hlsl.GroupMemoryBarrierWithGroupSync を呼ぶ形の挙動が変わります。これまでは転送の診断がシェーダー型の位置に出ていました。変更後は CMPWD2D0102 がその呼び出しの位置に出て、bytecode は建てられません。Hlsl.DeviceMemoryBarrier は ps_4_0、ps_4_1、ps_5_0 で FXC が受け付けるので断たず、level 9 の2つのプロファイルでは FXC が断って、これまでどおり転送の診断になります。計算シェーダーは何も変わりません。公開 API は増えず、Direct2D 側の診断の識別子が1つ増えます。README の制限の一覧には、Hlsl.Abort の項と同じ形で、同期の組み込みの項を英日の対で足しました。

Verification / 検証

dotnet build <project> -t:Rebuild -c Release -p:Platform=x64 -p:EmitCompilerGeneratedFiles=true

スイートは、生成器が走る11プロジェクトを1本ずつ -t:Rebuild で建ててから、建てた dll を直接起こして走らせました。土台は枝の先端 bf1bbe4d(#254 を含む main の fa7f369e に載せたもの)です。判定は失敗した試験の名前で行い、いずれのスイートにも失敗の名前はありません。

スイート 合計 失敗 成功 省略
ComputeWeave.Tests 4189 0 4137 52
ComputeWeave.Tests.SourceGenerators 616 0 616 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本で、出荷経路のワークフローが回します。変更前の値は main(fa7f369e と同じ木)を同じ手順で建てて測ったもので、8本とも失敗は0件、増えたのは Direct2D 側の生成器の7件(この枝で足した試験)だけです。

生成物の全数比較は、main と枝の先端を別の木で -t:Rebuild し、generated 配下の全ファイルの SHA-256 を突き合わせました。両方とも1080ファイルで、1078ファイルが同一、片方にしか無いものは0、違うのは同じコミットを2回建てても動く Direct2D の記述子2件だけです。

足した試験は、Direct2D 側の生成器に、断る5つの組み込みの行と、DeviceMemoryBarrier の対照(診断が0件で、生成物が FXC を通ること)と、報告の位置が呼び出しであることを見る1件です。5つの行は報告の集合が CMPWD2D0102 だけであること、つまり転送が並ばないことを見ます。

書き換え器は通しシェーダーコンパイラだけが断る入力を要る既存の試験3件は、その入力を同期の組み込みから Hlsl.Abort() へ移しました。FXC は連結を有効にした既定の選択肢で abort をライブラリの側で X4602 として断ります。生成器の試験はそれを転送の診断として読みます。

変異試験は、実装をコミットしてから3つの形で壊し、生成器の2スイートを全数で起こしました。土台は試験を載せた 3c11c69b です。

変異 計算側の生成器 Direct2D 側の生成器
報告しない 0件 6件(5つの行と位置の1件)
断つ名前を1つ落とす 0件 1件(落とした名前の行)
DeviceMemoryBarrier を断つ名前に足す 0件 1件(対照)

3つとも名指しで落ち、計算側の生成器は616件がどの変異でも通ったままです。

Adapter and driver tested / 試したアダプターとドライバー

Intel(R) Iris(R) Xe Graphics, 32.0.101.7085

Design notes / 設計の記録

置く層は共有の書き換え器にし、Direct2D 側のコンパイル記号の下に置きました。計算側が out 引数の組み込みへ渡す行列を自分の記号の下で断っているのと同じ形で、2つの生成器がそれぞれの段階に無いものを同じ場所で断ります。断つ名前は Direct2D 側の既知のメソッドの部分定義が持ち、書き換え器はそれを問い合わせるだけです。

解析器は採りませんでした。計算側は画素段階の組み込みを解析器(CMPW0112)で断っていますが、解析器は読み込まれたコンパイル単位の全ての呼び出しを見るので、計算と Direct2D の両方を参照するプロジェクトでは計算シェーダーの同期の組み込みまで断ってしまいます。書き換え器は Direct2D の生成器が書き出す本文しか通らないので、その誤検出がありません。課題 #255 は最初に解析器と書いていましたが、この理由で変えました。

報告は本文の書き換え器だけに置きました。同期の組み込みは値を返さないので静的フィールドの初期化子には現れず、初期化子が取り込むメソッドは本文の書き換え器が書き換えます。DeviceMemoryBarrier は断ちません。6つを FXC の5つのプロファイル(ps_4_0_level_9_1、ps_4_0_level_9_3、ps_4_0、ps_4_1、ps_5_0)で1つずつ建てると、5つはどのプロファイルでも X3664 で落ち、DeviceMemoryBarrier だけが ps_4_0 以上で通り、level 9 の2つでは落ちます。書き換え器はプロファイルを知らないので、プロファイルで変わる1つは FXC に任せ、どのプロファイルでも落ちる5つだけを断ちます。

前提が崩れる筋を書きます。FXC の版が同期の組み込みの扱いを変えたら、名前の一覧を測り直して直します。一覧は1箇所にあります。

Not measured / 測っていないこと

level 9 のプロファイルで DeviceMemoryBarrier を断つ形は置いていません。書き換え器にプロファイルを運ぶ変更になり、この変更の外です。計算側の解析器が両方の製品を参照するプロジェクトで画素シェーダーを誤って断つかどうかも、この変更の外で、測っていません。

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 15, 2026
@github-actions

github-actions Bot commented Sep 15, 2026 •

Copy link
Copy Markdown

PRレビュー / PR review

変更 11 ファイル、コミット 7 件。 / 11 files, 7 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.D2D1.SourceGenerators/AnalyzerReleases.Unshipped.md
    • src/ComputeWeave.SourceGeneration.Hlsl/SyntaxRewriters/ShaderSourceRewriter.cs
  • 記述子と診断 / descriptors and diagnostics
    • src/ComputeWeave.D2D1.SourceGenerators/AnalyzerReleases.Unshipped.md
    • src/ComputeWeave.D2D1.SourceGenerators/Diagnostics/DiagnosticDescriptors.cs
    • src/ComputeWeave.D2D1.SourceGenerators/Mappings/HlslKnownMethods.cs
    • src/ComputeWeave.D2D1.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.

@routersys
routersys merged commit 4e65472 into main Sep 17, 2026
5 checks passed
@routersys

Copy link
Copy Markdown
Owner Author

PR #257 もこの PR と同じ CMPWD2D0102 を Direct2D 側に足していました。2本を併合した木は文字どおりには衝突せず、記述子が2つとも CMPWD2D0102 のまま誤りも警告も出さずに建ちます。PR #257 の側を CMPWD2D0103 へ移したので、この PR の番号はそのままで衝突しません。どちらが後に既定ブランチへ入る場合でも、後の側は出荷前の記録の行と、同梱する文書が述べる Direct2D 側の件数(2本が入れば103)を既定ブランチと突き合わせる必要があります。同じ識別子を2つの記述子が持つことを試験で断つ PR #260 を別に出しました。

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

Development

Successfully merging this pull request may close these issues.

[Proposal] Direct2D 側は画素シェーダーが持たない同期の組み込みを断らず、FXC の誤りが転送だけになる

1 participant