DirectFB 1.3.0 を ubuntu 8.04 (VMware上) で動かす : system=sdl (その1)

DirectFB 1.3.0 を ubuntu 8.04 (VMware上) で動かす : system=sdl (その1)

ubuntuには、libdirectfb-1.0-0 がすでに入っています。
ここでは DirectFB を tar ballからinstall しますが、
libdirectfb-1.0-0に依存するものがある場合、それらはどうなるかを確認していません。
試される場合はご自身の責任でお試しください。
VMwareの場合は試す前にスナップショットをとっておくのもよいかもしれません。
system=SDL で動かせるかな?
$ dpkg -l | grep sdl
ii  libsdl1.2debian         1.2.13-1ubuntu1   Simple DirectMedia Layer
ii  libsdl1.2debian-alsa    1.2.13-1ubuntu1   Simple DirectMedia Layer (with X11 and ALSA

sdl の dev 系のパッケージはないようなのでいれる。

$ sudo apt-get install libsdl-dev
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています               
状態情報を読み取っています... 完了
注意、libsdl-dev の代わりに libsdl1.2-dev を選択します
すごい親切ですね。よくできてるなぁ。
libsdl1.2-dev だそうです。

この状態で ./configure する。

Building System Modules:
  Linux FBDev support       yes
  Generic /dev/mem support  yes
  X11 support               yes                 -I/usr/X11R6/include    -L/usr/X11R6/lib -lX11 -lXext
  OSX support               no                    
  SDL support               no                    
  VNC support               no                    
だめですね。

configureの引数に、--enable-sdl=yesを指定

Building System Modules:
  Linux FBDev support       yes
  Generic /dev/mem support  yes
  X11 support               yes                 -I/usr/X11R6/include    -L/usr/X11R6/lib -lX11 -lXext
  OSX support               no                    
  SDL support               yes                 -D_GNU_SOURCE=1 -D_REENTRANT -I/usr/include/SDL      -lSDL 
  VNC support               no                    
よさそうです。

$ make
$ make install
$ export LD_LIBRARY_PATH=/usr/local/lib

~/.directfbrc に system=sdlとしてdfbinfo実行

$ dfbinfo

   ~~~~~~~~~~~~~~~~~~~~~~~~~~| DirectFB 1.3.0 |~~~~~~~~~~~~~~~~~~~~~~~~~~
        (c) 2001-2008  The world wide DirectFB Open Source Community
        (c) 2000-2004  Convergence (integrated media) GmbH
      ----------------------------------------------------------------

(*) DirectFB/Core: Single Application Core. (2009-04-14 19:12)
(*) Direct/Thread: Started 'SDL Input' (20584) [INPUT OTHER/OTHER 0/0] <8388608>...
(*) DirectFB/Input: SDL Input 0.1 (Denis Oliver Kropp)
(!) [20583:    0.000] --> Caught signal 11 (at 0x52473a30, invalid address) <--
Aborted

あれ?signal。。。

~/.directfbrc に system=x11としてdfbinfo実行

$ dfbinfo

   ~~~~~~~~~~~~~~~~~~~~~~~~~~| DirectFB 1.3.0 |~~~~~~~~~~~~~~~~~~~~~~~~~~
        (c) 2001-2008  The world wide DirectFB Open Source Community
        (c) 2000-2004  Convergence (integrated media) GmbH
      ----------------------------------------------------------------

(*) DirectFB/Core: Single Application Core. (2009-04-14 19:12)
(!) [20573:    0.000] --> Caught signal 11 (at 0x60, invalid address) <--
Aborted

あれれ? 前は動いてたのに。。。
少しおいかけてみよう。

$ ./configure --enable-sdl=yes --enable-debug=yes
として、デバッグシンボルもつくってもらう。
コールスタックがとれた。

(gdb) bt
#0  0xb7b60145 in glXGetVisualFromFBConfigSGIX () from /usr/lib/libGL.so.1
#1  0xb7cbdf05 in InitLocal (local=0x804d288, x11=0x8051930) at glx_surface_pool.c:197
#2  0xb7f11a76 in init_pool (core=0x8051df0, pool=0x804d188, funcs=) at surface_pool.c:1050
#3  0xb7f11e7c in dfb_surface_pool_initialize (core=0x8051df0, funcs=0xb7cc22c0, ret_pool=0x8051ef8) at surface_pool.c:154
#4  0xb7cb79d1 in system_initialize (core=0x8051df0, data=0xb7f3eaac) at x11.c:256
#5  0xb7f15236 in dfb_system_core_initialize (core=0x8051df0, data=0x80517d8, shared=0x80517e8) at system.c:109
#6  0xb7ed9fe2 in dfb_core_part_initialize (core=0x8051df0, core_part=0xb7f3e480) at core_parts.c:73
#7  0xb7ed965c in dfb_core_initialize (core=0x8051df0) at core.c:983
#8  0xb7ed98eb in dfb_core_arena_initialize (arena=0x0, ctx=0x8051df0) at core.c:1060
#9  0xb7e70c11 in fusion_arena_enter (world=0x8050820, name=0xb7f2ed08 "DirectFB/Core", initialize=0xb7ed9760 ,
 join=0xb7ed9400 , ctx=0x8051df0, ret_arena=0x8051e00, ret_error=0xbfb947c8) at arena.c:509
