diff options
author | Sven Gothel <[email protected]> | 2010-12-09 23:37:21 +0100 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2010-12-09 23:37:21 +0100 |
commit | 10f33b1df5232ecc43dfc072ece35da57f75d0df (patch) | |
tree | aae99ce7b8e721c72cddfd2eb24c4bd42ba70771 /src/jogl/classes/com/jogamp | |
parent | a92e315245f6cefb55a71572eab8b6c95e8041a3 (diff) |
DummyWindow: 64x64, WGL: Use lockSurface/unlockSurface block to gather / release HDC
Diffstat (limited to 'src/jogl/classes/com/jogamp')
-rw-r--r-- | src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsDummyWGLDrawable.java | 65 | ||||
-rw-r--r-- | src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11DummyGLXDrawable.java | 2 |
2 files changed, 56 insertions, 11 deletions
diff --git a/src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsDummyWGLDrawable.java b/src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsDummyWGLDrawable.java index 015ef61a4..3cbdcd021 100644 --- a/src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsDummyWGLDrawable.java +++ b/src/jogl/classes/com/jogamp/opengl/impl/windows/wgl/WindowsDummyWGLDrawable.java @@ -47,31 +47,36 @@ import javax.media.opengl.GLProfile; import javax.media.nativewindow.AbstractGraphicsScreen; import com.jogamp.nativewindow.impl.ProxySurface; import com.jogamp.nativewindow.impl.windows.GDI; +import javax.media.nativewindow.AbstractGraphicsDevice; +import javax.media.nativewindow.NativeSurface; import javax.media.opengl.GLCapabilities; import javax.media.opengl.GLCapabilitiesImmutable; import javax.media.opengl.GLException; public class WindowsDummyWGLDrawable extends WindowsWGLDrawable { - private static final int f_dim = 128; + private static final int f_dim = 64; private long hwnd, hdc; protected WindowsDummyWGLDrawable(GLDrawableFactory factory, GLCapabilitiesImmutable caps, AbstractGraphicsScreen absScreen) { super(factory, new ProxySurface(WindowsWGLGraphicsConfigurationFactory.createDefaultGraphicsConfiguration(caps, absScreen)), true); hwnd = GDI.CreateDummyWindow(0, 0, f_dim, f_dim); - hdc = GDI.GetDC(hwnd); ProxySurface ns = (ProxySurface) getNativeSurface(); - ns.setSurfaceHandle(hdc); ns.setSize(f_dim, f_dim); - WindowsWGLGraphicsConfiguration config = (WindowsWGLGraphicsConfiguration)ns.getGraphicsConfiguration().getNativeGraphicsConfiguration(); - + + if(NativeSurface.LOCK_SURFACE_NOT_READY >= lockSurface()) { + throw new GLException("WindowsDummyWGLDrawable: surface not ready (lockSurface)"); + } try { - config.updateGraphicsConfiguration(factory, ns); + WindowsWGLGraphicsConfiguration config = (WindowsWGLGraphicsConfiguration)ns.getGraphicsConfiguration().getNativeGraphicsConfiguration(); + config.updateGraphicsConfiguration(factory, ns, null); if (DEBUG) { System.err.println("!!! WindowsDummyWGLDrawable: "+config); } } catch (Throwable t) { destroyImpl(); throw new GLException(t); + } finally { + unlockSurface(); } } @@ -84,6 +89,48 @@ public class WindowsDummyWGLDrawable extends WindowsWGLDrawable { return new WindowsDummyWGLDrawable(factory, caps, absScreen); } + public int lockSurface() throws GLException { + int res = NativeSurface.LOCK_SURFACE_NOT_READY; + ProxySurface ns = (ProxySurface) getNativeSurface(); + AbstractGraphicsDevice adevice = ns.getGraphicsConfiguration().getNativeGraphicsConfiguration().getScreen().getDevice(); + adevice.lock(); + try { + res = ns.lockSurface(); + if(NativeSurface.LOCK_SUCCESS == res && 0 != hwnd && 0 == hdc) { + hdc = GDI.GetDC(hwnd); + ns.setSurfaceHandle(hdc); + if(0 == hdc) { + throw new GLException("Error hdc 0, werr: "+GDI.GetLastError()); + } + } else { + Throwable t = new Throwable("Error lock failed - res "+res+", hwnd "+toHexString(hwnd)+", hdc "+toHexString(hdc)); + t.printStackTrace(); + } + } finally { + if( NativeSurface.LOCK_SURFACE_NOT_READY == res ) { + adevice.unlock(); + } + } + return res; + } + + public void unlockSurface() { + ProxySurface ns = (ProxySurface) getNativeSurface(); + ns.validateSurfaceLocked(); + AbstractGraphicsDevice adevice = ns.getGraphicsConfiguration().getNativeGraphicsConfiguration().getScreen().getDevice(); + + try { + if ( 0 != hdc && 0 != hwnd && ns.getSurfaceRecursionCount() == 0) { + GDI.ReleaseDC(hwnd, hdc); + hdc=0; + ns.setSurfaceHandle(hdc); + } + surface.unlockSurface(); + } finally { + adevice.unlock(); + } + } + public void setSize(int width, int height) { } @@ -96,10 +143,6 @@ public class WindowsDummyWGLDrawable extends WindowsWGLDrawable { } public GLContext createContext(GLContext shareWith) { - if (hdc == 0) { - // Construction failed - return null; - } // FIXME: figure out how to hook back in the Java 2D / JOGL bridge return new WindowsWGLContext(this, shareWith); } @@ -108,6 +151,8 @@ public class WindowsDummyWGLDrawable extends WindowsWGLDrawable { if (hdc != 0) { GDI.ReleaseDC(hwnd, hdc); hdc = 0; + ProxySurface ns = (ProxySurface) getNativeSurface(); + ns.setSurfaceHandle(hdc); } if (hwnd != 0) { GDI.ShowWindow(hwnd, GDI.SW_HIDE); diff --git a/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11DummyGLXDrawable.java b/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11DummyGLXDrawable.java index 72698d759..1f2bf9344 100644 --- a/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11DummyGLXDrawable.java +++ b/src/jogl/classes/com/jogamp/opengl/impl/x11/glx/X11DummyGLXDrawable.java @@ -35,7 +35,7 @@ import com.jogamp.nativewindow.impl.*; import com.jogamp.nativewindow.impl.x11.*; public class X11DummyGLXDrawable extends X11OnscreenGLXDrawable { - private static final int f_dim = 128; + private static final int f_dim = 64; private long dummyWindow = 0; /** |