diff options
author | Sven Gothel <[email protected]> | 2010-10-09 21:29:05 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2010-10-09 21:29:05 +0200 |
commit | 231f9fe67c55ece5ee013cf1183f15200b602cd8 (patch) | |
tree | 795e7289f1595d4610decba1bd068661be7368f6 /src/jogl/classes/com/jogamp | |
parent | 5e1a67c9bd3f8420eeab2d3879a795e25de22936 (diff) |
JOGL: WindowsWGLDrawableFactory/X11GLXDrawableFactory: synchronize sharedContext lock/release
Unsynchronized lead to an 'context already locked by another thread' exception
at initialization time (Windows: in general; X11: ATI and pbuffer drawable).
Diffstat (limited to 'src/jogl/classes/com/jogamp')
3 files changed, 80 insertions, 79 deletions
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsWGLDrawableFactory.java b/src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsWGLDrawableFactory.java index 08cee4dab..aafea36fd 100644 --- a/src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsWGLDrawableFactory.java +++ b/src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsWGLDrawableFactory.java @@ -158,27 +158,26 @@ public class WindowsWGLDrawableFactory extends GLDrawableFactoryImpl { throw new IllegalArgumentException("Null target"); } final List returnList = new ArrayList(); - final GLDrawableFactory factory = this; - final WindowsWGLContext _sharedContext = sharedContext; - final WindowsDummyWGLDrawable _sharedDrawable = sharedDrawable; Runnable r = new Runnable() { public void run() { GLContext lastContext = GLContext.getCurrent(); if (lastContext != null) { lastContext.release(); } - _sharedContext.makeCurrent(); - WGLExt wglExt = _sharedContext.getWGLExt(); - try { - GLDrawableImpl pbufferDrawable = new WindowsPbufferWGLDrawable(factory, target, - _sharedDrawable, - wglExt); - returnList.add(pbufferDrawable); - } finally { - _sharedContext.release(); - if (lastContext != null) { - lastContext.makeCurrent(); - } + synchronized(WindowsWGLDrawableFactory.this.sharedContext) { + WindowsWGLDrawableFactory.this.sharedContext.makeCurrent(); + try { + WGLExt wglExt = WindowsWGLDrawableFactory.this.sharedContext.getWGLExt(); + GLDrawableImpl pbufferDrawable = new WindowsPbufferWGLDrawable(WindowsWGLDrawableFactory.this, target, + WindowsWGLDrawableFactory.this.sharedDrawable, + wglExt); + returnList.add(pbufferDrawable); + } finally { + WindowsWGLDrawableFactory.this.sharedContext.release(); + if (lastContext != null) { + lastContext.makeCurrent(); + } + } } } }; diff --git a/src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsWGLGraphicsConfigurationFactory.java b/src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsWGLGraphicsConfigurationFactory.java index fd5a174c8..ae12d254a 100644 --- a/src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsWGLGraphicsConfigurationFactory.java +++ b/src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsWGLGraphicsConfigurationFactory.java @@ -136,68 +136,70 @@ public class WindowsWGLGraphicsConfigurationFactory extends GraphicsConfiguratio pfd = WindowsWGLGraphicsConfiguration.createPixelFormatDescriptor(); // Produce a recommended pixel format selection for the GLCapabilitiesChooser. // Use wglChoosePixelFormatARB if user requested multisampling and if we have it available - factory.sharedContext.makeCurrent(); - WGLExt wglExt = factory.sharedContext.getWGLExt(); - int recommendedPixelFormat = pixelFormat; // 1-based pixel format - boolean haveWGLChoosePixelFormatARB = false; boolean gotAvailableCaps = false; - if (wglExt != null) { - try { - haveWGLChoosePixelFormatARB = wglExt.isExtensionAvailable("WGL_ARB_pixel_format"); - if (haveWGLChoosePixelFormatARB) { - if(pixelFormat<=0) { - int[] iattributes = new int [2*WindowsWGLGraphicsConfiguration.MAX_ATTRIBS]; - float[] fattributes = new float[1]; + synchronized(factory.sharedContext) { + factory.sharedContext.makeCurrent(); + try { + WGLExt wglExt = factory.sharedContext.getWGLExt(); - if(WindowsWGLGraphicsConfiguration.GLCapabilities2AttribList(capabilities, - iattributes, - wglExt, - false, - null)) { - int[] pformats = new int[WindowsWGLGraphicsConfiguration.MAX_PFORMATS]; - int[] numFormatsTmp = new int[1]; - if (wglExt.wglChoosePixelFormatARB(hdc, - iattributes, 0, - fattributes, 0, - WindowsWGLGraphicsConfiguration.MAX_PFORMATS, - pformats, 0, - numFormatsTmp, 0)) { - numFormats = numFormatsTmp[0]; - if (recommendedPixelFormat<=0 && numFormats > 0) { - recommendedPixelFormat = pformats[0]; - if (DEBUG) { - System.err.println(getThreadName() + ": Used wglChoosePixelFormatARB to recommend pixel format " + recommendedPixelFormat); - } - } - } else { - if (DEBUG) { - System.err.println(getThreadName() + ": wglChoosePixelFormatARB failed: " + GDI.GetLastError() ); - Thread.dumpStack(); - } - } - if (DEBUG) { - if (recommendedPixelFormat <= 0) { - System.err.print(getThreadName() + ": wglChoosePixelFormatARB didn't recommend a pixel format: "+GDI.GetLastError()); - if (capabilities.getSampleBuffers()) { - System.err.print(" for multisampled GLCapabilities"); + boolean haveWGLChoosePixelFormatARB = false; + if (wglExt != null) { + haveWGLChoosePixelFormatARB = wglExt.isExtensionAvailable("WGL_ARB_pixel_format"); + if (haveWGLChoosePixelFormatARB) { + if(pixelFormat<=0) { + int[] iattributes = new int [2*WindowsWGLGraphicsConfiguration.MAX_ATTRIBS]; + float[] fattributes = new float[1]; + + if(WindowsWGLGraphicsConfiguration.GLCapabilities2AttribList(capabilities, + iattributes, + wglExt, + false, + null)) { + int[] pformats = new int[WindowsWGLGraphicsConfiguration.MAX_PFORMATS]; + int[] numFormatsTmp = new int[1]; + if (wglExt.wglChoosePixelFormatARB(hdc, + iattributes, 0, + fattributes, 0, + WindowsWGLGraphicsConfiguration.MAX_PFORMATS, + pformats, 0, + numFormatsTmp, 0)) { + numFormats = numFormatsTmp[0]; + if (recommendedPixelFormat<=0 && numFormats > 0) { + recommendedPixelFormat = pformats[0]; + if (DEBUG) { + System.err.println(getThreadName() + ": Used wglChoosePixelFormatARB to recommend pixel format " + recommendedPixelFormat); + } + } + } else { + if (DEBUG) { + System.err.println(getThreadName() + ": wglChoosePixelFormatARB failed: " + GDI.GetLastError() ); + Thread.dumpStack(); + } + } + if (DEBUG) { + if (recommendedPixelFormat <= 0) { + System.err.print(getThreadName() + ": wglChoosePixelFormatARB didn't recommend a pixel format: "+GDI.GetLastError()); + if (capabilities.getSampleBuffers()) { + System.err.print(" for multisampled GLCapabilities"); + } + System.err.println(); + } + } + } } - System.err.println(); + + availableCaps = WindowsWGLGraphicsConfiguration.HDC2GLCapabilities(wglExt, hdc, -1, glProfile, pixelFormatSet, onscreen, usePBuffer); + gotAvailableCaps = null!=availableCaps ; + choosenBywGLPixelFormat = gotAvailableCaps ; + } else if (DEBUG) { + System.err.println(getThreadName() + ": wglChoosePixelFormatARB not available"); } - } } - } - - availableCaps = WindowsWGLGraphicsConfiguration.HDC2GLCapabilities(wglExt, hdc, -1, glProfile, pixelFormatSet, onscreen, usePBuffer); - gotAvailableCaps = null!=availableCaps ; - choosenBywGLPixelFormat = gotAvailableCaps ; - } else if (DEBUG) { - System.err.println(getThreadName() + ": wglChoosePixelFormatARB not available"); + } finally { + factory.sharedContext.release(); } - } finally { - factory.sharedContext.release(); - } - } + } // synchronized(factory.sharedContext) if (!gotAvailableCaps) { if (DEBUG) { diff --git a/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11GLXDrawableFactory.java b/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11GLXDrawableFactory.java index 2ae53fb9d..4b84227c3 100644 --- a/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11GLXDrawableFactory.java +++ b/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11GLXDrawableFactory.java @@ -223,17 +223,17 @@ public class X11GLXDrawableFactory extends GLDrawableFactoryImpl { * The dummy context shall also use the same Display, * since switching Display in this regard is another ATI bug. */ - boolean usedSharedContext=false; if( isVendorATI() && null == GLContext.getCurrent() ) { - sharedContext.makeCurrent(); - usedSharedContext=true; - } - try { - pbufferDrawable = new X11PbufferGLXDrawable(this, target); - } finally { - if(usedSharedContext) { - sharedContext.release(); + synchronized(sharedContext) { + sharedContext.makeCurrent(); + try { + pbufferDrawable = new X11PbufferGLXDrawable(this, target); + } finally { + sharedContext.release(); + } } + } else { + pbufferDrawable = new X11PbufferGLXDrawable(this, target); } return pbufferDrawable; } |