diff --git a/include/GL/glfw3.h b/include/GL/glfw3.h index 1c8c4e1c..6e70e59c 100644 --- a/include/GL/glfw3.h +++ b/include/GL/glfw3.h @@ -583,6 +583,7 @@ GLFWAPI void glfwSwapInterval(int interval); GLFWAPI int glfwExtensionSupported(const char* extension); GLFWAPI void* glfwGetProcAddress(const char* procname); GLFWAPI void glfwGetGLVersion(int* major, int* minor, int* rev); +GLFWAPI void glfwCopyGLState(GLFWwindow src, GLFWwindow dst, unsigned long mask); /* Enable/disable functions */ GLFWAPI void glfwEnable(GLFWwindow window, int token); diff --git a/readme.html b/readme.html index 314b1cdd..31cc03ed 100644 --- a/readme.html +++ b/readme.html @@ -273,6 +273,7 @@ version of GLFW.

  • Added glfwSetWindowIconifyCallback function and GLFWwindowiconifyfun type for receiving window iconification events
  • Added glfwGetCurrentWindow function for retrieving the window whose OpenGL context is current
  • Added glfwInitWithModels function and GLFWallocator and GLFWthreadmodel types for pluggable memory allocation and threading models
  • +
  • Added glfwCopyGLState function for copying OpenGL state categories between contexts
  • Added GLFW_OPENGL_ES2_PROFILE profile for creating OpenGL ES 2.0 contexts using the GLX_EXT_create_context_es2_profile and WGL_EXT_create_context_es2_profile extensions
  • Added GLFW_OPENGL_ROBUSTNESS window hint and associated strategy tokens for GL_ARB_robustness support
  • Added windows simple multi-window test program
  • diff --git a/src/cocoa/cocoa_opengl.m b/src/cocoa/cocoa_opengl.m index b633d472..6d93ed9f 100644 --- a/src/cocoa/cocoa_opengl.m +++ b/src/cocoa/cocoa_opengl.m @@ -86,3 +86,12 @@ void* _glfwPlatformGetProcAddress(const char* procname) return symbol; } +//======================================================================== +// Copies the specified OpenGL state categories from src to dst +//======================================================================== + +void _glfwPlatformCopyGLState(_GLFWwindow* src, _GLFWwindow* dst, unsigned long mask) +{ + [dst->NSGL.context copyAttributesFromContext:src->NSGL.context withMask:mask]; +} + diff --git a/src/internal.h b/src/internal.h index c942707b..4a39b9c9 100644 --- a/src/internal.h +++ b/src/internal.h @@ -310,6 +310,7 @@ void _glfwPlatformSwapInterval(int interval); void _glfwPlatformRefreshWindowParams(void); int _glfwPlatformExtensionSupported(const char* extension); void* _glfwPlatformGetProcAddress(const char* procname); +void _glfwPlatformCopyGLState(_GLFWwindow* src, _GLFWwindow* dst, unsigned long mask); //======================================================================== diff --git a/src/opengl.c b/src/opengl.c index a08f97f9..2e5e287d 100644 --- a/src/opengl.c +++ b/src/opengl.c @@ -587,3 +587,25 @@ GLFWAPI void glfwGetGLVersion(int* major, int* minor, int* rev) *rev = window->glRevision; } + +//======================================================================== +// Copies the specified OpenGL state categories from src to dst +//======================================================================== + +GLFWAPI void glfwCopyGLState(GLFWwindow hsrc, GLFWwindow hdst, unsigned long mask) +{ + _GLFWwindow* src; + _GLFWwindow* dst; + + if (!_glfwInitialized) + { + _glfwSetError(GLFW_NOT_INITIALIZED, NULL); + return; + } + + src = (_GLFWwindow*) hsrc; + dst = (_GLFWwindow*) hdst; + + _glfwPlatformCopyGLState(src, dst, mask); +} + diff --git a/src/win32/win32_opengl.c b/src/win32/win32_opengl.c index efce1531..d729fb51 100644 --- a/src/win32/win32_opengl.c +++ b/src/win32/win32_opengl.c @@ -103,3 +103,14 @@ void* _glfwPlatformGetProcAddress(const char* procname) return (void*) wglGetProcAddress(procname); } + +//======================================================================== +// Copies the specified OpenGL state categories from src to dst +//======================================================================== + +void _glfwPlatformCopyGLState(_GLFWwindow* src, _GLFWwindow* dst, unsigned long mask) +{ + if (!wglCopyContext(src->WGL.context, dst->WGL.context, mask)) + _glfwSetError(GLFW_PLATFORM_ERROR, "Win32/WGL: Failed to copy OpenGL context attributes"); +} + diff --git a/src/x11/x11_opengl.c b/src/x11/x11_opengl.c index 33b19ff9..0442209b 100644 --- a/src/x11/x11_opengl.c +++ b/src/x11/x11_opengl.c @@ -116,3 +116,16 @@ void* _glfwPlatformGetProcAddress(const char* procname) return (void*) _glfw_glXGetProcAddress((const GLubyte*) procname); } + +//======================================================================== +// Copies the specified OpenGL state categories from src to dst +//======================================================================== + +void _glfwPlatformCopyGLState(_GLFWwindow* src, _GLFWwindow* dst, unsigned long mask) +{ + glXCopyContext(_glfwLibrary.X11.display, + src->GLX.context, + dst->GLX.context, + mask); +} +