From c225285e09f0a29fca418601bf1aa07cafb54339 Mon Sep 17 00:00:00 2001
From: Sven Gothel <sgothel@jausoft.com>
Date: Wed, 13 Mar 2013 06:35:30 +0100
Subject: Bug 665: Allow re-association of GLContext/GLEventListener to a
 GLDrawable (Part 4)

Note:

  - GLEventListenerState preservs the GLAutoDrawable state,
    i.e. GLContext, all GLEventListener and the GLAnimatorControl association.

  - GLEventListenerState may be utilized to move the state from a dying GLAutoDrawable,
    to be moved to a new created GLAutoDrawable at a later time.

  - GLEventListenerState will be made public soon.

+++

Exessive unit tests cover the new feature, tested manually on GNU/Linux/X11 and OSX(Java6/Java7).

+++

- GLAutoDrawable
  - Change 'setContext(..)' to allow the destruction of the unbound old context:
      'setContext(GLContext newCtx)' -> 'setContext(GLContext newCtx, boolean destroyPrevCtx)'

  - Implementations: Properly implement 'setRealized(..)' incl. obeying threading constraints if exists.
    Method is being utilized at least for GLEventListenerState.moveTo(..)
    to unrealize and realize the drawable resources.

+++

Fix propagation of GLContext/GLDrawable association change (Bottom -> Top):

  GLDrawableImpl.associateContext
      GLContextImpl.associateDrawable
          GLContextImpl.makeCurrent
          GLContextImpl.destroy
          GLContext.setGLDrawable
              ...
              GLDrawableHelper.switchContext
                  GLAutoDrawble.setContext

associateDrawable(..)/associateContext(..) unifies and hence:
    - GLContextImpl.contextRealized() (removed)
    - GLDrawableImpl.contextRealized() (removed)
    - GLDrawableImpl.associateContext(..) (merged)
    - MacOSXCGLContext.drawableChangedNotify(..) (removed)

+++

- EGLUpstreamSurfaceHook.evalUpstreamSurface() validates the surface's device for reusage,
  which is valid in case of GLEventListenerState.moveTo(..)

- MacOSXCGLContext.NSOpenGLImpl: pixelFormat replaces NSOpenGLLayerPfmt and has simplified lifecycle [create..destroy],
  while native NSOpenGLLayer code only holds the reference until released.
---
 .../native/macosx/MacOSXWindowSystemInterface-calayer.m | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

(limited to 'src/jogl/native')

diff --git a/src/jogl/native/macosx/MacOSXWindowSystemInterface-calayer.m b/src/jogl/native/macosx/MacOSXWindowSystemInterface-calayer.m
index 2cf74380c..abc9d7958 100644
--- a/src/jogl/native/macosx/MacOSXWindowSystemInterface-calayer.m
+++ b/src/jogl/native/macosx/MacOSXWindowSystemInterface-calayer.m
@@ -275,7 +275,7 @@ static const GLfloat gl_verts[] = {
     vboBufTexCoord = 0;
     vertAttrLoc = 0;
     texCoordAttrLoc = 0;
-    parentPixelFmt = _parentPixelFmt;
+    parentPixelFmt = [_parentPixelFmt retain]; // until destruction
     swapInterval = 1; // defaults to on (as w/ new GL profiles)
     swapIntervalCounter = 0;
     timespec_now(&lastWaitTime);
@@ -338,13 +338,13 @@ static const GLfloat gl_verts[] = {
 #ifdef VERBOSE_ON
     CGRect lRect = [self bounds];
     if(NULL != pbuffer) {
-        DBG_PRINT("MyNSOpenGLLayer::init (pbuffer) %p, ctx %p, pfmt %p, pbuffer %p, opaque %d, pbuffer %dx%d -> tex %dx%d, bounds: %lf/%lf %lfx%lf (refcnt %d)\n", 
+        DBG_PRINT("MyNSOpenGLLayer::init (pbuffer) %p, ctx %p, pfmt %p, pbuffer %p, opaque %d, pbuffer %dx%d -> tex %dx%d, bounds: %lf/%lf %lfx%lf, displayLink %p (refcnt %d)\n", 
             self, parentCtx, parentPixelFmt, pbuffer, opaque, [pbuffer pixelsWide], [pbuffer pixelsHigh], texWidth, texHeight,
-            lRect.origin.x, lRect.origin.y, lRect.size.width, lRect.size.height, (int)[self retainCount]);
+            lRect.origin.x, lRect.origin.y, lRect.size.width, lRect.size.height, displayLink, (int)[self retainCount]);
     } else {
-        DBG_PRINT("MyNSOpenGLLayer::init (texture) %p, ctx %p, pfmt %p, opaque %d, tex[id %d, %dx%d], bounds: %lf/%lf %lfx%lf (refcnt %d)\n", 
+        DBG_PRINT("MyNSOpenGLLayer::init (texture) %p, ctx %p, pfmt %p, opaque %d, tex[id %d, %dx%d], bounds: %lf/%lf %lfx%lf, displayLink %p (refcnt %d)\n", 
             self, parentCtx, parentPixelFmt, opaque, (int)textureID, texWidth, texHeight,
-            lRect.origin.x, lRect.origin.y, lRect.size.width, lRect.size.height, (int)[self retainCount]);
+            lRect.origin.x, lRect.origin.y, lRect.size.width, lRect.size.height, displayLink, (int)[self retainCount]);
     }
 #endif
     return self;
@@ -498,7 +498,10 @@ static const GLfloat gl_verts[] = {
         myCtx = NULL;
     }
     parentCtx = NULL;
-    [parentPixelFmt release];
+    if( NULL != parentPixelFmt ) {
+        [parentPixelFmt release];
+        parentPixelFmt = NULL;
+    }
     pthread_mutex_unlock(&renderLock);
     [self release];
     DBG_PRINT("MyNSOpenGLLayer::releaseLayer.X: %p\n", self);
@@ -623,7 +626,7 @@ static const GLfloat gl_verts[] = {
 {
     DBG_PRINT("MyNSOpenGLLayer::openGLPixelFormatForDisplayMask: %p (refcnt %d) - parent-pfmt %p -> new-pfmt %p\n", 
         self, (int)[self retainCount], parentPixelFmt, parentPixelFmt);
-    // We simply take over ownership of parent PixelFormat ..
+    // We simply take over ownership of parent PixelFormat until releaseLayer..
     return parentPixelFmt;
 }
 
-- 
cgit v1.2.3