opengl es2.0 glslのループの条件式とuniform

以前、シェーダを使い始めたときにループの条件式にuniformを使うとwin32では動くのに
androidではコケる、という現象が出ており、軽く調べたところ、opengl es2.0はそういう
仕様であるという話を聞いて、仕様であるならば仕方があるまい、win32で動くのは
androidopengl es2.0からwin32のopengl3.1への、glslのマイナーバージョンアップ
(glsl es1.0≒glsl1.0+αからglsl1.4)の間のどこかで、条件式にuniformが
使えるようになったんだろう、くらいに思っていた。
先日、件のエントリのコメントでそのあたりのことを改めてご指摘いただいて、
漠然と納得している部分を解消しておこうと思って再度、調べてみたところ、
↓のページを見つけた。

http://dench.flatlib.jp/opengl/glsl
>Tegra2/3/4 では Fragment Shader で動的なループがコンパイルエラーになる

OpenGL ES 2.0 (ShaderModel3.0) の仕様上必須ではないことが原因」とのこと。
確かにエントリを投稿した当時はまだiPhoneの環境構築をしておらず、
ArrowsZ(ISW13F)で確認しただけで、更にISW13FのプロセッサはTegra3なのだった。
では例えば手元にあるAQUOS PHONE CL(IS17SH)のGPU、Adreno205では動くの?
ということで試してみると、普通に動く。あれ、これ本当にGPUの問題なの、
と思って検証用にArrowsZ(ISW11F)とGALAXYSII(ISW11SC)を買ってきた。
GPUは前者がPowerVR SGX540、後者がMali-400MP4。結果、どちらも動いた。

Tegra2と4の安いやつが売ってなかったので、動かない方の確認が
不十分ではあるのだけど、元々の「uniformが使えない仕様」というのは勘違いで、
仕様上は不定、ベンダが勝手に実装していたりしていなかったりするのが
現状であるらしい、ということは分かった。

ただ、開発していく上では動かないものに合わせる(もしくは動かないものを
サポート外で切る)しかないので、そういう意味でループの条件式に
uniformは使わない、という風に覚えておいて問題なさそうではある。
ループの開始値、終了値にuniformは使わない、動的に変更する必要が
ある場合はcontinueやbreak、他諸々でなんとかする。

「Tegra2/3/4 では Fragment Shader の Uniform 配列が使えない」
のあたりもそのうち確認してみようかね。