Fix issue with BEST config not choosing a valid config on some devices when RGBA is not matched (ie no config exists with 0bit alpha). ConfigChooser now looks for an exact match of all attributes first, then a match of RGBA only, then uses the first available config.

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9715 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
iwg..ic 12 years ago
parent 3aa223360a
commit 5a71423624
  1. 51
      engine/src/android/com/jme3/system/android/AndroidConfigChooser.java

@ -2,7 +2,6 @@ package com.jme3.system.android;
import android.graphics.PixelFormat;
import android.opengl.GLSurfaceView.EGLConfigChooser;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.microedition.khronos.egl.EGL10;
import javax.microedition.khronos.egl.EGLConfig;
@ -116,7 +115,7 @@ public class AndroidConfigChooser implements EGLConfigChooser {
//Android Pixel format is not very well documented.
//From what i gathered, the format is chosen automatically except for the alpha channel
//if the alpha channel has 8 bit or more, e set the pixel format to Transluscent, as it allow transparent view background
//if it's 0 bit, the format is OPAQUE otherwise it's TRANSPARENT
//if it's 0 bit, the format is OPAQUE otherwise it's TRANSPARENT
egl.eglGetConfigAttrib(display, conf, EGL10.EGL_ALPHA_SIZE, value);
if (value[0] >= 8) {
return PixelFormat.TRANSLUCENT;
@ -217,6 +216,19 @@ public class AndroidConfigChooser implements EGLConfigChooser {
num_config)) {
throw new IllegalArgumentException("eglChooseConfig#2 failed");
}
// logger.log(Level.INFO, "num_config: {0}", num_config[0]);
//
// logger.log(Level.INFO, "There are {0} configurations that match the configAttrs", num_config[0]);
// logger.log(Level.INFO, "All Matching Configs:");
// for (int i=0; i<configs.length; i++) {
// if (configs[i] != null) {
// logger.log(Level.INFO, "configs{0} is not null", i);
// logEGLConfig(configs[i], display, egl);
// } else {
// logger.log(Level.INFO, "configs{0} is null", i);
// }
// }
EGLConfig config = chooseConfig(egl, display, configs);
//if (config == null) {
// throw new IllegalArgumentException("No config chosen");
@ -287,6 +299,32 @@ public class AndroidConfigChooser implements EGLConfigChooser {
@Override
public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display, EGLConfig[] configs) {
// first pass through config list. Try to find an exact match.
for (EGLConfig config : configs) {
int r = findConfigAttrib(egl, display, config,
EGL10.EGL_RED_SIZE, 0);
int g = findConfigAttrib(egl, display, config,
EGL10.EGL_GREEN_SIZE, 0);
int b = findConfigAttrib(egl, display, config,
EGL10.EGL_BLUE_SIZE, 0);
int a = findConfigAttrib(egl, display, config,
EGL10.EGL_ALPHA_SIZE, 0);
int d = findConfigAttrib(egl, display, config,
EGL10.EGL_DEPTH_SIZE, 0);
int s = findConfigAttrib(egl, display, config,
EGL10.EGL_STENCIL_SIZE, 0);
if ((
r == mRedSize) && (g == mGreenSize)
&& (b == mBlueSize) && (a == mAlphaSize)
&& (d == mDepthSize) && (s == mStencilSize)
) {
return config;
}
}
// second pass through config list. Try to find an RGBA match.
for (EGLConfig config : configs) {
int d = findConfigAttrib(egl, display, config,
EGL10.EGL_DEPTH_SIZE, 0);
@ -307,7 +345,14 @@ public class AndroidConfigChooser implements EGLConfigChooser {
}
}
}
return null;
// failsafe. pick the 1st config.
if (configs.length > 0) {
return configs[0];
} else {
return null;
}
}
private int findConfigAttrib(EGL10 egl, EGLDisplay display,

Loading…
Cancel
Save