Repository navigation
画素シェーダーの同期の組み込みを診断で断つ - #258
Conversation
PRレビュー / PR review変更 11 ファイル、コミット 7 件。 / 11 files, 7 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
これは自動の確認で、査読の代わりにはなりません。指摘は判断の材料であって、従う義務はありません。 |
Summary / 概要
共有の
Hlsl型が計算シェーダーのために持つ同期の組み込み(メモリバリア)を画素シェーダーの本文で呼ぶと、Direct2D 側の生成器は他の組み込みと同じ写像で書き出し、画素シェーダーには同期する群が無いので FXC がX3664で断っていました。その誤りはシェーダー型の位置へCMPWD2D0034として転送されるだけで、組み込みの名前は文に出ますが、呼び出しの位置は示されません。共有の書き換え器が Direct2D 側の記号の下で、6つのうち FXC が断る5つをCMPWD2D0102として呼び出しの位置へ報告します。Linked issue / 関連する課題
Closes #255
Kind / 種別
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.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です。DeviceMemoryBarrierを断つ名前に足す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 / 確認
If this touches a guarded area / 慎重を要する箇所に触れる場合