Alexandre Julliard : opengl32: Load GLU functions from glu32. dll instead of the Unix library.

Alexandre Julliard julliard at winehq.org
Mon Jul 23 13:54:24 CDT 2012


Module: wine
Branch: master
Commit: 719db58a9276ffa5f81ca3e7df79f540ee921a9e
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=719db58a9276ffa5f81ca3e7df79f540ee921a9e

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Jul 23 15:51:14 2012 +0200

opengl32: Load GLU functions from glu32.dll instead of the Unix library.

---

 dlls/opengl32/wgl.c |  117 +++++++++++++++++----------------------------------
 1 files changed, 39 insertions(+), 78 deletions(-)

diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c
index 86903c4..ca953e0 100644
--- a/dlls/opengl32/wgl.c
+++ b/dlls/opengl32/wgl.c
@@ -34,36 +34,16 @@
 #include "winnt.h"
 
 #include "opengl_ext.h"
-#ifdef HAVE_GL_GLU_H
-#undef far
-#undef near
-#include <GL/glu.h>
-#endif
 #define WGL_WGLEXT_PROTOTYPES
 #include "wine/wglext.h"
 #include "wine/gdi_driver.h"
 #include "wine/wgl_driver.h"
-#include "wine/library.h"
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(wgl);
 WINE_DECLARE_DEBUG_CHANNEL(opengl);
 
-#ifdef SONAME_LIBGLU
-#define MAKE_FUNCPTR(f) static typeof(f) * p##f;
-MAKE_FUNCPTR(gluNewTess)
-MAKE_FUNCPTR(gluDeleteTess)
-MAKE_FUNCPTR(gluTessBeginContour)
-MAKE_FUNCPTR(gluTessBeginPolygon)
-MAKE_FUNCPTR(gluTessCallback)
-MAKE_FUNCPTR(gluTessEndContour)
-MAKE_FUNCPTR(gluTessEndPolygon)
-MAKE_FUNCPTR(gluTessVertex)
-#undef MAKE_FUNCPTR
-#endif /* SONAME_LIBGLU */
-
 static HMODULE opengl32_handle;
-static void* libglu_handle = NULL;
 
 extern struct opengl_funcs null_opengl_funcs;
 
@@ -1198,42 +1178,51 @@ BOOL WINAPI wglUseFontBitmapsW(HDC hdc, DWORD first, DWORD count, DWORD listBase
     return wglUseFontBitmaps_common( hdc, first, count, listBase, TRUE );
 }
 
-#ifdef SONAME_LIBGLU
+/* FIXME: should probably have a glu.h header */
+
+typedef struct GLUtesselator GLUtesselator;
+typedef void (WINAPI *_GLUfuncptr)(void);
+
+#define GLU_TESS_BEGIN  100100
+#define GLU_TESS_VERTEX 100101
+#define GLU_TESS_END    100102
+
+static GLUtesselator * (WINAPI *pgluNewTess)(void);
+static void (WINAPI *pgluDeleteTess)(GLUtesselator *tess);
+static void (WINAPI *pgluTessBeginPolygon)(GLUtesselator *tess, void *polygon_data);
+static void (WINAPI *pgluTessEndPolygon)(GLUtesselator *tess);
+static void (WINAPI *pgluTessCallback)(GLUtesselator *tess, GLenum which, _GLUfuncptr fn);
+static void (WINAPI *pgluTessBeginContour)(GLUtesselator *tess);
+static void (WINAPI *pgluTessEndContour)(GLUtesselator *tess);
+static void (WINAPI *pgluTessVertex)(GLUtesselator *tess, GLdouble *location, GLvoid* data);
 
