|
@@ -34,9 +34,10 @@ public class AndroidConfigChooser implements EGLConfigChooser {
|
|
|
*/
|
|
|
FASTEST(5, 6, 5, 0, 16, 0, 5, 6, 5, 0, 16, 0),
|
|
|
/**
|
|
|
- * RGB???, 0 alpha, >=16 depth, 0 stencil
|
|
|
+ * min RGB888, 0 alpha, 16 depth, 0 stencil max RGB888, 0 alpha, 32
|
|
|
+ * depth, 8 stencil
|
|
|
*/
|
|
|
- BEST(8, 8, 8, 0, 32, 0, 8, 8, 8, 0, 16, 0),
|
|
|
+ BEST(8, 8, 8, 0, 32, 8, 8, 8, 8, 0, 16, 0),
|
|
|
/**
|
|
|
* Turn off config chooser and use hardcoded
|
|
|
* setEGLContextClientVersion(2); setEGLConfigChooser(5, 6, 5, 0, 16,
|
|
@@ -44,17 +45,18 @@ public class AndroidConfigChooser implements EGLConfigChooser {
|
|
|
*/
|
|
|
LEGACY(5, 6, 5, 0, 16, 0, 5, 6, 5, 0, 16, 0),
|
|
|
/**
|
|
|
- * RGB???, 8 alpha, >=16 depth, 0 stencil
|
|
|
+ * min RGB888, 8 alpha, 16 depth, 0 stencil max RGB888, 8 alpha, 32
|
|
|
+ * depth, 8 stencil
|
|
|
*/
|
|
|
- BEST_TRANSLUCENT(8, 8, 8, 8, 32, 0, 8, 8, 8, 8, 16, 0);
|
|
|
+ BEST_TRANSLUCENT(8, 8, 8, 8, 32, 8, 8, 8, 8, 8, 16, 0);
|
|
|
/**
|
|
|
- * red, green, blue, alpha, depth, stencil
|
|
|
+ * red, green, blue, alpha, depth, stencil (max values)
|
|
|
*/
|
|
|
int r, g, b, a, d, s;
|
|
|
/**
|
|
|
- * fallback
|
|
|
+ * minimal values
|
|
|
*/
|
|
|
- int fbr, fbg, fbb, fba, fbd, fbs;
|
|
|
+ int mr, mg, mb, ma, md, ms;
|
|
|
|
|
|
private ConfigType(int r, int g, int b, int a, int d, int s, int fbr, int fbg, int fbb, int fba, int fbd, int fbs) {
|
|
|
this.r = r;
|
|
@@ -63,12 +65,12 @@ public class AndroidConfigChooser implements EGLConfigChooser {
|
|
|
this.a = a;
|
|
|
this.d = d;
|
|
|
this.s = s;
|
|
|
- this.fbr = fbr;
|
|
|
- this.fbg = fbg;
|
|
|
- this.fbb = fbb;
|
|
|
- this.fba = fba;
|
|
|
- this.fbd = fbd;
|
|
|
- this.fbs = fbs;
|
|
|
+ this.mr = fbr;
|
|
|
+ this.mg = fbg;
|
|
|
+ this.mb = fbb;
|
|
|
+ this.ma = fba;
|
|
|
+ this.md = fbd;
|
|
|
+ this.ms = fbs;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -104,45 +106,15 @@ public class AndroidConfigChooser implements EGLConfigChooser {
|
|
|
* @param display
|
|
|
* @return true if successfull, false if no config was found
|
|
|
*/
|
|
|
- public boolean findConfig(EGL10 egl, EGLDisplay display) {
|
|
|
+ public boolean findConfig(EGL10 egl, EGLDisplay display) {
|
|
|
ConfigType type = (ConfigType) settings.get(SETTINGS_CONFIG_TYPE);
|
|
|
|
|
|
- ComponentSizeChooser compChooser = new ComponentSizeChooser(type.r, type.g, type.b, type.a, type.d, type.s, 4,1,2);
|
|
|
+ ComponentSizeChooser compChooser = new ComponentSizeChooser(type, settings.getSamples());
|
|
|
choosenConfig = compChooser.chooseConfig(egl, display);
|
|
|
- if (choosenConfig == null) {
|
|
|
- compChooser = new ComponentSizeChooser(type.fbr, type.fbg, type.fbb, type.fba, type.fbd, type.fbs);
|
|
|
- choosenConfig = compChooser.chooseConfig(egl, display);
|
|
|
- }
|
|
|
logger.log(Level.FINE, "JME3 using {0} EGL configuration available here: ", type.name());
|
|
|
-// switch (type) {
|
|
|
-// case BEST:
|
|
|
-// compChooser = new ComponentSizeChooser(8, 8, 8, 0, 32, 0);
|
|
|
-// choosenConfig = compChooser.chooseConfig(egl, display);
|
|
|
-// if (choosenConfig == null) {
|
|
|
-// compChooser = new ComponentSizeChooser(8, 8, 8, 0, 16, 0);
|
|
|
-// choosenConfig = compChooser.chooseConfig(egl, display);
|
|
|
-// }
|
|
|
-// logger.fine("JME3 using best EGL configuration available here: ");
|
|
|
-// break;
|
|
|
-// case BEST_TRANSLUCENT:
|
|
|
-// compChooser = new ComponentSizeChooser(8, 8, 8, 8, 32, 0);
|
|
|
-// choosenConfig = compChooser.chooseConfig(egl, display);
|
|
|
-// if (choosenConfig == null) {
|
|
|
-// compChooser = new ComponentSizeChooser(8, 8, 8, 8, 16, 0);
|
|
|
-// choosenConfig = compChooser.chooseConfig(egl, display);
|
|
|
-// }
|
|
|
-// logger.fine("JME3 using best EGL configuration available here with translucent pixels: ");
|
|
|
-// break;
|
|
|
-// case FASTEST:
|
|
|
-// compChooser = new ComponentSizeChooser(5, 6, 5, 0, 16, 0);
|
|
|
-// choosenConfig = compChooser.chooseConfig(egl, display);
|
|
|
-// logger.fine("JME3 using fastest EGL configuration available here: ");
|
|
|
-// break;
|
|
|
-//
|
|
|
-// }
|
|
|
|
|
|
if (choosenConfig != null) {
|
|
|
- logger.fine("JME3 using choosen config: ");
|
|
|
+ logger.info("JME3 using choosen config: ");
|
|
|
logEGLConfig(choosenConfig, display, egl);
|
|
|
pixelFormat = getPixelFormat(choosenConfig, display, egl);
|
|
|
clientOpenGLESVersion = getOpenGLVersion(choosenConfig, display, egl);
|
|
@@ -197,34 +169,34 @@ public class AndroidConfigChooser implements EGLConfigChooser {
|
|
|
int[] value = new int[1];
|
|
|
|
|
|
egl.eglGetConfigAttrib(display, conf, EGL10.EGL_RED_SIZE, value);
|
|
|
- logger.fine(String.format("EGL_RED_SIZE = %d", value[0]));
|
|
|
+ logger.info(String.format("EGL_RED_SIZE = %d", value[0]));
|
|
|
|
|
|
egl.eglGetConfigAttrib(display, conf, EGL10.EGL_GREEN_SIZE, value);
|
|
|
- logger.fine(String.format("EGL_GREEN_SIZE = %d", value[0]));
|
|
|
+ logger.info(String.format("EGL_GREEN_SIZE = %d", value[0]));
|
|
|
|
|
|
egl.eglGetConfigAttrib(display, conf, EGL10.EGL_BLUE_SIZE, value);
|
|
|
- logger.fine(String.format("EGL_BLUE_SIZE = %d", value[0]));
|
|
|
+ logger.info(String.format("EGL_BLUE_SIZE = %d", value[0]));
|
|
|
|
|
|
egl.eglGetConfigAttrib(display, conf, EGL10.EGL_ALPHA_SIZE, value);
|
|
|
- logger.fine(String.format("EGL_ALPHA_SIZE = %d", value[0]));
|
|
|
+ logger.info(String.format("EGL_ALPHA_SIZE = %d", value[0]));
|
|
|
|
|
|
egl.eglGetConfigAttrib(display, conf, EGL10.EGL_DEPTH_SIZE, value);
|
|
|
- logger.fine(String.format("EGL_DEPTH_SIZE = %d", value[0]));
|
|
|
+ logger.info(String.format("EGL_DEPTH_SIZE = %d", value[0]));
|
|
|
|
|
|
egl.eglGetConfigAttrib(display, conf, EGL10.EGL_STENCIL_SIZE, value);
|
|
|
- logger.fine(String.format("EGL_STENCIL_SIZE = %d", value[0]));
|
|
|
+ logger.info(String.format("EGL_STENCIL_SIZE = %d", value[0]));
|
|
|
|
|
|
egl.eglGetConfigAttrib(display, conf, EGL10.EGL_RENDERABLE_TYPE, value);
|
|
|
- logger.fine(String.format("EGL_RENDERABLE_TYPE = %d", value[0]));
|
|
|
+ logger.info(String.format("EGL_RENDERABLE_TYPE = %d", value[0]));
|
|
|
|
|
|
egl.eglGetConfigAttrib(display, conf, EGL10.EGL_SURFACE_TYPE, value);
|
|
|
- logger.fine(String.format("EGL_SURFACE_TYPE = %d", value[0]));
|
|
|
+ logger.info(String.format("EGL_SURFACE_TYPE = %d", value[0]));
|
|
|
|
|
|
egl.eglGetConfigAttrib(display, conf, EGL10.EGL_SAMPLE_BUFFERS, value);
|
|
|
- logger.fine(String.format("EGL_SAMPLE_BUFFERS = %d", value[0]));
|
|
|
+ logger.info(String.format("EGL_SAMPLE_BUFFERS = %d", value[0]));
|
|
|
|
|
|
egl.eglGetConfigAttrib(display, conf, EGL10.EGL_SAMPLES, value);
|
|
|
- logger.fine(String.format("EGL_SAMPLES = %d", value[0]));
|
|
|
+ logger.info(String.format("EGL_SAMPLES = %d", value[0]));
|
|
|
}
|
|
|
|
|
|
public int getClientOpenGLESVersion() {
|
|
@@ -241,78 +213,34 @@ public class AndroidConfigChooser implements EGLConfigChooser {
|
|
|
|
|
|
private abstract class BaseConfigChooser implements EGLConfigChooser {
|
|
|
|
|
|
- private boolean bClientOpenGLESVersionSet;
|
|
|
-
|
|
|
- public BaseConfigChooser(int[] configSpec) {
|
|
|
- bClientOpenGLESVersionSet = false;
|
|
|
- mConfigSpec = filterConfigSpec(configSpec);
|
|
|
+ public BaseConfigChooser() {
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) {
|
|
|
- int[] num_config = new int[1];
|
|
|
- if (!egl.eglChooseConfig(display, mConfigSpec, null, 0,
|
|
|
- num_config)) {
|
|
|
- throw new IllegalArgumentException("eglChooseConfig failed");
|
|
|
- }
|
|
|
|
|
|
- int numConfigs = num_config[0];
|
|
|
+ int[] num_config = new int[1];
|
|
|
+ int[] configSpec = new int[]{
|
|
|
+ EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
|
|
|
+ EGL10.EGL_NONE};
|
|
|
|
|
|
- if (numConfigs <= 0) {
|
|
|
- //throw new IllegalArgumentException("No configs match configSpec");
|
|
|
-
|
|
|
- return null;
|
|
|
- }
|
|
|
+ egl.eglChooseConfig(display, configSpec, null, 0, num_config);
|
|
|
|
|
|
+ int numConfigs = num_config[0];
|
|
|
EGLConfig[] configs = new EGLConfig[numConfigs];
|
|
|
- if (!egl.eglChooseConfig(display, mConfigSpec, configs, numConfigs,
|
|
|
- num_config)) {
|
|
|
- throw new IllegalArgumentException("eglChooseConfig#2 failed");
|
|
|
- }
|
|
|
-// logger.log(Level.FINE, "num_config: {0}", num_config[0]);
|
|
|
-//
|
|
|
-// logger.log(Level.FINE, "There are {0} configurations that match the configAttrs", num_config[0]);
|
|
|
-// logger.log(Level.FINE, "All Matching Configs:");
|
|
|
-// for (int i=0; i<configs.length; i++) {
|
|
|
-// if (configs[i] != null) {
|
|
|
-// logger.log(Level.FINE, "configs{0} is not null", i);
|
|
|
-// logEGLConfig(configs[i], display, egl);
|
|
|
-// } else {
|
|
|
-// logger.log(Level.FINE, "configs{0} is null", i);
|
|
|
-// }
|
|
|
+ egl.eglChooseConfig(display, configSpec, configs, numConfigs, num_config);
|
|
|
+
|
|
|
+// System.err.println("-----------------------------");
|
|
|
+// for (EGLConfig eGLConfig : configs) {
|
|
|
+// logEGLConfig(eGLConfig, display, egl);
|
|
|
// }
|
|
|
|
|
|
EGLConfig config = chooseConfig(egl, display, configs);
|
|
|
- //if (config == null) {
|
|
|
- // throw new IllegalArgumentException("No config chosen");
|
|
|
- //}
|
|
|
return config;
|
|
|
}
|
|
|
|
|
|
abstract EGLConfig chooseConfig(EGL10 egl, EGLDisplay display,
|
|
|
EGLConfig[] configs);
|
|
|
- protected int[] mConfigSpec;
|
|
|
-
|
|
|
- private int[] filterConfigSpec(int[] configSpec) {
|
|
|
- if (bClientOpenGLESVersionSet == true) {
|
|
|
- return configSpec;
|
|
|
- }
|
|
|
- /*
|
|
|
- * We know none of the subclasses define EGL_RENDERABLE_TYPE. And we
|
|
|
- * know the configSpec is well formed.
|
|
|
- */
|
|
|
- int len = configSpec.length;
|
|
|
- int[] newConfigSpec = new int[len + 2];
|
|
|
- System.arraycopy(configSpec, 0, newConfigSpec, 0, len - 1);
|
|
|
- newConfigSpec[len - 1] = EGL10.EGL_RENDERABLE_TYPE;
|
|
|
- newConfigSpec[len] = 4; /*
|
|
|
- * EGL_OPENGL_ES2_BIT
|
|
|
- */
|
|
|
- newConfigSpec[len + 1] = EGL10.EGL_NONE;
|
|
|
-
|
|
|
- bClientOpenGLESVersionSet = true;
|
|
|
-
|
|
|
- return newConfigSpec;
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -322,66 +250,47 @@ public class AndroidConfigChooser implements EGLConfigChooser {
|
|
|
private class ComponentSizeChooser extends BaseConfigChooser {
|
|
|
|
|
|
private int[] mValue;
|
|
|
- // Subclasses can adjust these values:
|
|
|
- protected int mRedSize;
|
|
|
- protected int mGreenSize;
|
|
|
- protected int mBlueSize;
|
|
|
- protected int mAlphaSize;
|
|
|
- protected int mDepthSize;
|
|
|
- protected int mStencilSize;
|
|
|
- protected int mRenderableType;
|
|
|
- protected int mSampleBuffers;
|
|
|
+ private ConfigType configType;
|
|
|
protected int mSamples;
|
|
|
|
|
|
- public ComponentSizeChooser(int redSize, int greenSize, int blueSize,
|
|
|
- int alphaSize, int depthSize, int stencilSize) {
|
|
|
- super(new int[]{
|
|
|
- EGL10.EGL_RED_SIZE, redSize,
|
|
|
- EGL10.EGL_GREEN_SIZE, greenSize,
|
|
|
- EGL10.EGL_BLUE_SIZE, blueSize,
|
|
|
- EGL10.EGL_ALPHA_SIZE, alphaSize,
|
|
|
- EGL10.EGL_DEPTH_SIZE, depthSize,
|
|
|
- EGL10.EGL_STENCIL_SIZE, stencilSize,
|
|
|
- EGL10.EGL_NONE});
|
|
|
- mValue = new int[1];
|
|
|
- mRedSize = redSize;
|
|
|
- mGreenSize = greenSize;
|
|
|
- mBlueSize = blueSize;
|
|
|
- mAlphaSize = alphaSize;
|
|
|
- mDepthSize = depthSize;
|
|
|
- mStencilSize = stencilSize;
|
|
|
- }
|
|
|
-
|
|
|
- public ComponentSizeChooser(int redSize, int greenSize, int blueSize,
|
|
|
- int alphaSize, int depthSize, int stencilSize, int renderableType, int sampleBuffers, int samples) {
|
|
|
- super(new int[]{
|
|
|
- EGL10.EGL_RED_SIZE, redSize,
|
|
|
- EGL10.EGL_GREEN_SIZE, greenSize,
|
|
|
- EGL10.EGL_BLUE_SIZE, blueSize,
|
|
|
- EGL10.EGL_ALPHA_SIZE, alphaSize,
|
|
|
- EGL10.EGL_DEPTH_SIZE, depthSize,
|
|
|
- EGL10.EGL_STENCIL_SIZE, stencilSize,
|
|
|
- EGL10.EGL_RENDERABLE_TYPE, renderableType,
|
|
|
- EGL10.EGL_SAMPLE_BUFFERS, sampleBuffers,
|
|
|
- EGL10.EGL_SAMPLES, samples,
|
|
|
- EGL10.EGL_NONE});
|
|
|
+// public ComponentSizeChooser(int redSize, int greenSize, int blueSize,
|
|
|
+// int alphaSize, int depthSize, int stencilSize, int samples) {
|
|
|
+// super(new int[]{
|
|
|
+// EGL10.EGL_RED_SIZE, redSize,
|
|
|
+// EGL10.EGL_GREEN_SIZE, greenSize,
|
|
|
+// EGL10.EGL_BLUE_SIZE, blueSize,
|
|
|
+// EGL10.EGL_ALPHA_SIZE, alphaSize,
|
|
|
+// EGL10.EGL_DEPTH_SIZE, depthSize,
|
|
|
+// EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
|
|
|
+// EGL10.EGL_SAMPLE_BUFFERS, TRUE,
|
|
|
+// EGL10.EGL_SAMPLES, samples,
|
|
|
+// EGL10.EGL_NONE});
|
|
|
+// mValue = new int[1];
|
|
|
+// mRedSize = redSize;
|
|
|
+// mGreenSize = greenSize;
|
|
|
+// mBlueSize = blueSize;
|
|
|
+// mAlphaSize = alphaSize;
|
|
|
+// mDepthSize = depthSize;
|
|
|
+// mStencilSize = stencilSize;
|
|
|
+// mSamples = samples;
|
|
|
+// }
|
|
|
+ public ComponentSizeChooser(ConfigType configType, int samples) {
|
|
|
mValue = new int[1];
|
|
|
- mRedSize = redSize;
|
|
|
- mGreenSize = greenSize;
|
|
|
- mBlueSize = blueSize;
|
|
|
- mAlphaSize = alphaSize;
|
|
|
- mDepthSize = depthSize;
|
|
|
- mStencilSize = stencilSize;
|
|
|
- mRenderableType = renderableType;
|
|
|
- mSampleBuffers = sampleBuffers;
|
|
|
mSamples = samples;
|
|
|
+ this.configType = configType;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display, EGLConfig[] configs) {
|
|
|
|
|
|
+ EGLConfig keptConfig = null;
|
|
|
+ int kd = 0;
|
|
|
+ int knbMs = 0;
|
|
|
+
|
|
|
+
|
|
|
// first pass through config list. Try to find an exact match.
|
|
|
for (EGLConfig config : configs) {
|
|
|
+// logEGLConfig(config, display, egl);
|
|
|
int r = findConfigAttrib(egl, display, config,
|
|
|
EGL10.EGL_RED_SIZE, 0);
|
|
|
int g = findConfigAttrib(egl, display, config,
|
|
@@ -394,36 +303,49 @@ public class AndroidConfigChooser implements EGLConfigChooser {
|
|
|
EGL10.EGL_DEPTH_SIZE, 0);
|
|
|
int s = findConfigAttrib(egl, display, config,
|
|
|
EGL10.EGL_STENCIL_SIZE, 0);
|
|
|
+ int isMs = findConfigAttrib(egl, display, config,
|
|
|
+ EGL10.EGL_SAMPLE_BUFFERS, 0);
|
|
|
+ int nbMs = findConfigAttrib(egl, display, config,
|
|
|
+ EGL10.EGL_SAMPLES, 0);
|
|
|
+
|
|
|
+ if (inRange(r, configType.mr, configType.r)
|
|
|
+ && inRange(g, configType.mg, configType.g)
|
|
|
+ && inRange(b, configType.mb, configType.b)
|
|
|
+ && inRange(a, configType.ma, configType.a)
|
|
|
+ && inRange(d, configType.md, configType.d)
|
|
|
+ && inRange(s, configType.ms, configType.s)) {
|
|
|
+ if (mSamples == 0 && isMs != 0) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ boolean keep = false;
|
|
|
+ //we keep the config if the depth is better or if the AA setting is better
|
|
|
+ if (d >= kd) {
|
|
|
+ kd = d;
|
|
|
+ keep = true;
|
|
|
+ } else {
|
|
|
+ keep = false;
|
|
|
+ }
|
|
|
|
|
|
- if ((r == mRedSize) && (g == mGreenSize)
|
|
|
- && (b == mBlueSize) && (a == mAlphaSize)
|
|
|
- && (d == mDepthSize) && (s == mStencilSize)) {
|
|
|
- return config;
|
|
|
+ if (mSamples != 0) {
|
|
|
+ if (nbMs >= knbMs && nbMs <= mSamples) {
|
|
|
+ knbMs = nbMs;
|
|
|
+ keep = true;
|
|
|
+ } else {
|
|
|
+ keep = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (keep) {
|
|
|
+ keptConfig = 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);
|
|
|
- int s = findConfigAttrib(egl, display, config,
|
|
|
- EGL10.EGL_STENCIL_SIZE, 0);
|
|
|
- if ((d >= mDepthSize) && (s >= mStencilSize)) {
|
|
|
- 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);
|
|
|
- if ((r == mRedSize) && (g == mGreenSize)
|
|
|
- && (b == mBlueSize) && (a == mAlphaSize)) {
|
|
|
- return config;
|
|
|
- }
|
|
|
- }
|
|
|
+ if (keptConfig != null) {
|
|
|
+ return keptConfig;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
// failsafe. pick the 1st config.
|
|
|
if (configs.length > 0) {
|
|
|
return configs[0];
|
|
@@ -433,6 +355,10 @@ public class AndroidConfigChooser implements EGLConfigChooser {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ private boolean inRange(int val, int min, int max) {
|
|
|
+ return min <= val && val <= max;
|
|
|
+ }
|
|
|
+
|
|
|
private int findConfigAttrib(EGL10 egl, EGLDisplay display,
|
|
|
EGLConfig config, int attribute, int defaultValue) {
|
|
|
|