From 36dc4f5ab6957a4078842c488afb51df2fdc0630 Mon Sep 17 00:00:00 2001
From: Sven Gothel <sgothel@jausoft.com>
Date: Fri, 26 Apr 2013 05:38:24 +0200
Subject: Simplify GLDrawableFactory's SharedResource Query Methods; Move
 WindowsWGLDrawableFactory Quirks to GLRendererQuirks
 (NeedCurrCtx4ARBPixFmtQueries, NeedCurrCtx4ARBCreateContext); Bug 706:
 Confine NeedCurrCtx4ARBCreateContext to [Windows, ATI, driver < 12.102.3);
 Avoid possible NPE @ GLContext.getGLVendorVersionNumber()

- Simplify GLDrawableFactory's SharedResource Query Methods
  - Moving common methods to GLDrawableFactory/GLDrawableFactoryImpl
    while reusing common methods to SharedResourceRunner.Resource.
  - All factories SharedResources impl. SharedResourceRunner.Resource.

- Move WindowsWGLDrawableFactory Quirks to GLRendererQuirks (NeedCurrCtx4ARBPixFmtQueries, NeedCurrCtx4ARBCreateContext)
  - For better maintenance, move the mentioned quirks from the windows factory to our common place,
    being detected within GLContextImpl after each context creation.

- Bug 706: Confine NeedCurrCtx4ARBCreateContext to [Windows, ATI, driver < 12.102.3)
  - Before we added this quirk if [Windows, ATI],
    however, we have hopes that the new drivers will suffice for all
    as tested successful on my test machine (AMD Radeon HD 6300M Series, amd_catalyst_13.5_mobility_beta2).

- Avoid possible NPE @ GLContext.getGLVendorVersionNumber()
  - GLContext.getGLVendorVersionNumber() never returns 'null' but a zero version instance instead!
  - Add API doc.

- Use mixed case names in GLContextImpl.setRendererQuirks(..).
---
 .../com/jogamp/opengl/GLRendererQuirks.java        |  48 +++++++-
 src/jogl/classes/javax/media/opengl/GLContext.java |  15 ++-
 .../javax/media/opengl/GLDrawableFactory.java      |   9 +-
 src/jogl/classes/jogamp/opengl/GLContextImpl.java  |  82 +++++++++----
 .../jogamp/opengl/GLDrawableFactoryImpl.java       |  61 +++++++---
 .../classes/jogamp/opengl/GLVersionNumber.java     |   7 +-
 .../jogamp/opengl/SharedResourceRunner.java        |   4 +
 .../jogamp/opengl/egl/EGLDrawableFactory.java      |  84 +++++---------
 .../egl/EGLGraphicsConfigurationFactory.java       |   2 +-
 .../macosx/cgl/MacOSXCGLDrawableFactory.java       |  87 ++++++--------
 .../macosx/cgl/MacOSXCGLGraphicsConfiguration.java |   2 +-
 .../macosx/cgl/MacOSXPbufferCGLDrawable.java       |   2 +-
 .../windows/wgl/WindowsPbufferWGLDrawable.java     |   2 +-
 .../opengl/windows/wgl/WindowsWGLContext.java      |   6 +-
 .../windows/wgl/WindowsWGLDrawableFactory.java     | 129 ++++-----------------
 .../wgl/WindowsWGLGraphicsConfiguration.java       |   3 +-
 .../WindowsWGLGraphicsConfigurationFactory.java    |  21 ++--
 .../jogamp/opengl/x11/glx/X11GLXContext.java       |   2 +-
 .../opengl/x11/glx/X11GLXDrawableFactory.java      |  47 ++------
 .../glx/X11GLXGraphicsConfigurationFactory.java    |   2 +-
 20 files changed, 296 insertions(+), 319 deletions(-)

(limited to 'src')

diff --git a/src/jogl/classes/com/jogamp/opengl/GLRendererQuirks.java b/src/jogl/classes/com/jogamp/opengl/GLRendererQuirks.java
index 4c068414c..01d2b30a0 100644
--- a/src/jogl/classes/com/jogamp/opengl/GLRendererQuirks.java
+++ b/src/jogl/classes/com/jogamp/opengl/GLRendererQuirks.java
@@ -34,6 +34,10 @@ package com.jogamp.opengl;
  * Using centralized quirk identifier enables us to
  * locate code dealing w/ it and hence eases it's maintenance.   
  * </p>
