From e552d800ee9df3761108c044342612c8bda1f304 Mon Sep 17 00:00:00 2001
From: Kenneth Russel <kbrussel@alum.mit.edu>
Date: Fri, 21 Jul 2006 22:34:00 +0000
Subject: Added support for sharing of textures, etc. between GLPbuffers and
 GLJPanels when the Java2D/JOGL bridge is active on Mac OS X. This required
 adding an alternate implementation for pbuffer drawables and contexts on OS X
 which uses CGL rather than the NextStep OpenGL APIs. Tested with advance
 Mustang bits on Mac OS X; Water and HWShadowmapsSimple demos (which use
 pbuffers) are now working within the JRefract harness when the Java2D/JOGL
 bridge is active.

git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/svn-server-sync/jogl/trunk@855 232f8b59-042b-4e1e-8c03-345bb8c30851
---
 .../sun/opengl/impl/macosx/MacOSXGLDrawable.java   | 41 ++++++++++++++++++++--
 1 file changed, 39 insertions(+), 2 deletions(-)

(limited to 'src/classes/com/sun/opengl/impl/macosx/MacOSXGLDrawable.java')

diff --git a/src/classes/com/sun/opengl/impl/macosx/MacOSXGLDrawable.java b/src/classes/com/sun/opengl/impl/macosx/MacOSXGLDrawable.java
index 16f2410de..8a31d4b18 100644
--- a/src/classes/com/sun/opengl/impl/macosx/MacOSXGLDrawable.java
+++ b/src/classes/com/sun/opengl/impl/macosx/MacOSXGLDrawable.java
@@ -45,10 +45,42 @@ import com.sun.opengl.impl.*;
 public abstract class MacOSXGLDrawable extends GLDrawableImpl {
   protected static final boolean DEBUG = Debug.debug("MacOSXGLDrawable");
 
-  protected long nsView; // NSView
   protected GLCapabilities capabilities;
   protected GLCapabilitiesChooser chooser;
   
+  // The Java2D/OpenGL pipeline on OS X uses low-level CGLContextObjs
+  // to represent the contexts for e.g. the Java2D back buffer. When
+  // the Java2D/JOGL bridge is active, this means that if we want to
+  // be able to share textures and display lists with the Java2D
+  // contexts, we need to use the CGL APIs rather than the NSOpenGL
+  // APIs on the JOGL side. For example, if we create a pbuffer using
+  // the NSOpenGL APIs and want to share textures and display lists
+  // between it and the Java2D back buffer, there is no way to do so,
+  // because the Java2D context is actually a CGLContextObj and the
+  // NSOpenGLContext's initWithFormat:shareContext: only accepts an
+  // NSOpenGLContext as its second argument. Of course there is no way
+  // to wrap an NSOpenGLContext around an arbitrary CGLContextObj.
+  //
+  // The situation we care most about is allowing a GLPbuffer to share
+  // textures, etc. with a GLJPanel when the Java2D/JOGL bridge is
+  // active; several of the demos rely on this functionality. We aim
+  // to get there by allowing a GLPBuffer to switch its implementation
+  // between using an NSOpenGLPixelBuffer and a CGLPBufferObj. In
+  // order to track whether this has been done we need to have the
+  // notion of a "mode" of both the MacOSXGLDrawable and the
+  // MacOSXGLContext. Initially the mode is "unspecified", meaning it
+  // leans toward the default (NSOpenGL). If sharing is requested
+  // between either a GLJPanel and a GLPbuffer or a GLCanvas and a
+  // GLPbuffer, the GLPbuffer will be switched into the appropriate
+  // mode: CGL mode for a GLJPanel and NSOpenGL mode for a GLCanvas.
+  // To avoid thrashing we support exactly one such switch during the
+  // lifetime of a given GLPbuffer. This is not a fully general
+  // solution (for example, you can't share textures among a
+  // GLPbuffer, a GLJPanel and a GLCanvas simultaneously) but should
+  // be enough to get things off the ground.
+  public static final int NSOPENGL_MODE = 1;
+  public static final int CGL_MODE      = 2;
+
   public MacOSXGLDrawable(GLCapabilities capabilities,
                           GLCapabilitiesChooser chooser) {
     this.capabilities = (GLCapabilities) capabilities.clone();
@@ -83,11 +115,16 @@ public abstract class MacOSXGLDrawable extends GLDrawableImpl {
     return availableCaps[pixelFormat];
   }
 
+  // Only used for on-screen contexts
   public long getView() {
-    return nsView;
+    return 0;
   }
   
   protected static String getThreadName() {
     return Thread.currentThread().getName();
   }
+
+  // Support for "mode switching" as per above
+  public abstract void setOpenGLMode(int mode);
+  public abstract int  getOpenGLMode();
 }
-- 
cgit v1.2.3