/** * Copyright 2012 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of JogAmp Community. */ package com.jogamp.opengl; import java.util.IdentityHashMap; import javax.media.nativewindow.AbstractGraphicsDevice; import jogamp.opengl.egl.EGL; import jogamp.opengl.egl.EGLExt; /** * 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
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. */
public static final int GLSLBuggyDiscard = 5;
/**
* Non compliant GL context due to a buggy implementation not suitable for use.
* * Currently, Mesa >= 9.1.3 (may extend back as far as 9.0) OpenGL 3.1 compatibility * context is not compliant. Most programs will give completely broken output (or no * output at all. For now, this context is not trusted. *
* The above has been confirmed for the following Mesa 9.* GL_RENDERER strings: *
* It still has to be verified whether the AMD OpenGL 3.1 core driver is compliant enought.
*/
public static final int GLNonCompliant = 6;
/**
* The OpenGL Context needs a glFlush()
before releasing it, otherwise driver may freeze:
*
* 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 X11
, not with GLX/DRI renderer.* See Bug 515 - https://jogamp.org/bugzilla/show_bug.cgi?id=515 * and {@link jogamp.nativewindow.x11.X11Util#ATI_HAS_XCLOSEDISPLAY_BUG}. *
** See Bug 705 - https://jogamp.org/bugzilla/show_bug.cgi?id=705 *
*/ public static final int DontCloseX11Display = 8; /** * Need current GL Context when calling new ARB pixel format query functions, * otherwise driver crashes the VM. ** Drivers known exposing such bug: *
* See Bug 480 - https://jogamp.org/bugzilla/show_bug.cgi?id=480 *
*/ public static final int NeedCurrCtx4ARBPixFmtQueries = 9; /** * Need current GL Context when calling new ARB CreateContext function, * otherwise driver crashes the VM. ** Drivers known exposing such bug: *
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
*
jogl.fbo.force.min
.
*/
public static final int NoFullFBOSupport = 11;
/**
* GLSL is not compliant or even not stable (crash)
* * X11 Mesa DRI Intel(R) driver >= 9.2.1 cannot handle multithreaded shared GLContext usage * with non-blocking exclusive X11 display connections. * References: *
* 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: ** On Android 4.*, Huawei's Ascend G615 w/ Immersion.16 could not make a shared context * current, which uses a pbuffer drawable: *
*
*/ public static final int GLSharedContextBuggy = 14; /** * Bug 925 - Accept an ES3 Context, if reported via GL-Version-String w/o {@link EGLExt#EGL_OPENGL_ES3_BIT_KHR}. ** The ES3 Context can be used via {@link EGL#EGL_OPENGL_ES2_BIT}. *
** The ES3 Context {@link EGL#eglCreateContext(long, long, long, java.nio.IntBuffer) must be created} with version attributes: *
* EGL.EGL_CONTEXT_CLIENT_VERSION, 2, .. ** *
* Not thread safe. *
*/ public static GLRendererQuirks getStickyDeviceQuirks(AbstractGraphicsDevice device) { final String key = device.getUniqueID(); final GLRendererQuirks has = stickyDeviceQuirks.get(key); final GLRendererQuirks res; if( null == has ) { res = new GLRendererQuirks(); stickyDeviceQuirks.put(key, res); } else { res = has; } return res; } /** * {@link #addQuirks(int[], int, int) Adding given quirks} of sticky {@link AbstractGraphicsDevice}'s {@link GLRendererQuirks}. ** Not thread safe. *
*/ public static void addStickyDeviceQuirks(AbstractGraphicsDevice device, int[] quirks, int offset, int len) throws IllegalArgumentException { final GLRendererQuirks sq = getStickyDeviceQuirks(device); sq.addQuirks(quirks, offset, len); } /** * {@link #addQuirks(GLRendererQuirks) Adding given quirks} of sticky {@link AbstractGraphicsDevice}'s {@link GLRendererQuirks}. ** Not thread safe. *
*/ public static void addStickyDeviceQuirks(AbstractGraphicsDevice device, GLRendererQuirks quirks) throws IllegalArgumentException { final GLRendererQuirks sq = getStickyDeviceQuirks(device); sq.addQuirks(quirks); } /** * {@link #exist(int) Query} of sticky {@link AbstractGraphicsDevice}'s {@link GLRendererQuirks}. ** Not thread safe. However, use after changing the sticky quirks is safe. *
*/ public static boolean existStickyDeviceQuirk(AbstractGraphicsDevice device, int quirk) { return getStickyDeviceQuirks(device).exist(quirk); } /** * {@link #addQuirks(GLRendererQuirks) Pushing} the sticky {@link AbstractGraphicsDevice}'s {@link GLRendererQuirks} * to the given {@link GLRendererQuirks destination}. ** Not thread safe. However, use after changing the sticky quirks is safe. *
*/ public static void pushStickyDeviceQuirks(AbstractGraphicsDevice device, GLRendererQuirks dest) { dest.addQuirks(getStickyDeviceQuirks(device)); } private int _bitmask; public GLRendererQuirks() { _bitmask = 0; } /** * @param quirks an array of valid quirks * @param offset offset in quirks array to start reading * @param len number of quirks to read from offset within quirks array * @throws IllegalArgumentException if one of the quirks is out of range */ public GLRendererQuirks(int[] quirks, int offset, int len) throws IllegalArgumentException { this(); addQuirks(quirks, offset, len); } /** * @param quirks an array of valid quirks to be added * @param offset offset in quirks array to start reading * @param len number of quirks to read from offset within quirks array * @throws IllegalArgumentException if one of the quirks is out of range */ public final void addQuirks(int[] quirks, int offset, int len) throws IllegalArgumentException { int bitmask = 0; if( !( 0 <= offset + len && offset + len < quirks.length ) ) { throw new IllegalArgumentException("offset and len out of bounds: offset "+offset+", len "+len+", array-len "+quirks.length); } for(int i=offset; i