+ * <p>
+ * <i>Some</i> <code>GL_VENDOR</code> and <code>GL_RENDERER</code> strings are
+ * listed here <http://feedback.wildfiregames.com/report/opengl/feature/GL_VENDOR>. 
+ * </p>
  */
 public class GLRendererQuirks {
     /** 
@@ -92,7 +96,7 @@ public class GLRendererQuirks {
      * Drivers known exposing such bug:
      * <ul>
      *   <li>Mesa &lt; 8.0 _with_ X11 software renderer <code>Mesa X11</code>, not with GLX/DRI renderer.</li>
-     *   <li>ATI proprietary Catalyst X11 driver (RENDERER vendor version):
+     *   <li>ATI proprietary Catalyst X11 driver versions:
      *     <ul>
      *       <li>8.78.6</li>
      *       <li>8.881</li>
@@ -111,12 +115,50 @@ public class GLRendererQuirks {
      */
     public static final int DontCloseX11Display = 8;
     
+    /**
+     * Need current GL Context when calling new ARB <i>pixel format query</i> functions, 
+     * otherwise driver crashes the VM.
+     * <p>
+     * Drivers known exposing such bug:
+     * <ul>
+     *   <li>ATI proprietary Catalyst driver on Windows version &le; XP. 
+     *       TODO: Validate if bug actually relates to 'old' ATI Windows drivers for old GPU's like X300
+     *             regardless of the Windows version.</li>
+     * </ul>
+     * <p>
+     * See Bug 480 - https://jogamp.org/bugzilla/show_bug.cgi?id=480
+     * </p>
+     */
+    public static final int NeedCurrCtx4ARBPixFmtQueries = 9;
+    
+    /**
+     * Need current GL Context when calling new ARB <i>CreateContext</i> function,
+     * otherwise driver crashes the VM.
+     * <p>
+     * Drivers known exposing such bug:
+     * <ul>
+     *   <li>ATI proprietary Catalyst Windows driver on laptops with a driver version as reported in <i>GL_VERSION</i>:
+     *     <ul>
+     *       <li> <i>null</i> </li>
+     *       <li> &lt; <code>12.102.3.0</code> ( <i>amd_catalyst_13.5_mobility_beta2</i> ) </li>
+     *     </ul></li>
+     * </ul>
+     * </p>
+     * <p>
+     * See Bug 706 - https://jogamp.org/bugzilla/show_bug.cgi?id=706<br/>
+     * See Bug 520 - https://jogamp.org/bugzilla/show_bug.cgi?id=520
+     * </p>
+     */
+    public static final int NeedCurrCtx4ARBCreateContext = 10;
+    
+    
     /** Number of quirks known. */
-    public static final int COUNT = 9;
+    public static final int COUNT = 11;
     
     private static final String[] _names = new String[] { "NoDoubleBufferedPBuffer", "NoDoubleBufferedBitmap", "NoSetSwapInterval",
                                                           "NoOffscreenBitmap", "NoSetSwapIntervalPostRetarget", "GLSLBuggyDiscard",
-                                                          "GLNonCompliant", "GLFlushBeforeRelease", "DontCloseX11Display"
+                                                          "GLNonCompliant", "GLFlushBeforeRelease", "DontCloseX11Display",
+                                                          "NeedCurrCtx4ARBPixFmtQueries", "NeedCurrCtx4ARBCreateContext"
                                                         };
 
     private final int _bitmask;
diff --git a/src/jogl/classes/javax/media/opengl/GLContext.java b/src/jogl/classes/javax/media/opengl/GLContext.java
index d26076344..f303c5b1c 100644
--- a/src/jogl/classes/javax/media/opengl/GLContext.java
+++ b/src/jogl/classes/javax/media/opengl/GLContext.java
@@ -176,7 +176,6 @@ public abstract class GLContext {
   protected VersionNumber ctxGLSLVersion;
   private int currentSwapInterval;
   protected GLRendererQuirks glRendererQuirks;
-  private static final VersionNumberString nullVersion = new VersionNumberString(-1, -1, -1, "n/a");
 
   /** Did the drawable association changed ? see {@link GLRendererQuirks#NoSetSwapIntervalPostRetarget} */ 
   protected boolean drawableRetargeted; 
@@ -186,8 +185,8 @@ public abstract class GLContext {
         System.err.println(getThreadName() + ": GLContext.resetStates()");
         // Thread.dumpStack();
       }
-      ctxVersion = nullVersion;
-      ctxVendorVersion = nullVersion;
+      ctxVersion = VersionNumberString.zeroVersion;
+      ctxVendorVersion = VersionNumberString.zeroVersion;
       ctxOptions=0;
       ctxVersionString=null;
       ctxGLSLVersion=null;
@@ -668,6 +667,16 @@ public abstract class GLContext {
    * @see #getGLSLVersionNumber() 
    **/
   public final VersionNumber getGLVersionNumber() { return ctxVersion; }
+  /** 
+   * Returns the vendor's version, i.e. version number at the end of <code>GL_VERSION</code> not being the GL version.
+   * <p>
+   * In case no such version exists within <code>GL_VERSION</code>, 
+   * the {@link VersionNumberString#zeroVersion zero version} instance is being returned.
+   * </p> 
+   * <p>
+   * The vendor's version is usually the vendor's OpenGL driver version.
+   * </p>
+   */
   public final VersionNumberString getGLVendorVersionNumber() { return ctxVendorVersion; }
   public final boolean isGLCompatibilityProfile() { return ( 0 != ( CTX_PROFILE_COMPAT & ctxOptions ) ); }
   public final boolean isGLCoreProfile()          { return ( 0 != ( CTX_PROFILE_CORE   & ctxOptions ) ); }
diff --git a/src/jogl/classes/javax/media/opengl/GLDrawableFactory.java b/src/jogl/classes/javax/media/opengl/GLDrawableFactory.java
index 9feb54a46..dbf6df0de 100644
--- a/src/jogl/classes/javax/media/opengl/GLDrawableFactory.java
+++ b/src/jogl/classes/javax/media/opengl/GLDrawableFactory.java
@@ -285,7 +285,7 @@ public abstract class GLDrawableFactory {
       if(null==device) {
           device = getDefaultDevice();
           if(null==device) {
-              throw new InternalError("no default device");
+              throw new InternalError("no default device available");
           }
           if (GLProfile.DEBUG) {
               System.err.println("Info: "+getClass().getSimpleName()+".validateDevice: using default device : "+device);
@@ -322,7 +322,10 @@ public abstract class GLDrawableFactory {
    * @param device which {@link javax.media.nativewindow.AbstractGraphicsDevice#getConnection() connection} denotes the shared the target device, may be <code>null</code> for the platform's default device.
    * @return true if a shared resource could been created, otherwise false. 
    */
-  protected abstract boolean createSharedResource(AbstractGraphicsDevice device);
+  protected final boolean createSharedResource(AbstractGraphicsDevice device) {
+      return createSharedResourceImpl(device);
+  }  
+  protected abstract boolean createSharedResourceImpl(AbstractGraphicsDevice device);
   
   /**
    * Returns true if the <code>quirk</code> exist in the shared resource's context {@link GLRendererQuirks}.
@@ -419,7 +422,7 @@ public abstract class GLDrawableFactory {
   public final List<GLCapabilitiesImmutable> getAvailableCapabilities(AbstractGraphicsDevice device) {
       device = validateDevice(device);
       if(null!=device) {
-        return getAvailableCapabilitiesImpl(device);
+          return getAvailableCapabilitiesImpl(device);
       }
       return null;
   }
diff --git a/src/jogl/classes/jogamp/opengl/GLContextImpl.java b/src/jogl/classes/jogamp/opengl/GLContextImpl.java
index 66e3efc4d..1b8b0316c 100644
--- a/src/jogl/classes/jogamp/opengl/GLContextImpl.java
+++ b/src/jogl/classes/jogamp/opengl/GLContextImpl.java
@@ -90,6 +90,7 @@ public abstract class GLContextImpl extends GLContext {
   // OpenGL functions.
   private ProcAddressTable glProcAddressTable;
 
+  private String glVendor;
   private String glRenderer;
   private String glRendererLowerCase;
   private String glVersion;
@@ -165,8 +166,10 @@ public abstract class GLContextImpl extends GLContext {
       contextFQN = null;
       additionalCtxCreationFlags = 0;
 
-      glRenderer = "";
-      glRendererLowerCase = glRenderer;       
+      glVendor = "";
+      glRenderer = glVendor;
+      glRendererLowerCase = glRenderer;
+      glVersion = glVendor;
       
       if (boundFBOTarget != null) { // <init>
           boundFBOTarget[0] = 0; // draw
@@ -1152,6 +1155,16 @@ public abstract class GLContextImpl extends GLContext {
         }
         return false;
     } else {
+        final String _glVendor = glGetStringInt(GL.GL_VENDOR, _glGetString);
+        if(null == _glVendor) {
+            if(DEBUG) {
+                System.err.println("Warning: GL_VENDOR is NULL.");
+                Thread.dumpStack();
+            }
+            return false;
+        }
+        glVendor = _glVendor;
+        
         final String _glRenderer = glGetStringInt(GL.GL_RENDERER, _glGetString);
         if(null == _glRenderer) {
             if(DEBUG) {
@@ -1173,6 +1186,7 @@ public abstract class GLContextImpl extends GLContext {
             return false;
         }
         glVersion = _glVersion;
+        
         return true;
     }
   }
@@ -1389,7 +1403,7 @@ public abstract class GLContextImpl extends GLContext {
     
     final VersionNumberString vendorVersion = GLVersionNumber.createVendorVersion(glVersion);
     
-    setRendererQuirks(major, minor, ctxProfileBits, vendorVersion);
+    setRendererQuirks(adevice, major, minor, ctxProfileBits, vendorVersion);
     
     if( strictMatch && glRendererQuirks.exist(GLRendererQuirks.GLNonCompliant) ) {
         if(DEBUG) {
@@ -1486,13 +1500,16 @@ public abstract class GLContextImpl extends GLContext {
     return true;
   }
   
-  private final void setRendererQuirks(int major, int minor, int ctp, VersionNumberString vendorVersion) {
+  private final void setRendererQuirks(final AbstractGraphicsDevice adevice, int major, int minor, int ctp, final VersionNumberString vendorVersion) {
     int[] quirks = new int[GLRendererQuirks.COUNT];
     int i = 0;
     
+    final String MesaSP = "Mesa ";
     final boolean hwAccel = 0 == ( ctp & GLContext.CTX_IMPL_ACCEL_SOFT );
     final boolean compatCtx = 0 != ( ctp & GLContext.CTX_PROFILE_COMPAT );
-    
+    final boolean isDriverMesa = glRenderer.contains(MesaSP) || glRenderer.contains("Gallium ");
+    final boolean isDriverATICatalyst = !isDriverMesa && ( glVendor.contains("ATI Technologies") || glRenderer.startsWith("ATI ") );
+    final boolean isDriverNVIDIAGeForce = !isDriverMesa && ( glVendor.contains("NVIDIA Corporation") || glRenderer.contains("NVIDIA ") );
     //
     // OS related quirks
     //
@@ -1509,28 +1526,51 @@ public abstract class GLContextImpl extends GLContext {
         }
         
         final VersionNumber OSXVersion173 = new VersionNumber(1,7,3);
-        if( Platform.getOSVersionNumber().compareTo(OSXVersion173) < 0 && glRendererLowerCase.contains("nvidia") ) {
+        if( Platform.getOSVersionNumber().compareTo(OSXVersion173) < 0 && isDriverNVIDIAGeForce ) {
             final int quirk = GLRendererQuirks.GLFlushBeforeRelease;
             if(DEBUG) {
                 System.err.println("Quirk: "+GLRendererQuirks.toString(quirk)+": cause: OS "+Platform.getOSType()+", OS Version "+Platform.getOSVersionNumber()+", Renderer "+glRenderer);
             }
             quirks[i++] = quirk;
         }
-    } else if( Platform.getOSType() == Platform.OSType.WINDOWS ) {
+    } else if( Platform.getOSType() == Platform.OSType.WINDOWS ) {        
         //
         // WINDOWS
         //
-        final int quirk = GLRendererQuirks.NoDoubleBufferedBitmap;
-        if(DEBUG) {
-            System.err.println("Quirk: "+GLRendererQuirks.toString(quirk)+": cause: OS "+Platform.getOSType());
+        {
+            final int quirk = GLRendererQuirks.NoDoubleBufferedBitmap;
+            if(DEBUG) {
+                System.err.println("Quirk: "+GLRendererQuirks.toString(quirk)+": cause: OS "+Platform.getOSType());
+            }
+            quirks[i++] = quirk;
+        }
+        
+        if( isDriverATICatalyst ) {
+            final VersionNumber winXPVersionNumber = new VersionNumber ( 5, 1, 0);          
+            final VersionNumber amdSafeMobilityVersion = new VersionNumber(12, 102, 3);  
+            
+            if ( vendorVersion.compareTo(amdSafeMobilityVersion) < 0 ) { // includes: vendorVersion.isZero()
+                final int quirk = GLRendererQuirks.NeedCurrCtx4ARBCreateContext;
+                if(DEBUG) {
+                    System.err.println("Quirk: "+GLRendererQuirks.toString(quirk)+": cause: OS "+Platform.getOSType()+", [Vendor "+glVendor+" or Renderer "+glRenderer+"], driverVersion "+vendorVersion);
+                }
+                quirks[i++] = quirk;                
+            }
+            
+            if( Platform.getOSVersionNumber().compareTo(winXPVersionNumber) <= 0 ) {
+                final int quirk = GLRendererQuirks.NeedCurrCtx4ARBPixFmtQueries;
+                if(DEBUG) {
+                    System.err.println("Quirk: "+GLRendererQuirks.toString(quirk)+": cause: OS-Version "+Platform.getOSType()+" "+Platform.getOSVersionNumber()+", [Vendor "+glVendor+" or Renderer "+glRenderer+"]");
+                }
+                quirks[i++] = quirk;                
+            }
         }
-        quirks[i++] = quirk;
     } else if( Platform.OSType.ANDROID == Platform.getOSType() ) {    
         //
         // ANDROID
         //
         // Renderer related quirks, may also involve OS
-        if( glRendererLowerCase.contains("powervr") ) {
+        if( glRenderer.contains("PowerVR") ) {
             final int quirk = GLRendererQuirks.NoSetSwapInterval;
             if(DEBUG) {
                 System.err.println("Quirk: "+GLRendererQuirks.toString(quirk)+": cause: OS "+Platform.getOSType() + " / Renderer " + glRenderer);
@@ -1542,7 +1582,7 @@ public abstract class GLContextImpl extends GLContext {
     //
     // RENDERER related quirks
     //
-    if( glRendererLowerCase.contains("mesa") || glRendererLowerCase.contains("gallium") ) {
+    if( isDriverMesa ) {
         {
             final int quirk = GLRendererQuirks.NoSetSwapIntervalPostRetarget;
             if(DEBUG) {
@@ -1550,7 +1590,7 @@ public abstract class GLContextImpl extends GLContext {
             }
             quirks[i++] = quirk;
         }
-        if( hwAccel /* glRendererLowerCase.contains("intel(r)") || glRendererLowerCase.contains("amd") */ )
+        if( hwAccel /* glRenderer.contains("Intel(R)") || glRenderer.contains("AMD ") */ )
         {
             final int quirk = GLRendererQuirks.NoDoubleBufferedPBuffer;
             if(DEBUG) {
@@ -1558,7 +1598,7 @@ public abstract class GLContextImpl extends GLContext {
             }
             quirks[i++] = quirk;
         }
-        if( glRendererLowerCase.contains("intel(r)") && compatCtx && ( major>3 || major==3 && minor>=1 ) )
+        if( glRenderer.contains("Intel(R)") && compatCtx && ( major>3 || major==3 && minor>=1 ) )
         {
             // FIXME: Apply vendor version constraints!
             final int quirk = GLRendererQuirks.GLNonCompliant;
@@ -1574,14 +1614,14 @@ public abstract class GLContextImpl extends GLContext {
     //
     if( NativeWindowFactory.TYPE_X11 == NativeWindowFactory.getNativeWindowType(true) ) {
         final int quirk = GLRendererQuirks.DontCloseX11Display;
-        if( glRendererLowerCase.contains("mesa") ) {
-            if ( glRendererLowerCase.contains("x11") && vendorVersion.compareTo(Version80) < 0 ) {
+        if( glRenderer.contains(MesaSP) ) {
+            if ( glRenderer.contains("X11") && vendorVersion.compareTo(Version80) < 0 ) {
                 if(DEBUG) {
                     System.err.println("Quirk: "+GLRendererQuirks.toString(quirk)+": cause: X11 Renderer=" + glRenderer + ", Version=[vendor " + vendorVersion + ", GL " + glVersion+"]");
                 }
                 quirks[i++] = quirk;
         	}
-        } else if( glRendererLowerCase.contains("ati technologies") || glRendererLowerCase.startsWith("ati ") ) {
+        } else if( isDriverATICatalyst ) {
             {
                 if(DEBUG) {
                     System.err.println("Quirk: "+GLRendererQuirks.toString(quirk)+": cause: X11 Renderer=" + glRenderer);
@@ -1597,7 +1637,7 @@ public abstract class GLContextImpl extends GLContext {
             }
         }
     }
-
+    
     glRendererQuirks = new GLRendererQuirks(quirks, 0, i);
   }
     
@@ -1652,8 +1692,8 @@ public abstract class GLContextImpl extends GLContext {
     if(!drawable.getChosenGLCapabilities().getHardwareAccelerated()) {
         isHardwareRasterizer = false;
     } else {
-        isHardwareRasterizer = ! ( glRendererLowerCase.contains("software") /* Mesa3D */  ||
-                                   glRendererLowerCase.contains("mesa x11") /* Mesa3D*/   ||
+        isHardwareRasterizer = ! ( glRendererLowerCase.contains("software") /* Mesa3D  */ ||
+                                   glRendererLowerCase.contains("mesa x11") /* Mesa3D  */ ||
                                    glRendererLowerCase.contains("softpipe") /* Gallium */ ||
                                    glRendererLowerCase.contains("llvmpipe") /* Gallium */
                                  );
diff --git a/src/jogl/classes/jogamp/opengl/GLDrawableFactoryImpl.java b/src/jogl/classes/jogamp/opengl/GLDrawableFactoryImpl.java
index 26b1975ba..06e856d41 100644
--- a/src/jogl/classes/jogamp/opengl/GLDrawableFactoryImpl.java
+++ b/src/jogl/classes/jogamp/opengl/GLDrawableFactoryImpl.java
@@ -80,30 +80,61 @@ public abstract class GLDrawableFactoryImpl extends GLDrawableFactory {
     super();
   }
 
-  @Override
-  public GLRendererQuirks getRendererQuirks(AbstractGraphicsDevice device) {
-      final GLContext ctx = getOrCreateSharedContextImpl(device);
-      if(null != ctx) {
-          return ctx.getRendererQuirks();
+  /**
+   * Returns the shared resource mapped to the <code>device</code> {@link AbstractGraphicsDevice#getConnection()},
+   * either a pre-existing or newly created, or <code>null</code> if creation failed or not supported.<br>
+   * Creation of the shared resource is tried only once.
+   *
+   * @param device which {@link javax.media.nativewindow.AbstractGraphicsDevice#getConnection() connection} denotes the shared the target device, may be <code>null</code> for the platform's default device.
+   */
+  protected final SharedResourceRunner.Resource getOrCreateSharedResource(AbstractGraphicsDevice device) {
+      try {
+          device = validateDevice(device);
+          if( null != device) {
+              return getOrCreateSharedResourceImpl( device );
+          }
+      } catch (GLException gle) {
+          if(DEBUG) {
+              System.err.println("Catched Exception on thread "+getThreadName()); 
+              gle.printStackTrace();
+          }
       }
       return null;
   }
-
+  protected abstract SharedResourceRunner.Resource getOrCreateSharedResourceImpl(AbstractGraphicsDevice device);
+  
   /**
    * Returns the shared context mapped to the <code>device</code> {@link AbstractGraphicsDevice#getConnection()},
-   * either a pre-existing or newly created, or <code>null</code> if creation failed or not supported.<br>
+   * either a pre-existing or newly created, or <code>null</code> if creation failed or <b>not supported</b>.<br>
    * Creation of the shared context is tried only once.
    *
    * @param device which {@link javax.media.nativewindow.AbstractGraphicsDevice#getConnection() connection} denotes the shared the target device, may be <code>null</code> for the platform's default device.
    */
   public final GLContext getOrCreateSharedContext(AbstractGraphicsDevice device) {
-      device = validateDevice(device);
-      if(null!=device) {
-        return getOrCreateSharedContextImpl(device);
+      final SharedResourceRunner.Resource sr = getOrCreateSharedResource( device );
+      if(null!=sr) {
+        return sr.getContext();
+      }
+      return null;
+  }
+
+  @Override
+  protected final boolean createSharedResourceImpl(AbstractGraphicsDevice device) {
+      final SharedResourceRunner.Resource sr = getOrCreateSharedResource( device );
+      if(null!=sr) {
+          return sr.isValid();
+      }
+      return false;
+  }
+
+  @Override
+  public final GLRendererQuirks getRendererQuirks(AbstractGraphicsDevice device) {
+      final SharedResourceRunner.Resource sr = getOrCreateSharedResource( device );
+      if(null!=sr) {
+          return sr.getRendererQuirks();
       }
       return null;
   }
-  protected abstract GLContext getOrCreateSharedContextImpl(AbstractGraphicsDevice device);
 
   /**
    * Returns the shared device mapped to the <code>device</code> {@link AbstractGraphicsDevice#getConnection()},
@@ -113,15 +144,13 @@ public abstract class GLDrawableFactoryImpl extends GLDrawableFactory {
    * @param device which {@link javax.media.nativewindow.AbstractGraphicsDevice#getConnection() connection} denotes the shared device to be used, may be <code>null</code> for the platform's default device.
    */
   protected final AbstractGraphicsDevice getOrCreateSharedDevice(AbstractGraphicsDevice device) {
-      device = validateDevice(device);
-      if( null != device) {
-          return getOrCreateSharedDeviceImpl(device);
+      final SharedResourceRunner.Resource sr = getOrCreateSharedResource( device );
+      if(null!=sr) {
+        return sr.getDevice();
       }
       return null;
   }
-  protected abstract AbstractGraphicsDevice getOrCreateSharedDeviceImpl(AbstractGraphicsDevice device);
 
-  
   /**
    * Returns the GLDynamicLookupHelper
    * @param profile if EGL/ES, profile <code>1</code> refers to ES1 and <code>2</code> to ES2,
diff --git a/src/jogl/classes/jogamp/opengl/GLVersionNumber.java b/src/jogl/classes/jogamp/opengl/GLVersionNumber.java
index 1784cd772..990698667 100644
--- a/src/jogl/classes/jogamp/opengl/GLVersionNumber.java
+++ b/src/jogl/classes/jogamp/opengl/GLVersionNumber.java
@@ -128,12 +128,13 @@ class GLVersionNumber extends VersionNumberString {
     
     /** 
      * Returns the optional vendor version at the end of the 
-     * <code>GL_VERSION</code> string if exists, otherwise <code>null</code>.
+     * <code>GL_VERSION</code> string if exists, otherwise the {@link VersionNumberString#zeroVersion zero version} instance.
      * <pre>
      *   2.1 Mesa 7.0.3-rc2 -> 7.0.3 (7.0.3-rc2)
      *   4.2.12171 Compatibility Profile Context 9.01.8 -> 9.1.8 (9.01.8)
+     *   4.2.12198 Compatibility Profile Context 12.102.3.0 -> 12.102.3 (12.102.3.0)
      *   4.3.0 NVIDIA 310.32 -> 310.32 (310.32)
-     * </pre> 
+     * </pre>
      */
     public static final VersionNumberString createVendorVersion(String versionString) {
         if (versionString == null || versionString.length() <= 0) {
@@ -152,6 +153,6 @@ class GLVersionNumber extends VersionNumberString {
                 return version;
             }
         }
-        return null;
+        return VersionNumberString.zeroVersion;
     }
 }
diff --git a/src/jogl/classes/jogamp/opengl/SharedResourceRunner.java b/src/jogl/classes/jogamp/opengl/SharedResourceRunner.java
index 91187cc26..f454904a2 100644
--- a/src/jogl/classes/jogamp/opengl/SharedResourceRunner.java
+++ b/src/jogl/classes/jogamp/opengl/SharedResourceRunner.java
@@ -33,14 +33,18 @@ import java.util.Iterator;
 import javax.media.nativewindow.AbstractGraphicsDevice;
 import javax.media.nativewindow.AbstractGraphicsScreen;
 
+import com.jogamp.opengl.GLRendererQuirks;
+
 public class SharedResourceRunner implements Runnable {
     protected static final boolean DEBUG = GLDrawableImpl.DEBUG;
 
     public static interface Resource {
+      boolean isValid();
       AbstractGraphicsDevice getDevice();
       AbstractGraphicsScreen getScreen();
       GLDrawableImpl getDrawable();
       GLContextImpl getContext();
+      GLRendererQuirks getRendererQuirks();
     }
 
     public static interface Implementation {
diff --git a/src/jogl/classes/jogamp/opengl/egl/EGLDrawableFactory.java b/src/jogl/classes/jogamp/opengl/egl/EGLDrawableFactory.java
index 431de5159..adb78b3b9 100644
--- a/src/jogl/classes/jogamp/opengl/egl/EGLDrawableFactory.java
+++ b/src/jogl/classes/jogamp/opengl/egl/EGLDrawableFactory.java
@@ -67,10 +67,12 @@ import javax.media.opengl.GLProfile;
 
 import jogamp.nativewindow.WrappedSurface;
 import jogamp.opengl.Debug;
+import jogamp.opengl.GLContextImpl;
 import jogamp.opengl.GLDrawableFactoryImpl;
 import jogamp.opengl.GLDrawableImpl;
 import jogamp.opengl.GLDynamicLookupHelper;
 import jogamp.opengl.GLGraphicsConfigurationUtil;
+import jogamp.opengl.SharedResourceRunner;
 
 import com.jogamp.common.nio.Buffers;
 import com.jogamp.common.nio.PointerBuffer;
@@ -251,8 +253,8 @@ public class EGLDrawableFactory extends GLDrawableFactoryImpl {
                 String key = keyI.next();
                 SharedResource sr = sharedMap.get(key);
                 System.err.println("EGLDrawableFactory.map["+i+"] "+key+" -> "+sr.getDevice()+", "+
-                                   "es1 [avail "+sr.wasES1ContextAvailable()+", pbuffer "+sr.hasES1PBuffer()+", quirks "+sr.getGLRendererQuirksES1()+", ctp "+EGLContext.getGLVersion(1, 0, sr.getCtpES1(), null)+"], "+
-                                   "es2 [avail "+sr.wasES2ContextAvailable()+", pbuffer "+sr.hasES2PBuffer()+", quirks "+sr.getGLRendererQuirksES1()+", ctp "+EGLContext.getGLVersion(2, 0, sr.getCtpES2(), null)+"]");
+                                   "es1 [avail "+sr.wasES1ContextCreated+", pbuffer "+sr.hasPBufferES1+", quirks "+sr.rendererQuirksES1+", ctp "+EGLContext.getGLVersion(1, 0, sr.ctpES1, null)+"], "+
+                                   "es2 [avail "+sr.wasES2ContextCreated+", pbuffer "+sr.hasPBufferES2+", quirks "+sr.rendererQuirksES2+", ctp "+EGLContext.getGLVersion(2, 0, sr.ctpES2, null)+"]");
             }
             ;
         }
@@ -265,7 +267,7 @@ public class EGLDrawableFactory extends GLDrawableFactoryImpl {
     private boolean isANGLE = false;
     private boolean hasX11 = false;
 
-    static class SharedResource {
+    static class SharedResource implements SharedResourceRunner.Resource {
       private final EGLGraphicsDevice device;
       // private final EGLContext contextES1;
       // private final EGLContext contextES2;
@@ -293,17 +295,31 @@ public class EGLDrawableFactory extends GLDrawableFactoryImpl {
           this.hasPBufferES1= hasPBufferES1;
           this.hasPBufferES2= hasPBufferES2;
       }
-      final EGLGraphicsDevice getDevice() { return device; }
+      @Override
+      public final boolean isValid() {
+          return wasES1ContextCreated || wasES2ContextCreated;
+      }
+      @Override
+      public final EGLGraphicsDevice getDevice() { return device; }
       // final EGLContext getContextES1() { return contextES1; }
       // final EGLContext getContextES2() { return contextES2; }
-      final GLRendererQuirks getGLRendererQuirksES1() { return rendererQuirksES1; }
-      final GLRendererQuirks getGLRendererQuirksES2() { return rendererQuirksES2; }
-      final int getCtpES1() { return ctpES1; }
-      final int getCtpES2() { return ctpES2; }
-      final boolean wasES1ContextAvailable() { return wasES1ContextCreated; }
-      final boolean wasES2ContextAvailable() { return wasES2ContextCreated; }
-      final boolean hasES1PBuffer() { return hasPBufferES1; }
-      final boolean hasES2PBuffer() { return hasPBufferES2; }
+      
+      @Override
+      public AbstractGraphicsScreen getScreen() {
+          return null;
+      }
+      @Override
+      public GLDrawableImpl getDrawable() {
+          return null;
+      }
+      @Override
+      public GLContextImpl getContext() {
+          return null;
+      }
+      @Override
+      public GLRendererQuirks getRendererQuirks() {
+          return null != rendererQuirksES2 ? rendererQuirksES2 : rendererQuirksES1 ;      
+      }
     }
 
     @Override
@@ -504,7 +520,8 @@ public class EGLDrawableFactory extends GLDrawableFactoryImpl {
         }        
     }
     
-    /* package */ SharedResource getOrCreateEGLSharedResource(AbstractGraphicsDevice adevice) {
+    @Override
+    protected final SharedResource getOrCreateSharedResourceImpl(AbstractGraphicsDevice adevice) {
         if(null == sharedMap) { // null == eglES1DynamicLookupHelper && null == eglES2DynamicLookupHelper
             return null;
         }
@@ -600,46 +617,7 @@ public class EGLDrawableFactory extends GLDrawableFactoryImpl {
         return null;
     }
 
-    @Override
-    protected final boolean createSharedResource(AbstractGraphicsDevice device) {
-        try {
-            SharedResource sr = getOrCreateEGLSharedResource(device);
-            if(null!=sr) {
-                return sr.wasES1ContextAvailable() || sr.wasES2ContextAvailable();
-            }
-        } catch (GLException gle) {
-            if(DEBUG) {
-                System.err.println("Catched Exception on thread "+getThreadName()); 
-                gle.printStackTrace();
-            }
-        }
-        return false;
-    }
-
-    @Override
-    protected final GLContext getOrCreateSharedContextImpl(AbstractGraphicsDevice device) {
-        return null; // FIXME: n/a ..
-    }
-    
-    @Override
-    public GLRendererQuirks getRendererQuirks(AbstractGraphicsDevice device) {
-        SharedResource sr = getOrCreateEGLSharedResource(device);
-        if(null!=sr) {
-            return null != sr.getGLRendererQuirksES2() ? sr.getGLRendererQuirksES2() : sr.getGLRendererQuirksES1() ; 
-        }
-        return null;
-    }
-    
-    @Override
-    protected AbstractGraphicsDevice getOrCreateSharedDeviceImpl(AbstractGraphicsDevice device) {
-        SharedResource sr = getOrCreateEGLSharedResource(device);
-        if(null!=sr) {
-            return sr.getDevice();
-        }
-        return null;
-    }
-
-    public boolean isANGLE() {
+    public final boolean isANGLE() {
         return isANGLE;
     }
 
diff --git a/src/jogl/classes/jogamp/opengl/egl/EGLGraphicsConfigurationFactory.java b/src/jogl/classes/jogamp/opengl/egl/EGLGraphicsConfigurationFactory.java
index 7e1f8a5a2..b44e08500 100644
--- a/src/jogl/classes/jogamp/opengl/egl/EGLGraphicsConfigurationFactory.java
+++ b/src/jogl/classes/jogamp/opengl/egl/EGLGraphicsConfigurationFactory.java
@@ -181,7 +181,7 @@ public class EGLGraphicsConfigurationFactory extends GLGraphicsConfigurationFact
     }
 
     protected static List<GLCapabilitiesImmutable> getAvailableCapabilities(EGLDrawableFactory factory, AbstractGraphicsDevice device) {
-        EGLDrawableFactory.SharedResource sharedResource = factory.getOrCreateEGLSharedResource(device);
+        EGLDrawableFactory.SharedResource sharedResource = factory.getOrCreateSharedResourceImpl(device);
         if(null == sharedResource) {
             throw new GLException("Shared resource for device n/a: "+device);
         }
diff --git a/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXCGLDrawableFactory.java b/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXCGLDrawableFactory.java
index 39178290a..c9402b33d 100644
--- a/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXCGLDrawableFactory.java
+++ b/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXCGLDrawableFactory.java
@@ -64,10 +64,12 @@ import javax.media.opengl.GLProfile;
 import jogamp.nativewindow.WrappedSurface;
 import jogamp.nativewindow.macosx.OSXDummyUpstreamSurfaceHook;
 import jogamp.opengl.DesktopGLDynamicLookupHelper;
+import jogamp.opengl.GLContextImpl;
 import jogamp.opengl.GLDrawableFactoryImpl;
 import jogamp.opengl.GLDrawableImpl;
 import jogamp.opengl.GLDynamicLookupHelper;
 import jogamp.opengl.GLGraphicsConfigurationUtil;
+import jogamp.opengl.SharedResourceRunner;
 
 import com.jogamp.common.nio.Buffers;
 import com.jogamp.common.util.ReflectionUtil;
@@ -146,35 +148,54 @@ public class MacOSXCGLDrawableFactory extends GLDrawableFactoryImpl {
   private HashMap<String, SharedResource> sharedMap = new HashMap<String, SharedResource>();
   private MacOSXGraphicsDevice defaultDevice;
 
-  static class SharedResource {
+  static class SharedResource implements SharedResourceRunner.Resource {
       // private MacOSXCGLDrawable drawable;
       // private MacOSXCGLContext context;
       private GLRendererQuirks glRendererQuirks;
       MacOSXGraphicsDevice device;
-      boolean wasContextCreated;
+      boolean valid;
       boolean hasNPOTTextures;
       boolean hasRECTTextures;
       boolean hasAppleFloatPixels;
 
-      SharedResource(MacOSXGraphicsDevice device, boolean wasContextCreated,
+      SharedResource(MacOSXGraphicsDevice device, boolean valid,
                      boolean hasNPOTTextures, boolean hasRECTTextures, boolean hasAppletFloatPixels
                      /* MacOSXCGLDrawable draw, MacOSXCGLContext ctx */, GLRendererQuirks glRendererQuirks) {
           // drawable = draw;
           // this.context = ctx;
           this.glRendererQuirks = glRendererQuirks;
           this.device = device;
-          this.wasContextCreated = wasContextCreated;
+          this.valid = valid;
           this.hasNPOTTextures = hasNPOTTextures;
           this.hasRECTTextures = hasRECTTextures;
           this.hasAppleFloatPixels = hasAppletFloatPixels;
       }
-      final MacOSXGraphicsDevice getDevice() { return device; }
+      @Override
+      public final boolean isValid() {
+          return valid;
+      }
+      @Override
+      public final MacOSXGraphicsDevice getDevice() { return device; }
       // final MacOSXCGLContext getContext() { return context; }
-      final GLRendererQuirks getGLRendererQuirks() { return glRendererQuirks; }
-      final boolean wasContextAvailable() { return wasContextCreated; }
       final boolean isNPOTTextureAvailable() { return hasNPOTTextures; }
       final boolean isRECTTextureAvailable() { return hasRECTTextures; }
       final boolean isAppleFloatPixelsAvailable() { return hasAppleFloatPixels; }
+      @Override
+      public final AbstractGraphicsScreen getScreen() {
+          return null;
+      }
+      @Override
+      public final GLDrawableImpl getDrawable() {
+          return null;
+      }
+      @Override
+      public GLContextImpl getContext() {
+          return null;
+      }
+      @Override
+      public GLRendererQuirks getRendererQuirks() {
+          return glRendererQuirks;      
+      }
   }
 
   @Override
@@ -208,7 +229,7 @@ public class MacOSXCGLDrawableFactory extends GLDrawableFactoryImpl {
       }
   }
 
-  /* package */ SharedResource getOrCreateOSXSharedResource(AbstractGraphicsDevice adevice) {
+  protected final SharedResource getOrCreateSharedResourceImpl(AbstractGraphicsDevice adevice) {
     final String connection = adevice.getConnection();
     SharedResource sr;
     synchronized(sharedMap) {
@@ -218,7 +239,7 @@ public class MacOSXCGLDrawableFactory extends GLDrawableFactoryImpl {
         addDeviceTried(connection);
         final MacOSXGraphicsDevice sharedDevice = new MacOSXGraphicsDevice(adevice.getUnitID());
         GLRendererQuirks glRendererQuirks = null;
-        boolean madeCurrent = false;
+        boolean isValid = false;
         boolean hasNPOTTextures = false;
         boolean hasRECTTextures = false;
         boolean hasAppleFloatPixels = false;
@@ -238,8 +259,8 @@ public class MacOSXCGLDrawableFactory extends GLDrawableFactoryImpl {
             
             try {
                 sharedContext.makeCurrent(); // could cause exception
-                madeCurrent = sharedContext.isCurrent();
-                if(madeCurrent) {
+                isValid = sharedContext.isCurrent();
+                if(isValid) {
                     GL gl = sharedContext.getGL();
                     hasNPOTTextures = gl.isNPOTTextureAvailable();
                     hasRECTTextures = gl.isExtensionAvailable(GLExtensions.EXT_texture_rectangle);
@@ -263,14 +284,14 @@ public class MacOSXCGLDrawableFactory extends GLDrawableFactoryImpl {
             }
             sharedDrawable.setRealized(false);
         }
-        sr = new SharedResource(sharedDevice, madeCurrent, hasNPOTTextures, hasRECTTextures, hasAppleFloatPixels, glRendererQuirks);
+        sr = new SharedResource(sharedDevice, isValid, hasNPOTTextures, hasRECTTextures, hasAppleFloatPixels, glRendererQuirks);
         synchronized(sharedMap) {
             sharedMap.put(connection, sr);
         }
         removeDeviceTried(connection);
         if (DEBUG) {
             System.err.println("MacOSXCGLDrawableFactory.createShared: device:  " + sharedDevice);
-            System.err.println("MacOSXCGLDrawableFactory.createShared: context: madeCurrent " + madeCurrent + ", NPOT "+hasNPOTTextures+
+            System.err.println("MacOSXCGLDrawableFactory.createShared: context: madeCurrent " + isValid + ", NPOT "+hasNPOTTextures+
                                ", RECT "+hasRECTTextures+", FloatPixels "+hasAppleFloatPixels+", "+glRendererQuirks);
         }
     }
@@ -282,46 +303,6 @@ public class MacOSXCGLDrawableFactory extends GLDrawableFactoryImpl {
     return null;
   }
 
-  @Override
-  protected final boolean createSharedResource(AbstractGraphicsDevice device) {
-    try {
-        SharedResource sr = getOrCreateOSXSharedResource(device);
-        if(null!=sr) {
-            return sr.wasContextAvailable();
-        }
-    } catch (GLException gle) {
-        if(DEBUG) {
-            System.err.println("Catched Exception on thread "+getThreadName()); 
-            gle.printStackTrace();
-        }
-    }
-    return false;
-  }
-
-  @Override
-  protected final GLContext getOrCreateSharedContextImpl(AbstractGraphicsDevice device) {
-      // FIXME: no more available
-      return null;
-  }
-
-  @Override
-  public GLRendererQuirks getRendererQuirks(AbstractGraphicsDevice device) {
-      SharedResource sr = getOrCreateOSXSharedResource(device);
-      if(null!=sr) {
-          return sr.getGLRendererQuirks(); 
-      }
-      return null;
-  }
-  
-  @Override
-  protected AbstractGraphicsDevice getOrCreateSharedDeviceImpl(AbstractGraphicsDevice device) {
-      SharedResource sr = getOrCreateOSXSharedResource(device);
-      if(null!=sr) {
-          return sr.getDevice();
-      }
-      return null;
-  }
-
   @Override
   protected List<GLCapabilitiesImmutable> getAvailableCapabilitiesImpl(AbstractGraphicsDevice device) {
       return MacOSXCGLGraphicsConfiguration.getAvailableCapabilities(this, device);
diff --git a/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXCGLGraphicsConfiguration.java b/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXCGLGraphicsConfiguration.java
index 86e1ef481..5eb11c6a4 100644
--- a/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXCGLGraphicsConfiguration.java
+++ b/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXCGLGraphicsConfiguration.java
@@ -64,7 +64,7 @@ public class MacOSXCGLGraphicsConfiguration extends MutableGraphicsConfiguration
     }
 
     protected static List<GLCapabilitiesImmutable> getAvailableCapabilities(MacOSXCGLDrawableFactory factory, AbstractGraphicsDevice device) {
-        MacOSXCGLDrawableFactory.SharedResource sharedResource = factory.getOrCreateOSXSharedResource(device);
+        MacOSXCGLDrawableFactory.SharedResource sharedResource = factory.getOrCreateSharedResourceImpl(device);
         if(null == sharedResource) {
             throw new GLException("Shared resource for device n/a: "+device);
         }
diff --git a/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXPbufferCGLDrawable.java b/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXPbufferCGLDrawable.java
index 982bb57e1..4e791cb5f 100644
--- a/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXPbufferCGLDrawable.java
+++ b/src/jogl/classes/jogamp/opengl/macosx/cgl/MacOSXPbufferCGLDrawable.java
@@ -121,7 +121,7 @@ public class MacOSXPbufferCGLDrawable extends MacOSXCGLDrawable {
     final DefaultGraphicsConfiguration config = (DefaultGraphicsConfiguration) ms.getGraphicsConfiguration();
     final GLCapabilitiesImmutable capabilities = (GLCapabilitiesImmutable)config.getChosenCapabilities();
     final GLProfile glProfile = capabilities.getGLProfile();
-    MacOSXCGLDrawableFactory.SharedResource sr = ((MacOSXCGLDrawableFactory)factory).getOrCreateOSXSharedResource(config.getScreen().getDevice());
+    MacOSXCGLDrawableFactory.SharedResource sr = ((MacOSXCGLDrawableFactory)factory).getOrCreateSharedResourceImpl(config.getScreen().getDevice());
 
     if (DEBUG) {
         System.out.println(getThreadName()+": Pbuffer config: " + config);
diff --git a/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsPbufferWGLDrawable.java b/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsPbufferWGLDrawable.java
index 2a0f2596e..217ca18e8 100644
--- a/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsPbufferWGLDrawable.java
+++ b/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsPbufferWGLDrawable.java
@@ -113,7 +113,7 @@ public class WindowsPbufferWGLDrawable extends WindowsWGLDrawable {
 
   private void createPbuffer() {
     WindowsWGLGraphicsConfiguration config = (WindowsWGLGraphicsConfiguration) getNativeSurface().getGraphicsConfiguration();
-    SharedResource sharedResource = ((WindowsWGLDrawableFactory)factory).getOrCreateSharedResource(config.getScreen().getDevice());
+    SharedResource sharedResource = ((WindowsWGLDrawableFactory)factory).getOrCreateSharedResourceImpl(config.getScreen().getDevice());
     NativeSurface sharedSurface = sharedResource.getDrawable().getNativeSurface();
     if (NativeSurface.LOCK_SURFACE_NOT_READY >= sharedSurface.lockSurface()) {
       throw new NativeWindowException("Could not lock (sharedSurface): "+this);
diff --git a/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLContext.java b/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLContext.java
index 92b12a7ff..94153d96d 100644
--- a/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLContext.java
+++ b/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLContext.java
@@ -56,6 +56,7 @@ import com.jogamp.common.nio.Buffers;
 import com.jogamp.gluegen.runtime.ProcAddressTable;
 import com.jogamp.gluegen.runtime.opengl.GLProcAddressResolver;
 import com.jogamp.opengl.GLExtensions;
+import com.jogamp.opengl.GLRendererQuirks;
 
 import jogamp.nativewindow.windows.GDI;
 import jogamp.opengl.GLContextImpl;
@@ -271,8 +272,7 @@ public class WindowsWGLContext extends GLContextImpl {
     final AbstractGraphicsConfiguration config = drawable.getNativeSurface().getGraphicsConfiguration();
     final AbstractGraphicsDevice device = config.getScreen().getDevice();
     final WindowsWGLDrawableFactory factory = (WindowsWGLDrawableFactory)drawable.getFactoryImpl();
-    final WindowsWGLDrawableFactory.SharedResource sharedResource = factory.getOrCreateSharedResource(device);
-    final WindowsWGLContext sharedContext = (WindowsWGLContext) ( null != sharedResource ? sharedResource.getContext() : null );
+    final WindowsWGLContext sharedContext = (WindowsWGLContext) factory.getOrCreateSharedContext(device);
     final GLCapabilitiesImmutable glCaps = drawable.getChosenGLCapabilities();
 
     isGLReadDrawableAvailable(); // trigger setup wglGLReadDrawableAvailable
@@ -296,7 +296,7 @@ public class WindowsWGLContext extends GLContextImpl {
 
     // utilize the shared context's GLXExt in case it was using the ARB method and it already exists ; exclude BITMAP
     if( null != sharedContext && sharedContext.isCreatedWithARBMethod() && !glCaps.isBitmap() ) {
-        if ( sharedResource.needsCurrenContext4ARBCreateContextAttribs() ) {
+        if ( sharedContext.getRendererQuirks().exist( GLRendererQuirks.NeedCurrCtx4ARBCreateContext ) ) {
             if(GLContext.CONTEXT_NOT_CURRENT == sharedContext.makeCurrent()) {
                 throw new GLException("Could not make Shared Context current: "+sharedContext);
             }
diff --git a/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLDrawableFactory.java b/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLDrawableFactory.java
index 483e31611..5fb01d1a3 100644
--- a/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLDrawableFactory.java
+++ b/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLDrawableFactory.java
@@ -41,6 +41,7 @@
 package jogamp.opengl.windows.wgl;
 
 import java.nio.Buffer;
+
 import java.nio.ShortBuffer;
 import java.util.Collection;
 import java.util.HashMap;
@@ -53,7 +54,6 @@ import javax.media.nativewindow.DefaultGraphicsScreen;
 import javax.media.nativewindow.NativeSurface;
 import javax.media.nativewindow.ProxySurface;
 import javax.media.nativewindow.UpstreamSurfaceHook;
-import javax.media.opengl.GL;
 import javax.media.opengl.GLCapabilities;
 import javax.media.opengl.GLCapabilitiesChooser;
 import javax.media.opengl.GLCapabilitiesImmutable;
@@ -76,11 +76,10 @@ import jogamp.opengl.GLGraphicsConfigurationUtil;
 import jogamp.opengl.SharedResourceRunner;
 
 import com.jogamp.common.nio.PointerBuffer;
-import com.jogamp.common.os.Platform;
 import com.jogamp.common.util.ReflectionUtil;
-import com.jogamp.common.util.VersionNumber;
 import com.jogamp.nativewindow.windows.WindowsGraphicsDevice;
 import com.jogamp.opengl.GLExtensions;
+import com.jogamp.opengl.GLRendererQuirks;
 
 public class WindowsWGLDrawableFactory extends GLDrawableFactoryImpl {
   private static DesktopGLDynamicLookupHelper windowsWGLDynamicLookupHelper = null;
@@ -201,29 +200,18 @@ public class WindowsWGLDrawableFactory extends GLDrawableFactoryImpl {
     }
   }
 
-  /**
-   * http://msdn.microsoft.com/en-us/library/ms724832%28v=vs.85%29.aspx
-   * Windows XP    5.1
-   */
-  static final VersionNumber winXPVersionNumber = new VersionNumber ( 5, 1, 0);
-
   static class SharedResource implements SharedResourceRunner.Resource {
       private final boolean hasARBPixelFormat;
       private final boolean hasARBMultisample;
       private final boolean hasARBPBuffer;
       private final boolean hasARBReadDrawable;
-      private final String vendor;
-      private final boolean isVendorATI;
-      private final boolean isVendorNVIDIA;
-      private final boolean needsCurrenContext4ARBPFDQueries;
-      private final boolean needsCurrenContext4ARBCreateContextAttribs;
       private WindowsGraphicsDevice device;
       private AbstractGraphicsScreen screen;
       private GLDrawableImpl drawable;
       private GLContextImpl context;
-
+      
       SharedResource(WindowsGraphicsDevice dev, AbstractGraphicsScreen scrn, GLDrawableImpl draw, GLContextImpl ctx,
-                     boolean arbPixelFormat, boolean arbMultisample, boolean arbPBuffer, boolean arbReadDrawable, String glVendor) {
+                     boolean arbPixelFormat, boolean arbMultisample, boolean arbPBuffer, boolean arbReadDrawable) {
           device = dev;
           screen = scrn;
           drawable = draw;
@@ -232,33 +220,12 @@ public class WindowsWGLDrawableFactory extends GLDrawableFactoryImpl {
           hasARBMultisample = arbMultisample;
           hasARBPBuffer = arbPBuffer;
           hasARBReadDrawable = arbReadDrawable;
-          vendor = glVendor;
-          if(null != vendor) {
-              isVendorNVIDIA = vendor.startsWith("NVIDIA") ;
-              isVendorATI = vendor.startsWith("ATI") ;
-          } else {
-              isVendorNVIDIA = false;
-              isVendorATI = false;              
-          }
-
-          if ( isVendorATI ) {
-              needsCurrenContext4ARBCreateContextAttribs = true;
-              final VersionNumber winVersion = Platform.getOSVersionNumber();
-              final boolean isWinXPOrLess = winVersion.compareTo(winXPVersionNumber) <= 0;
-              needsCurrenContext4ARBPFDQueries = isWinXPOrLess;
-              if(DEBUG) {
-                  System.err.println("ATI && isWinXPOrLess = "+winVersion+" <= "+winXPVersionNumber+" = "+isWinXPOrLess+" - "+Platform.getOSVersion());
-              }
-          } else {
-              needsCurrenContext4ARBPFDQueries = false;
-              needsCurrenContext4ARBCreateContextAttribs = false;
-          }
-          if(DEBUG) {
-              System.err.println("needsCurrenContext4ARBCreateContextAttribs: "+needsCurrenContext4ARBCreateContextAttribs);
-              System.err.println("needsCurrenContext4ARBPFDQueries: "+needsCurrenContext4ARBPFDQueries);
-          }
       }
 
+      @Override
+      public final boolean isValid() {
+          return null != context;
+      }
       @Override
       final public AbstractGraphicsDevice getDevice() { return device; }
       @Override
@@ -267,35 +234,15 @@ public class WindowsWGLDrawableFactory extends GLDrawableFactoryImpl {
       final public GLDrawableImpl getDrawable() { return drawable; }
       @Override
       final public GLContextImpl getContext() { return context; }
+      @Override
+      public GLRendererQuirks getRendererQuirks() {
+          return null != context ? context.getRendererQuirks() : null;      
+      }
 
       final boolean hasARBPixelFormat() { return hasARBPixelFormat; }
       final boolean hasARBMultisample() { return hasARBMultisample; }
       final boolean hasARBPBuffer() { return hasARBPBuffer; }
       final boolean hasReadDrawable() { return hasARBReadDrawable; }
-
-      final String vendor() { return vendor; }
-      final boolean isVendorATI() { return isVendorATI; }
-      final boolean isVendorNVIDIA() { return isVendorNVIDIA; }
-
-      /**
-       * Solves bug #480
-       *
-       * TODO: Validate if bug actually relates to the 'old' ATI Windows driver for old GPU's like X300 etc
-       * and not to the Windows version !
-       *
-       * @return true if GL_VENDOR is ATI _and_ platform is Windows version XP or less!
-       */
-      final boolean needsCurrentContext4ARBPFDQueries() { return needsCurrenContext4ARBPFDQueries; }
-      
-      /**
-       * Solves bug #706 and bug #520
-       *
-       * TODO: Validate if quirk can be reduced to a certain range of GPUs and/or driver versions,
-       * where we would also need a method to query the latter (-> jogl/src/nativewindow/native/win32/DeviceDriverQuery.txt).
-       *
-       * @return true if GL_VENDOR is ATI
-       */
-      final boolean needsCurrenContext4ARBCreateContextAttribs() { return needsCurrenContext4ARBCreateContextAttribs; }
   }
 
   class SharedResourceImplementation implements SharedResourceRunner.Implementation {
@@ -351,7 +298,6 @@ public class WindowsWGLDrawableFactory extends GLDrawableFactoryImpl {
                 boolean hasARBMultisample;
                 boolean hasARBPBuffer;
                 boolean hasARBReadDrawableAvailable;
-                String vendor;
                 sharedContext.makeCurrent();
                 try {
                     hasARBPixelFormat = sharedContext.isExtensionAvailable(WGL_ARB_pixel_format);
@@ -359,7 +305,6 @@ public class WindowsWGLDrawableFactory extends GLDrawableFactoryImpl {
                     hasARBPBuffer = sharedContext.isExtensionAvailable(GLExtensions.ARB_pbuffer);
                     hasARBReadDrawableAvailable = sharedContext.isExtensionAvailable(WGL_ARB_make_current_read) &&
                                             sharedContext.isFunctionAvailable(wglMakeContextCurrent);
-                    vendor = sharedContext.getGL().glGetString(GL.GL_VENDOR);
                 } finally {
                     sharedContext.release();
                 }
@@ -371,11 +316,10 @@ public class WindowsWGLDrawableFactory extends GLDrawableFactoryImpl {
                     System.err.println("multisample:   " + hasARBMultisample);
                     System.err.println("pbuffer:       " + hasARBPBuffer);
                     System.err.println("readDrawable:  " + hasARBReadDrawableAvailable);
-                    System.err.println("vendor:        " + vendor);
                 }
                 return new SharedResource(sharedDevice, absScreen, sharedDrawable, sharedContext,
                                           hasARBPixelFormat, hasARBMultisample,
-                                          hasARBPBuffer, hasARBReadDrawableAvailable, vendor);
+                                          hasARBPBuffer, hasARBReadDrawableAvailable);
             } catch (Throwable t) {
                 throw new GLException("WindowsWGLDrawableFactory - Could not initialize shared resources for "+connection, t);
             } finally {
@@ -441,51 +385,18 @@ public class WindowsWGLDrawableFactory extends GLDrawableFactoryImpl {
   }
 
   @Override
-  protected final boolean createSharedResource(AbstractGraphicsDevice device) {
-    try {
-        SharedResourceRunner.Resource sr = sharedResourceRunner.getOrCreateShared(device);
-        if(null!=sr) {
-          return null != sr.getContext();
-        }
-    } catch (GLException gle) {
-        if(DEBUG) {
-            System.err.println("Catched Exception on thread "+getThreadName()); 
-            gle.printStackTrace();
-        }
-    }
-    return false;
-  }
-
-  @Override
-  protected final GLContext getOrCreateSharedContextImpl(AbstractGraphicsDevice device) {
-    SharedResourceRunner.Resource sr = sharedResourceRunner.getOrCreateShared(device);
-    if(null!=sr) {
-      return sr.getContext();
-    }
-    return null;
-  }
-
-  @Override
-  protected AbstractGraphicsDevice getOrCreateSharedDeviceImpl(AbstractGraphicsDevice device) {
-    SharedResourceRunner.Resource sr = sharedResourceRunner.getOrCreateShared(device);
-    if(null!=sr) {
-        return sr.getDevice();
-    }
-    return null;
+  protected final SharedResource getOrCreateSharedResourceImpl(AbstractGraphicsDevice device) {
+    return (SharedResource) sharedResourceRunner.getOrCreateShared(device);
   }
 
-  protected WindowsWGLDrawable getOrCreateSharedDrawable(AbstractGraphicsDevice device) {
-    SharedResourceRunner.Resource sr = sharedResourceRunner.getOrCreateShared(device);
+  protected final WindowsWGLDrawable getOrCreateSharedDrawable(AbstractGraphicsDevice device) {
+    SharedResourceRunner.Resource sr = getOrCreateSharedResourceImpl(device);
     if(null!=sr) {
         return (WindowsWGLDrawable) sr.getDrawable();
     }
     return null;
   }
 
-  SharedResource getOrCreateSharedResource(AbstractGraphicsDevice device) {
-    return (SharedResource) sharedResourceRunner.getOrCreateShared(device);
-  }
-
   @Override
   protected List<GLCapabilitiesImmutable> getAvailableCapabilitiesImpl(AbstractGraphicsDevice device) {
     return WindowsWGLGraphicsConfigurationFactory.getAvailableCapabilities(this, device);
@@ -518,7 +429,7 @@ public class WindowsWGLDrawableFactory extends GLDrawableFactoryImpl {
      * Similar to ATI Bug https://bugzilla.mozilla.org/show_bug.cgi?id=486277,
      * we need to have a context current on the same Display to create a PBuffer.
      */
-    final SharedResource sr = (SharedResource) sharedResourceRunner.getOrCreateShared(device);
+    final SharedResource sr = getOrCreateSharedResourceImpl(device);
     if(null!=sr) {
         GLContext lastContext = GLContext.getCurrent();
         if (lastContext != null) {
@@ -544,7 +455,7 @@ public class WindowsWGLDrawableFactory extends GLDrawableFactoryImpl {
    *           and -1 if undefined yet, ie no shared device exist at this point.
    */
   public final int isReadDrawableAvailable(AbstractGraphicsDevice device) {
-    SharedResource sr = (SharedResource) sharedResourceRunner.getOrCreateShared((null!=device)?device:defaultDevice);
+    SharedResource sr = getOrCreateSharedResourceImpl( ( null != device ) ? device : defaultDevice );
     if(null!=sr) {
         return sr.hasReadDrawable() ? 1 : 0 ;
     }
@@ -553,7 +464,7 @@ public class WindowsWGLDrawableFactory extends GLDrawableFactoryImpl {
 
   @Override
   public final boolean canCreateGLPbuffer(AbstractGraphicsDevice device) {
-    SharedResource sr = (SharedResource) sharedResourceRunner.getOrCreateShared((null!=device)?device:defaultDevice);
+    SharedResource sr = getOrCreateSharedResourceImpl( ( null != device ) ? device : defaultDevice );
     if(null!=sr) {
         return sr.hasARBPBuffer();
     }
diff --git a/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLGraphicsConfiguration.java b/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLGraphicsConfiguration.java
index 017f8c40b..42b92305a 100644
--- a/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLGraphicsConfiguration.java
+++ b/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLGraphicsConfiguration.java
@@ -56,7 +56,6 @@ import jogamp.nativewindow.windows.GDI;
 import jogamp.nativewindow.windows.GDIUtil;
 import jogamp.nativewindow.windows.MARGINS;
 import jogamp.nativewindow.windows.PIXELFORMATDESCRIPTOR;
-import jogamp.opengl.GLContextImpl;
 import jogamp.opengl.GLGraphicsConfigurationUtil;
 
 public class WindowsWGLGraphicsConfiguration extends MutableGraphicsConfiguration implements Cloneable {    
@@ -100,7 +99,7 @@ public class WindowsWGLGraphicsConfiguration extends MutableGraphicsConfiguratio
         }
         WindowsWGLDrawableFactory factory = (WindowsWGLDrawableFactory) _factory;
         AbstractGraphicsDevice device = screen.getDevice();
-        WindowsWGLDrawableFactory.SharedResource sharedResource = factory.getOrCreateSharedResource(device);
+        WindowsWGLDrawableFactory.SharedResource sharedResource = factory.getOrCreateSharedResourceImpl(device);
         boolean hasARB = null != sharedResource && sharedResource.hasARBPixelFormat();
 
         WGLGLCapabilities caps = null;
diff --git a/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLGraphicsConfigurationFactory.java b/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLGraphicsConfigurationFactory.java
index 1e72e312b..3d093b972 100644
--- a/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLGraphicsConfigurationFactory.java
+++ b/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLGraphicsConfigurationFactory.java
@@ -51,6 +51,7 @@ import javax.media.opengl.GLException;
 import javax.media.opengl.GLProfile;
 
 import com.jogamp.common.nio.Buffers;
+import com.jogamp.opengl.GLRendererQuirks;
 
 import jogamp.nativewindow.windows.GDI;
 import jogamp.nativewindow.windows.PIXELFORMATDESCRIPTOR;
@@ -114,21 +115,23 @@ public class WindowsWGLGraphicsConfigurationFactory extends GLGraphicsConfigurat
     }
 
     protected static List<GLCapabilitiesImmutable> getAvailableCapabilities(WindowsWGLDrawableFactory factory, AbstractGraphicsDevice device) {
-        final WindowsWGLDrawableFactory.SharedResource sharedResource = factory.getOrCreateSharedResource(device);
+        final WindowsWGLDrawableFactory.SharedResource sharedResource = factory.getOrCreateSharedResourceImpl(device);
         if(null == sharedResource) {
             throw new GLException("Shared resource for device n/a: "+device);
         }
         final GLDrawableImpl sharedDrawable = sharedResource.getDrawable();
-        final GLContext sharedContext = sharedResource.getContext();
         final GLProfile glp = GLProfile.getDefault(device);
 
         List<GLCapabilitiesImmutable> availableCaps = null;
         
-        if ( sharedResource.needsCurrentContext4ARBPFDQueries() ) {
+        final GLContext sharedContext;
+        if ( factory.hasRendererQuirk(device, GLRendererQuirks.NeedCurrCtx4ARBPixFmtQueries) ) {
+            sharedContext = sharedResource.getContext();
             if(GLContext.CONTEXT_NOT_CURRENT == sharedContext.makeCurrent()) {
                 throw new GLException("Could not make Shared Context current: "+device);
             }
         } else {
+            sharedContext = null;
             sharedDrawable.lockSurface();
         }
         try {
@@ -147,7 +150,7 @@ public class WindowsWGLGraphicsConfigurationFactory extends GLGraphicsConfigurat
                 availableCaps.addAll(availableCapsGDI);
             }
         } finally {
-            if ( sharedResource.needsCurrentContext4ARBPFDQueries() ) {
+            if ( null != sharedContext ) {
                 sharedContext.release();    
             } else {
                 sharedDrawable.unlockSurface();
@@ -281,13 +284,15 @@ public class WindowsWGLGraphicsConfigurationFactory extends GLGraphicsConfigurat
             System.err.println("user chosen caps " + config.getChosenCapabilities());
         }
         AbstractGraphicsDevice device = config.getScreen().getDevice();
-        WindowsWGLDrawableFactory.SharedResource sharedResource = ((WindowsWGLDrawableFactory)factory).getOrCreateSharedResource(device);
-        GLContext sharedContext = null;
-        if (null != sharedResource && sharedResource.needsCurrentContext4ARBPFDQueries()) {
+        WindowsWGLDrawableFactory.SharedResource sharedResource = ((WindowsWGLDrawableFactory)factory).getOrCreateSharedResourceImpl(device);
+        final GLContext sharedContext;
+        if ( factory.hasRendererQuirk(device, GLRendererQuirks.NeedCurrCtx4ARBPixFmtQueries) ) {
             sharedContext = sharedResource.getContext();
             if(GLContext.CONTEXT_NOT_CURRENT == sharedContext.makeCurrent()) {
                 throw new GLException("Could not make Shared Context current: "+device);
             }
+        } else {
+            sharedContext = null;
         }
         try {
             final GLCapabilitiesImmutable capsChosen = (GLCapabilitiesImmutable) config.getChosenCapabilities();
@@ -308,7 +313,7 @@ public class WindowsWGLGraphicsConfigurationFactory extends GLGraphicsConfigurat
     private static boolean updateGraphicsConfigurationARB(WindowsWGLDrawableFactory factory, WindowsWGLGraphicsConfiguration config, CapabilitiesChooser chooser,
                                                           long hdc, boolean extHDC, int[] pformats) {
         final AbstractGraphicsDevice device = config.getScreen().getDevice();
-        final WindowsWGLDrawableFactory.SharedResource sharedResource = factory.getOrCreateSharedResource(device);
+        final WindowsWGLDrawableFactory.SharedResource sharedResource = factory.getOrCreateSharedResourceImpl(device);
 
         if (null == sharedResource) {
             if (DEBUG) {
diff --git a/src/jogl/classes/jogamp/opengl/x11/glx/X11GLXContext.java b/src/jogl/classes/jogamp/opengl/x11/glx/X11GLXContext.java
index 9df042ba8..0d56bcde1 100644
--- a/src/jogl/classes/jogamp/opengl/x11/glx/X11GLXContext.java
+++ b/src/jogl/classes/jogamp/opengl/x11/glx/X11GLXContext.java
@@ -283,7 +283,7 @@ public class X11GLXContext extends GLContextImpl {
     final X11GLXDrawableFactory factory = (X11GLXDrawableFactory)drawable.getFactoryImpl();
     final X11GLXGraphicsConfiguration config = (X11GLXGraphicsConfiguration)drawable.getNativeSurface().getGraphicsConfiguration();
     final AbstractGraphicsDevice device = config.getScreen().getDevice();
-    final X11GLXContext sharedContext = (X11GLXContext) factory.getOrCreateSharedContextImpl(device);
+    final X11GLXContext sharedContext = (X11GLXContext) factory.getOrCreateSharedContext(device);
     long display = device.getHandle();
 
     final long share;
diff --git a/src/jogl/classes/jogamp/opengl/x11/glx/X11GLXDrawableFactory.java b/src/jogl/classes/jogamp/opengl/x11/glx/X11GLXDrawableFactory.java
index 0d89468a9..e44be7509 100644
--- a/src/jogl/classes/jogamp/opengl/x11/glx/X11GLXDrawableFactory.java
+++ b/src/jogl/classes/jogamp/opengl/x11/glx/X11GLXDrawableFactory.java
@@ -185,6 +185,10 @@ public class X11GLXDrawableFactory extends GLDrawableFactoryImpl {
           glXMultisampleAvailable = glXServerMultisampleAvail;
       }
       @Override
+      public final boolean isValid() {
+          return null != context;
+      }
+      @Override
       final public AbstractGraphicsDevice getDevice() { return device; }
       @Override
       final public AbstractGraphicsScreen getScreen() { return screen; }
@@ -192,6 +196,10 @@ public class X11GLXDrawableFactory extends GLDrawableFactoryImpl {
       final public GLDrawableImpl getDrawable() { return drawable; }
       @Override
       final public GLContextImpl getContext() { return context; }
+      @Override
+      public GLRendererQuirks getRendererQuirks() {
+          return null != context ? context.getRendererQuirks() : null;      
+      }
 
       final String getGLXVendorName() { return glXServerVendorName; }
       final boolean isGLXVendorATI() { return isGLXServerVendorATI; }
@@ -357,51 +365,18 @@ public class X11GLXDrawableFactory extends GLDrawableFactoryImpl {
   }
 
   @Override
-  protected final boolean createSharedResource(AbstractGraphicsDevice device) {
-    try {
-        SharedResourceRunner.Resource sr = sharedResourceRunner.getOrCreateShared(device);
-        if(null!=sr) {
-          return null != sr.getContext();
-        }
-    } catch (GLException gle) {
-        if(DEBUG) {
-            System.err.println("Catched Exception on thread "+getThreadName()); 
-            gle.printStackTrace();
-        }
-    }
-    return false;
-  }
-
-  @Override
-  protected final GLContext getOrCreateSharedContextImpl(AbstractGraphicsDevice device) {
-    SharedResourceRunner.Resource sr = sharedResourceRunner.getOrCreateShared(device);
-    if(null!=sr) {
-      return sr.getContext();
-    }
-    return null;
-  }
-
-  @Override
-  protected AbstractGraphicsDevice getOrCreateSharedDeviceImpl(AbstractGraphicsDevice device) {
-    SharedResourceRunner.Resource sr = sharedResourceRunner.getOrCreateShared(device);
-    if(null!=sr) {
-        return sr.getDevice();
-    }
-    return null;
+  protected final SharedResource getOrCreateSharedResourceImpl(AbstractGraphicsDevice device) {
+    return (SharedResource) sharedResourceRunner.getOrCreateShared(device);
   }
 
   protected final long getOrCreateSharedDpy(AbstractGraphicsDevice device) {
-    SharedResourceRunner.Resource sr = sharedResourceRunner.getOrCreateShared(device);
+    final SharedResourceRunner.Resource sr = getOrCreateSharedResource( device );
     if(null!=sr) {
         return sr.getDevice().getHandle();
     }
     return 0;
   }
 
-  SharedResource getOrCreateSharedResource(AbstractGraphicsDevice device) {
-    return (SharedResource) sharedResourceRunner.getOrCreateShared(device);
-  }
-
   @Override
   protected List<GLCapabilitiesImmutable> getAvailableCapabilitiesImpl(AbstractGraphicsDevice device) {
     return X11GLXGraphicsConfigurationFactory.getAvailableCapabilities(this, device);
diff --git a/src/jogl/classes/jogamp/opengl/x11/glx/X11GLXGraphicsConfigurationFactory.java b/src/jogl/classes/jogamp/opengl/x11/glx/X11GLXGraphicsConfigurationFactory.java
index e62dcadcb..a7c7d3fe6 100644
--- a/src/jogl/classes/jogamp/opengl/x11/glx/X11GLXGraphicsConfigurationFactory.java
+++ b/src/jogl/classes/jogamp/opengl/x11/glx/X11GLXGraphicsConfigurationFactory.java
@@ -124,7 +124,7 @@ public class X11GLXGraphicsConfigurationFactory extends GLGraphicsConfigurationF
     }
 
     protected static List<GLCapabilitiesImmutable> getAvailableCapabilities(X11GLXDrawableFactory factory, AbstractGraphicsDevice device) {
-        X11GLXDrawableFactory.SharedResource sharedResource = factory.getOrCreateSharedResource(device);
+        X11GLXDrawableFactory.SharedResource sharedResource = factory.getOrCreateSharedResourceImpl(device);
         if(null == sharedResource) {
             throw new GLException("Shared resource for device n/a: "+device);
         }
-- 
cgit v1.2.3