diff --git a/stella/src/common/FrameBufferGL.cxx b/stella/src/common/FrameBufferGL.cxx index 237f13584..ea13e4dea 100644 --- a/stella/src/common/FrameBufferGL.cxx +++ b/stella/src/common/FrameBufferGL.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: FrameBufferGL.cxx,v 1.49 2006-01-14 21:36:29 stephena Exp $ +// $Id: FrameBufferGL.cxx,v 1.50 2006-01-14 22:29:34 stephena Exp $ //============================================================================ #ifdef DISPLAY_OPENGL @@ -31,38 +31,39 @@ #include "Font.hxx" #include "GuiUtils.hxx" -static void APIENTRY (*p_glClear)( GLbitfield ); -static void APIENTRY (*p_glEnable)( GLenum ); -static void APIENTRY (*p_glDisable)( GLenum ); -static void APIENTRY (*p_glPushAttrib)( GLbitfield ); -static const GLubyte* APIENTRY (*p_glGetString)( GLenum ); -static void APIENTRY (*p_glHint)( GLenum, GLenum ); +// Maybe this code could be cleaner ... +static void (APIENTRY* p_glClear)( GLbitfield ); +static void (APIENTRY* p_glEnable)( GLenum ); +static void (APIENTRY* p_glDisable)( GLenum ); +static void (APIENTRY* p_glPushAttrib)( GLbitfield ); +static const GLubyte* (APIENTRY* p_glGetString)( GLenum ); +static void (APIENTRY* p_glHint)( GLenum, GLenum ); // Matrix -static void APIENTRY (*p_glMatrixMode)( GLenum ); -static void APIENTRY (*p_glOrtho)( GLdouble, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble ); -static void APIENTRY (*p_glViewport)( GLint, GLint, GLsizei, GLsizei ); -static void APIENTRY (*p_glPushMatrix)( void ); -static void APIENTRY (*p_glLoadIdentity)( void ); +static void (APIENTRY* p_glMatrixMode)( GLenum ); +static void (APIENTRY* p_glOrtho)( GLdouble, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble ); +static void (APIENTRY* p_glViewport)( GLint, GLint, GLsizei, GLsizei ); +static void (APIENTRY* p_glPushMatrix)( void ); +static void (APIENTRY* p_glLoadIdentity)( void ); // Drawing -static void APIENTRY (*p_glBegin)( GLenum ); -static void APIENTRY (*p_glEnd)( void ); -static void APIENTRY (*p_glVertex2i)( GLint, GLint ); -static void APIENTRY (*p_glTexCoord2f)( GLfloat, GLfloat ); +static void (APIENTRY* p_glBegin)( GLenum ); +static void (APIENTRY* p_glEnd)( void ); +static void (APIENTRY* p_glVertex2i)( GLint, GLint ); +static void (APIENTRY* p_glTexCoord2f)( GLfloat, GLfloat ); // Raster funcs -static void APIENTRY (*p_glReadPixels)( GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLvoid* ); -static void APIENTRY (*p_glPixelStorei)( GLenum, GLint ); +static void (APIENTRY* p_glReadPixels)( GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLvoid* ); +static void (APIENTRY* p_glPixelStorei)( GLenum, GLint ); // Texture mapping -static void APIENTRY (*p_glTexEnvf)( GLenum, GLenum, GLfloat ); -static void APIENTRY (*p_glGenTextures)( GLsizei, GLuint* ); // 1.1 -static void APIENTRY (*p_glDeleteTextures)( GLsizei, const GLuint* ); // 1.1 -static void APIENTRY (*p_glBindTexture)( GLenum, GLuint ); // 1.1 -static void APIENTRY (*p_glTexImage2D)( GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid* ); -static void APIENTRY (*p_glTexSubImage2D)( GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid* ); // 1.1 -static void APIENTRY (*p_glTexParameteri)( GLenum, GLenum, GLint ); +static void (APIENTRY* p_glTexEnvf)( GLenum, GLenum, GLfloat ); +static void (APIENTRY* p_glGenTextures)( GLsizei, GLuint* ); // 1.1 +static void (APIENTRY* p_glDeleteTextures)( GLsizei, const GLuint* ); // 1.1 +static void (APIENTRY* p_glBindTexture)( GLenum, GLuint ); // 1.1 +static void (APIENTRY* p_glTexImage2D)( GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid* ); +static void (APIENTRY* p_glTexSubImage2D)( GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid* ); // 1.1 +static void (APIENTRY* p_glTexParameteri)( GLenum, GLenum, GLint ); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -91,6 +92,9 @@ FrameBufferGL::~FrameBufferGL() // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bool FrameBufferGL::loadFuncs(const string& library) { + if(myFuncsLoaded) + return true; + if(SDL_WasInit(SDL_INIT_VIDEO) == 0) SDL_Init(SDL_INIT_VIDEO); @@ -101,60 +105,63 @@ bool FrameBufferGL::loadFuncs(const string& library) // If anything fails, we'll know it immediately, and return false // Yes, this syntax is ugly, but I can type it out faster than the time // it takes to figure our macro magic to do it neatly - p_glClear = (void(*)(GLbitfield)) + p_glClear = (void(APIENTRY*)(GLbitfield)) SDL_GL_GetProcAddress("glClear"); if(!p_glClear) return false; - p_glEnable = (void(*)(GLenum)) + p_glEnable = (void(APIENTRY*)(GLenum)) SDL_GL_GetProcAddress("glEnable"); if(!p_glEnable) return false; - p_glDisable = (void(*)(GLenum)) + p_glDisable = (void(APIENTRY*)(GLenum)) SDL_GL_GetProcAddress("glDisable"); if(!p_glDisable) return false; - p_glPushAttrib = (void(*)(GLbitfield)) + p_glPushAttrib = (void(APIENTRY*)(GLbitfield)) SDL_GL_GetProcAddress("glPushAttrib"); if(!p_glPushAttrib) return false; - p_glGetString = (const GLubyte*(*)(GLenum)) + p_glGetString = (const GLubyte*(APIENTRY*)(GLenum)) SDL_GL_GetProcAddress("glGetString"); if(!p_glGetString) return false; - p_glHint = (void(*)(GLenum, GLenum)) + p_glHint = (void(APIENTRY*)(GLenum, GLenum)) SDL_GL_GetProcAddress("glHint"); if(!p_glHint) return false; - p_glMatrixMode = (void(*)(GLenum)) + p_glMatrixMode = (void(APIENTRY*)(GLenum)) SDL_GL_GetProcAddress("glMatrixMode"); if(!p_glMatrixMode) return false; - p_glOrtho = (void(*)(GLdouble, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble)) + p_glOrtho = (void(APIENTRY*)(GLdouble, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble)) SDL_GL_GetProcAddress("glOrtho"); if(!p_glOrtho) return false; - p_glViewport = (void(*)(GLint, GLint, GLsizei, GLsizei)) + p_glViewport = (void(APIENTRY*)(GLint, GLint, GLsizei, GLsizei)) SDL_GL_GetProcAddress("glViewport"); if(!p_glViewport) return false; - p_glPushMatrix = (void(*)(void)) + p_glPushMatrix = (void(APIENTRY*)(void)) SDL_GL_GetProcAddress("glPushMatrix"); if(!p_glPushMatrix) return false; - p_glLoadIdentity = (void(*)(void)) + p_glLoadIdentity = (void(APIENTRY*)(void)) SDL_GL_GetProcAddress("glLoadIdentity"); if(!p_glLoadIdentity) return false; - p_glBegin = (void(*)(GLenum)) + p_glBegin = (void(APIENTRY*)(GLenum)) SDL_GL_GetProcAddress("glBegin"); if(!p_glBegin) return false; - p_glEnd = (void(*)(void)) + p_glEnd = (void(APIENTRY*)(void)) SDL_GL_GetProcAddress("glEnd"); if(!p_glEnd) return false; - p_glVertex2i = (void(*)(GLint, GLint)) + p_glVertex2i = (void(APIENTRY*)(GLint, GLint)) SDL_GL_GetProcAddress("glVertex2i"); if(!p_glVertex2i) return false; - p_glTexCoord2f = (void(*)(GLfloat, GLfloat)) + p_glTexCoord2f = (void(APIENTRY*)(GLfloat, GLfloat)) SDL_GL_GetProcAddress("glTexCoord2f"); if(!p_glTexCoord2f) return false; - p_glReadPixels = (void(*)(GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLvoid*)) + p_glReadPixels = (void(APIENTRY*)(GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLvoid*)) SDL_GL_GetProcAddress("glReadPixels"); if(!p_glReadPixels) return false; - p_glPixelStorei = (void(*)(GLenum, GLint)) + p_glPixelStorei = (void(APIENTRY*)(GLenum, GLint)) SDL_GL_GetProcAddress("glPixelStorei"); if(!p_glPixelStorei) return false; - p_glTexEnvf = (void(*)(GLenum, GLenum, GLfloat)) + p_glTexEnvf = (void(APIENTRY*)(GLenum, GLenum, GLfloat)) SDL_GL_GetProcAddress("glTexEnvf"); if(!p_glTexEnvf) return false; - p_glGenTextures = (void(*)(GLsizei, GLuint*)) + p_glGenTextures = (void(APIENTRY*)(GLsizei, GLuint*)) SDL_GL_GetProcAddress("glGenTextures"); if(!p_glGenTextures) return false; - p_glDeleteTextures = (void(*)(GLsizei, const GLuint*)) + p_glDeleteTextures = (void(APIENTRY*)(GLsizei, const GLuint*)) SDL_GL_GetProcAddress("glDeleteTextures"); if(!p_glDeleteTextures) return false; - p_glBindTexture = (void(*)(GLenum, GLuint)) + p_glBindTexture = (void(APIENTRY*)(GLenum, GLuint)) SDL_GL_GetProcAddress("glBindTexture"); if(!p_glBindTexture) return false; - p_glTexImage2D = (void(*)(GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid*)) + p_glTexImage2D = (void(APIENTRY*)(GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid*)) SDL_GL_GetProcAddress("glTexImage2D"); if(!p_glTexImage2D) return false; - p_glTexSubImage2D = (void(*)(GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid*)) + p_glTexSubImage2D = (void(APIENTRY*)(GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid*)) SDL_GL_GetProcAddress("glTexSubImage2D"); if(!p_glTexSubImage2D) return false; - p_glTexParameteri = (void(*)(GLenum, GLenum, GLint)) + p_glTexParameteri = (void(APIENTRY*)(GLenum, GLenum, GLint)) SDL_GL_GetProcAddress("glTexParameteri"); if(!p_glTexParameteri) return false; - return true; + if(SDL_WasInit(SDL_INIT_VIDEO)) + SDL_QuitSubSystem(SDL_INIT_VIDEO); + + return myFuncsLoaded = true; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -729,4 +736,7 @@ void FrameBufferGL::setDimensions(GLdouble* orthoWidth, GLdouble* orthoHeight) */ } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool FrameBufferGL::myFuncsLoaded = false; + #endif // DISPLAY_OPENGL diff --git a/stella/src/common/FrameBufferGL.hxx b/stella/src/common/FrameBufferGL.hxx index 43b3986e9..777c319a0 100644 --- a/stella/src/common/FrameBufferGL.hxx +++ b/stella/src/common/FrameBufferGL.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: FrameBufferGL.hxx,v 1.27 2006-01-14 21:36:29 stephena Exp $ +// $Id: FrameBufferGL.hxx,v 1.28 2006-01-14 22:29:34 stephena Exp $ //============================================================================ #ifndef FRAMEBUFFER_GL_HXX @@ -37,7 +37,7 @@ class GUI::Font; This class implements an SDL OpenGL framebuffer. @author Stephen Anthony - @version $Id: FrameBufferGL.hxx,v 1.27 2006-01-14 21:36:29 stephena Exp $ + @version $Id: FrameBufferGL.hxx,v 1.28 2006-01-14 22:29:34 stephena Exp $ */ class FrameBufferGL : public FrameBuffer { @@ -249,6 +249,9 @@ class FrameBufferGL : public FrameBuffer // TODO - will be removed when textured dirty rect support is added bool myDirtyFlag; + + // Indicates if the OpenGL functions have been properly loaded + static bool myFuncsLoaded; }; #endif // DISPLAY_OPENGL diff --git a/stella/src/win32/Stella.vcproj b/stella/src/win32/Stella.vcproj index 4d8718076..e1e3a0d64 100755 --- a/stella/src/win32/Stella.vcproj +++ b/stella/src/win32/Stella.vcproj @@ -36,8 +36,8 @@ AdditionalOptions="SDL.lib SDLmain.lib libpng.lib -opengl32.lib" - AdditionalDependencies="sdl.lib sdlmain.lib libpng.lib opengl32.lib zdll.lib" +" + AdditionalDependencies="sdl.lib sdlmain.lib libpng.lib zdll.lib" OutputFile="$(OutDir)/Stella.exe" LinkIncremental="2" GenerateDebugInformation="TRUE" @@ -87,8 +87,8 @@ opengl32.lib" AdditionalOptions="SDL.lib SDLmain.lib libpng.lib -opengl32.lib" - AdditionalDependencies="sdl.lib sdlmain.lib libpng.lib opengl32.lib zdll.lib" +" + AdditionalDependencies="sdl.lib sdlmain.lib libpng.lib zdll.lib" OutputFile="$(OutDir)/Stella.exe" GenerateDebugInformation="TRUE" SubSystem="2"