Tegra2でだけ特定のエラーメッセージが出てうまく動かないということに悩まされていました。調べてみても、日本じゃ該当なし、海外で報告があるけどよくわからないまま終了というやっかいな状態でした。
それが今回ようやく解決方法含めてわかったので、記事にしてみました。
戦っていたエラーメッセージは 、P1202: Texture’s gl states do not match with shader’s というものです。
エラーメッセージのタイミング
このエラーメッセージはどこで出てくるのかを調べてみると、 GL_VALIDATE_STATUS を引数に、glGetProgramiv を呼び出して、エラー時に glGetProgramInfoLog を呼び出して、その中のメッセージに格納されて表示されてくるようです。
つまり、glValidateProgram の部分がまずい!ということです。
このAPIの説明を確認すると、現在のシェーダーが正常に実行できるか検証するという意味合いのAPIとのことです。
通常は、glUseProgramした後で、 glValidateProgramで実行できるかを確認する、という使い方を想定していると思われます。決して、シェーダーのglLinkProgram後に検証というものではなさそうです。
つまり、実行するときの状態がそろった上で 検証をしなくてはなりません。
そのため、使用するテクスチャ の状態が正常か、サンプラーの状態は正しいか、などすべての条件が考慮されます。 今回引っかかってしまったのは、テクスチャを使うシェーダーで、テクスチャを設定していない(バインドしていない)状態で、glValidateProgram を呼び出してエラーとなっていました。
このメッセージで悩まされた場合には、その時の状況が何か正しくないのだと思います。設定されている各種状態を丁寧に見た方がよいと思います。
なお、Mali-400, Adreno, PowerVR あたりの ドライバではこのあたりはきちんと検証してくれないのかエラーとなることは今のところありませんでした。(故に発見がおくれた&Tegra2のバグだ!と考えてしまいました)
最後になりましたが、Javaからだとタイミングが悪くてもこれらのエラーメッセージはでないようです。
コメント