aboutsummaryrefslogtreecommitdiffstats
path: root/src/net/java/games/jogl/impl/windows/WindowsGLContextFactory.java
diff options
context:
space:
mode:
authorKenneth Russel <[email protected]>2005-07-17 18:59:50 +0000
committerKenneth Russel <[email protected]>2005-07-17 18:59:50 +0000
commit9ccfb4b547a75be721d9bbc2d760e51f170832cd (patch)
tree826915fbdc242aebb1d8175577db79644cd291c3 /src/net/java/games/jogl/impl/windows/WindowsGLContextFactory.java
parent7e7e225eaf4fddb31152ab204bf1776f26079d40 (diff)
Rewrote and refactored creation of dummy window and OpenGL context on
Windows to be encapsulated in WindowsDummyGLDrawable class. This is a prerequisite for implementing top-level pbuffer support in the GLDrawableFactory (i.e., not associated with a GLCanvas). Refactored context implementations further on all platforms. git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/svn-server-sync/jogl/branches/JSR-231@325 232f8b59-042b-4e1e-8c03-345bb8c30851
Diffstat (limited to 'src/net/java/games/jogl/impl/windows/WindowsGLContextFactory.java')
-rw-r--r--src/net/java/games/jogl/impl/windows/WindowsGLContextFactory.java231
1 files changed, 0 insertions, 231 deletions
diff --git a/src/net/java/games/jogl/impl/windows/WindowsGLContextFactory.java b/src/net/java/games/jogl/impl/windows/WindowsGLContextFactory.java
index d99554fcf..fb03b8702 100644
--- a/src/net/java/games/jogl/impl/windows/WindowsGLContextFactory.java
+++ b/src/net/java/games/jogl/impl/windows/WindowsGLContextFactory.java
@@ -81,8 +81,6 @@ public class WindowsGLContextFactory extends GLContextFactory {
public WindowsGLContextFactory() {
AccessController.doPrivileged( new PrivilegedAction() {
public Object run() {
- Runtime.getRuntime().addShutdownHook( new ShutdownHook() );
-
// Test for whether we should enable the single-threaded
// workaround for ATI cards. It appears that if we make any
// OpenGL context current on more than one thread on ATI cards
@@ -161,235 +159,6 @@ public class WindowsGLContextFactory extends GLContextFactory {
return new WindowsOffscreenGLDrawable(capabilities, chooser);
}
- // Return cached GL drawable
- public static WindowsGLDrawable getDummyGLDrawable( final GraphicsDevice device ) {
- checkForDummyContext( device );
- NativeWindowStruct nws = (NativeWindowStruct) dummyContextMap.get(device);
- return nws.getWindowsDrawable();
- }
-
- // Return cached GL context
- public static WindowsGLContext getDummyGLContext( final GraphicsDevice device ) {
- checkForDummyContext( device );
- NativeWindowStruct nws = (NativeWindowStruct) dummyContextMap.get(device);
- return nws.getWindowsContext();
- }
-
- // Return cached extension string
- public static String getDummyGLExtensions(final GraphicsDevice device) {
- checkForDummyContext( device );
- String exts = (String) dummyExtensionsMap.get(device);
- return (exts == null) ? "" : exts;
- }
-
- // Return cached GL function pointers
- public static GL getDummyGL(final GraphicsDevice device) {
- checkForDummyContext( device );
- NativeWindowStruct nws = (NativeWindowStruct) dummyContextMap.get(device);
- return( nws.getWindowsContext().getGL() );
- }
-
- /*
- * Locate a cached native window, if one doesn't exist create one amd
- * cache it.
- */
- private static void checkForDummyContext( final GraphicsDevice device ) {
- if (!pendingContextSet.contains(device) && !dummyContextMap.containsKey( device ) ) {
- if (DEBUG) {
- System.err.println("WindowsGLContextFactory.checkForDummyContext() called on thread " +
- Thread.currentThread().getName());
- }
-
- pendingContextSet.add(device);
- GraphicsConfiguration config = device.getDefaultConfiguration();
- Rectangle rect = config.getBounds();
- GLCapabilities caps = new GLCapabilities();
- caps.setDepthBits( 16 );
- // Create a context that we use to query pixel formats
-
- WindowsOnscreenGLDrawable drawable = new WindowsOnscreenGLDrawable(null, caps, null);
- WindowsOnscreenGLContext context = new WindowsOnscreenGLContext( drawable, null );
- // Start a native thread and grab native screen resources from the thread
- NativeWindowThread nwt = new NativeWindowThread( rect );
- nwt.start();
- long hWnd = 0;
- long tempHDC = 0;
- while( (hWnd = nwt.getHWND()) == 0 || (tempHDC = nwt.getHDC()) == 0 ) {
- Thread.yield();
- }
- // Choose a hardware accelerated pixel format
- PIXELFORMATDESCRIPTOR pfd = drawable.glCapabilities2PFD( caps, true );
- int pixelFormat = WGL.ChoosePixelFormat( tempHDC, pfd );
- if( pixelFormat == 0 ) {
- System.err.println("Pixel Format is Zero");
- pendingContextSet.remove(device);
- return;
- }
- // Set the hardware accelerated pixel format
- if (!WGL.SetPixelFormat(tempHDC, pixelFormat, pfd)) {
- System.err.println("SetPixelFormat Failed");
- pendingContextSet.remove( device );
- return;
- }
- // Create a rendering context
- long tempHGLRC = WGL.wglCreateContext( tempHDC );
- if( hWnd == 0 || tempHDC == 0 || tempHGLRC == 0 ) {
- pendingContextSet.remove( device );
- return;
- }
- // Store native handles for later use
- NativeWindowStruct nws = new NativeWindowStruct();
- nws.setHWND( hWnd );
- nws.setWindowsDrawable( drawable );
- nws.setWindowsContext( context );
- nws.setWindowThread( nwt );
- long currentHDC = WGL.wglGetCurrentDC();
- long currentHGLRC = WGL.wglGetCurrentContext();
- // Make the new hardware accelerated context current
- if( !WGL.wglMakeCurrent( tempHDC, tempHGLRC ) ) {
- pendingContextSet.remove( device );
- return;
- }
- // Grab function pointers
- drawable.hdc = tempHDC;
- context.hglrc = tempHGLRC;
- context.resetGLFunctionAvailability();
- context.createGL();
- pendingContextSet.remove( device );
- dummyContextMap.put( device, nws );
- String availableGLExtensions = "";
- String availableWGLExtensions = "";
- String availableEXTExtensions = "";
- try {
- availableWGLExtensions = context.getGL().wglGetExtensionsStringARB( currentHDC );
- } catch( GLException e ) {
- }
- try {
- availableEXTExtensions = context.getGL().wglGetExtensionsStringEXT();
- } catch( GLException e ) {
- }
- availableGLExtensions = context.getGL().glGetString( GL.GL_EXTENSIONS );
- dummyExtensionsMap.put(device, availableGLExtensions + " " + availableEXTExtensions + " " + availableWGLExtensions);
- WGL.wglMakeCurrent( currentHDC, currentHGLRC );
- }
- }
-
- /*
- * This class stores handles to native resources that need to be destroyed
- * at JVM shutdown.
- */
- static class NativeWindowStruct {
- private long HWND;
- private WindowsGLDrawable windowsDrawable;
- private WindowsGLContext windowsContext;
- private Thread windowThread;
-
- public NativeWindowStruct() {
- }
-
- public long getHDC() {
- return( windowsDrawable.hdc );
- }
-
- public long getHGLRC() {
- return( windowsContext.hglrc );
- }
-
- public void setHWND( long hwnd ) {
- HWND = hwnd;
- }
-
- public long getHWND() {
- return( HWND );
- }
-
- public void setWindowsDrawable( WindowsGLDrawable drawable ) {
- windowsDrawable = drawable;
- }
-
- public void setWindowsContext( WindowsGLContext context ) {
- windowsContext = context;
- }
-
- public WindowsGLDrawable getWindowsDrawable() {
- return( windowsDrawable );
- }
-
- public WindowsGLContext getWindowsContext() {
- return( windowsContext );
- }
-
- public void setWindowThread( Thread thread ) {
- windowThread = thread;
- }
-
- public Thread getWindowThread() {
- return( windowThread );
- }
- }
-
- /*
- * Native HWDN and HDC handles must be created and destroyed on the same
- * thread.
- */
-
- static class NativeWindowThread extends Thread {
- private long HWND = 0;
- private long HDC = 0;
- private Rectangle rectangle;
-
- public NativeWindowThread( Rectangle rect ) {
- rectangle = rect;
- }
-
- public synchronized long getHWND() {
- return( HWND );
- }
-
- public synchronized long getHDC() {
- return( HDC );
- }
-
- public void run() {
- // Create a native window and device context
- synchronized (WindowsGLContextFactory.class) {
- HWND = WGL.CreateDummyWindow( rectangle.x, rectangle.y, rectangle.width, rectangle.height );
- }
- HDC = WGL.GetDC( HWND );
-
- // Start the message pump at shutdown
- WGL.NativeEventLoop();
- }
- }
-
- /*
- * This class is registered with the JVM to destroy all cached redering
- * contexts, device contexts, and window handles.
- */
-
- class ShutdownHook extends Thread {
- public void run() {
- // Collect all saved screen resources
- Collection c = dummyContextMap.values();
- Iterator iter = c.iterator();
- while( iter.hasNext() ) {
- // NativeWindowStruct holds refs to native resources that need to be destroyed
- NativeWindowStruct struct = (NativeWindowStruct)iter.next();
- // Restart native window threads to respond to window closing events
- synchronized( struct.getWindowThread() ) {
- struct.getWindowThread().notifyAll();
- }
- // Destroy OpenGL rendering context
- if( !WGL.wglDeleteContext( struct.getHGLRC() ) ) {
- System.err.println( "Error Destroying NativeWindowStruct RC: " + WGL.GetLastError() );
- }
- // Send context handles to native method for deletion
- WGL.DestroyDummyWindow( struct.getHWND(), struct.getHDC() );
- }
- }
- }
-
-
static String wglGetLastError() {
int err = WGL.GetLastError();
String detail = null;