読者です 読者をやめる 読者になる 読者になる

syghの新フラグメント置き場

プログラミングTipsやコード断片の保管場所です。お絵描きもときどき載せます。

HLSL warningの3000番台はdisableできない?

(これは2011-01-10に書いた故OCNブログの記事を移植したものです)

例えばこういうHLSLコード(Direct3D 9, XNA)をコンパイルすると、X3550の警告が出ます。

// 指定したインデックスのボーン行列をテクスチャからフェッチする。
void VTFBoneMatrix(out float4x4 boneMatrix, half index)
{
    float offset = 0.5f;
    for (int i = 0; i < 16; i++)
    {
        const float4 texCoord = { BoneMatrixPaletteTexelSize.x * (0.5f + index), BoneMatrixPaletteTexelSize.y * offset, 0, 0 };
        boneMatrix[i / 4][i % 4] = tex2Dlod(BnMatPltTexSmp, texCoord).x;
        offset += 1.0f;
    }
}

boneMatrix[i / 4][i % 4] = ... の箇所で、

(array reference cannot be used as an l-value; not natively addressable, forcing loop to unroll)

という警告メッセージが出るんですが、要するにHLSLにおいて配列の添え字演算子による要素アクセスは左辺値として使えないから強制的にループ アンロールしちゃうよ、ってことらしいです。
動的ループじゃないので別にアンロールしてくれる分には問題ないけど、いちいち警告が出るのはうざい。

HLSLはVisual C++同様、#pragma warning(disable:XXXX) という形の拡張プリプロセッサをサポートしていますが、これはどうやら4000番台の警告にしか効果がない模様。
warning X3582の場合、for文に[unroll]属性を付けると警告が終息するんですが、X3550も同じように属性指定すればいいのか?