Repository navigation
シェーダー自身のメソッドの限定子付きの呼び出しを名前だけで書き出す - #252
Merged
Merged
Conversation
PRレビュー / PR review変更 6 ファイル、コミット 6 件。 / 6 files, 6 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
寿命の追跡と危険の追跡は別々の保証です。一方を保っても他方が保たれるとは限りません。 確認できた点 / Confirmed
これは自動の確認で、査読の代わりにはなりません。指摘は判断の材料であって、従う義務はありません。 |
…ifiedShaderMethodCall
3 tasks done
…ifiedShaderMethodCall
13 tasks done
…ifiedShaderMethodCall
13 tasks done
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary / 概要
課題 #244 を直します。シェーダー自身のメソッドを
Shader.Twice()のように型名を付けて呼ぶと、型名がそのまま生成HLSLへ出て、シェーダーコンパイラが宣言の無い識別子として断ります。届くのは生成物の行を名指すCMPW0046で、利用者は自分の書いた行を知らされません。Twice()と書けば通るので、書き方で建つかどうかが変わっていました。型名だけではありません。名前空間や
global::を付けた形、usingの別名を付けた形、インスタンスメソッドをthis.Twice()と書いた形も同じです。this.を必ず付ける規約(StyleCop の SA1101)の下で書かれたシェーダーでは、インスタンスメソッドの呼び出しがすべてこの形になります。生成器はシェーダー自身のメソッドを最上位の関数として名前だけで書き出すので、どの限定子も生成HLSLの中では何も指しません。呼び出しを、生成器がそのメソッドを書き出す名前だけの形へ揃えます。Linked issue / 関連する課題
Closes #244
Kind / 種別
Behavior change / 挙動の変更
シェーダー自身のメソッドを限定子付きで呼ぶ形が建つようになります。これまではどの形も
CMPW0046(Direct2D側はCMPWD2D0034)で止まっていたので、既に建っているシェーダーの生成HLSLは1バイトも変わりません。公開APIも診断の一覧も変わりません。Verification / 検証
土台は
39bf66af、実装のコミットは3210e52fです。変更前の値は 2026-09-14 に v2.6.0 の
a8245449で採ったもので、そこから土台までに生成器のプロジェクトとその試験プロジェクトへ触れたコミットはありません。増える8件と3件は、足した試験の本数と一致します。実装のコミットだけでも2つの試験プロジェクトが建つことを、そのコミットだけを別の作業ツリーへ取り出して確かめました。乖離の監査は待ち行列が空であると述べます。課題の形を族として測り直しました
土台で、限定子の付け方ごとに生成器を直接通し、生成HLSLの行と診断を採りました。計算側は15形、Direct2D側は10形です。
Shader.Twice()CMPW0046(use of undeclared identifier 'Shader')Twice()になり建つShader.Twice()Shader.Twice()Shader.Twice()Shader.Twice()Shader.Twice()Shader.Twice(x)Shaders.Shader.Twice()CMPW0046('Shaders')global::Shaders.Shader.Twice()CMPW0046('global')using S = Shaders.Shader;のS.Twice()CMPW0046('S')this.Twice()(インスタンスメソッド)CMPW0046(invalid use of 'this' outside of a non-static member function)this.Twice()Twice()(静的、インスタンスの2形)Shader.Factor課題が挙げていたのは上の3行です。Direct2D側は、課題が測っていなかったので同じ形を10形で測り、限定子を付けた7形が
CMPWD2D0034になり、対照の3形が建つことを見ました。この枝では10形とも建ちます。生成物を全数で突き合わせました
解全体の生成器が走る11プロジェクトを
-t:Rebuildと-p:EmitCompilerGeneratedFiles=trueで建て直し、生成されたファイルをすべて数え取って土台と比べています。差が出た2件はどちらも Direct2D の記述子で、差は埋め込まれたバイトコードの配列の中だけにあり、その前後の文字列はバイト単位で同一です。同じコミットを2回建てても動く2件で、#182 のときと同じものです。
変異
実装をコミットしてから壊しています。壊す前の木は
71d44e92です。thisを付けた呼び出しの箇所だけ戻す落ちるのはどれも足した試験だけで、既存の試験は1件も落ちません。1行目は足した11件がすべて落ち、2行目から4行目は3つの箇所がそれぞれ本文、初期化子、
thisの行を落とします。最後の行が落とすのは HLSL の予約語と重なる名前のメソッドの行だけです。宣言は__reserved__を付けた名前で書き出されるので、記号の名前で呼び出しを書くとその1形だけが建ちません。歩いたあとの名前を残す形にしたのはそのためです。Adapter and driver tested / 試したアダプターとドライバー: 走らせていません。生成器の試験はデバイスを開きません。
Checklist / 確認
If this touches a guarded area / 慎重を要する箇所に触れる場合
Notes for the reviewer / 査読者への注記
直した場所
書き換え器は2つあり、本文と取り込んだ宣言を書き換えるものと、静的フィールドの初期化子を書き換えるものです。どちらもシェーダー自身の静的メソッドの呼び出しを「生成器が別の経路で書き出すので触らない」として素通りさせていました。限定子を落とす補助を、両方が派生する型に1つ置き、3箇所から呼びます。本文の書き換え器の静的メソッドの分岐、同じ書き換え器のインスタンスメソッドの分岐、初期化子の書き換え器の静的メソッドの分岐です。静的フィールドの型名を落とした #182 が2つの書き換え器に同じ分岐を置いたのが前例で、今回は3箇所になるので共有の置き場にしました。
静的フィールドと違って、メンバーアクセスの式を見る箇所では判定していません。呼び出しの対象になっているメンバーアクセスの式は意味解析の操作を持たず、フィールドの読みのように記号を引けないと読んでいます。呼び出しの操作は対象のメソッドを持つので、そこで判定します。
歩いたあとの名前を残しています
補助は呼び出しの式がメンバーアクセスの式なら、その右側の名前だけを残します。記号から名前を読み直してはいません。書き換え器は識別子の字句を歩くときに HLSL の予約語と重なる名前を
__reserved__付きへ改名していて、メソッドの宣言もその名前で書き出されるためです。記号の名前で書く形は、sampleのような名前のメソッドで建たなくなります。その形を変異として当て、予約語の行だけが落ちることを見ています。断らずに直した理由
C# で同じ呼び出しを指す2つの書き方が同じHLSLになるのが、この生成器の他の箇所の振る舞いです。静的フィールドの
Shader.Factorは型名を落としてFactorになり、this.fieldはthisを落とします。メソッドだけを診断で断つ形は、C# として正しい上に意味の曖昧さも無い書き方を断ることになるので採りませんでした。触っていないもの
メソッドの名前そのものは変えていません。取り込んだ外の型のメソッドは今までどおり型名を含む名前へ改名され、シェーダー自身のメソッドは今までどおり名前だけです。
thisを落とすのはシェーダー自身のインスタンスメソッドの呼び出しだけで、補助型のインスタンスメソッドの呼び出しは受け手を残します。HLSL の構造体のメソッドはその形で呼ぶためです。限定子を落とした名前が、同じ名前の局所変数や引数に生成HLSLで隠される形は、この変更の外です。この変更の自己再評価で測り、#256 として出しました。フィールドの読みでは #182 とそれ以前から値が黙って変わり、メソッドの呼び出しではこの変更の前も後も
CMPW0046で止まるので、この変更で悪くなった形はありません。測っていないこと
実機で走らせていません。直したあとの生成HLSLは、名前だけで書いた呼び出しと同じ文字列になるので、生成器の試験がシェーダーコンパイラを通すことで建つことまでを見ています。生成器の試験2本以外のスイートは手元で走らせていません。解全体の生成物が土台と同一なので、実行時の挙動は変わらないためです。CI の8本は併合後の先端で通っています。
main を併合しています
出したあとで main が
c050699dへ進み、乖離台帳の末尾の行が衝突したので、main を枝へ併合しました。衝突は main の行を先に、この枝の行をその後ろに置く形で解いています。併合後の先端7508bed3で生成器の試験2本を走らせ、計算側は合計575、Direct2D側は合計237で失敗0でした。併合した main の同じスイートは、2026-09-15 の手元の記録で567と234で、差は足した8件と3件です。乖離の監査は併合後も待ち行列が空です。そのあとで main が
fa7f369eへ進み(#243、#253、#254)、もう一度併合しました(7b459899)。衝突は乖離台帳の末尾と、静的メソッドの呼び出しを扱う2つの箇所です。#243 が同じ箇所から環の歩きの呼び出しを外していたので、その形の上に名前だけへ揃える1行を置き、台帳は main の行を先に置いて解きました。併合後の先端で生成器の試験2本を走らせ、計算側は合計624、Direct2D側は合計243で失敗0、足した8件と3件はどれも通っています。CI も4本とも通っています。2026-09-17 に main が
4e654727(#258)へ進み、乖離台帳の末尾がまた衝突したので、三度目の併合をしました(6ca5a299)。解き方は同じで、併合後の先端で生成器の試験2本は計算側 624、Direct2D側 250 で失敗0です。