From daaff783a77e2fa5a35678091663c3a6fa850e25 Mon Sep 17 00:00:00 2001 From: leo Date: Wed, 24 May 2000 17:39:53 +0000 Subject: Load OpenGL dynamically under Windows git-svn-id: http://svn.leocad.org/trunk@66 c7d43263-9d01-0410-8a33-9dba5d9f93d6 --- win/win_gl.cpp | 124 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ win/win_gl.h | 94 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 218 insertions(+) create mode 100755 win/win_gl.cpp create mode 100755 win/win_gl.h (limited to 'win') 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_ -- cgit v1.2.3