2013年12月16日月曜日

freeglut: glutInitを重複呼び出ししないための方法

OpenGLヘルパーライブラリーのfreeglutを使う際は、freeglutライブラリーの初期化処理のために glutInit を真っ先に呼びます。

と、それだけならば誰も問題に遭遇しないと思います。

しかし、開発対象が、

  • 実行バイナリー単独で動作するアプリではなく、glutを用いた何かを行いたい共有ライブラリーで、
    • もしかしたらライブラリーのユーザーは他のライブラリーでglutを先に初期化しているかもしれないし、
    • あるいは開発対象のライブラリーのオブジェクトを複数個生成して同時に使いたがるかも
しれません。

さて、こんな場合は glutInit はどう実装すべきでしょうか?

#include <GL/freeglut_ext.h>

...

  if( ! glutGet(GLUT_INIT_STATE) )
  {
    int argc = 0;
    glutInit(&argc, {});
  }

...

#include <GL/freeglut_ext.h>した上で glutGet(GLUT_INIT_STATE) を呼び出すとGLUTの内部状態を管理するfgState の Initialized メンバーの値が帰ってきます。未初期化の場合には glutInit します。

ちなみに、 glutInit に渡してあげるべきパラメーターが特に無い場合は上記の様にダミーの argc に引数の数を0個と定義した上で、文字列配列は {} を渡すと楽です。

なお、glutInitの実装を確認したい場合は freeglut/src/freeglut_init.c にその記述があります。 glutGet は freeglut/src/freeglut_state.c 、 GL_INIT_STATE の定義は freeglut/include/GL/freeglut_ext.h にあります。

参考:

  1. https://github.com/Distrotech/freeglut/
    1. https://github.com/Distrotech/freeglut/blob/distrotech-freeglut/freeglut/src/freeglut_init.c#L718
    2. https://github.com/Distrotech/freeglut/blob/distrotech-freeglut/freeglut/src/freeglut_state.c#L160
    3. https://github.com/Distrotech/freeglut/blob/distrotech-freeglut/freeglut/include/GL/freeglut_ext.h#L72
  2. The freeglut Project > 13.2 glutGet

0 件のコメント:

コメントを投稿