#10 0xb7ed9091 in dfb_core_create (ret_core=0xbfb94808) at core.c:338
#11 0xb7e89509 in DirectFBCreate (interface=0x804b464) at directfb.c:193
#12 0x0804888f in main (argc=1, argv=0xbfb948d4) at dfbinfo.c:92

#1 の InitLocalという関数の中で、SurfacePoolというものを作ろうとしている。
#0 は glGetVisualFromFBConfigSGIX とでているが、入り口はこの関数↓

XVisualInfo *info24 = glXGetVisualFromFBConfig( local->display, local->config24 );

local->config24 が 0 (null)のために驚いてしまったようだ。
処理をもうすこし前まで含めてみてみた。

local->configs = glXChooseFBConfig( local->display, DefaultScreen(local->display), attribs, &local->num_configs );

D_DEBUG_AT( GLX_Surfaces, "  -> found %d configs\n", local->num_configs );

for (i=0; inum_configs; i++) {

   ※ここ!
}

XVisualInfo *info24 = glXGetVisualFromFBConfig( local->display, local->config24 );

↑このコードの、※ここ!というところで local->config24は設定されるはずなのですが、local->num_configs が 0 なので loop の中に入らない。

なぜ glXChooseFBConfig で configが帰ってこないのだろう?

glXChooseFBConfig に渡しているパラメータ attribs は、

     int attribs[] = {
          GLX_DOUBLEBUFFER,
          False,

          GLX_DRAWABLE_TYPE,
          GLX_PIXMAP_BIT,

          GLX_X_RENDERABLE,
          True,

          GLX_RED_SIZE,
          8,

          GLX_GREEN_SIZE,
          8,

          GLX_BLUE_SIZE,
          8,

          GLX_ALPHA_SIZE,
          8,

          GLX_DEPTH_SIZE,
          0,

          GLX_X_VISUAL_TYPE,
          GLX_TRUE_COLOR,

          None
     };

と、固定になっている。ubuntu上の FB Configってどんなのがあるんだろう?
それは今度調べてみるとして、コードを書き換えずに動かす手段はないかなぁ。。。

いま見ていた関数、InitLocalの呼び元は、

#ifdef USE_GLX
     dfb_surface_pool_initialize( core, &glxSurfacePoolFuncs, &shared->glx_pool );
#endif

とかこまれている。

libsdl1.2-devをインストールする前は、USE_GLXは定義されていない。
(別の VMwareイメージで確認)

sdl-devをいれたときのメッセージをチェック。

$ sudo apt-get install libsdl1.2-dev
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています               
状態情報を読み取っています... 完了
以下の特別パッケージがインストールされます:
  libgl1-mesa-dev libglu1-mesa-dev libglu1-xorg-dev mesa-common-dev
推奨パッケージ:
  libaa1-dev libartsc0-dev libasound2-dev libaudio-dev libcaca-dev
  libcucul-dev libdirectfb-dev libesd0-dev libxext-dev libxt-dev
以下のパッケージが新たにインストールされます:
  libgl1-mesa-dev libglu1-mesa-dev libglu1-xorg-dev libsdl1.2-dev
  mesa-common-dev
アップグレード: 0 個、新規インストール: 5 個、削除: 0 個、保留: 0 個。
…
mesa を入れたからかな?




トップページへ




鮫洲曙町会ホームページ