GLUT for Gauche

田舎へ行ってきた。帰りのお土産は地元で今が旬の、根曲がり筍。 あともう一種、みさき と言う、キャベツ。普通のキャベツよりは小ぶりで、 ちょっと、とんがった形をしていた。

帰ってきて、早速このキャベツに、塩と少々の黒胡椒をまぶして食べた。 とても、やわらかで美味しかった。こんなに美味しいなら、もっと買って くるべきだったよ。ああ、残念。

gauche-gl on FreeBSD

やはり、GLUT をサポートした gauche-gl が、用意されてました。portsになって いて、簡単に入るようになってましたよ。ただ、portsからだと、土台のMesaを 新しくするよ、更にはxorgもと言う具合になりそうなので、野良で入れました。

早速、試運転という事で、附属のマニュアルから一番簡単なのを試してみました。

(use gl)
(use gl.glut)

(define (disp)
  (gl-clear GL_COLOR_BUFFER_BIT)
  (gl-color '#f32(1.0 1.0 1.0))
  (gl-begin* GL_POLYGON
    (gl-vertex '#f32(0.25 0.25 0.0))
    (gl-vertex '#f32(0.75 0.25 0.0))
    (gl-vertex '#f32(0.75 0.75 0.0))
    (gl-vertex '#f32(0.25 0.75 0.0))
    )
  (gl-flush)
  )

(define (init)
  (gl-clear-color 0.0 0.0 0.0 0.0)
  (gl-matrix-mode GL_PROJECTION)
  (gl-load-identity)
  (gl-ortho 0.0 1.0 0.0 1.0 -1.0 1.0)
  )

(define (keyboard key x y)
  (cond
   ((= key 27) (exit 0))    ; ESC key 
   ))

(define (main args)
  (glut-init args)
  (glut-init-display-mode (logior GLUT_SINGLE GLUT_RGB))
  (glut-init-window-size 250 250)
  (glut-init-window-position 100 100)
  (glut-create-window "hello")
  (init)
  (glut-display-func disp)
  (glut-keyboard-func keyboard)
  (glut-main-loop)
  0)

コッカの配置が、普段見慣れた風景と違っていて、ちょっと違和感があります。 また、gl-begin と gl-end の間に、描画命令を置くはずなんですが、gl-endが 省略されてます。大体想像つくけど、gl-begin* にしておくと、決まりきった gl-endは、省略出来るようになってるのね。細かな、気くばりありがとう。

examplesには、有名なOpen-GLを解説した赤本からの移植の例や、mandelbrotの例とか ベンチを兼ねた、gearsが収録されていた。ベンチしてみる。

[sakae@fb ~/Gauche-gl-0.4.4/examples]$ gosh gears.scm

GL_RENDERER       = Mesa GLX Indirect
GL_VERSION        = 1.4 (2.1 Mesa 7.0.1)
GL_VENDOR         = Mesa project: www.mesa3d.org
GL_EXTENSIONS = GL_ARB_depth_texture GL_ARB_draw_buffers GL_ARB_fragment_program GL_ARB_imaging GL_ARB_multisample GL_ARB_multitexture GL_ARB_occlusion_query GL_ARB_point_parameters GL_ARB_point_sprite GL_ARB_shadow GL_ARB_shadow_ambient GL_ARB_texture_border_clamp GL_ARB_texture_compression GL_ARB_texture_cube_map GL_ARB_texture_env_add GL_ARB_texture_env_combine GL_ARB_texture_env_crossbar GL_ARB_texture_env_dot3 GL_ARB_texture_mirrored_repeat GL_ARB_texture_non_power_of_two GL_ARB_texture_rectangle GL_ARB_transpose_matrix GL_ARB_vertex_program GL_ARB_window_pos GL_EXT_abgr GL_EXT_bgra GL_EXT_blend_color GL_EXT_blend_equation_separate GL_EXT_blend_func_separate GL_EXT_blend_logic_op GL_EXT_blend_minmax GL_EXT_blend_subtract GL_EXT_clip_volume_hint GL_EXT_copy_texture GL_EXT_draw_range_elements GL_EXT_fog_coord GL_EXT_framebuffer_object GL_EXT_multi_draw_arrays GL_EXT_packed_pixels GL_EXT_paletted_texture GL_EXT_point_parameters GL_EXT_polygon_offset GL_EXT_rescale_normal GL_EXT_secondary_color GL_EXT_separate_specular_color GL_EXT_shadow_funcs GL_EXT_shared_texture_palette GL_EXT_stencil_wrap GL_EXT_subtexture GL_EXT_texture GL_EXT_texture3D GL_EXT_texture_edge_clamp GL_EXT_texture_env_add GL_EXT_texture_env_combine GL_EXT_texture_env_dot3 GL_EXT_texture_lod_bias GL_EXT_texture_mirror_clamp GL_EXT_texture_object GL_EXT_texture_rectangle GL_EXT_vertex_array GL_APPLE_packed_pixels GL_ATI_draw_buffers GL_ATI_texture_env_combine3 GL_ATI_texture_mirror_once GL_ATIX_texture_env_combine3 GL_IBM_texture_mirrored_repeat GL_INGR_blend_func_separate GL_MESA_pack_invert GL_MESA_ycbcr_texture GL_NV_blend_square GL_NV_fragment_program GL_NV_light_max_exponent GL_NV_point_sprite GL_NV_texgen_reflection GL_NV_texture_rectangle GL_NV_vertex_program GL_NV_vertex_program1_1 GL_SGI_color_matrix GL_SGI_color_table GL_SGIS_generate_mipmap GL_SGIS_texture_border_clamp GL_SGIS_texture_edge_clamp GL_SGIS_texture_lod GL_SGIX_depth_texture GL_SGIX_shadow GL_SGIX_shadow_ambient GL_SUN_multi_draw_arrays

303 in 5.004 seconds = 60.55155875299761 FPS
319 in 5.013 seconds = 63.63455016955915 FPS
318 in 5.027 seconds = 63.258404615078575 FPS
318 in 5.006 seconds = 63.52377147423092 FPS

当然、Windowsサイズを大小によって、FPS値は変わってくる。上記はデフォでの値。 そんじゃ、ゲイツマシンでやってみたら、どうなる?

gauche-gl on WIndowsXP

丁度、2chを見ていたら、こんな悩みが

From: [611] デフォルトの名無しさん <sage>
Date: 2009/06/28(日) 17:15:24

>>608
これを聞いて、mingwのインストールからやってみましたが
私には無理でした。gauche-glのmakeで失敗します
具体的には(home-directory)が#fを返すためにそこでmakeが止まります
gaucheのmingwでのビルドでは全てのテストにパスしていない
(make testは9050/9067 pass)のが原因かもしれません

cygwinは全然だめで
./configure --includedir=ほげ --oldincludedir=ふがを
windowsとcygwinのパス表示で色々試しましたが
GLUT/glut.hどころか、Cのヘッダ(sys/types.h等)も
configureでnoになります。
(gaucheのインストールでは普通にyesになります)
なお、glut自体はcygwin/windowsで動作確認済です

Gauche-boxの存在にその後気づいてインストールしたのですが
バイナリ配布されているgauche-glは
リンク切れになっていました
なんでもいいのでwindows環境でgauche-glが使いたいのですが
バイナリ配布してる箇所って、他にないですかね・・
________________________________________

From: [613] デフォルトの名無しさん <sage>
Date: 2009/06/28(日) 19:42:22

>>611
http://saito.s4.xrea.com/?Gauche

From: [617] デフォルトの名無しさん <sage>
Date: 2009/06/28(日) 21:14:09

>>613
どうやってビルドしているんだろうか。詳しい手順が知りたい。
________________________________________

From: [619] デフォルトの名無しさん <sage>
Date: 2009/06/29(月) 01:04:48

>>617
忘れた。
でも、ひっかかったのはしょーもないことばっかりだった気がする。
ひっかかったところをそのつど修正すればだいたいいけるよ。
もしかしたら Gauche 自体もちょっとは弄ったかもしんない。

なんと言うGood Timming! 私も早速頂いてきた。そして、ベンチ実行

c:\sakae\Freebsd-gl\examples>gosh gears.scm

GL_RENDERER       = GDI Generic
GL_VERSION        = 1.1.0
GL_VENDOR         = Microsoft Corporation
GL_EXTENSIONS = GL_WIN_swap_hint GL_EXT_bgra GL_EXT_paletted_texture

1105 in 5.002 seconds = 220.91163534586167 FPS
1048 in 5.0 seconds = 209.6 FPS
1100 in 5.0 seconds = 220.0 FPS
1161 in 5.001 seconds = 232.15356928614275 FPS
1170 in 5.002 seconds = 233.90643742503 FPS

4倍弱は速いねぇ。FreeBSD機は、10年近く前のマシン、Window機も5年ぐらい前のマシン。 今買ってきたマシンだと、更に4倍ぐらいは速いのかな? ムーアの法則が成り立って いれば、だけど!

追試

これで終わってしまっては、あれなので、自分でもコンパイルに挑戦してみる。

挑戦は、gauche-gl をサポートされたgaucheをまず使ってみる。

c:\sakae\Gauche-gl-0.4.4>sh configure
checking build system type... i686-pc-mingw32
 .....
checking GL/glx.h usability... no
checking GL/glx.h presence... no
checking for GL/glx.h... no
checking GLUT/glut.h usability... no
checking GLUT/glut.h presence... no
checking for GLUT/glut.h... no
checking for makeinfo... no
checking for gzip... gzip
configure: creating Gauche-gl.gpd
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating lib/Makefile
config.status: creating cg/Makefile
config.status: creating doc/Makefile

2chの人が言っていた、(home-directory)には、改造が加えてあるのだな。

gosh> (use file.util)
#<undef>
gosh> (home-directory)
"c:\\sakae"

それじゃ、早速 compile

c:\sakae\Gauche-gl-0.4.4>gmake
cd src; gmake all
gmake[1]: Entering directory `/c/sakae/Gauche-gl-0.4.4/src'
/c/app/Gauche/bin/gauche-package compile --verbose \
   --cflags="-DPACKAGE_NAME=\"Gauche-gl\" -DPACKAGE_TARNAME=\"gauche-gl\" -DPACKAGE_VERSION=\"0.4.4\" -DPACKAGE_STRING=\"Gauche-gl\ 0.4.4\" -DPACKAGE_BUGREPORT=\"shiro@acm.org\" -DX_DISPLAY_MISSING=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1   " --ldflags="" --libs="" \
   libgauche-math3d gauche-math3d.c math3d-lib.stub
'c:\app\Gauche\lib\gauche\0.8.14\i686-pc-mingw32\gauche-config' --fixup-extension 'libgauche-math3d'
*** SYSTEM-ERROR: couldn't open input file: "/dev/null": 指定されたパスが見つか
りません。

Stack Trace:
_______________________________________
  0  opener

  1  file

  2  error

  3  (run-process "/bin/sh" "-c" cmdline :input (if stdin-string :pipe  ...
        At line 52 of "c:\\app\\Gauche\\share\\gauche\\0.8.14\\lib/gauche/package/util.scm"
  4  (run (string-append "'" (x->string CONFIG) "' --fixup-extension '" ...
        At line 124 of "c:\\app\\Gauche\\share\\gauche\\0.8.14\\lib/gauche/package/compile.scm"
  5  (usage)
        At line 101 of "(input string port)"
gmake[1]: *** [libgauche-math3d.dll] Error 70
gmake[1]: Leaving directory `/c/sakae/Gauche-gl-0.4.4/src'
gmake: *** [all] Error 2

これはまた、微妙な所ですねぇ。

(define (run cmdline :key (stdin-string #f))
  (when (or (dry-run) (verbose-run))
    (print cmdline))
  (unless (dry-run)
    (let1 p (run-process "/bin/sh" "-c" cmdline
                         :input (if stdin-string :pipe "/dev/null")
                         :wait #f)
      (when stdin-string
        (let1 pi (process-input p)
          (display stdin-string pi)
          (flush pi)
          (close-output-port pi)))
      (process-wait p)
      (unless (zero? (process-exit-status p))
        (errorf "command execution failed: ~a" cmdline)))))

根性無しの私は、降参です。かの人は、これを丹念に潰して行ったのね、尊敬します。