From c15bfa2dce50ae132736dd678192f819d5ba2404 Mon Sep 17 00:00:00 2001 From: Kenneth Russel Date: Mon, 20 Feb 2006 21:25:05 +0000 Subject: Changed locking protocol for on-screen surfaces to only use the JAWT's DrawingSurface locking primitives during the makeCurrent operation. While in theory the JAWT should be used for locking for the entire duration of the makeCurrent/release pair, in practice because OpenGL is orthogonal to the window system this is not really necessary, at least if higher-level locking primitives are used to make sure the window is not torn down out from under the library while OpenGL rendering is being performed. The OpenGL-related work done in GLCanvas.addNotify() and removeNotify() handles this. These changes enable simultaneous multi-head rendering on X11 systems with one OpenGL context per thread. Changed GLContext.destroy() to acquire the context's lock during the destroyImpl operation for correctness in the new protocol. Changed several Mac OS X native code entry points to not take an unnecessary NSView* argument. Tested with several demos on all platforms to stress creation and destruction of multiple kinds of OpenGL contexts. git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/svn-server-sync/jogl/trunk@624 232f8b59-042b-4e1e-8c03-345bb8c30851 --- .../impl/windows/WindowsOnscreenGLContext.java | 29 ++++------------------ 1 file changed, 5 insertions(+), 24 deletions(-) (limited to 'src/classes/com/sun/opengl/impl/windows/WindowsOnscreenGLContext.java') diff --git a/src/classes/com/sun/opengl/impl/windows/WindowsOnscreenGLContext.java b/src/classes/com/sun/opengl/impl/windows/WindowsOnscreenGLContext.java index 00647e7dd..4e1dbd1c0 100644 --- a/src/classes/com/sun/opengl/impl/windows/WindowsOnscreenGLContext.java +++ b/src/classes/com/sun/opengl/impl/windows/WindowsOnscreenGLContext.java @@ -54,40 +54,21 @@ public class WindowsOnscreenGLContext extends WindowsGLContext { } protected int makeCurrentImpl() throws GLException { + int lockRes = 0; try { - int lockRes = drawable.lockSurface(); + lockRes = drawable.lockSurface(); if (lockRes == WindowsOnscreenGLDrawable.LOCK_SURFACE_NOT_READY) { return CONTEXT_NOT_CURRENT; } if (lockRes == WindowsOnscreenGLDrawable.LOCK_SURFACE_CHANGED) { - if (hglrc != 0) { - if (!WGL.wglDeleteContext(hglrc)) { - throw new GLException("Unable to delete old GL context after surface changed"); - } - GLContextShareSet.contextDestroyed(this); - if (DEBUG) { - System.err.println(getThreadName() + ": !!! Destroyed OpenGL context " + toHexString(hglrc) + " due to JAWT_LOCK_SURFACE_CHANGED"); - } - hglrc = 0; - } + destroyImpl(); } int ret = super.makeCurrentImpl(); return ret; - } catch (RuntimeException e) { - try { + } finally { + if (lockRes != WindowsOnscreenGLDrawable.LOCK_SURFACE_NOT_READY) { drawable.unlockSurface(); - } catch (Exception e2) { - // do nothing if unlockSurface throws } - throw(e); - } - } - - protected void releaseImpl() throws GLException { - try { - super.releaseImpl(); - } finally { - drawable.unlockSurface(); } } } -- cgit v1.2.3