From 0a7cd9c58537d80131dbebf102f1f639ca0eb334 Mon Sep 17 00:00:00 2001
From: Sven Gothel <sgothel@jausoft.com>
Date: Thu, 18 Apr 2013 19:14:35 +0200
Subject: Bug 718: WindowsBitmapWGLDrawable: Requires GLProfile.GL2, fix BITMAP
 GLCaps ASAP at Ctor instead of setRealized(true); WindowsWGLContext: Exclude
 ARB creation for BITMAP

Unit Test TestGLAutoDrawableFactoryGLnBitmapCapsNEWT added using BITMAP on GLProfile.getDefault()

Also:
  X11GLXContext, WindowsWGLContext: Cleanup formatting in createImpl(..)
---
 .../windows/wgl/WindowsBitmapWGLDrawable.java      | 39 +++++++++-----
 .../opengl/windows/wgl/WindowsWGLContext.java      | 61 ++++++++++++++--------
 .../windows/wgl/WindowsWGLDrawableFactory.java     |  2 +-
 3 files changed, 64 insertions(+), 38 deletions(-)

(limited to 'src/jogl/classes/jogamp/opengl/windows')

diff --git a/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsBitmapWGLDrawable.java b/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsBitmapWGLDrawable.java
index 3c326e93e..909a017b0 100644
--- a/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsBitmapWGLDrawable.java
+++ b/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsBitmapWGLDrawable.java
@@ -40,12 +40,14 @@
 
 package jogamp.opengl.windows.wgl;
 
+import javax.media.nativewindow.AbstractGraphicsDevice;
 import javax.media.nativewindow.NativeSurface;
 import javax.media.nativewindow.MutableSurface;
 import javax.media.opengl.GLCapabilitiesImmutable;
 import javax.media.opengl.GLContext;
 import javax.media.opengl.GLDrawableFactory;
 import javax.media.opengl.GLException;
+import javax.media.opengl.GLProfile;
 
 import jogamp.nativewindow.windows.BITMAPINFO;
 import jogamp.nativewindow.windows.BITMAPINFOHEADER;
