Class GLRendererQuirks


  • public class GLRendererQuirks
    extends Object
    GLRendererQuirks contains information of known bugs of various GL renderer. This information allows us to workaround them.

    Using centralized quirk identifier enables us to locate code dealing w/ it and hence eases it's maintenance.

    Some GL_VENDOR and GL_RENDERER strings are listed here .

    For testing purpose or otherwise, you may override the implemented quirk bit setting behavior using GLRendererQuirks.Override.

    • Field Detail

      • NoDoubleBufferedPBuffer

        public static final int NoDoubleBufferedPBuffer
        Crashes XServer when using double buffered PBuffer with hardware GL_RENDERER on Mesa < 18.2.2:
        • Mesa DRI Intel(R) Sandybridge Desktop
        • Mesa DRI Intel(R) Ivybridge Mobile - 3.0 Mesa 8.0.4
        • Gallium 0.4 on AMD CYPRESS
        For now, it is safe to disable it w/ hw-acceleration.
        See Also:
        Constant Field Values
      • NoDoubleBufferedBitmap

        public static final int NoDoubleBufferedBitmap
        On Windows no double buffered bitmaps are guaranteed to be available.
        See Also:
        Constant Field Values
      • NoSetSwapInterval

        public static final int NoSetSwapInterval
        Crashes application when trying to set EGL swap interval on Android 4.0.3 / Pandaboard ES / PowerVR SGX 540
        See Also:
        Constant Field Values
      • NoOffscreenBitmap

        public static final int NoOffscreenBitmap
        No offscreen bitmap available, currently true for JOGL's OSX implementation.
        See Also:
        Constant Field Values
      • NoSetSwapIntervalPostRetarget

        public static final int NoSetSwapIntervalPostRetarget
        SIGSEGV on setSwapInterval() after changing the context's drawable w/ Mesa >= 8.0.4 until Mesa < 18.2.2: dri2SetSwapInterval/DRI2 (soft & intel)
        See Also:
        Constant Field Values
      • GLSLBuggyDiscard

        public static final int GLSLBuggyDiscard
        GLSL discard command leads to undefined behavior or won't get compiled if being used.

        Appears to have happened on Nvidia Tegra2, but seems to be fine now.
        FIXME: Constrain version.

        See Also:
        Constant Field Values
      • GL3CompatNonCompliant

        public static final int GL3CompatNonCompliant
        Non compliant OpenGL 3.1+ compatibility profile due to a buggy implementation not suitable for use.

        Mesa versions in the range [9.1.3 .. 18.2.0[ are not fully compliant with the OpenGL 3.1 compatibility profile. Most programs will give completely broken output (or no output at all.

        The above has been confirmed for the following Mesa 9.* GL_RENDERER strings:

        • Mesa .* Intel(R) Sandybridge Desktop
        • Gallium 0.4 on AMD RS880

        Default implementation sets this quirk on all Mesa < 18.2.0 drivers.

        See Also:
        Constant Field Values
      • GLFlushBeforeRelease

        public static final int GLFlushBeforeRelease
        The OpenGL context needs a glFlush() before releasing it, otherwise driver may freeze:
        • OSX < 10.7.3 - NVidia Driver. Bug 533 and Bug 548 @ https://jogamp.org/bugzilla/.
        See Also:
        Constant Field Values
      • DontCloseX11Display

        public static final int DontCloseX11Display
        Closing X11 displays may cause JVM crashes or X11 errors with some buggy drivers while being used in concert w/ OpenGL.

        Some drivers may require X11 displays to be closed in the same order as they were created, some may not allow them to be closed at all while resources are being used somehow.

        Drivers known exposing such bug:

        • Mesa < 8.0 _with_ X11 software renderer Mesa X11, not with GLX/DRI renderer.
        • ATI proprietary Catalyst X11 driver versions:
          • 8.78.6
          • 8.881
          • 8.911
          • 9.01.8

        See Bug 515 - https://jogamp.org/bugzilla/show_bug.cgi?id=515 and X11Util.ATI_HAS_XCLOSEDISPLAY_BUG.

        See Bug 705 - https://jogamp.org/bugzilla/show_bug.cgi?id=705

        See Also:
        Constant Field Values
      • NeedCurrCtx4ARBPixFmtQueries

        public static final int NeedCurrCtx4ARBPixFmtQueries
        Need current GL context when calling new ARB pixel format query functions, otherwise driver crashes the VM.

        Drivers known exposing such bug:

        • ATI proprietary Catalyst driver on Windows version ≤ XP. TODO: Validate if bug actually relates to 'old' ATI Windows drivers for old GPU's like X300 regardless of the Windows version.

        See Bug 480 - https://jogamp.org/bugzilla/show_bug.cgi?id=480

        See Also:
        Constant Field Values
      • NeedCurrCtx4ARBCreateContext

        public static final int NeedCurrCtx4ARBCreateContext
        Need current GL context when calling new ARB CreateContext function, otherwise driver crashes the VM.

        Drivers known exposing such bug:

        • ATI proprietary Catalyst Windows driver on laptops with a driver version as reported in GL_VERSION:
          • null
          • < 12.102.3.0 ( amd_catalyst_13.5_mobility_beta2 )

        See Bug 706 - https://jogamp.org/bugzilla/show_bug.cgi?id=706
        See Bug 520 - https://jogamp.org/bugzilla/show_bug.cgi?id=520

        See Also:
        Constant Field Values
      • NoFullFBOSupport

        public static final int NoFullFBOSupport
        No full FBO support, i.e. not compliant w/
        • GL_ARB_framebuffer_object
        • EXT_framebuffer_object
        • EXT_framebuffer_multisample
        • EXT_framebuffer_blit
        • EXT_packed_depth_stencil
        . Drivers known exposing such bug:
        • Mesa 7.12-devel on Windows with VMware SVGA3D renderer:
          • GL_VERSION: 2.1 Mesa 7.12-devel (git-d6c318e)
          • GL_RENDERER: Gallium 0.4 on SVGA3D; build: RELEASE;

        Note: Also enabled via BuggyColorRenderbuffer.

        See Also:
        Constant Field Values
      • GLSLNonCompliant

        public static final int GLSLNonCompliant
        GLSL is not compliant or even not stable (crash)
        • OSX < 10.7.0 (?) - NVidia Driver. Bug 818 @ https://jogamp.org/bugzilla/.
        See Also:
        Constant Field Values
      • GL4NeedsGL3Request

        public static final int GL4NeedsGL3Request
        GL4 context needs to be requested via GL3 profile attribute
        • OSX >= 10.9.0 - kCGLOGLPVersion_GL4_Core may not produce hw-accel context. Bug 867 @ https://jogamp.org/bugzilla/.
        See Also:
        Constant Field Values
      • GLSharedContextBuggy

        public static final int GLSharedContextBuggy
        Buggy shared OpenGL context support within a multithreaded use-case, not suitable for stable usage.

        X11 Mesa DRI Intel(R) driver >= 9.2.1 cannot handle multithreaded shared GLContext usage with non-blocking exclusive X11 display connections. References:

        • Bug 873: https://jogamp.org/bugzilla/show_bug.cgi?id=873
        • https://bugs.freedesktop.org/show_bug.cgi?id=41736#c8

        However, not all multithreaded use-cases are broken, e.g. our GLMediaPlayer does work.

        The above has been confirmed for the following Mesa 9.* strings:
        • GL_VENDOR Intel Open Source Technology Center
        • GL_RENDERER Mesa DRI Intel(R) Sandybridge Desktop
        • GL_RENDERER Mesa DRI Intel(R) Ivybridge Mobile
        • GL_VERSION 3.1 (Core Profile) Mesa 9.2.1

        On Android 4.*, Huawei's Ascend G615 w/ Immersion.16 could not make a shared context current, which uses a pbuffer drawable:

        • Android 4.*
        • GL_VENDOR Hisilicon Technologies
        • GL_RENDERER Immersion.16
        • GL_VERSION OpenGL ES 2.0

        See Also:
        Constant Field Values
      • SingletonEGLDisplayOnly

        public static final int SingletonEGLDisplayOnly
        Bug 948 - NVIDIA 331.38 (Linux X11) EGL impl. only supports _one_ EGL Device via EGL.eglGetDisplay(long).

        Subsequent calls to EGL.eglGetDisplay(long) fail.

        Reusing global EGL display works.

        The quirk is autodetected within EGLDrawableFactory's initial default device setup!

        Appears on:

        • EGL_VENDOR NVIDIA
        • EGL_VERSION 1.4
        • GL_VENDOR NVIDIA Corporation
        • GL_VERSION OpenGL ES 3.0 331.38 (probably w/ 1st NV EGL lib on x86)
        • GL_VERSION OpenGL ES 3.1 NVIDIA 355.06 (unstable)
        • Platform X11
        • CPU Family Platform.CPUFamily.X86

        See Also:
        Constant Field Values
      • NoMultiSamplingBuffers

        public static final int NoMultiSamplingBuffers
        No reliable MSAA / FSAA multi sampling available, i.e. driver may crash.

        Appears on:

        • GL_VENDOR nouveau
        • GL_RENDERER Gallium 0.4 on NV34
        TODO: We have to determine the exact version range, i.e. not adding the quirk with fixed driver version!

        TODO: Since we currently don't handle this quirk internally, a user may need to do the following:
         final AbstractGraphicsDevice adevice = GLDrawableFactory.getDesktopFactory(); // or similar
         if( GLRendererQuirks.existStickyDeviceQuirk(adevice, GLRendererQuirks.NoMultiSamplingBuffers) ) {
            // don't use MSAA
         }
         
        See Also:
        Constant Field Values
      • BuggyColorRenderbuffer

        public static final int BuggyColorRenderbuffer
        Buggy FBO color renderbuffer target, i.e. driver may crash.

        Appears on:

        • GL_VENDOR Brian Paul
        • GL_RENDERER Mesa X11
        • GL_VERSION 2.1 Mesa 7.2
        TODO: We have to determine the exact version range, i.e. not adding the quirk with fixed driver version!

        Note: Also enables NoFullFBOSupport.

        Note: GLFBODrawable always uses texture attachments if set.

        See Also:
        Constant Field Values
      • NoPBufferWithAccum

        public static final int NoPBufferWithAccum
        No pbuffer supporting accumulation buffers available, even if driver claims otherwise.

        Some drivers wrongly claim to support pbuffers with accumulation buffers. However, the creation of such pbuffer fails:

           com.jogamp.opengl.GLException: pbuffer creation error: Couldn't find a suitable pixel format
         

        Appears on:

        • GL_VENDOR Intel
        • GL_RENDERER Intel Bear Lake B
        • GL_VERSION 1.4.0 - Build 8.14.10.1930
        • Platform Windows

        See Also:
        Constant Field Values
      • NeedSharedObjectSync

        public static final int NeedSharedObjectSync
        Need GL objects (VBO, ..) to be synchronized when utilized concurrently from multiple threads via a shared GL context, otherwise driver crashes the VM.

        Usually synchronization should not be required, if the shared GL objects are created and immutable before concurrent usage.
        However, using drivers exposing this issue always require the user to synchronize access of shared GL objects.

        Synchronization can be avoided if accessing the shared GL objects exclusively via a queue or Ringbuffer, see GLMediaPlayerImpl as an example.

        Appears on:

        • Platform OSX
          • detected on OSX 10.9.5 first
          • any driver
          • enabled for all OSX versions

        See Bug 1088 - https://jogamp.org/bugzilla/show_bug.cgi?id=1088

        See Also:
        Constant Field Values
      • NoARBCreateContext

        public static final int NoARBCreateContext
        No reliable ARB_create_context implementation, even if driver claims otherwise.

        Some drivers wrongly claim to support ARB_create_context. However, the creation of such context fails:

           com.jogamp.opengl.GLException: AWT-EventQueue-0: WindowsWGLContex.createContextImpl ctx !ARB, profile > GL2
           requested (OpenGL >= 3.0.1). Requested: GLProfile[GL3bc/GL3bc.hw], current: 2.1 (Compat profile, FBO, hardware)
           - 2.1.8787
         

        Appears on:

        • GL_VENDOR ATI Technologies Inc.
        • GL_RENDERER ATI Radeon 3100 Graphics
        • GL_VERSION 2.1.8787
        • Platform Windows

        See Also:
        Constant Field Values
      • NoSurfacelessCtx

        public static final int NoSurfacelessCtx
        No support for ES or desktop GL >= 3.0 current context without surface, i.e. without a default framebuffer as read- and write drawables.

        See OpenGL spec 3.0, chapter 2.1 OpenGL Fundamentals, page 7 or
        OpenGL ES spec 3.0.2, chapter 2.1 OpenGL Fundamentals, page 6:

         It is possible to use a GL context without a default framebuffer, in which case
         a framebuffer object must be used to perform all rendering. This is useful for
         applications neeting to perform offscreen rendering.
         

        The feature will be attempted at initialization and this quirk will be set if failing.

        Known drivers failing the specification:

        • GNU/Linux X11 Nvidia proprietary driver
          • GL_VERSION 4.4.0 NVIDIA 340.24
          • GL_VERSION 4.6.0 NVIDIA 440.36
          • Platform GNU/Linux X11

        See Also:
        Constant Field Values
      • No10BitColorCompOffscreen

        public static final int No10BitColorCompOffscreen
        On Mesa >= 18.0.0, glXChooseFBConfig selects better GLCapabilities FBConfig than actually supported by glXCreatePbuffer and glXCreateGLXPixmap.

        As tested on Mesa 18.3.6, requesting an RGB 8bit color component FBConfig for GLX_PBUFFER_BIT and GLX_PIXMAP_BIT GLX_DRAWABLE_TYPEs via glXChooseFBConfig returns an RGB 10bit color component FBConfig as its best match. Subsequent glXCreatePbuffer and glXCreateGLXPixmap calls fail.

        This bugs seems to occur in Mesa >= 18.0.0 using allow_rgb10_configs, which is the default now. While the 10 bit color components are not listed for on-screen GLX.GLX_WINDOW_BIT GLX_DRAWABLE_TYPEs, they are listed for above mentioned off-screen types without XVisualInfo reference.

        This quirk disables using any color component > 8 bit for GLX_PBUFFER_BIT and GLX_PIXMAP_BIT types and forces using an optional given GLCapabilitiesChooser or the DefaultGLCapabilitiesChooser.

        Note: Also implies DontChooseFBConfigBestMatch for GLX_PBUFFER_BIT and GLX_PIXMAP_BIT types.

        See Also:
        Constant Field Values
    • Constructor Detail

      • GLRendererQuirks

        public GLRendererQuirks()