Takashi Ishizaki
isiza****@da2*****
2007年 7月 8日 (日) 20:43:08 JST
石崎です wilikiでsasagawaさんとshiroさんのやりとり[sasagawa:complex]を見て examples/glbook/example8-6.scmを動かしたら次のエラーが出たので、 ちょっと調べてみました。 "GL extension glConvolutionFilter2D is not supported on this platform" 環境: Gauche 0.8.10 [sjis] Gauche-gl 0.4.3 cygwin 昨日(2007/7/7)ネットからsetup.exeでインストールしたもの uname -a では次のように表示される 1.5.21(0.156/4/2) 2006-07-30 14:21 i686 Cygwin GL_ARB_imaging はサポートされているNVIDIAのGraphic I/F 1. X が無い環境下でExtension Functionの呼び出しがエラーになる cygwin に X Window をインストールしていない、あるいはインストール していても ./configure --without-x でビルドする場合。 gauche-gl.c の Scm_GLGetProcAddressのコメントに書いてありました。 現在はGLXのケースのみ対応しているとのこと。Win32環境の場合は wglGetProcAddressを呼ぶようにする必要があるとのこと。 下記パッチで動くようですが、どうでしょうか。 2. X環境下の問題 2-1. makeが失敗する 普通に ./configure して make するとlibgauche-gl.dllのリンク時に undefined reference のエラーが大量に出て失敗します。 これは configure がXを検知してコンパイル時のヘッダーファイルが /usr/X11R6/include を参照するようになったにもかかわらず、リンク時の ライブラリにX用のものが設定されないためです。 上記1のXが無い場合は、次のようになってます。 -lglut32 -lglu32 -lopengl32 Xを使用する場合は、次のライブラリにしないといけない。 -lglut -lXmu -lXi -lGLU -lGL -lX11 -lXext 注)cygwinのfreeglutというパッケージが必要 2-2. 上記のライブラリの問題が解決しても、Extention Function呼び出し がエラーになる これは configure のAC_CHECK_HEADERSでGL/glx.hが検出されず、 HAVE_GL_GLX_H が設定されないのが原因。 Cygwin の X を普通にインストールすると、GL/glx.h が /usr/X11R6/include にインストールされるものの、/usr/include には インストールされないので、こうなります。 configure 時の CPPFLAGS に -I/usr/X11R6/include を設定すれば 解決します。 2-3. 上記で HAVE_GL_GLX_H が設定されたので、うまくいくと思った ら gauche-gl.c のコンパイルで次のエラーになってしまった。 gauche-gl.c: In function `Scm_GLGetProcAddress': gauche-gl.c:143: error: `glXGetProcAddressARB' undeclared これの正しい解決方法がわからんのですが、WEBを検索すると 直接 GLX_GLXEXT_PROTOTYPES を #define するような例があったので やってみたところ、問題なさげでした。 以上をまとめたパッチ・ファイルを以下に示します。 configure.in の修正があるので autoconf する必要があります。 8<------------------------------------------------------------------------->8 --- Gauche-gl-0.4.3-org/configure.in 2007-01-18 04:19:16.00 +0900 +++ Gauche-gl-0.4.3/configure.in 2007-07-08 09:48:44.25 +0900 @@ -11,7 +11,13 @@ case "$target" in *-*-cygwin*) - LIBGLUT=glut32;; + if test "x-$have_x" = "x-disabled" -o "x-$have_x" = "x-no"; + then + LIBGLUT=glut32; + else + LIBGLUT=glut + CPPFLAGS="$CPPFLAGS -I$x_includes"; + fi;; *) LIBGLUT=glut;; esac --- Gauche-gl-0.4.3-org/src/gauche-gl.h 2007-01-15 19:22:41.00 +0900 +++ Gauche-gl-0.4.3/src/gauche-gl.h 2007-07-07 19:11:50.53 +0900 @@ -28,9 +28,14 @@ #endif #ifdef HAVE_GL_GLX_H +#define GLX_GLXEXT_PROTOTYPES #include <GL/glx.h> #endif +#if defined(__CYGWIN__) && defined(X_DISPLAY_MISSING) +#include <windows.h> +#endif + #include <gauche/uvector.h> #include "gauche/math3d.h" --- Gauche-gl-0.4.3-org/src/gauche-gl.c 2007-01-16 10:39:09.00 +0900 +++ Gauche-gl-0.4.3/src/gauche-gl.c 2007-07-07 17:31:22.42 +0900 @@ -149,6 +149,10 @@ } #elif defined(MacOSX) return glutGetProcAddress(name); +#elif defined(__CYGWIN__) && defined(X_DISPLAY_MISSING) + if (wglGetProcAddress != NULL) { + return wglGetProcAddress(name); + } #endif /* !defined(GLX_VERSION_1_4) && !defined(GLX_ARB_get_proc_address) */ Scm_Error("GL extension %s is not supported on this platform", name); } 8<------------------------------------------------------------------------->8 以上