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

ICONIA TAB A500で発生する「シェーダデタッチ動作バグ」の検証を行うためのサンプル。

配布

  • 2012.1029.1
    • 最初のバージョン。

コメント

  • ○(正常動作):IS05, xPeria PLAY, P76Ti, S42HW, Galaxy TAB, Nexus S, Galaxy Nexus, Nexus 7 -- GORRY 2012-10-29 20:35:59 (月)
  • ×(異常動作):Acer A500 -- GORRY 2012-10-29 20:36:11 (月)
  • ×(異常動作):Motorola PHOTON(KDDI:ISW11M) Tegra2 1GHzで Acer A500と同じ挙動です -- PHPtvOPPAI? 2012-10-29 21:00:29 (月)
  • ○(正常動作):lenovo ThinkpadTablet?(183827J)/AndroidVersion4.0.3 正常に表示されております -- k_heckel? 2012-10-29 21:15:08 (月)
  • Sony Tablet S(Tegra2)ICS 4.0.3でICONIA TAB A500と同じ挙動でした。 -- Tnk? 2012-10-29 21:39:13 (月)
  • ×(異常動作):Motorola XOOMもA500と同じでした。 -- FIRST? 2012-10-29 21:49:51 (月)
  • ×(異常動作):SONY NW-Z1070 (Walkman AndroidVer2.3.4) Tegra2 1GHzで Acer A500と同じ挙動です -- ume? 2012-10-29 22:41:33 (月)
  • ○(正常動作):LG L-01E -- FIRST? 2012-10-29 22:47:02 (月)
  • ×(異常動作):ASUS EeePad? Transformer TF101 Tegra2 1GHz搭載機です。 Acer A500と同じ挙動でした。 -- Noboruhi? 2012-10-30 00:56:02 (火)
  • ISW13F(Arrows Z)Tegra 3正常動作してます。 -- etekou? 2012-10-30 14:07:49 (火)

概要

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をインストールし、起動します。プログラムが正常に動いているときは、以下のような表示が行われます。

  • 黒い背景に、丸・四角・星型3つの図形が回転表示される。

メニューボタンを押すと、以下のメニューが表示されます。

  • [No Detach]。シェーダのデタッチを行わない。
  • [Detach Vertex Shader]。頂点シェーダのデタッチを行う。
  • [Detach Fragment Shader]。ピクセルシェーダのデタッチを行う。
  • [Detach both Shader]。両方のシェーダのデタッチを行う。

OpenGL ESが仕様通りに動いている場合は、どのモードで実行しても動作は変化しません。

ICONIA TAB A500(*2)では、以下のような動作になります。

  • [No Detach]。正常動作する。
  • [Detach Vertex Shader]。正常動作する。
  • [Detach Fragment Shader]。プログラムが異常終了する。
  • [Detach both Shader]。各図形の外側に黒い四角の領域が残った状態で描画が行われる(透明ピクセルの抜きが行われない)。
*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での表示

余談

  • ICONIA TAB A500は、NVIDIA Tegra2プロセッサが搭載されています。同じプロセッサを搭載している端末では、再現するかもしれません。

ライセンス

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

参考

counter: today=1, yesterday=4, total=2724

添付ファイル: filedetachbug_ng.png 406件 [詳細] filedetachbug_ok.png 407件 [詳細]

トップ   変更 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-10-30 (火) 14:07:49 (2204d)