@@ -58,8 +60,28 @@ public class WindowsBitmapWGLDrawable extends WindowsWGLDrawable {
   private long origbitmap;
   private long hbitmap;
 
-  protected WindowsBitmapWGLDrawable(GLDrawableFactory factory, NativeSurface target) {
-    super(factory, target, false);
+  private WindowsBitmapWGLDrawable(GLDrawableFactory factory, NativeSurface comp) {
+    super(factory, comp, false);
+  }
+  
+  protected static WindowsBitmapWGLDrawable create(GLDrawableFactory factory, NativeSurface comp) {
+    final WindowsWGLGraphicsConfiguration config = (WindowsWGLGraphicsConfiguration)comp.getGraphicsConfiguration();
+    final AbstractGraphicsDevice aDevice = config.getScreen().getDevice();
+    if( !GLProfile.isAvailable(aDevice, GLProfile.GL2) ) {
+        throw new GLException("GLProfile GL2 n/a on "+aDevice+" but required for Windows BITMAP");
+    }
+    final GLProfile glp = GLProfile.get(GLProfile.GL2);
+    final GLCapabilitiesImmutable capsChosen0 = (GLCapabilitiesImmutable)config.getChosenCapabilities();
+    // RGB555 and also alpha channel is experienced to fail on some Windows machines
+    final GLCapabilitiesImmutable capsChosen1 = GLGraphicsConfigurationUtil.clipRGBAGLCapabilities(capsChosen0, false /* allowRGB555 */, false /* allowAlpha */);
+    final GLCapabilitiesImmutable capsChosen2 = GLGraphicsConfigurationUtil.fixGLProfile(capsChosen1, glp);
+    if( capsChosen0 != capsChosen2 ) {
+        config.setChosenCapabilities(capsChosen2);
+        if(DEBUG) {
+            System.err.println("WindowsBitmapWGLDrawable: "+capsChosen0+" -> "+capsChosen2);
+        }
+    }
+    return new WindowsBitmapWGLDrawable(factory, comp);
   }
 
   @Override
@@ -88,18 +110,7 @@ public class WindowsBitmapWGLDrawable extends WindowsWGLDrawable {
         System.err.println(getThreadName()+": WindowsBitmapWGLDrawable (1): "+ns);
     }
     final WindowsWGLGraphicsConfiguration config = (WindowsWGLGraphicsConfiguration)ns.getGraphicsConfiguration();
-    final GLCapabilitiesImmutable capsChosen;
-    {
-        final GLCapabilitiesImmutable capsChosen0 = (GLCapabilitiesImmutable)config.getChosenCapabilities();
-        // RGB555 and also alpha channel is experienced to fail on some Windows machines
-        capsChosen = GLGraphicsConfigurationUtil.clipRGBAGLCapabilities(capsChosen0, false /* allowRGB555 */, false /* allowAlpha */);
-        if( capsChosen0 != capsChosen ) {
-            config.setChosenCapabilities(capsChosen);
-            if(DEBUG) {
-                System.err.println("WindowsBitmapWGLDrawable: "+capsChosen0+" -> "+capsChosen);
-            }
-        }
-    }
+    final GLCapabilitiesImmutable capsChosen = (GLCapabilitiesImmutable)config.getChosenCapabilities();
     final int width = getWidth();
     final int height = getHeight();
 
diff --git a/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLContext.java b/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLContext.java
index 1f41563ba..77d06f548 100644
--- a/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLContext.java
+++ b/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLContext.java
@@ -277,50 +277,63 @@ public class WindowsWGLContext extends GLContextImpl {
 
     isGLReadDrawableAvailable(); // trigger setup wglGLReadDrawableAvailable
 
+    if (DEBUG) {
+        System.err.println(getThreadName() + ": createImpl: START "+glCaps+", share "+shareWith);
+    }
+    
     // Windows can set up sharing of display lists after creation time
-    long share = 0;
-    if (null != shareWith) {
-      share = shareWith.getHandle();
-      if (share == 0) {
-        throw new GLException("GLContextShareSet returned an invalid OpenGL context");
-      }
+    long share;
+    if ( null != shareWith ) {
+        share = shareWith.getHandle();
+        if (share == 0) {
+            throw new GLException("GLContextShareSet returned an invalid OpenGL context");
+        }
+    } else {
+        share = 0;
     }
 
     boolean createContextARBTried = false;
 
-    // utilize the shared context's GLXExt in case it was using the ARB method and it already exists
-    if( null!=sharedContext && sharedContext.isCreatedWithARBMethod() ) {
+    // 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() ) {
         contextHandle = createContextARB(share, true);
         createContextARBTried = true;
-        if (DEBUG && 0!=contextHandle) {
+        if ( DEBUG && 0 != contextHandle ) {
             System.err.println(getThreadName() + ": createImpl: OK (ARB, using sharedContext) share "+share);
         }
     }
 
-    long temp_ctx = 0;
-    if(0==contextHandle) {
+    final long temp_ctx;
+    if( 0 == contextHandle ) {
         // To use WGL_ARB_create_context, we have to make a temp context current,
         // so we are able to use GetProcAddress
         temp_ctx = WGL.wglCreateContext(drawable.getHandle());
-        if (temp_ctx == 0) {
+        if ( 0 == temp_ctx ) {
           throw new GLException("Unable to create temp OpenGL context for device context " + toHexString(drawable.getHandle()));
         }
-        if (!WGL.wglMakeCurrent(drawable.getHandle(), temp_ctx)) {
+        if ( !WGL.wglMakeCurrent(drawable.getHandle(), temp_ctx) ) {
             throw new GLException("Error making temp context current: 0x" + toHexString(temp_ctx) + ", werr: "+GDI.GetLastError());
         }
         setGLFunctionAvailability(true, 0, 0, CTX_PROFILE_COMPAT, false);  // use GL_VERSION
         WGL.wglMakeCurrent(0, 0); // release temp context
 
-        if( !createContextARBTried) {
+        if( !createContextARBTried ) {
             // is*Available calls are valid since setGLFunctionAvailability(..) was called
-            final boolean isProcCreateContextAttribsARBAvailable = isFunctionAvailable("wglCreateContextAttribsARB");
-            final boolean isExtARBCreateContextAvailable = isExtensionAvailable("WGL_ARB_create_context");
+            final boolean isProcCreateContextAttribsARBAvailable;
+            final boolean isExtARBCreateContextAvailable;
+            if( !glCaps.isBitmap() ) { // exclude ARB if BITMAP
+                isProcCreateContextAttribsARBAvailable = isFunctionAvailable("wglCreateContextAttribsARB");
+                isExtARBCreateContextAvailable = isExtensionAvailable("WGL_ARB_create_context");
+            } else {
+                isProcCreateContextAttribsARBAvailable = false;
+                isExtARBCreateContextAvailable = false;
+            }
             if ( isProcCreateContextAttribsARBAvailable && isExtARBCreateContextAvailable ) {
                 // initial ARB context creation
                 contextHandle = createContextARB(share, true);
                 createContextARBTried=true;
                 if (DEBUG) {
-                    if(0!=contextHandle) {
+                    if( 0 != contextHandle ) {
                         System.err.println(getThreadName() + ": createContextImpl: OK (ARB, initial) share "+share);
                     } else {
                         System.err.println(getThreadName() + ": createContextImpl: NOT OK (ARB, initial) - creation failed - share "+share);
@@ -331,11 +344,13 @@ public class WindowsWGLContext extends GLContextImpl {
                                    ", isProcCreateContextAttribsARBAvailable "+isProcCreateContextAttribsARBAvailable+", isExtGLXARBCreateContextAvailable "+isExtARBCreateContextAvailable);
             }
         }
+    } else {
+        temp_ctx = 0;
     }
 
-    if(0!=contextHandle) {
+    if( 0 != contextHandle ) {
         share = 0; // mark as shared thx to the ARB create method
-        if(0!=temp_ctx) {
+        if( 0 != temp_ctx ) {
             WGL.wglMakeCurrent(0, 0);
             WGL.wglDeleteContext(temp_ctx);
             if (!wglMakeContextCurrent(drawable.getHandle(), drawableRead.getHandle(), contextHandle)) {
@@ -343,7 +358,7 @@ public class WindowsWGLContext extends GLContextImpl {
             }
         }
     } else {
-        if(glCaps.getGLProfile().isGL3()) {
+        if( glCaps.getGLProfile().isGL3() ) {
           WGL.wglMakeCurrent(0, 0);
           WGL.wglDeleteContext(temp_ctx);
           throw new GLException(getThreadName()+": WindowsWGLContex.createContextImpl ctx !ARB, profile > GL2 requested (OpenGL >= 3.0.1). Requested: "+glCaps.getGLProfile()+", current: "+getGLVersion());
@@ -354,15 +369,15 @@ public class WindowsWGLContext extends GLContextImpl {
 
         // continue with temp context for GL < 3.0
         contextHandle = temp_ctx;
-        if (!wglMakeContextCurrent(drawable.getHandle(), drawableRead.getHandle(), contextHandle)) {
+        if ( !wglMakeContextCurrent(drawable.getHandle(), drawableRead.getHandle(), contextHandle) ) {
             WGL.wglMakeCurrent(0, 0);
             WGL.wglDeleteContext(contextHandle);
             throw new GLException("Error making old context current: 0x" + toHexString(contextHandle) + ", werr: " + GDI.GetLastError());
         }
-        if(0!=share) {
+        if( 0 != share ) {
             // Only utilize the classic GDI 'wglShareLists' shared context method
             // for traditional non ARB context.
-            if (!WGL.wglShareLists(share, contextHandle)) {
+            if ( !WGL.wglShareLists(share, contextHandle) ) {
                 throw new GLException("wglShareLists(" + toHexString(share) +
                                       ", " + toHexString(contextHandle) + ") failed: werr " + GDI.GetLastError());
             }
diff --git a/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLDrawableFactory.java b/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLDrawableFactory.java
index 26d73638f..e9742c4fe 100644
--- a/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLDrawableFactory.java
+++ b/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLDrawableFactory.java
@@ -490,7 +490,7 @@ public class WindowsWGLDrawableFactory extends GLDrawableFactoryImpl {
     AbstractGraphicsConfiguration config = target.getGraphicsConfiguration();
     GLCapabilitiesImmutable chosenCaps = (GLCapabilitiesImmutable) config.getChosenCapabilities();
     if(!chosenCaps.isPBuffer()) {
-        return new WindowsBitmapWGLDrawable(this, target);
+        return WindowsBitmapWGLDrawable.create(this, target);
     }
 
     // PBuffer GLDrawable Creation
-- 
cgit v1.2.3