aboutsummaryrefslogtreecommitdiffstats
path: root/src/jogl/classes/javax/media
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2014-10-01 23:51:33 +0200
committerSven Gothel <[email protected]>2014-10-01 23:59:16 +0200
commit66d00dfc4cb2612fa91680b960baf5a2fb5fed53 (patch)
treef39071526a9172550e1bed9c8fc2682639f79b72 /src/jogl/classes/javax/media
parent39cd0dfa0e46a3617b51e5b15a5fccedeae77f39 (diff)
Bug 1084: Fix GLProfile Mapping regarding hardware priority, honor software/hardware attribute of all profiles
GLProfile's mapping code does not consider the following combination: - GL4 software - GL3 hardware and hence maps GL4-software -> [GL2ES2, GL2GL3], where GL3-hardware -> [GL2ES2, GL2GL3] is desired. This combination has recently been observed on Mac OSX 10.9.5, which includes a software GL 4.1 implementation. However, other systems could be affected as well. +++ Fix GLProfile.computeProfileImpl(..): Only use the higher profile, if hardware-accelerated or none of the lower profiles offers hardware-acceleration! This extra condition was missing for certain profiles, e.g. GL4, GL4bc, GL3, GL3bc and GL2. Conflicts: make/scripts/tests.sh
Diffstat (limited to 'src/jogl/classes/javax/media')
-rw-r--r--src/jogl/classes/javax/media/opengl/GLProfile.java174
1 files changed, 110 insertions, 64 deletions
diff --git a/src/jogl/classes/javax/media/opengl/GLProfile.java b/src/jogl/classes/javax/media/opengl/GLProfile.java
index 08712e488..c7aaca5d3 100644
--- a/src/jogl/classes/javax/media/opengl/GLProfile.java
+++ b/src/jogl/classes/javax/media/opengl/GLProfile.java
@@ -2056,71 +2056,95 @@ public class GLProfile {
* Returns the profile implementation
*/
private static String computeProfileImpl(final AbstractGraphicsDevice device, final String profile, final boolean desktopCtxUndef, final boolean esCtxUndef, final boolean isHardwareRasterizer[]) {
- if (GL2ES1 == profile) {
- final boolean es1HardwareRasterizer[] = new boolean[1];
- final boolean gles1Available = hasGLES1Impl && ( esCtxUndef || GLContext.isGLES1Available(device, es1HardwareRasterizer) );
- final boolean gles1HWAvailable = gles1Available && es1HardwareRasterizer[0] ;
+ final boolean hardwareRasterizer[] = new boolean[1];
+ if ( GL2ES1 == profile ) {
+ final boolean gles1Available;
+ final boolean gles1HWAvailable;
+ if( hasGLES1Impl ) {
+ gles1Available = esCtxUndef || GLContext.isGLES1Available(device, hardwareRasterizer);
+ gles1HWAvailable = gles1Available && hardwareRasterizer[0] ;
+ } else {
+ gles1Available = false;
+ gles1HWAvailable = false;
+ }
if(hasGL234Impl) {
- if(GLContext.isGL4bcAvailable(device, isHardwareRasterizer)) {
- if(!gles1HWAvailable || isHardwareRasterizer[0]) {
- return GL4bc;
- }
+ final boolean gl3bcAvailable = GLContext.isGL3bcAvailable(device, hardwareRasterizer);
+ final boolean gl3bcHWAvailable = gl3bcAvailable && hardwareRasterizer[0] ;
+ final boolean gl2Available = GLContext.isGL2Available(device, hardwareRasterizer);
+ final boolean gl2HWAvailable = gl2Available && hardwareRasterizer[0] ;
+ final boolean glAnyHWAvailable = gl3bcHWAvailable || gl2HWAvailable ||
+ gles1HWAvailable ;
+
+ if( GLContext.isGL4bcAvailable(device, isHardwareRasterizer) &&
+ ( isHardwareRasterizer[0] || !glAnyHWAvailable ) ) {
+ return GL4bc;
}
- if(GLContext.isGL3bcAvailable(device, isHardwareRasterizer)) {
- if(!gles1HWAvailable || isHardwareRasterizer[0]) {
- return GL3bc;
- }
+ if( gl3bcAvailable && ( gl3bcHWAvailable || !glAnyHWAvailable ) ) {
+ isHardwareRasterizer[0] = gl3bcHWAvailable;
+ return GL3bc;
}
- if(desktopCtxUndef || GLContext.isGL2Available(device, isHardwareRasterizer)) {
- if(!gles1HWAvailable || isHardwareRasterizer[0]) {
- return GL2;
- }
+ if( ( desktopCtxUndef || gl2Available ) && ( gl2HWAvailable || !glAnyHWAvailable ) ) {
+ isHardwareRasterizer[0] = gl2HWAvailable;
+ return GL2;
}
}
- if(gles1Available) {
- isHardwareRasterizer[0] = es1HardwareRasterizer[0];
+ if( gles1Available ) {
+ isHardwareRasterizer[0] = gles1HWAvailable;
return GLES1;
}
- } else if (GL2ES2 == profile) {
- final boolean es2HardwareRasterizer[] = new boolean[1];
- final boolean gles2Available = hasGLES3Impl && ( esCtxUndef || GLContext.isGLES2Available(device, es2HardwareRasterizer) );
- final boolean gles2HWAvailable = gles2Available && es2HardwareRasterizer[0] ;
- final boolean es3HardwareRasterizer[] = new boolean[1];
- final boolean gles3Available = hasGLES3Impl && ( esCtxUndef || GLContext.isGLES3Available(device, es3HardwareRasterizer) );
- final boolean gles3HWAvailable = gles3Available && es3HardwareRasterizer[0] ;
- if(hasGL234Impl) {
- if(GLContext.isGL4Available(device, isHardwareRasterizer)) {
- if( (!gles3HWAvailable && !gles2HWAvailable ) || isHardwareRasterizer[0] ) {
- return GL4;
- }
+ } else if ( GL2ES2 == profile ) {
+ final boolean gles2Available, gles3Available;
+ final boolean gles2HWAvailable, gles3HWAvailable;
+ if( hasGLES3Impl ) {
+ gles2Available = esCtxUndef || GLContext.isGLES2Available(device, hardwareRasterizer);
+ gles2HWAvailable = gles2Available && hardwareRasterizer[0] ;
+ gles3Available = esCtxUndef || GLContext.isGLES3Available(device, hardwareRasterizer);
+ gles3HWAvailable = gles3Available && hardwareRasterizer[0] ;
+ } else {
+ gles2Available = false;
+ gles2HWAvailable = false;
+ gles3Available = false;
+ gles3HWAvailable = false;
+ }
+ if( hasGL234Impl ) {
+ final boolean gl4bcAvailable = GLContext.isGL4bcAvailable(device, hardwareRasterizer);
+ final boolean gl4bcHWAvailable = gl4bcAvailable && hardwareRasterizer[0] ;
+ final boolean gl3Available = GLContext.isGL3Available(device, hardwareRasterizer);
+ final boolean gl3HWAvailable = gl3Available && hardwareRasterizer[0] ;
+ final boolean gl3bcAvailable = GLContext.isGL3bcAvailable(device, hardwareRasterizer);
+ final boolean gl3bcHWAvailable = gl3bcAvailable && hardwareRasterizer[0] ;
+ final boolean gl2Available = GLContext.isGL2Available(device, hardwareRasterizer);
+ final boolean gl2HWAvailable = gl2Available && hardwareRasterizer[0] ;
+ final boolean glAnyHWAvailable = gl4bcHWAvailable || gl3HWAvailable || gl3bcHWAvailable || gl2HWAvailable ||
+ gles3HWAvailable || gles2HWAvailable ;
+
+ if( GLContext.isGL4Available(device, isHardwareRasterizer) &&
+ ( isHardwareRasterizer[0] || !glAnyHWAvailable ) ) {
+ return GL4;
}
- if(GLContext.isGL4bcAvailable(device, isHardwareRasterizer)) {
- if( (!gles3HWAvailable && !gles2HWAvailable ) || isHardwareRasterizer[0] ) {
- return GL4bc;
- }
+ if( gl4bcAvailable && ( gl4bcHWAvailable || !glAnyHWAvailable ) ) {
+ isHardwareRasterizer[0] = gl4bcHWAvailable;
+ return GL4bc;
}
- if(GLContext.isGL3Available(device, isHardwareRasterizer)) {
- if( (!gles3HWAvailable && !gles2HWAvailable ) || isHardwareRasterizer[0] ) {
- return GL3;
- }
+ if( gl3Available && ( gl3HWAvailable || !glAnyHWAvailable ) ) {
+ isHardwareRasterizer[0] = gl3HWAvailable;
+ return GL3;
}
- if(GLContext.isGL3bcAvailable(device, isHardwareRasterizer)) {
- if( (!gles3HWAvailable && !gles2HWAvailable ) || isHardwareRasterizer[0] ) {
- return GL3bc;
- }
+ if( gl3bcAvailable && ( gl3bcHWAvailable || !glAnyHWAvailable ) ) {
+ isHardwareRasterizer[0] = gl3bcHWAvailable;
+ return GL3bc;
}
- if(desktopCtxUndef || GLContext.isGL2Available(device, isHardwareRasterizer)) {
- if( (!gles3HWAvailable && !gles2HWAvailable ) || isHardwareRasterizer[0] ) {
- return GL2;
- }
+ if( ( desktopCtxUndef || gl2Available ) && ( gl2HWAvailable || !glAnyHWAvailable ) ) {
+ isHardwareRasterizer[0] = gl2HWAvailable;
+ return GL2;
}
}
- if(gles3Available && ( !gles2HWAvailable || gles3HWAvailable ) ) {
- isHardwareRasterizer[0] = es3HardwareRasterizer[0];
+ if( gles3Available && ( gles3HWAvailable || !gles2HWAvailable ) ) {
+ isHardwareRasterizer[0] = gles3HWAvailable;
return GLES3;
}
- if(gles2Available) {
- isHardwareRasterizer[0] = es2HardwareRasterizer[0];
+ if( gles2Available ) {
+ isHardwareRasterizer[0] = gles2HWAvailable;
return GLES2;
}
} else if (GL4ES3 == profile) {
@@ -2129,16 +2153,19 @@ public class GLProfile {
final boolean es3HardwareRasterizer[] = new boolean[1];
final boolean gles3Available = hasGLES3Impl && ( esCtxUndef || GLContext.isGLES3Available(device, es3HardwareRasterizer) );
final boolean gles3HWAvailable = gles3Available && es3HardwareRasterizer[0] ;
- if(hasGL234Impl) {
- if(GLContext.isGL4Available(device, isHardwareRasterizer)) {
- if(!gles3HWAvailable || isHardwareRasterizer[0]) {
- return GL4;
- }
+ if( hasGL234Impl ) {
+ final boolean gl4bcAvailable = GLContext.isGL4bcAvailable(device, hardwareRasterizer);
+ final boolean gl4bcHWAvailable = gl4bcAvailable && hardwareRasterizer[0] ;
+ final boolean glAnyHWAvailable = gl4bcHWAvailable ||
+ gles3HWAvailable;
+
+ if( GLContext.isGL4Available(device, isHardwareRasterizer) &&
+ ( isHardwareRasterizer[0] || !glAnyHWAvailable ) ) {
+ return GL4;
}
- if( GLContext.isGL4bcAvailable(device, isHardwareRasterizer)) {
- if(!gles3HWAvailable || isHardwareRasterizer[0]) {
- return GL4bc;
- }
+ if( ( desktopCtxUndef || gl4bcAvailable ) && ( gl4bcHWAvailable || !glAnyHWAvailable ) ) {
+ isHardwareRasterizer[0] = gl4bcHWAvailable;
+ return GL4bc;
}
}
if(gles3Available) {
@@ -2148,15 +2175,34 @@ public class GLProfile {
}
} else if(GL2GL3 == profile) {
if(hasGL234Impl) {
- if( GLContext.isGL4bcAvailable(device, isHardwareRasterizer)) {
+ final boolean gl4Available = GLContext.isGL4Available(device, hardwareRasterizer);
+ final boolean gl4HWAvailable = gl4Available && hardwareRasterizer[0] ;
+ final boolean gl3Available = GLContext.isGL3Available(device, hardwareRasterizer);
+ final boolean gl3HWAvailable = gl3Available && hardwareRasterizer[0] ;
+ final boolean gl3bcAvailable = GLContext.isGL3bcAvailable(device, hardwareRasterizer);
+ final boolean gl3bcHWAvailable = gl3bcAvailable && hardwareRasterizer[0] ;
+ final boolean gl2Available = GLContext.isGL2Available(device, hardwareRasterizer);
+ final boolean gl2HWAvailable = gl2Available && hardwareRasterizer[0] ;
+ final boolean glAnyHWAvailable = gl4HWAvailable || gl3HWAvailable || gl3bcHWAvailable || gl2HWAvailable;
+
+ if( GLContext.isGL4bcAvailable(device, isHardwareRasterizer) &&
+ ( isHardwareRasterizer[0] || !glAnyHWAvailable ) ) {
return GL4bc;
- } else if( GLContext.isGL4Available(device, isHardwareRasterizer)) {
+ }
+ if( gl4Available && ( gl4HWAvailable || !glAnyHWAvailable ) ) {
+ isHardwareRasterizer[0] = gl4HWAvailable;
return GL4;
- } else if( GLContext.isGL3bcAvailable(device, isHardwareRasterizer)) {
+ }
+ if( gl3bcAvailable && ( gl3bcHWAvailable || !glAnyHWAvailable ) ) {
+ isHardwareRasterizer[0] = gl3bcHWAvailable;
return GL3bc;
- } else if( GLContext.isGL3Available(device, isHardwareRasterizer)) {
+ }
+ if( gl3Available && ( gl3HWAvailable || !glAnyHWAvailable ) ) {
+ isHardwareRasterizer[0] = gl3HWAvailable;
return GL3;
- } else if(desktopCtxUndef || GLContext.isGL2Available(device, isHardwareRasterizer)) {
+ }
+ if( desktopCtxUndef || gl2Available ) {
+ isHardwareRasterizer[0] = gl2HWAvailable;
return GL2;
}
}