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
This commit is contained in:
parent
3aa223360a
commit
5a71423624
@ -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…
x
Reference in New Issue
Block a user