From 5cd7e4fab47996eddf1a2798215fb975fe32b4bf Mon Sep 17 00:00:00 2001 From: Sven Gothel <sgothel@jausoft.com> Date: Sun, 4 Oct 2009 13:04:42 -0700 Subject: Fix EGL SurfaceType query/setup [on-/offscreen, pbuffer] using EGLConfig/GLCapabilities --- .../opengl/impl/egl/EGLGraphicsConfiguration.java | 42 ++++++++++++-------- .../impl/egl/EGLGraphicsConfigurationFactory.java | 46 +++++++++++----------- .../sun/opengl/impl/egl/EGLPbufferDrawable.java | 8 +++- 3 files changed, 54 insertions(+), 42 deletions(-) (limited to 'src/jogl/classes/com/sun/opengl') diff --git a/src/jogl/classes/com/sun/opengl/impl/egl/EGLGraphicsConfiguration.java b/src/jogl/classes/com/sun/opengl/impl/egl/EGLGraphicsConfiguration.java index cde826c1b..9d337a207 100644 --- a/src/jogl/classes/com/sun/opengl/impl/egl/EGLGraphicsConfiguration.java +++ b/src/jogl/classes/com/sun/opengl/impl/egl/EGLGraphicsConfiguration.java @@ -73,7 +73,7 @@ public class EGLGraphicsConfiguration extends DefaultGraphicsConfiguration imple } GLProfile glp = capsRequested.getGLProfile(); _EGLConfig _cfg = EGLConfigId2EGLConfig(glp, dpy, cfgID); - GLCapabilities caps = EGLConfig2Capabilities(glp, dpy, _cfg, capsRequested.isOnscreen(), capsRequested.isPBuffer()); + GLCapabilities caps = EGLConfig2Capabilities(glp, dpy, _cfg); return new EGLGraphicsConfiguration(absScreen, caps, capsRequested, new DefaultGLCapabilitiesChooser(), _cfg, cfgID); } @@ -116,8 +116,7 @@ public class EGLGraphicsConfiguration extends DefaultGraphicsConfiguration imple return configs[0]; } - public static GLCapabilities EGLConfig2Capabilities(GLProfile glp, long display, _EGLConfig _config, - boolean onscreen, boolean pbuffer) { + public static GLCapabilities EGLConfig2Capabilities(GLProfile glp, long display, _EGLConfig _config) { GLCapabilities caps = new GLCapabilities(glp); int[] val = new int[1]; @@ -162,27 +161,36 @@ public class EGLGraphicsConfiguration extends DefaultGraphicsConfiguration imple caps.setTransparentAlphaValue(val[0]==EGL.EGL_DONT_CARE?-1:val[0]); } */ } - caps.setOnscreen(onscreen); - caps.setDoubleBuffered(onscreen); - caps.setPBuffer(pbuffer); + if(EGL.eglGetConfigAttrib(display, _config, EGL.EGL_SURFACE_TYPE, val, 0)) { + switch(val[0]) { + case EGL.EGL_WINDOW_BIT: + caps.setOnscreen(true); + caps.setPBuffer(false); + break; + case EGL.EGL_PBUFFER_BIT: + caps.setOnscreen(false); + caps.setPBuffer(true); + break; + case EGL.EGL_PIXMAP_BIT: + caps.setOnscreen(false); + caps.setPBuffer(false); + break; + default: + throw new GLException("Invalid EGL_SURFACE_TYPE 0x"+Integer.toHexString(val[0])); + } + } else { + throw new GLException("Could not determine EGL_SURFACE_TYPE"); + } + return caps; } - public static int[] GLCapabilities2AttribList(GLCapabilities caps, int eglSurfaceType) { + public static int[] GLCapabilities2AttribList(GLCapabilities caps) { int[] attrs = new int[32]; int idx=0; - switch(eglSurfaceType) { - case EGL.EGL_WINDOW_BIT: - case EGL.EGL_PBUFFER_BIT: - case EGL.EGL_PIXMAP_BIT: - break; - default: - throw new GLException("Invalid EGL_SURFACE_TYPE 0x"+Integer.toHexString(eglSurfaceType)); - } - attrs[idx++] = EGL.EGL_SURFACE_TYPE; - attrs[idx++] = eglSurfaceType; + attrs[idx++] = caps.isOnscreen() ? ( EGL.EGL_WINDOW_BIT ) : ( caps.isPBuffer() ? EGL.EGL_PBUFFER_BIT : EGL.EGL_PIXMAP_BIT ) ; attrs[idx++] = EGL.EGL_RED_SIZE; attrs[idx++] = caps.getRedBits(); diff --git a/src/jogl/classes/com/sun/opengl/impl/egl/EGLGraphicsConfigurationFactory.java b/src/jogl/classes/com/sun/opengl/impl/egl/EGLGraphicsConfigurationFactory.java index 861a89a75..4c6ff314d 100644 --- a/src/jogl/classes/com/sun/opengl/impl/egl/EGLGraphicsConfigurationFactory.java +++ b/src/jogl/classes/com/sun/opengl/impl/egl/EGLGraphicsConfigurationFactory.java @@ -72,12 +72,12 @@ public class EGLGraphicsConfigurationFactory extends GraphicsConfigurationFactor return chooseGraphicsConfigurationStatic((GLCapabilities) capabilities, (GLCapabilitiesChooser) chooser, - absScreen, EGL.EGL_WINDOW_BIT); + absScreen); } public static EGLGraphicsConfiguration chooseGraphicsConfigurationStatic(GLCapabilities capabilities, GLCapabilitiesChooser chooser, - AbstractGraphicsScreen absScreen, int eglSurfaceType) { + AbstractGraphicsScreen absScreen) { if (capabilities == null) { capabilities = new GLCapabilities(null); } @@ -103,12 +103,12 @@ public class EGLGraphicsConfigurationFactory extends GraphicsConfigurationFactor caps2.setDoubleBuffered(false); } - EGLGraphicsConfiguration res = eglChooseConfig(eglDisplay, caps2, capabilities, chooser, absScreen, eglSurfaceType); + EGLGraphicsConfiguration res = eglChooseConfig(eglDisplay, caps2, capabilities, chooser, absScreen); if(null!=res) { return res; } if(DEBUG) { - System.err.println("eglChooseConfig failed with given capabilities surfaceType 0x"+Integer.toHexString(eglSurfaceType)+", "+caps2); + System.err.println("eglChooseConfig failed with given capabilities "+caps2); } if (chooser == null) { @@ -124,8 +124,7 @@ public class EGLGraphicsConfigurationFactory extends GraphicsConfigurationFactor if (numConfigs[0] == 0) { throw new GLException("Graphics configuration fetch (eglGetConfigs) - no EGLConfig found"); } - GLCapabilities[] caps = eglConfigs2GLCaps(glp, eglDisplay, configs, numConfigs[0], - caps2.isOnscreen(), caps2.isPBuffer()); + GLCapabilities[] caps = eglConfigs2GLCaps(glp, eglDisplay, configs, numConfigs[0]); if(DEBUG) { System.err.println("EGL Get Configs: "+numConfigs[0]+", Caps "+caps.length); printCaps("eglGetConfigs", caps, System.err); @@ -140,12 +139,12 @@ public class EGLGraphicsConfigurationFactory extends GraphicsConfigurationFactor if(DEBUG) { System.err.println("Chosen "+caps[chosen]); } - res = eglChooseConfig(eglDisplay, caps[chosen], capabilities, chooser, absScreen, eglSurfaceType); + res = eglChooseConfig(eglDisplay, caps[chosen], capabilities, chooser, absScreen); if(null!=res) { return res; } if(DEBUG) { - System.err.println("eglChooseConfig failed with eglGetConfig/choosen capabilities surfaceType 0x"+Integer.toHexString(eglSurfaceType)); + System.err.println("eglChooseConfig failed with eglGetConfig/choosen capabilities "+caps[chosen]); } // Last try .. add a fixed embedded profile [ATI, Nokia, Intel, ..] @@ -161,7 +160,7 @@ public class EGLGraphicsConfigurationFactory extends GraphicsConfigurationFactor if(DEBUG) { System.err.println("trying fixed caps (1): "+fixedCaps); } - res = eglChooseConfig(eglDisplay, fixedCaps, capabilities, chooser, absScreen, eglSurfaceType); + res = eglChooseConfig(eglDisplay, fixedCaps, capabilities, chooser, absScreen); if(null!=res) { return res; } @@ -176,19 +175,24 @@ public class EGLGraphicsConfigurationFactory extends GraphicsConfigurationFactor if(DEBUG) { System.err.println("trying fixed caps (2): "+fixedCaps); } - res = eglChooseConfig(eglDisplay, fixedCaps, capabilities, chooser, absScreen, eglSurfaceType); + res = eglChooseConfig(eglDisplay, fixedCaps, capabilities, chooser, absScreen); if(null!=res) { return res; } // // rgb565 - d16, s4 + fixedCaps = new GLCapabilities(glp); + fixedCaps.setRedBits(5); + fixedCaps.setGreenBits(6); + fixedCaps.setBlueBits(5); + fixedCaps.setDepthBits(16); fixedCaps.setSampleBuffers(true); fixedCaps.setNumSamples(4); if(DEBUG) { System.err.println("trying fixed caps (3): "+fixedCaps); } - res = eglChooseConfig(eglDisplay, fixedCaps, capabilities, chooser, absScreen, eglSurfaceType); + res = eglChooseConfig(eglDisplay, fixedCaps, capabilities, chooser, absScreen); if(null!=res) { return res; } @@ -197,21 +201,20 @@ public class EGLGraphicsConfigurationFactory extends GraphicsConfigurationFactor protected static EGLGraphicsConfiguration eglChooseConfig(long eglDisplay, GLCapabilities capsChosen0, GLCapabilities capsRequested, GLCapabilitiesChooser chooser, - AbstractGraphicsScreen absScreen, int eglSurfaceType) { + AbstractGraphicsScreen absScreen) { GLProfile glp = capsChosen0.getGLProfile(); - int[] attrs = EGLGraphicsConfiguration.GLCapabilities2AttribList(capsChosen0, eglSurfaceType); + int[] attrs = EGLGraphicsConfiguration.GLCapabilities2AttribList(capsChosen0); _EGLConfig[] configs = new _EGLConfig[1]; int[] numConfigs = new int[1]; if (!EGL.eglChooseConfig(eglDisplay, attrs, 0, configs, configs.length, numConfigs, 0)) { - throw new GLException("Graphics configuration selection (eglChooseConfig) failed for surfaceType 0x"+Integer.toHexString(eglSurfaceType)+", "+capsChosen0); + throw new GLException("Graphics configuration selection (eglChooseConfig) failed for "+capsChosen0); } if (numConfigs[0] > 0) { if(DEBUG) { - GLCapabilities[] caps = eglConfigs2GLCaps(glp, eglDisplay, configs, numConfigs[0], - capsChosen0.isOnscreen(), capsChosen0.isPBuffer()); + GLCapabilities[] caps = eglConfigs2GLCaps(glp, eglDisplay, configs, numConfigs[0]); System.err.println("EGL Choose Configs: "+numConfigs[0]+", Caps "+caps.length); printCaps("eglChooseConfig", caps, System.err); } @@ -224,11 +227,9 @@ public class EGLGraphicsConfigurationFactory extends GraphicsConfigurationFactor } val[0]=0; } - GLCapabilities capsChosen1 = EGLGraphicsConfiguration.EGLConfig2Capabilities(glp, eglDisplay, configs[0], - capsChosen0.isOnscreen(), capsChosen0.isPBuffer()); + GLCapabilities capsChosen1 = EGLGraphicsConfiguration.EGLConfig2Capabilities(glp, eglDisplay, configs[0]); if(DEBUG) { System.err.println("eglChooseConfig found: eglDisplay 0x"+Long.toHexString(eglDisplay)+ - ", surfaceType 0x"+Integer.toHexString(eglSurfaceType)+ ", eglConfig ID 0x"+Integer.toHexString(val[0])+ ", "+capsChosen0+" -> "+capsChosen1); } @@ -237,19 +238,16 @@ public class EGLGraphicsConfigurationFactory extends GraphicsConfigurationFactor } else { if(DEBUG) { System.err.println("EGL Choose Configs: None using eglDisplay 0x"+Long.toHexString(eglDisplay)+ - ", surfaceType 0x"+Integer.toHexString(eglSurfaceType)+ ", "+capsChosen0); } } return null; } - protected static GLCapabilities[] eglConfigs2GLCaps(GLProfile glp, long eglDisplay, _EGLConfig[] configs, int num, - boolean onscreen, boolean pbuffer) - { + protected static GLCapabilities[] eglConfigs2GLCaps(GLProfile glp, long eglDisplay, _EGLConfig[] configs, int num) { GLCapabilities[] caps = new GLCapabilities[num]; for(int i=0; i<num; i++) { - caps[i] = EGLGraphicsConfiguration.EGLConfig2Capabilities(glp, eglDisplay, configs[i], onscreen, pbuffer); + caps[i] = EGLGraphicsConfiguration.EGLConfig2Capabilities(glp, eglDisplay, configs[i]); } return caps; } diff --git a/src/jogl/classes/com/sun/opengl/impl/egl/EGLPbufferDrawable.java b/src/jogl/classes/com/sun/opengl/impl/egl/EGLPbufferDrawable.java index 498372e55..09dbbeee6 100644 --- a/src/jogl/classes/com/sun/opengl/impl/egl/EGLPbufferDrawable.java +++ b/src/jogl/classes/com/sun/opengl/impl/egl/EGLPbufferDrawable.java @@ -82,6 +82,12 @@ public class EGLPbufferDrawable extends EGLDrawable { } protected static EGLGraphicsConfiguration createEGLGraphicsConfiguration(GLCapabilities caps, GLCapabilitiesChooser chooser) { + if(caps.isOnscreen()) { + throw new GLException("Error: Onscreen set: "+caps); + } + if(!caps.isPBuffer()) { + throw new GLException("Error: PBuffer not set: "+caps); + } long eglDisplay = EGL.eglGetDisplay(EGL.EGL_DEFAULT_DISPLAY); if (eglDisplay == EGL.EGL_NO_DISPLAY) { throw new GLException("Failed to created EGL default display: error 0x"+Integer.toHexString(EGL.eglGetError())); @@ -93,7 +99,7 @@ public class EGLPbufferDrawable extends EGLDrawable { } EGLGraphicsDevice e = new EGLGraphicsDevice(eglDisplay); DefaultGraphicsScreen s = new DefaultGraphicsScreen(e, 0); - EGLGraphicsConfiguration eglConfig = EGLGraphicsConfigurationFactory.chooseGraphicsConfigurationStatic(caps, chooser, s, EGL.EGL_PBUFFER_BIT); + EGLGraphicsConfiguration eglConfig = EGLGraphicsConfigurationFactory.chooseGraphicsConfigurationStatic(caps, chooser, s); if (null == eglConfig) { EGL.eglTerminate(eglDisplay); throw new GLException("Couldn't create EGLGraphicsConfiguration from "+s); -- cgit v1.2.3