From e2223107cc54e08031bd9505ce8a9ccc72673be0 Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Sat, 28 Dec 2019 04:16:18 +0100 Subject: Bug 1347: Resolve Merged EGL/Desktop Profile Mapping GLProfile.computeProfileImpl(..) as of Bug 1084 is not the culprit here and its hardware criteria filter works. The issue is commit 99a064327bf991318841c858d21d13e55d6b39db of Bug 1203, in particular the change in GLProfile re: "Merge computed EGL-Profile-Map (1) and Desktop-Profile-Map (2) per device, instead of just using the last computation, preserving and favoratizing the Desktop-Profile-Map." Here the Desktop-Profile-Map overwrites the EGL-Profile-Map and hence the software mapping gets used. Indeed, this is a regression cause by the work of Bug 1203. +++ Resolution is to revert the explicit 'union mapping' and rely on an enhanced 'GLContextImpl.remapAvailableGLVersions(fromDevice, toDevice)' function. Here the EGLDrawableFactory _already_ maps the EGL device's GL Versions to the 'host' device (e.g. X11). This has to be refined so that the remap will not overwrite the 'host' device's already detected GL Versions. That alone is enough, so that GLProfile can simply use the 'mappedEGLProfiles' of the 'host' device if detected, which already is a merged mapping of X11 host- and EGL sub-device. In case no 'mappedEGLProfiles' are available, we simply use the 'mappedDesktopProfiles'. --- src/jogl/classes/com/jogamp/opengl/GLContext.java | 3 ++ src/jogl/classes/com/jogamp/opengl/GLProfile.java | 22 ++++++------ src/jogl/classes/jogamp/opengl/GLContextImpl.java | 39 +++++++++++++++++++--- src/jogl/classes/jogamp/opengl/egl/EGLContext.java | 8 +++-- .../jogamp/opengl/egl/EGLDrawableFactory.java | 4 ++- 5 files changed, 57 insertions(+), 19 deletions(-) (limited to 'src/jogl') diff --git a/src/jogl/classes/com/jogamp/opengl/GLContext.java b/src/jogl/classes/com/jogamp/opengl/GLContext.java index 88fed4450..4455633a1 100644 --- a/src/jogl/classes/com/jogamp/opengl/GLContext.java +++ b/src/jogl/classes/com/jogamp/opengl/GLContext.java @@ -1647,6 +1647,9 @@ public abstract class GLContext { ctp[0] = ( bits32 & 0x0000FFFF ) ; return new VersionNumber(major, minor, 0); } + protected static int getCTPFromBits(final int bits32) { + return ( bits32 & 0x0000FFFF ); + } protected static void validateProfileBits(final int bits, final String argName) { int num = 0; diff --git a/src/jogl/classes/com/jogamp/opengl/GLProfile.java b/src/jogl/classes/com/jogamp/opengl/GLProfile.java index c52e3136e..8612fc73f 100644 --- a/src/jogl/classes/com/jogamp/opengl/GLProfile.java +++ b/src/jogl/classes/com/jogamp/opengl/GLProfile.java @@ -1982,8 +1982,16 @@ public class GLProfile { } } - if( !addedDesktopProfile && !addedMobileProfile ) { - setProfileMap(device, new HashMap()); // empty + final HashMap mappedAllProfiles; + if( addedMobileProfile ) { + // If run on actual desktop device, e.g. '.x11_:0_0', + // GLContextImpl.remapAvailableGLVersion('.egl_:0_0' -> '.x11_:0_0') + // ensures EGL profiles being mapped to upstream desktop device '.x11_:0_0'. + mappedAllProfiles = mappedEGLProfiles; + } else if( addedDesktopProfile ) { + mappedAllProfiles = mappedDesktopProfiles; + } else { + mappedAllProfiles = new HashMap(); // empty if(DEBUG) { System.err.println("GLProfile: device could not be initialized: "+device); System.err.println("GLProfile: compatible w/ desktop: "+deviceIsDesktopCompatible+ @@ -1993,16 +2001,8 @@ public class GLProfile { System.err.println("GLProfile: hasGLES1Impl "+hasGLES1Impl); System.err.println("GLProfile: hasGLES3Impl "+hasGLES3Impl); } - } else { - final HashMap mappedAllProfiles = new HashMap(); - if( addedMobileProfile ) { - mappedAllProfiles.putAll(mappedEGLProfiles); - } - if( addedDesktopProfile ) { - mappedAllProfiles.putAll(mappedDesktopProfiles); - } - setProfileMap(device, mappedAllProfiles); // union } + setProfileMap(device, mappedAllProfiles); // merged mappedEGLProfiles if available, otherwise mappedDesktopProfiles GLContext.setAvailableGLVersionsSet(device, true); diff --git a/src/jogl/classes/jogamp/opengl/GLContextImpl.java b/src/jogl/classes/jogamp/opengl/GLContextImpl.java index 60a351fc2..11b155760 100644 --- a/src/jogl/classes/jogamp/opengl/GLContextImpl.java +++ b/src/jogl/classes/jogamp/opengl/GLContextImpl.java @@ -63,6 +63,7 @@ import com.jogamp.gluegen.runtime.opengl.GLNameResolver; import com.jogamp.gluegen.runtime.opengl.GLProcAddressResolver; import com.jogamp.opengl.GLExtensions; import com.jogamp.opengl.GLRendererQuirks; + import com.jogamp.nativewindow.AbstractGraphicsConfiguration; import com.jogamp.nativewindow.AbstractGraphicsDevice; import com.jogamp.nativewindow.NativeSurface; @@ -1098,13 +1099,24 @@ public abstract class GLContextImpl extends GLContext { } - protected static void remapAvailableGLVersions(final AbstractGraphicsDevice fromDevice, final AbstractGraphicsDevice toDevice) { + /** + * Remaps all available GL Version from {@code fromDevice} to {@code toDevice}. + * + * @param fromDevice the required matching device key to be mapped + * @param toDevice mapped GL version target + * @param overwrite if {@code true} overwrites previous mapping, otherwise leaves it untouched + * @param ctpCriteria the given GL Version context profile required to map a {@code fromDevice} GL Version. + * To map all GL Versions, just pass {@link GLContext#CTX_PROFILE_ES} | {@link GLContext#CTX_PROFILE_CORE} | {@link GLContext#CTX_PROFILE_COMPAT} + */ + protected static void remapAvailableGLVersions(final AbstractGraphicsDevice fromDevice, final AbstractGraphicsDevice toDevice, + final boolean overwrite, final int ctpCriteria) { if( fromDevice == toDevice || fromDevice.getUniqueID() == toDevice.getUniqueID() ) { return; // NOP } synchronized(deviceVersionAvailable) { if(DEBUG) { - System.err.println(getThreadName() + ": createContextARB-MapGLVersions REMAP "+fromDevice+" -> "+toDevice); + System.err.println(getThreadName() + ": createContextARB-MapGLVersions REMAP "+fromDevice+" -> "+toDevice+ + ", overwrite "+overwrite+", ctpCriteria "+getGLProfile(new StringBuilder(), ctpCriteria).toString()); } final IdentityHashMap newDeviceVersionAvailable = new IdentityHashMap(); final Set keys = deviceVersionAvailable.keySet(); @@ -1115,7 +1127,7 @@ public abstract class GLContextImpl extends GLContext { if(DEBUG) { final int[] ctp = { 0 }; final VersionNumber version = decomposeBits(valI.intValue(), ctp); - System.err.println(" MapGLVersions REMAP OLD "+origKey+" -> "+GLContext.getGLVersion(new StringBuilder(), version, ctp[0], null).toString()); + System.err.println(" MapGLVersions REMAP VAL0 "+origKey+" == "+GLContext.getGLVersion(new StringBuilder(), version, ctp[0], null).toString()); } newDeviceVersionAvailable.put(origKey, valI); final int devSepIdx = origKey.lastIndexOf('-'); @@ -1124,12 +1136,29 @@ public abstract class GLContextImpl extends GLContext { } final String devUniqueID = origKey.substring(0, devSepIdx); if( fromDevice.getUniqueID().equals(devUniqueID) ) { + // key/val pair from 'fromDevice' to be mapped to 'toDevice' final String profileReq = origKey.substring(devSepIdx); final String newKey = (toDevice.getUniqueID()+profileReq).intern(); + final Integer preI = deviceVersionAvailable.get(newKey); + final int valCTP = getCTPFromBits(valI.intValue()); + final boolean write = ( overwrite || null == preI ) && 0 != ( ctpCriteria & valCTP ); + if( write ) { + newDeviceVersionAvailable.put(newKey, valI); + } if(DEBUG) { - System.err.println(" MapGLVersions REMAP NEW "+newKey+" -> (ditto)"); + if( write ) { + System.err.println(" MapGLVersions REMAP NEW0 "+newKey+" -> (ditto)"); + } else { + System.err.println(" MapGLVersions REMAP NEW0 "+newKey+" (unchanged)"); + } + if( null != preI ) { + final int[] ctp = { 0 }; + final VersionNumber version = decomposeBits(preI.intValue(), ctp); + System.err.println(" MapGLVersions REMAP OLD1 "+newKey+" :: "+GLContext.getGLVersion(new StringBuilder(), version, ctp[0], null).toString()); + } else { + System.err.println(" MapGLVersions REMAP OLD1 "+newKey+" :: (nil)"); + } } - newDeviceVersionAvailable.put(newKey, valI); } } } diff --git a/src/jogl/classes/jogamp/opengl/egl/EGLContext.java b/src/jogl/classes/jogamp/opengl/egl/EGLContext.java index 28448d537..5b7c7da2c 100644 --- a/src/jogl/classes/jogamp/opengl/egl/EGLContext.java +++ b/src/jogl/classes/jogamp/opengl/egl/EGLContext.java @@ -480,8 +480,12 @@ public class EGLContext extends GLContextImpl { return GLContext.getGLProfile(sb, ctp); } /* pp */ int getContextOptions() { return ctxOptions; } - protected static void remapAvailableGLVersions(final AbstractGraphicsDevice fromDevice, final AbstractGraphicsDevice toDevice) { - GLContextImpl.remapAvailableGLVersions(fromDevice, toDevice); + /** + * Delegates to {@link GLContextImpl#remapAvailableGLVersions(AbstractGraphicsDevice, AbstractGraphicsDevice, boolean, int)} + */ + protected static void remapAvailableGLVersions(final AbstractGraphicsDevice fromDevice, final AbstractGraphicsDevice toDevice, + final boolean overwrite, final int ctpCriteria) { + GLContextImpl.remapAvailableGLVersions(fromDevice, toDevice, overwrite, ctpCriteria); } protected static synchronized void setMappedGLVersionListener(final MappedGLVersionListener mvl) { GLContextImpl.setMappedGLVersionListener(mvl); diff --git a/src/jogl/classes/jogamp/opengl/egl/EGLDrawableFactory.java b/src/jogl/classes/jogamp/opengl/egl/EGLDrawableFactory.java index 026776769..b0c5d1928 100644 --- a/src/jogl/classes/jogamp/opengl/egl/EGLDrawableFactory.java +++ b/src/jogl/classes/jogamp/opengl/egl/EGLDrawableFactory.java @@ -659,7 +659,9 @@ public class EGLDrawableFactory extends GLDrawableFactoryImpl { } if( mappedToDefaultDevice[0] ) { - EGLContext.remapAvailableGLVersions(defaultDevice, adevice); + // map all GL versions (ES, CORE or COMPAT) to 'adevice' if not existing (no overwrite) + EGLContext.remapAvailableGLVersions(defaultDevice, adevice, false /* overwrite */, + EGLContext.CTX_PROFILE_ES | EGLContext.CTX_PROFILE_CORE | EGLContext.CTX_PROFILE_COMPAT ); sr = defaultSharedResource; } else { if( hasX11 ) { -- cgit v1.2.3