summaryrefslogtreecommitdiff
path: root/win
diff options
context:
space:
mode:
authorleo2000-05-24 17:39:53 +0000
committerleo2000-05-24 17:39:53 +0000
commitdaaff783a77e2fa5a35678091663c3a6fa850e25 (patch)
tree89191de78a4d8e061cb30259747985602f1aaae7 /win
parente5773dcd4fd5a3a32ebc15262f9d6f40ff339b0e (diff)
Load OpenGL dynamically under Windows
git-svn-id: http://svn.leocad.org/trunk@66 c7d43263-9d01-0410-8a33-9dba5d9f93d6
Diffstat (limited to 'win')
-rwxr-xr-xwin/win_gl.cpp124
-rwxr-xr-xwin/win_gl.h94
2 files changed, 218 insertions, 0 deletions
diff --git a/win/win_gl.cpp b/win/win_gl.cpp
new file mode 100755
index 0000000..b23bb55
--- /dev/null
+++ b/win/win_gl.cpp
@@ -0,0 +1,124 @@
+//
+// Windows OpenGL functions
+//
+
+#include "opengl.h"
+
+static HMODULE gl_module;
+
+// ============================================================================
+// Function pointers
+
+WGLCHOOSEPIXELFORMAT pfnwglChoosePixelFormat;
+WGLDESCRIBEPIXELFORMAT pfnwglDescribePixelFormat;
+WGLGETPIXELFORMAT pfnwglGetPixelFormat;
+WGLSETPIXELFORMAT pfnwglSetPixelFormat;
+WGLSWAPBUFFERS pfnwglSwapBuffers;
+WGLCOPYCONTEXT pfnwglCopyContext;
+WGLCREATECONTEXT pfnwglCreateContext;
+WGLCREATELAYERCONTEXT pfnwglCreateLayerContext;
+WGLDELETECONTEXT pfnwglDeleteContext;
+WGLGETCURRENTCONTEXT pfnwglGetCurrentContext;
+WGLGETCURRENTDC pfnwglGetCurrentDC;
+WGLGETPROCADDRESS pfnwglGetProcAddress;
+WGLMAKECURRENT pfnwglMakeCurrent;
+WGLSHARELISTS pfnwglShareLists;
+WGLUSEFONTBITMAPS pfnwglUseFontBitmaps;
+WGLUSEFONTOUTLINES pfnwglUseFontOutlines;
+WGLDESCRIBELAYERPLANE pfnwglDescribeLayerPlane;
+WGLSETLAYERPALETTEENTRIES pfnwglSetLayerPaletteEntries;
+WGLGETLAYERPALETTEENTRIES pfnwglGetLayerPaletteEntries;
+WGLREALIZELAYERPALETTE pfnwglRealizeLayerPalette;
+WGLSWAPLAYERBUFFERS pfnwglSwapLayerBuffers;
+WGLSWAPINTERVALEXT pfnwglSwapIntervalEXT;
+WGLGETDEVICEGAMMARAMPEXT pfnwglGetDeviceGammaRampEXT;
+WGLSETDEVICEGAMMARAMPEXT pfnwglSetDeviceGammaRampEXT;
+
+// ============================================================================
+// Global functions
+
+void* Sys_GLGetProc (const char *symbol)
+{
+ return GetProcAddress (gl_module, symbol);
+}
+
+void* Sys_GLGetExtension (const char *symbol)
+{
+ return pfnwglGetProcAddress (symbol);
+}
+
+bool Sys_GLOpenLibrary (const char* libname)
+{
+ if (libname)
+ gl_module = LoadLibrary (libname);
+
+ if (gl_module == NULL)
+ gl_module = LoadLibrary ("opengl32.dll");
+
+ if (gl_module == NULL)
+ gl_module = LoadLibrary ("opengl.dll");
+
+ if (gl_module == NULL)
+ return false;
+
+ pfnwglChoosePixelFormat = (WGLCHOOSEPIXELFORMAT) Sys_GLGetProc ("wglChoosePixelFormat");
+ pfnwglDescribePixelFormat = (WGLDESCRIBEPIXELFORMAT) Sys_GLGetProc ("wglDescribePixelFormat");
+ pfnwglGetPixelFormat = (WGLGETPIXELFORMAT) Sys_GLGetProc ("wglGetPixelFormat");
+ pfnwglSetPixelFormat = (WGLSETPIXELFORMAT) Sys_GLGetProc ("wglSetPixelFormat");
+ pfnwglSwapBuffers = (WGLSWAPBUFFERS) Sys_GLGetProc ("wglSwapBuffers");
+ pfnwglCopyContext = (WGLCOPYCONTEXT) Sys_GLGetProc ("wglCopyContext");
+ pfnwglCreateContext = (WGLCREATECONTEXT) Sys_GLGetProc ("wglCreateContext");
+ pfnwglCreateLayerContext = (WGLCREATELAYERCONTEXT) Sys_GLGetProc ("wglCreateLayerContext");
+ pfnwglDeleteContext = (WGLDELETECONTEXT) Sys_GLGetProc ("wglDeleteContext");
+ pfnwglGetCurrentContext = (WGLGETCURRENTCONTEXT) Sys_GLGetProc ("wglGetCurrentContext");
+ pfnwglGetCurrentDC = (WGLGETCURRENTDC) Sys_GLGetProc ("wglGetCurrentDC");
+ pfnwglGetProcAddress = (WGLGETPROCADDRESS) Sys_GLGetProc ("wglGetProcAddress");
+ pfnwglMakeCurrent = (WGLMAKECURRENT) Sys_GLGetProc ("wglMakeCurrent");
+ pfnwglShareLists = (WGLSHARELISTS) Sys_GLGetProc ("wglShareLists");
+ pfnwglUseFontBitmaps = (WGLUSEFONTBITMAPS) Sys_GLGetProc ("wglUseFontBitmaps");
+ pfnwglUseFontOutlines = (WGLUSEFONTOUTLINES) Sys_GLGetProc ("wglUseFontOutlines");
+ pfnwglDescribeLayerPlane = (WGLDESCRIBELAYERPLANE) Sys_GLGetProc ("wglDescribeLayerPlane");
+ pfnwglSetLayerPaletteEntries = (WGLSETLAYERPALETTEENTRIES) Sys_GLGetProc ("wglSetLayerPaletteEntries");
+ pfnwglGetLayerPaletteEntries = (WGLGETLAYERPALETTEENTRIES) Sys_GLGetProc ("wglGetLayerPaletteEntries");
+ pfnwglRealizeLayerPalette = (WGLREALIZELAYERPALETTE) Sys_GLGetProc ("wglRealizeLayerPalette");
+ pfnwglSwapLayerBuffers = (WGLSWAPLAYERBUFFERS) Sys_GLGetProc ("wglSwapLayerBuffers");
+ pfnwglSwapIntervalEXT = (WGLSWAPINTERVALEXT) Sys_GLGetProc ("wglSwapIntervalEXT");
+ pfnwglGetDeviceGammaRampEXT = (WGLGETDEVICEGAMMARAMPEXT) Sys_GLGetProc ("wglGetDeviceGammaRampEXT");
+ pfnwglSetDeviceGammaRampEXT = (WGLSETDEVICEGAMMARAMPEXT) Sys_GLGetProc ("wglSetDeviceGammaRampEXT");
+
+ return true;
+}
+
+void Sys_GLCloseLibrary ()
+{
+ if (gl_module)
+ {
+ FreeLibrary (gl_module);
+ gl_module = NULL;
+ }
+
+ pfnwglChoosePixelFormat = NULL;
+ pfnwglDescribePixelFormat = NULL;
+ pfnwglGetPixelFormat = NULL;
+ pfnwglSetPixelFormat = NULL;
+ pfnwglSwapBuffers = NULL;
+ pfnwglCopyContext = NULL;
+ pfnwglCreateContext = NULL;
+ pfnwglCreateLayerContext = NULL;
+ pfnwglDeleteContext = NULL;
+ pfnwglGetCurrentContext = NULL;
+ pfnwglGetCurrentDC = NULL;
+ pfnwglGetProcAddress = NULL;
+ pfnwglMakeCurrent = NULL;
+ pfnwglShareLists = NULL;
+ pfnwglUseFontBitmaps = NULL;
+ pfnwglUseFontOutlines = NULL;
+ pfnwglDescribeLayerPlane = NULL;
+ pfnwglSetLayerPaletteEntries = NULL;
+ pfnwglGetLayerPaletteEntries = NULL;
+ pfnwglRealizeLayerPalette = NULL;
+ pfnwglSwapLayerBuffers = NULL;
+ pfnwglSwapIntervalEXT = NULL;
+ pfnwglGetDeviceGammaRampEXT = NULL;
+ pfnwglSetDeviceGammaRampEXT = NULL;
+}
diff --git a/win/win_gl.h b/win/win_gl.h
new file mode 100755
index 0000000..891361c
--- /dev/null
+++ b/win/win_gl.h
@@ -0,0 +1,94 @@
+#ifndef _WIN_GL_H_
+#define _WIN_GL_H_
+
+// ============================================================================
+// WGL functions typedefs
+
+typedef int (WINAPI* WGLCHOOSEPIXELFORMAT) (HDC, CONST PIXELFORMATDESCRIPTOR *);
+typedef int (WINAPI* WGLDESCRIBEPIXELFORMAT) (HDC, int, UINT, LPPIXELFORMATDESCRIPTOR);
+typedef int (WINAPI* WGLGETPIXELFORMAT)(HDC);
+typedef BOOL (WINAPI* WGLSETPIXELFORMAT)(HDC, int, CONST PIXELFORMATDESCRIPTOR *);
+typedef BOOL (WINAPI* WGLSWAPBUFFERS)(HDC);
+typedef BOOL (WINAPI* WGLCOPYCONTEXT)(HGLRC, HGLRC, UINT);
+typedef HGLRC (WINAPI* WGLCREATECONTEXT)(HDC);
+typedef HGLRC (WINAPI* WGLCREATELAYERCONTEXT)(HDC, int);
+typedef BOOL (WINAPI* WGLDELETECONTEXT)(HGLRC);
+typedef HGLRC (WINAPI* WGLGETCURRENTCONTEXT)(VOID);
+typedef HDC (WINAPI* WGLGETCURRENTDC)(VOID);
+typedef PROC (WINAPI* WGLGETPROCADDRESS)(LPCSTR);
+typedef BOOL (WINAPI* WGLMAKECURRENT)(HDC, HGLRC);
+typedef BOOL (WINAPI* WGLSHARELISTS)(HGLRC, HGLRC);
+typedef BOOL (WINAPI* WGLUSEFONTBITMAPS)(HDC, DWORD, DWORD, DWORD);
+typedef BOOL (WINAPI* WGLUSEFONTOUTLINES)(HDC, DWORD, DWORD, DWORD, FLOAT, FLOAT, int, LPGLYPHMETRICSFLOAT);
+typedef BOOL (WINAPI* WGLDESCRIBELAYERPLANE)(HDC, int, int, UINT, LPLAYERPLANEDESCRIPTOR);
+typedef int (WINAPI* WGLSETLAYERPALETTEENTRIES)(HDC, int, int, int, CONST COLORREF *);
+typedef int (WINAPI* WGLGETLAYERPALETTEENTRIES)(HDC, int, int, int, COLORREF *);
+typedef BOOL (WINAPI* WGLREALIZELAYERPALETTE)(HDC, int, BOOL);
+typedef BOOL (WINAPI* WGLSWAPLAYERBUFFERS)(HDC, UINT);
+typedef BOOL (WINAPI* WGLSWAPINTERVALEXT)(int interval);
+typedef BOOL (WINAPI* WGLGETDEVICEGAMMARAMPEXT) (unsigned char *pRed, unsigned char *pGreen, unsigned char *pBlue);
+typedef BOOL (WINAPI* WGLSETDEVICEGAMMARAMPEXT) (const unsigned char *pRed, const unsigned char *pGreen, const unsigned char *pBlue);
+
+
+// ============================================================================
+// WGL extern declarations
+
+extern WGLCHOOSEPIXELFORMAT pfnwglChoosePixelFormat;
+extern WGLDESCRIBEPIXELFORMAT pfnwglDescribePixelFormat;
+extern WGLGETPIXELFORMAT pfnwglGetPixelFormat;
+extern WGLSETPIXELFORMAT pfnwglSetPixelFormat;
+extern WGLSWAPBUFFERS pfnwglSwapBuffers;
+extern WGLCOPYCONTEXT pfnwglCopyContext;
+extern WGLCREATECONTEXT pfnwglCreateContext;
+extern WGLCREATELAYERCONTEXT pfnwglCreateLayerContext;
+extern WGLDELETECONTEXT pfnwglDeleteContext;
+extern WGLGETCURRENTCONTEXT pfnwglGetCurrentContext;
+extern WGLGETCURRENTDC pfnwglGetCurrentDC;
+extern WGLGETPROCADDRESS pfnwglGetProcAddress;
+extern WGLMAKECURRENT pfnwglMakeCurrent;
+extern WGLSHARELISTS pfnwglShareLists;
+extern WGLUSEFONTBITMAPS pfnwglUseFontBitmaps;
+extern WGLUSEFONTOUTLINES pfnwglUseFontOutlines;
+extern WGLDESCRIBELAYERPLANE pfnwglDescribeLayerPlane;
+extern WGLSETLAYERPALETTEENTRIES pfnwglSetLayerPaletteEntries;
+extern WGLGETLAYERPALETTEENTRIES pfnwglGetLayerPaletteEntries;
+extern WGLREALIZELAYERPALETTE pfnwglRealizeLayerPalette;
+extern WGLSWAPLAYERBUFFERS pfnwglSwapLayerBuffers;
+extern WGLSWAPINTERVALEXT pfnwglSwapIntervalEXT;
+extern WGLGETDEVICEGAMMARAMPEXT pfnwglGetDeviceGammaRampEXT;
+extern WGLSETDEVICEGAMMARAMPEXT pfnwglSetDeviceGammaRampEXT;
+
+
+// ============================================================================
+// Replace WGL functions
+/*
+#undef wglUseFontBitmaps
+#undef wglUseFontOutlines
+
+#define wglChoosePixelFormat pfnwglChoosePixelFormat;
+#define wglDescribePixelFormat pfnwglDescribePixelFormat;
+#define wglGetPixelFormat pfnwglGetPixelFormat;
+#define wglSetPixelFormat pfnwglSetPixelFormat;
+#define wglSwapBuffers pfnwglSwapBuffers;
+#define wglCopyContext pfnwglCopyContext;
+#define wglCreateContext pfnwglCreateContext;
+#define wglCreateLayerContext pfnwglCreateLayerContext;
+#define wglDeleteContext pfnwglDeleteContext;
+#define wglGetCurrentContext pfnwglGetCurrentContext;
+#define wglGetCurrentDC pfnwglGetCurrentDC;
+#define wglGetProcAddress pfnwglGetProcAddress;
+#define wglMakeCurrent pfnwglMakeCurrent;
+#define wglShareLists pfnwglShareLists;
+#define wglUseFontBitmaps pfnwglUseFontBitmaps;
+#define wglUseFontOutlines pfnwglUseFontOutlines;
+#define wglDescribeLayerPlane pfnwglDescribeLayerPlane;
+#define wglSetLayerPaletteEntries pfnwglSetLayerPaletteEntries;
+#define wglGetLayerPaletteEntries pfnwglGetLayerPaletteEntries;
+#define wglRealizeLayerPalette pfnwglRealizeLayerPalette;
+#define wglSwapLayerBuffers pfnwglSwapLayerBuffers;
+#define wglSwapIntervalEXT pfnwglSwapIntervalEXT;
+#define wglGetDeviceGammaRampEXT pfnwglGetDeviceGammaRampEXT;
+#define wglSetDeviceGammaRampEXT pfnwglSetDeviceGammaRampEXT;
+*/
+
+#endif // _WIN_GL_H_