Skip to content

[Bug] 計算側の CMPW0112 は呼び出しを持つ型を読まず、両方を参照するプロジェクトで Direct2D の画素シェーダーを断つ #259

Closed

Description

@routersys

Summary / 概要

計算側の解析器は、画素段階の組み込み(Clip、微分の7つ、Abort)の呼び出しを CMPW0112 で断ちますが、呼び出しを持つ型を読みません。計算と Direct2D の両方を参照するプロジェクトでは、Direct2D の画素シェーダーが Hlsl.Clip や Hlsl.DerivativeOfDx を使う正しい形にも CMPW0112 が誤りとして出て、構築が止まります。画素シェーダーにはこれらが使えることを、Direct2D 側の実行時の試験が固定しています。

Measured / 測ったこと

main(fa7f369e)で、IComputeShader を実装しない型(IPixelShaderLike という自前のインターフェースを実装する構造体)の本文に Hlsl.Clip(this.time) と Hlsl.DerivativeOfDx(this.time) を置き、UnsupportedHlslIntrinsicAnalyzer に通しました。CMPW0112 が2件出ます。解析器は ComputeWeave.Hlsl の静的メソッドの呼び出しであることと名前だけを見ており、型がシェーダーかどうかは読んでいません。

public readonly partial struct Effect : IPixelShaderLike
{
    private readonly float time;

    public float Execute()
    {
        Hlsl.Clip(this.time);

        return Hlsl.DerivativeOfDx(this.time);
    }
}

Direct2D だけを参照するプロジェクトには計算側の解析器が読み込まれないので、この形は両方を参照するプロジェクトでだけ起きます。同じ組み込みが Direct2D の画素シェーダーで使えることは、Direct2D 側の実行時の試験(微分の7つと Clip が既定の選択肢で建ち、画像比較まで一致する)が固定しています。

Proposal / 提案

断りを解析器から生成器の書き換え器へ移します。共有の書き換え器は計算側のコンパイル記号の下で、out 引数の組み込みへ渡す行列を断っており(CMPW0123)、Direct2D 側の記号の下で同期の組み込みを断ちます(#258)。同じ場所で画素段階の組み込みを断てば、計算の生成器が書き出す本文にしか掛からず、両方を参照するプロジェクトでも Direct2D の画素シェーダーには届きません。CMPW0112 の識別子はそのまま生成器から出す形にし、解析器を外します。解析器を残して型を読む形(IComputeShader を実装する型の中だけ)は、シェーダーが取り込む補助型のメソッドを見られないので採りません。

順序は #258 の後です。移す先の分岐と、断る名前を持つ部分定義の形が #258 で決まります。

Activity

  1. added
    bugSomething isn't working / 不具合が起きている
    analyzer or generatorAnalyzer or generator / アナライザーまたはジェネレーター
    on Sep 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

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

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions