|
@@ -2,6 +2,7 @@ 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;
|
|
@@ -9,26 +10,23 @@ import javax.microedition.khronos.egl.EGLDisplay;
|
|
|
|
|
|
/**
|
|
|
* AndroidConfigChooser is used to determine the best suited EGL Config
|
|
|
- * @author larynx
|
|
|
*
|
|
|
+ * @author larynx
|
|
|
*/
|
|
|
-public class AndroidConfigChooser implements EGLConfigChooser
|
|
|
-{
|
|
|
+public class AndroidConfigChooser implements EGLConfigChooser {
|
|
|
+
|
|
|
private static final Logger logger = Logger.getLogger(AndroidConfigChooser.class.getName());
|
|
|
-
|
|
|
protected int clientOpenGLESVersion = 0;
|
|
|
protected EGLConfig bestConfig = null;
|
|
|
protected EGLConfig fastestConfig = null;
|
|
|
protected EGLConfig choosenConfig = null;
|
|
|
protected ConfigType type;
|
|
|
protected int pixelFormat;
|
|
|
-
|
|
|
protected boolean verbose = false;
|
|
|
-
|
|
|
private final static int EGL_OPENGL_ES2_BIT = 4;
|
|
|
|
|
|
- public enum ConfigType
|
|
|
- {
|
|
|
+ public enum ConfigType {
|
|
|
+
|
|
|
/**
|
|
|
* RGB565, 0 alpha, 16 depth, 0 stencil
|
|
|
*/
|
|
@@ -39,94 +37,79 @@ public class AndroidConfigChooser implements EGLConfigChooser
|
|
|
BEST,
|
|
|
/**
|
|
|
* Turn off config chooser and use hardcoded
|
|
|
- * setEGLContextClientVersion(2);
|
|
|
- * setEGLConfigChooser(5, 6, 5, 0, 16, 0);
|
|
|
+ * setEGLContextClientVersion(2); setEGLConfigChooser(5, 6, 5, 0, 16,
|
|
|
+ * 0);
|
|
|
*/
|
|
|
LEGACY
|
|
|
}
|
|
|
-
|
|
|
- public AndroidConfigChooser(ConfigType type, boolean verbose)
|
|
|
- {
|
|
|
+
|
|
|
+ public AndroidConfigChooser(ConfigType type) {
|
|
|
this.type = type;
|
|
|
- this.verbose = verbose;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* Gets called by the GLSurfaceView class to return the best config
|
|
|
- */
|
|
|
+ */
|
|
|
@Override
|
|
|
- public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display)
|
|
|
- {
|
|
|
+ public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) {
|
|
|
logger.info("GLSurfaceView asks for egl config, returning: ");
|
|
|
logEGLConfig(choosenConfig, display, egl);
|
|
|
return choosenConfig;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* findConfig is used to locate the best config and init the chooser with
|
|
|
+ *
|
|
|
* @param egl
|
|
|
* @param display
|
|
|
* @return true if successfull, false if no config was found
|
|
|
*/
|
|
|
- public boolean findConfig(EGL10 egl, EGLDisplay display)
|
|
|
- {
|
|
|
-
|
|
|
- if (type == ConfigType.BEST)
|
|
|
- {
|
|
|
- ComponentSizeChooser compChooser = new ComponentSizeChooser(8, 8, 8, 8, 32, 0);
|
|
|
- choosenConfig = compChooser.chooseConfig(egl, display);
|
|
|
+ public boolean findConfig(EGL10 egl, EGLDisplay display) {
|
|
|
+
|
|
|
+ if (type == ConfigType.BEST) {
|
|
|
+ ComponentSizeChooser compChooser = new ComponentSizeChooser(8, 8, 8, 8, 32, 0);
|
|
|
+ choosenConfig = compChooser.chooseConfig(egl, display);
|
|
|
|
|
|
- if (choosenConfig == null)
|
|
|
- {
|
|
|
+ if (choosenConfig == null) {
|
|
|
compChooser = new ComponentSizeChooser(8, 8, 8, 0, 32, 0);
|
|
|
choosenConfig = compChooser.chooseConfig(egl, display);
|
|
|
- if (choosenConfig == null)
|
|
|
- {
|
|
|
+ if (choosenConfig == null) {
|
|
|
compChooser = new ComponentSizeChooser(8, 8, 8, 8, 16, 0);
|
|
|
choosenConfig = compChooser.chooseConfig(egl, display);
|
|
|
- if (choosenConfig == null)
|
|
|
- {
|
|
|
+ if (choosenConfig == null) {
|
|
|
compChooser = new ComponentSizeChooser(8, 8, 8, 0, 16, 0);
|
|
|
choosenConfig = compChooser.chooseConfig(egl, display);
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
+ }
|
|
|
+
|
|
|
logger.info("JME3 using best EGL configuration available here: ");
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ComponentSizeChooser compChooser = new ComponentSizeChooser(5, 6, 5, 0, 16, 0);
|
|
|
- choosenConfig = compChooser.chooseConfig(egl, display);
|
|
|
+ } else {
|
|
|
+ ComponentSizeChooser compChooser = new ComponentSizeChooser(5, 6, 5, 0, 16, 0);
|
|
|
+ choosenConfig = compChooser.chooseConfig(egl, display);
|
|
|
logger.info("JME3 using fastest EGL configuration available here: ");
|
|
|
}
|
|
|
-
|
|
|
- if (choosenConfig != null)
|
|
|
- {
|
|
|
- logger.info("JME3 using choosen config: ");
|
|
|
- logEGLConfig(choosenConfig, display, egl);
|
|
|
+
|
|
|
+ if (choosenConfig != null) {
|
|
|
+ logger.info("JME3 using choosen config: ");
|
|
|
+ logEGLConfig(choosenConfig, display, egl);
|
|
|
pixelFormat = getPixelFormat(choosenConfig, display, egl);
|
|
|
clientOpenGLESVersion = getOpenGLVersion(choosenConfig, display, egl);
|
|
|
return true;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
+ } else {
|
|
|
logger.severe("###ERROR### Unable to get a valid OpenGL ES 2.0 config, nether Fastest nor Best found! Bug. Please report this.");
|
|
|
clientOpenGLESVersion = 1;
|
|
|
pixelFormat = PixelFormat.UNKNOWN;
|
|
|
return false;
|
|
|
- }
|
|
|
+ }
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
- private int getPixelFormat(EGLConfig conf, EGLDisplay display, EGL10 egl)
|
|
|
- {
|
|
|
+
|
|
|
+ private int getPixelFormat(EGLConfig conf, EGLDisplay display, EGL10 egl) {
|
|
|
int[] value = new int[1];
|
|
|
- int result = PixelFormat.RGB_565;
|
|
|
+ int result = PixelFormat.RGB_565;
|
|
|
|
|
|
egl.eglGetConfigAttrib(display, conf, EGL10.EGL_RED_SIZE, value);
|
|
|
- if (value[0] == 8)
|
|
|
- {
|
|
|
+ if (value[0] == 8) {
|
|
|
result = PixelFormat.RGBA_8888;
|
|
|
/*
|
|
|
egl.eglGetConfigAttrib(display, conf, EGL10.EGL_ALPHA_SIZE, value);
|
|
@@ -139,165 +122,163 @@ public class AndroidConfigChooser implements EGLConfigChooser
|
|
|
result = PixelFormat.RGB_888;
|
|
|
}*/
|
|
|
}
|
|
|
-
|
|
|
- if (verbose)
|
|
|
- {
|
|
|
- logger.info("Using PixelFormat " + result);
|
|
|
+
|
|
|
+ if (verbose) {
|
|
|
+ logger.log(Level.INFO, "Using PixelFormat {0}", result);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
//return result; TODO Test pixelformat
|
|
|
return PixelFormat.TRANSPARENT;
|
|
|
}
|
|
|
-
|
|
|
- private int getOpenGLVersion(EGLConfig conf, EGLDisplay display, EGL10 egl)
|
|
|
- {
|
|
|
+
|
|
|
+ private int getOpenGLVersion(EGLConfig conf, EGLDisplay display, EGL10 egl) {
|
|
|
int[] value = new int[1];
|
|
|
int result = 1;
|
|
|
-
|
|
|
+
|
|
|
egl.eglGetConfigAttrib(display, conf, EGL10.EGL_RENDERABLE_TYPE, value);
|
|
|
// Check if conf is OpenGL ES 2.0
|
|
|
- if ((value[0] & EGL_OPENGL_ES2_BIT) != 0)
|
|
|
- {
|
|
|
+ if ((value[0] & EGL_OPENGL_ES2_BIT) != 0) {
|
|
|
result = 2;
|
|
|
}
|
|
|
|
|
|
- return result;
|
|
|
+ return result;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* log output with egl config details
|
|
|
+ *
|
|
|
* @param conf
|
|
|
* @param display
|
|
|
* @param egl
|
|
|
*/
|
|
|
- public void logEGLConfig(EGLConfig conf, EGLDisplay display, EGL10 egl)
|
|
|
- {
|
|
|
+ public void logEGLConfig(EGLConfig conf, EGLDisplay display, EGL10 egl) {
|
|
|
int[] value = new int[1];
|
|
|
|
|
|
egl.eglGetConfigAttrib(display, conf, EGL10.EGL_RED_SIZE, value);
|
|
|
- logger.info(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.info(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.info(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.info(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.info(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.info(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.info(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.info(String.format("EGL_SURFACE_TYPE = %d", value[0] ) );
|
|
|
+ logger.info(String.format("EGL_SURFACE_TYPE = %d", value[0]));
|
|
|
}
|
|
|
-
|
|
|
- public int getClientOpenGLESVersion()
|
|
|
- {
|
|
|
+
|
|
|
+ public int getClientOpenGLESVersion() {
|
|
|
return clientOpenGLESVersion;
|
|
|
}
|
|
|
|
|
|
- public void setClientOpenGLESVersion(int clientOpenGLESVersion)
|
|
|
- {
|
|
|
+ public void setClientOpenGLESVersion(int clientOpenGLESVersion) {
|
|
|
this.clientOpenGLESVersion = clientOpenGLESVersion;
|
|
|
}
|
|
|
-
|
|
|
- public int getPixelFormat()
|
|
|
- {
|
|
|
+
|
|
|
+ public int getPixelFormat() {
|
|
|
return pixelFormat;
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- private abstract class BaseConfigChooser implements EGLConfigChooser
|
|
|
- {
|
|
|
+
|
|
|
+ private abstract class BaseConfigChooser implements EGLConfigChooser {
|
|
|
+
|
|
|
private boolean bClientOpenGLESVersionSet;
|
|
|
-
|
|
|
- public BaseConfigChooser(int[] configSpec)
|
|
|
- {
|
|
|
- bClientOpenGLESVersionSet = false;
|
|
|
- mConfigSpec = filterConfigSpec(configSpec);
|
|
|
- }
|
|
|
-
|
|
|
- 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];
|
|
|
-
|
|
|
- if (numConfigs <= 0)
|
|
|
- {
|
|
|
- //throw new IllegalArgumentException("No configs match configSpec");
|
|
|
-
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- EGLConfig[] configs = new EGLConfig[numConfigs];
|
|
|
- if (!egl.eglChooseConfig(display, mConfigSpec, configs, numConfigs,
|
|
|
- num_config)) {
|
|
|
- throw new IllegalArgumentException("eglChooseConfig#2 failed");
|
|
|
- }
|
|
|
- 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;
|
|
|
- }
|
|
|
+
|
|
|
+ public BaseConfigChooser(int[] configSpec) {
|
|
|
+ bClientOpenGLESVersionSet = false;
|
|
|
+ mConfigSpec = filterConfigSpec(configSpec);
|
|
|
+ }
|
|
|
+
|
|
|
+ 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];
|
|
|
+
|
|
|
+ if (numConfigs <= 0) {
|
|
|
+ //throw new IllegalArgumentException("No configs match configSpec");
|
|
|
+
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ EGLConfig[] configs = new EGLConfig[numConfigs];
|
|
|
+ if (!egl.eglChooseConfig(display, mConfigSpec, configs, numConfigs,
|
|
|
+ num_config)) {
|
|
|
+ throw new IllegalArgumentException("eglChooseConfig#2 failed");
|
|
|
+ }
|
|
|
+ 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;
|
|
|
+ }
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
- * Choose a configuration with exactly the specified r,g,b,a sizes,
|
|
|
- * and at least the specified depth and stencil sizes.
|
|
|
+ * Choose a configuration with exactly the specified r,g,b,a sizes, and at
|
|
|
+ * least the specified depth and stencil sizes.
|
|
|
*/
|
|
|
- private class ComponentSizeChooser extends BaseConfigChooser
|
|
|
- {
|
|
|
+ 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;
|
|
|
+
|
|
|
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});
|
|
|
+ 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;
|
|
@@ -305,25 +286,22 @@ public class AndroidConfigChooser implements EGLConfigChooser
|
|
|
mAlphaSize = alphaSize;
|
|
|
mDepthSize = depthSize;
|
|
|
mStencilSize = stencilSize;
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
@Override
|
|
|
- public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display, EGLConfig[] configs)
|
|
|
- {
|
|
|
- for (EGLConfig config : configs)
|
|
|
- {
|
|
|
+ public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display, EGLConfig[] configs) {
|
|
|
+ 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))
|
|
|
- {
|
|
|
+ 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);
|
|
|
+ EGL10.EGL_GREEN_SIZE, 0);
|
|
|
int b = findConfigAttrib(egl, display, config,
|
|
|
- EGL10.EGL_BLUE_SIZE, 0);
|
|
|
+ EGL10.EGL_BLUE_SIZE, 0);
|
|
|
int a = findConfigAttrib(egl, display, config,
|
|
|
EGL10.EGL_ALPHA_SIZE, 0);
|
|
|
if ((r == mRedSize) && (g == mGreenSize)
|
|
@@ -336,27 +314,12 @@ public class AndroidConfigChooser implements EGLConfigChooser
|
|
|
}
|
|
|
|
|
|
private int findConfigAttrib(EGL10 egl, EGLDisplay display,
|
|
|
- EGLConfig config, int attribute, int defaultValue)
|
|
|
- {
|
|
|
+ EGLConfig config, int attribute, int defaultValue) {
|
|
|
|
|
|
- if (egl.eglGetConfigAttrib(display, config, attribute, mValue))
|
|
|
- {
|
|
|
+ if (egl.eglGetConfigAttrib(display, config, attribute, mValue)) {
|
|
|
return mValue[0];
|
|
|
}
|
|
|
return defaultValue;
|
|
|
}
|
|
|
-
|
|
|
- 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;
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
}
|