Added context sharing.

This commit is contained in:
Camilla Berglund 2010-10-04 18:17:53 +02:00
parent 7a0be0f2eb
commit 99ddce3214
24 changed files with 97 additions and 62 deletions

View File

@ -577,7 +577,7 @@ int main( void )
glfwOpenWindowHint(GLFW_DEPTH_BITS, 16); glfwOpenWindowHint(GLFW_DEPTH_BITS, 16);
window = glfwOpenWindow( 400, 400, GLFW_WINDOWED, "Boing (classic Amiga demo)" ); window = glfwOpenWindow( 400, 400, GLFW_WINDOWED, "Boing (classic Amiga demo)", NULL );
if (!window) if (!window)
{ {
fprintf( stderr, "Failed to open GLFW window\n" ); fprintf( stderr, "Failed to open GLFW window\n" );

View File

@ -331,7 +331,7 @@ int main(int argc, char *argv[])
glfwOpenWindowHint(GLFW_DEPTH_BITS, 16); glfwOpenWindowHint(GLFW_DEPTH_BITS, 16);
window = glfwOpenWindow( 300, 300, GLFW_WINDOWED, "Gears" ); window = glfwOpenWindow( 300, 300, GLFW_WINDOWED, "Gears", NULL );
if (!window) if (!window)
{ {
fprintf( stderr, "Failed to open GLFW window\n" ); fprintf( stderr, "Failed to open GLFW window\n" );

View File

@ -587,7 +587,7 @@ int main(int argc, char** argv)
glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwOpenWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_FALSE); glfwOpenWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_FALSE);
window = glfwOpenWindow(800, 600, GLFW_WINDOWED, "GLFW OpenGL3 Heightmap demo"); window = glfwOpenWindow(800, 600, GLFW_WINDOWED, "GLFW OpenGL3 Heightmap demo", NULL);
if (! window ) if (! window )
{ {
fprintf(stderr, "ERROR: Unable to create the OpenGL context and associated window\n"); fprintf(stderr, "ERROR: Unable to create the OpenGL context and associated window\n");

View File

@ -460,7 +460,7 @@ int main( void )
glfwOpenWindowHint(GLFW_DEPTH_BITS, 16); glfwOpenWindowHint(GLFW_DEPTH_BITS, 16);
// Open OpenGL window // Open OpenGL window
window = glfwOpenWindow( 500, 500, GLFW_WINDOWED, "Split view demo" ); window = glfwOpenWindow( 500, 500, GLFW_WINDOWED, "Split view demo", NULL );
if (!window) if (!window)
{ {
fprintf( stderr, "Failed to open GLFW window\n" ); fprintf( stderr, "Failed to open GLFW window\n" );

View File

@ -23,7 +23,7 @@ int main( void )
} }
// Open a window and create its OpenGL context // Open a window and create its OpenGL context
window = glfwOpenWindow( 640, 480, GLFW_WINDOWED, "Spinning Triangle" ); window = glfwOpenWindow( 640, 480, GLFW_WINDOWED, "Spinning Triangle", NULL );
if (!window) if (!window)
{ {
fprintf( stderr, "Failed to open GLFW window\n" ); fprintf( stderr, "Failed to open GLFW window\n" );

View File

@ -337,7 +337,7 @@ int main(int argc, char* argv[])
glfwOpenWindowHint(GLFW_DEPTH_BITS, 16); glfwOpenWindowHint(GLFW_DEPTH_BITS, 16);
/* Open window */ /* Open window */
window = glfwOpenWindow(width, height, mode, "Wave Simulation"); window = glfwOpenWindow(width, height, mode, "Wave Simulation", NULL);
if (!window) if (!window)
{ {
fprintf(stderr, "Could not open window\n"); fprintf(stderr, "Could not open window\n");

View File

@ -413,7 +413,7 @@ GLFWAPI int glfwGetVideoModes(GLFWvidmode* list, int maxcount);
GLFWAPI void glfwGetDesktopMode(GLFWvidmode* mode); GLFWAPI void glfwGetDesktopMode(GLFWvidmode* mode);
/* Window handling */ /* Window handling */
GLFWAPI GLFWwindow glfwOpenWindow(int width, int height, int mode, const char* title); GLFWAPI GLFWwindow glfwOpenWindow(int width, int height, int mode, const char* title, GLFWwindow share);
GLFWAPI void glfwOpenWindowHint(int target, int hint); GLFWAPI void glfwOpenWindowHint(int target, int hint);
GLFWAPI void glfwMakeWindowCurrent(GLFWwindow window); GLFWAPI void glfwMakeWindowCurrent(GLFWwindow window);
GLFWAPI int glfwIsWindow(GLFWwindow window); GLFWAPI int glfwIsWindow(GLFWwindow window);

View File

@ -271,6 +271,7 @@ version of GLFW.</p>
<li>Added <code>glfwSetWindowFocusCallback</code> function and <code>GLFWwindowfocusfun</code> type for receiving window focus events</li> <li>Added <code>glfwSetWindowFocusCallback</code> function and <code>GLFWwindowfocusfun</code> type for receiving window focus events</li>
<li>Added <code>glfwSetWindowIconifyCallback</code> function and <code>GLFWwindowiconifyfun</code> type for receiving window iconification events</li> <li>Added <code>glfwSetWindowIconifyCallback</code> function and <code>GLFWwindowiconifyfun</code> type for receiving window iconification events</li>
<li>Added <code>windows</code> simple multi-window test program</li> <li>Added <code>windows</code> simple multi-window test program</li>
<li>Added a parameter to <code>glfwOpenWindow</code> for specifying a context the new window's context will share objects with</li>
<li>Added initial window title parameter to <code>glfwOpenWindow</code></li> <li>Added initial window title parameter to <code>glfwOpenWindow</code></li>
<li>Changed buffer bit depth parameters of <code>glfwOpenWindow</code> to window hints</li> <li>Changed buffer bit depth parameters of <code>glfwOpenWindow</code> to window hints</li>
<li>Renamed <code>glfw.h</code> to <code>glfw3.h</code> to avoid conflicts with 2.x series</li> <li>Renamed <code>glfw.h</code> to <code>glfw3.h</code> to avoid conflicts with 2.x series</li>

View File

@ -631,9 +631,14 @@ int _glfwPlatformOpenWindow(_GLFWwindow* window,
return GL_FALSE; return GL_FALSE;
} }
NSOpenGLContext* share = NULL;
if (wndconfig->share)
share = wndconfig->share->NSGL.context;
window->NSGL.context = window->NSGL.context =
[[NSOpenGLContext alloc] initWithFormat:window->NSGL.pixelFormat [[NSOpenGLContext alloc] initWithFormat:window->NSGL.pixelFormat
shareContext:nil]; shareContext:share];
if (window->NSGL.context == nil) if (window->NSGL.context == nil)
{ {
_glfwSetError(GLFW_INTERNAL_ERROR); _glfwSetError(GLFW_INTERNAL_ERROR);

View File

@ -60,13 +60,20 @@
#include "platform.h" #include "platform.h"
typedef struct _GLFWhints _GLFWhints;
typedef struct _GLFWwndconfig _GLFWwndconfig;
typedef struct _GLFWfbconfig _GLFWfbconfig;
typedef struct _GLFWwindow _GLFWwindow;
typedef struct _GLFWlibrary _GLFWlibrary;
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Window hints, set by glfwOpenWindowHint and consumed by glfwOpenWindow // Window hints, set by glfwOpenWindowHint and consumed by glfwOpenWindow
// A bucket of semi-random stuff lumped together for historical reasons // A bucket of semi-random stuff lumped together for historical reasons
// This is used only by the platform independent code and only to store // This is used only by the platform independent code and only to store
// parameters passed to us by glfwOpenWindowHint // parameters passed to us by glfwOpenWindowHint
//------------------------------------------------------------------------ //------------------------------------------------------------------------
typedef struct _GLFWhints struct _GLFWhints
{ {
int redBits; int redBits;
int greenBits; int greenBits;
@ -88,7 +95,7 @@ typedef struct _GLFWhints
int glForward; int glForward;
int glDebug; int glDebug;
int glProfile; int glProfile;
} _GLFWhints; };
//------------------------------------------------------------------------ //------------------------------------------------------------------------
@ -97,7 +104,7 @@ typedef struct _GLFWhints
// This is used to pass window and context creation parameters from the // This is used to pass window and context creation parameters from the
// platform independent code to the platform specific code // platform independent code to the platform specific code
//------------------------------------------------------------------------ //------------------------------------------------------------------------
typedef struct _GLFWwndconfig struct _GLFWwndconfig
{ {
int mode; int mode;
const char* title; const char* title;
@ -108,7 +115,8 @@ typedef struct _GLFWwndconfig
int glForward; int glForward;
int glDebug; int glDebug;
int glProfile; int glProfile;
} _GLFWwndconfig; _GLFWwindow* share;
};
//------------------------------------------------------------------------ //------------------------------------------------------------------------
@ -118,7 +126,7 @@ typedef struct _GLFWwndconfig
// code to the platform specific code, and also to enumerate and select // code to the platform specific code, and also to enumerate and select
// available framebuffer configurations // available framebuffer configurations
//------------------------------------------------------------------------ //------------------------------------------------------------------------
typedef struct _GLFWfbconfig struct _GLFWfbconfig
{ {
int redBits; int redBits;
int greenBits; int greenBits;
@ -134,13 +142,13 @@ typedef struct _GLFWfbconfig
int stereo; int stereo;
int samples; int samples;
GLFWintptr platformID; GLFWintptr platformID;
} _GLFWfbconfig; };
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Window structure // Window structure
//------------------------------------------------------------------------ //------------------------------------------------------------------------
typedef struct _GLFWwindow struct _GLFWwindow
{ {
struct _GLFWwindow* next; struct _GLFWwindow* next;
@ -199,13 +207,13 @@ typedef struct _GLFWwindow
_GLFW_PLATFORM_WINDOW_STATE; _GLFW_PLATFORM_WINDOW_STATE;
_GLFW_PLATFORM_CONTEXT_STATE; _GLFW_PLATFORM_CONTEXT_STATE;
} _GLFWwindow; };
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Library global data // Library global data
//------------------------------------------------------------------------ //------------------------------------------------------------------------
typedef struct _GLFWlibrary struct _GLFWlibrary
{ {
_GLFWhints hints; _GLFWhints hints;
@ -215,7 +223,7 @@ typedef struct _GLFWlibrary
_GLFWwindow* cursorLockWindow; _GLFWwindow* cursorLockWindow;
_GLFW_PLATFORM_LIBRARY_STATE; _GLFW_PLATFORM_LIBRARY_STATE;
} _GLFWlibrary; };
//======================================================================== //========================================================================

View File

@ -315,20 +315,23 @@ static HGLRC createContext(_GLFWwindow* window,
const _GLFWwndconfig* wndconfig, const _GLFWwndconfig* wndconfig,
int pixelFormat) int pixelFormat)
{ {
HGLRC context;
PIXELFORMATDESCRIPTOR pfd; PIXELFORMATDESCRIPTOR pfd;
int flags, i = 0, attribs[7]; int flags, i = 0, attribs[7];
HGLRC share = NULL;
if (wndconfig->share)
share = wndconfig->share->WGL.context;
if (!_glfw_DescribePixelFormat(window->WGL.DC, pixelFormat, sizeof(pfd), &pfd)) if (!_glfw_DescribePixelFormat(window->WGL.DC, pixelFormat, sizeof(pfd), &pfd))
{ {
_glfwSetError(GLFW_INTERNAL_ERROR); _glfwSetError(GLFW_INTERNAL_ERROR);
return NULL; return GL_FALSE;
} }
if (!_glfw_SetPixelFormat(window->WGL.DC, pixelFormat, &pfd)) if (!_glfw_SetPixelFormat(window->WGL.DC, pixelFormat, &pfd))
{ {
_glfwSetError(GLFW_INTERNAL_ERROR); _glfwSetError(GLFW_INTERNAL_ERROR);
return NULL; return GL_FALSE;
} }
if (window->WGL.has_WGL_ARB_create_context) if (window->WGL.has_WGL_ARB_create_context)
@ -372,24 +375,35 @@ static HGLRC createContext(_GLFWwindow* window,
attribs[i++] = 0; attribs[i++] = 0;
context = window->WGL.CreateContextAttribsARB(window->WGL.DC, NULL, attribs); window->WGL.context = window->WGL.CreateContextAttribsARB(window->WGL.DC,
if (!context) share,
attribs);
if (!window->WGL.context)
{ {
_glfwSetError(GLFW_INTERNAL_ERROR); _glfwSetError(GLFW_INTERNAL_ERROR);
return NULL; return GL_FALSE;
} }
} }
else else
{ {
context = wglCreateContext(window->WGL.DC); window->WGL.context = wglCreateContext(window->WGL.DC);
if (!context) if (!window->WGL.context)
{ {
_glfwSetError(GLFW_INTERNAL_ERROR); _glfwSetError(GLFW_INTERNAL_ERROR);
return NULL; return GL_FALSE;
}
if (share)
{
if (!wglShareLists(share, window->WGL.context))
{
_glfwSetError(GLFW_INTERNAL_ERROR);
return GL_FALSE;
}
} }
} }
return context; return GL_TRUE;
} }
@ -1201,8 +1215,7 @@ static int createWindow(_GLFWwindow* window,
if (!pixelFormat) if (!pixelFormat)
return GL_FALSE; return GL_FALSE;
window->WGL.context = createContext(window, wndconfig, pixelFormat); if (!createContext(window, wndconfig, pixelFormat))
if (!window->WGL.context)
return GL_FALSE; return GL_FALSE;
glfwMakeWindowCurrent(window); glfwMakeWindowCurrent(window);

View File

@ -409,7 +409,8 @@ const _GLFWfbconfig* _glfwChooseFBConfig(const _GLFWfbconfig* desired,
//======================================================================== //========================================================================
GLFWAPI GLFWwindow glfwOpenWindow(int width, int height, GLFWAPI GLFWwindow glfwOpenWindow(int width, int height,
int mode, const char* title) int mode, const char* title,
GLFWwindow share)
{ {
_GLFWfbconfig fbconfig; _GLFWfbconfig fbconfig;
_GLFWwndconfig wndconfig; _GLFWwndconfig wndconfig;
@ -458,6 +459,7 @@ GLFWAPI GLFWwindow glfwOpenWindow(int width, int height,
wndconfig.glForward = _glfwLibrary.hints.glForward ? GL_TRUE : GL_FALSE; wndconfig.glForward = _glfwLibrary.hints.glForward ? GL_TRUE : GL_FALSE;
wndconfig.glDebug = _glfwLibrary.hints.glDebug ? GL_TRUE : GL_FALSE; wndconfig.glDebug = _glfwLibrary.hints.glDebug ? GL_TRUE : GL_FALSE;
wndconfig.glProfile = _glfwLibrary.hints.glProfile; wndconfig.glProfile = _glfwLibrary.hints.glProfile;
wndconfig.share = share;
// Clear for next open call // Clear for next open call
_glfwClearWindowHints(); _glfwClearWindowHints();

View File

@ -483,6 +483,10 @@ static int createContext(_GLFWwindow* window, const _GLFWwndconfig* wndconfig, G
int attribs[40]; int attribs[40];
int flags, dummy, index; int flags, dummy, index;
GLXFBConfig* fbconfig; GLXFBConfig* fbconfig;
GLXContext share = NULL;
if (wndconfig->share)
share = wndconfig->share->GLX.context;
// Retrieve the previously selected GLXFBConfig // Retrieve the previously selected GLXFBConfig
{ {
@ -580,9 +584,10 @@ static int createContext(_GLFWwindow* window, const _GLFWwndconfig* wndconfig, G
setGLXattrib(attribs, index, None, None); setGLXattrib(attribs, index, None, None);
window->GLX.context = window->GLX.CreateContextAttribsARB(_glfwLibrary.X11.display, window->GLX.context =
window->GLX.CreateContextAttribsARB(_glfwLibrary.X11.display,
*fbconfig, *fbconfig,
NULL, share,
True, True,
attribs); attribs);
} }
@ -590,10 +595,11 @@ static int createContext(_GLFWwindow* window, const _GLFWwndconfig* wndconfig, G
{ {
if (window->GLX.has_GLX_SGIX_fbconfig) if (window->GLX.has_GLX_SGIX_fbconfig)
{ {
window->GLX.context = window->GLX.CreateContextWithConfigSGIX(_glfwLibrary.X11.display, window->GLX.context =
window->GLX.CreateContextWithConfigSGIX(_glfwLibrary.X11.display,
*fbconfig, *fbconfig,
GLX_RGBA_TYPE, GLX_RGBA_TYPE,
NULL, share,
True); True);
} }
else else
@ -601,7 +607,7 @@ static int createContext(_GLFWwindow* window, const _GLFWwndconfig* wndconfig, G
window->GLX.context = glXCreateNewContext(_glfwLibrary.X11.display, window->GLX.context = glXCreateNewContext(_glfwLibrary.X11.display,
*fbconfig, *fbconfig,
GLX_RGBA_TYPE, GLX_RGBA_TYPE,
NULL, share,
True); True);
} }
} }

View File

@ -65,7 +65,7 @@ int main(void)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
window = glfwOpenWindow(window_width, window_height, GLFW_WINDOWED, "Cursor Inaccuracy Detector"); window = glfwOpenWindow(window_width, window_height, GLFW_WINDOWED, "Cursor Inaccuracy Detector", NULL);
if (!window) if (!window)
{ {
glfwTerminate(); glfwTerminate();

View File

@ -75,7 +75,7 @@ int main(void)
exit(1); exit(1);
} }
window = glfwOpenWindow(0, 0, GLFW_WINDOWED, "Defaults"); window = glfwOpenWindow(0, 0, GLFW_WINDOWED, "Defaults", NULL);
if (!window) if (!window)
{ {
glfwTerminate(); glfwTerminate();

View File

@ -290,7 +290,7 @@ int main(void)
printf("Library initialized\n"); printf("Library initialized\n");
window = glfwOpenWindow(0, 0, GLFW_WINDOWED, "Event Linter"); window = glfwOpenWindow(0, 0, GLFW_WINDOWED, "Event Linter", NULL);
if (!window) if (!window)
{ {
glfwTerminate(); glfwTerminate();

View File

@ -56,7 +56,7 @@ int main(void)
glfwOpenWindowHint(GLFW_FSAA_SAMPLES, 4); glfwOpenWindowHint(GLFW_FSAA_SAMPLES, 4);
window = glfwOpenWindow(400, 400, GLFW_WINDOWED, "Aliasing Detector"); window = glfwOpenWindow(400, 400, GLFW_WINDOWED, "Aliasing Detector", NULL);
if (!window) if (!window)
{ {
glfwTerminate(); glfwTerminate();

View File

@ -81,7 +81,7 @@ int main(void)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
window = glfwOpenWindow(640, 480, GLFW_FULLSCREEN, "Fullscreen focus"); window = glfwOpenWindow(640, 480, GLFW_FULLSCREEN, "Fullscreen focus", NULL);
if (!window) if (!window)
{ {
glfwTerminate(); glfwTerminate();

View File

@ -109,7 +109,7 @@ int main(int argc, char** argv)
height = 0; height = 0;
} }
window = glfwOpenWindow(width, height, mode, "Iconify"); window = glfwOpenWindow(width, height, mode, "Iconify", NULL);
if (!window) if (!window)
{ {
glfwTerminate(); glfwTerminate();

View File

@ -89,7 +89,7 @@ static GLboolean open_window(void)
{ {
int x, y; int x, y;
window_handle = glfwOpenWindow(0, 0, GLFW_WINDOWED, "Peter Detector"); window_handle = glfwOpenWindow(0, 0, GLFW_WINDOWED, "Peter Detector", NULL);
if (!window_handle) if (!window_handle)
return GL_FALSE; return GL_FALSE;

View File

@ -84,7 +84,7 @@ static int open_window(int width, int height, int mode)
{ {
double base = glfwGetTime(); double base = glfwGetTime();
window_handle = glfwOpenWindow(width, height, mode, "Window Re-opener"); window_handle = glfwOpenWindow(width, height, mode, "Window Re-opener", NULL);
if (!window_handle) if (!window_handle)
{ {
fprintf(stderr, "Failed to open %s mode GLFW window: %s\n", get_mode_name(mode), glfwErrorString(glfwGetError())); fprintf(stderr, "Failed to open %s mode GLFW window: %s\n", get_mode_name(mode), glfwErrorString(glfwGetError()));

View File

@ -50,7 +50,7 @@ int main(void)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
window = glfwOpenWindow(0, 0, GLFW_WINDOWED, "Tearing Detector"); window = glfwOpenWindow(0, 0, GLFW_WINDOWED, "Tearing Detector", NULL);
if (!window) if (!window)
{ {
glfwTerminate(); glfwTerminate();

View File

@ -180,7 +180,7 @@ int main(int argc, char** argv)
// We assume here that we stand a better chance of success by leaving all // We assume here that we stand a better chance of success by leaving all
// possible details of pixel format selection to GLFW // possible details of pixel format selection to GLFW
window = glfwOpenWindow(0, 0, GLFW_WINDOWED, "Version"); window = glfwOpenWindow(0, 0, GLFW_WINDOWED, "Version", NULL);
if (!window) if (!window)
{ {
glfwTerminate(); glfwTerminate();

View File

@ -55,7 +55,7 @@ int main(void)
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
{ {
windows[i] = glfwOpenWindow(200, 200, GLFW_WINDOWED, titles[i]); windows[i] = glfwOpenWindow(200, 200, GLFW_WINDOWED, titles[i], NULL);
if (!windows[i]) if (!windows[i])
{ {
fprintf(stderr, "Failed to open GLFW window: %s\n", fprintf(stderr, "Failed to open GLFW window: %s\n",