-static void *load_libglu(void)
+static HMODULE load_libglu(void)
 {
+    static const WCHAR glu32W[] = {'g','l','u','3','2','.','d','l','l',0};
     static int already_loaded;
-    void *handle;
+    static HMODULE module;
 
-    if (already_loaded) return libglu_handle;
+    if (already_loaded) return module;
     already_loaded = 1;
 
-    TRACE("Trying to load GLU library: %s\n", SONAME_LIBGLU);
-    handle = wine_dlopen(SONAME_LIBGLU, RTLD_NOW, NULL, 0);
-    if (!handle)
+    TRACE("Trying to load GLU library\n");
+    module = LoadLibraryW( glu32W );
+    if (!module)
     {
-        WARN("Failed to load %s\n", SONAME_LIBGLU);
+        WARN("Failed to load glu32\n");
         return NULL;
     }
-
-#define LOAD_FUNCPTR(f) if((p##f = wine_dlsym(handle, #f, NULL, 0)) == NULL) goto sym_not_found;
-LOAD_FUNCPTR(gluNewTess)
-LOAD_FUNCPTR(gluDeleteTess)
-LOAD_FUNCPTR(gluTessBeginContour)
-LOAD_FUNCPTR(gluTessBeginPolygon)
-LOAD_FUNCPTR(gluTessCallback)
-LOAD_FUNCPTR(gluTessEndContour)
-LOAD_FUNCPTR(gluTessEndPolygon)
-LOAD_FUNCPTR(gluTessVertex)
+#define LOAD_FUNCPTR(f) p##f = (void *)GetProcAddress( module, #f )
+    LOAD_FUNCPTR(gluNewTess);
+    LOAD_FUNCPTR(gluDeleteTess);
+    LOAD_FUNCPTR(gluTessBeginContour);
+    LOAD_FUNCPTR(gluTessBeginPolygon);
+    LOAD_FUNCPTR(gluTessCallback);
+    LOAD_FUNCPTR(gluTessEndContour);
+    LOAD_FUNCPTR(gluTessEndPolygon);
+    LOAD_FUNCPTR(gluTessVertex);
 #undef LOAD_FUNCPTR
-    libglu_handle = handle;
-    return handle;
-
-sym_not_found:
-    WARN("Unable to load function ptrs from libGLU\n");
-    /* Close the library as we won't use it */
-    wine_dlclose(handle, NULL, 0);
-    return NULL;
+    return module;
 }
 
 static void fixed_to_double(POINTFX fixed, UINT em_size, GLdouble vertex[3])
@@ -1243,7 +1232,7 @@ static void fixed_to_double(POINTFX fixed, UINT em_size, GLdouble vertex[3])
     vertex[2] = 0.0;
 }
 
-static void tess_callback_vertex(GLvoid *vertex)
+static void WINAPI tess_callback_vertex(GLvoid *vertex)
 {
     const struct opengl_funcs *funcs = NtCurrentTeb()->glTable;
     GLdouble *dbl = vertex;
@@ -1251,14 +1240,14 @@ static void tess_callback_vertex(GLvoid *vertex)
     funcs->gl.p_glVertex3dv(vertex);
 }
 
-static void tess_callback_begin(GLenum which)
+static void WINAPI tess_callback_begin(GLenum which)
 {
     const struct opengl_funcs *funcs = NtCurrentTeb()->glTable;
     TRACE("%d\n", which);
     funcs->gl.p_glBegin(which);
 }
 
-static void tess_callback_end(void)
+static void WINAPI tess_callback_end(void)
 {
     const struct opengl_funcs *funcs = NtCurrentTeb()->glTable;
     TRACE("\n");
@@ -1292,7 +1281,7 @@ static BOOL wglUseFontOutlines_common(HDC hdc,
 
     if (!load_libglu())
     {
-        ERR("libGLU is required for this function but isn't loaded\n");
+        ERR("glu32 is required for this function but isn't available\n");
         return FALSE;
     }
 
@@ -1425,24 +1414,6 @@ error_in_list:
 
 }
 
-#else /* SONAME_LIBGLU */
-
-static BOOL wglUseFontOutlines_common(HDC hdc,
-                                      DWORD first,
-                                      DWORD count,
-                                      DWORD listBase,
-                                      FLOAT deviation,
-                                      FLOAT extrusion,
-                                      int format,
-                                      LPGLYPHMETRICSFLOAT lpgmf,
-                                      BOOL unicode)
-{
-    FIXME("Unable to compile in wglUseFontOutlines support without GL/glu.h\n");
-    return FALSE;
-}
-
-#endif /* SONAME_LIBGLU */
-
 /***********************************************************************
  *		wglUseFontOutlinesA (OPENGL32.@)
  */
@@ -1560,13 +1531,6 @@ BOOL WINAPI DECLSPEC_HOTPATCH wglSwapBuffers( HDC hdc )
     return GdiSwapBuffers(hdc);
 }
 
-/**********************************************************************/
-
-static void process_detach(void)
-{
-  if (libglu_handle) wine_dlclose(libglu_handle, NULL, 0);
-}
-
 /***********************************************************************
  *           OpenGL initialisation routine
  */
@@ -1582,9 +1546,6 @@ BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved )
     case DLL_THREAD_ATTACH:
         NtCurrentTeb()->glTable = &null_opengl_funcs;
         break;
-    case DLL_PROCESS_DETACH:
-        process_detach();
-        break;
     }
     return TRUE;
 }




More information about the wine-cvs mailing list