ICONIA TAB A500で発生する「シェーダデタッチ動作バグ」の検証を行うためのサンプル。
OpenGL ESでシェーダプログラムのリンクを行うときは、以下のようにします。
programId = glCreateProgram(); glAttachShader(programId, vertexShaderId); glAttachShader(programId, fragmentShaderId); glLinkProgram(programId);
Khronosのドキュメントによると、「glLinkProgram()の後、アタッチしたシェーダオブジェクトはデタッチしてもよい」と記されています(*1)。デタッチする場合、コードは以下のようになります。
programId = glCreateProgram(); glAttachShader(programId, vertexShaderId); glAttachShader(programId, fragmentShaderId); glLinkProgram(programId); glDetachShader(programId, fragmentShaderId); glDetachShader(programId, vertexShaderId);
しかし、ICONIA TAB A500ではデタッチを実行してしまうと、対象のシェーダプログラムは動作が保証されません。正常なレンダリングが行われなかったり、プログラムの異常終了の原因にもなります。このプログラムは、この現象を再現するためのサンプルです。
*1: http://www.khronos.org/opengles/sdk/docs/man/xhtml/glLinkProgram.xml The program object's information log is updated and the program is generated at the time of the link operation. After the link operation, applications are free to modify attached shader objects, compile attached shader objects, detach shader objects, delete shader objects, and attach additional shader objects. None of these operations affects the information log or the program that is part of the program object.
detachbugをインストールし、起動します。プログラムが正常に動いているときは、以下のような表示が行われます。
メニューボタンを押すと、以下のメニューが表示されます。
OpenGL ESが仕様通りに動いている場合は、どのモードで実行しても動作は変化しません。
ICONIA TAB A500(*2)では、以下のような動作になります。
*2: A500, Android 3.2.1, Kermel 2.6.36.3+, Acer_A500_7.015.05_AAP_CUS6JP
ライセンスについては、パッケージ同梱のAPACHE-LICENSE-2.0.txtをご覧ください。