detachbug : シェーダデタッチ動作検証

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
detachbug_ok.pngdetachbug_ng.png
正常な表示ICONIA TAB A500での表示

余談

ライセンス

ライセンスについては、パッケージ同梱のAPACHE-LICENSE-2.0.txtをご覧ください。

参考

counter: today=1, yesterday=0, total=2966

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS