159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage com.jme3.system.android; 259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport android.graphics.PixelFormat; 459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport android.opengl.GLSurfaceView.EGLConfigChooser; 5a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Bartaimport java.util.logging.Level; 659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.logging.Logger; 759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport javax.microedition.khronos.egl.EGL10; 859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport javax.microedition.khronos.egl.EGLConfig; 959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport javax.microedition.khronos.egl.EGLDisplay; 1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/** 1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * AndroidConfigChooser is used to determine the best suited EGL Config 1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 14a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta * @author larynx 1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 16a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Bartapublic class AndroidConfigChooser implements EGLConfigChooser { 17a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private static final Logger logger = Logger.getLogger(AndroidConfigChooser.class.getName()); 1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected int clientOpenGLESVersion = 0; 2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected EGLConfig bestConfig = null; 2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected EGLConfig fastestConfig = null; 2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected EGLConfig choosenConfig = null; 2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected ConfigType type; 2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected int pixelFormat; 2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected boolean verbose = false; 2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private final static int EGL_OPENGL_ES2_BIT = 4; 2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 28a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta public enum ConfigType { 29a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * RGB565, 0 alpha, 16 depth, 0 stencil 3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta FASTEST, 3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * RGB???, 0 alpha, >=16 depth, 0 stencil 3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta BEST, 3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Turn off config chooser and use hardcoded 40a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta * setEGLContextClientVersion(2); setEGLConfigChooser(5, 6, 5, 0, 16, 41a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta * 0); 4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta LEGACY 4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 45a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 46a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta public AndroidConfigChooser(ConfigType type) { 4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.type = type; 4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 49a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Gets called by the GLSurfaceView class to return the best config 52a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta */ 5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 54a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) { 5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta logger.info("GLSurfaceView asks for egl config, returning: "); 5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta logEGLConfig(choosenConfig, display, egl); 5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return choosenConfig; 5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 59a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * findConfig is used to locate the best config and init the chooser with 62a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta * 6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param egl 6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param display 6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return true if successfull, false if no config was found 6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 67a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta public boolean findConfig(EGL10 egl, EGLDisplay display) { 68a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 69a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta if (type == ConfigType.BEST) { 70a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta ComponentSizeChooser compChooser = new ComponentSizeChooser(8, 8, 8, 8, 32, 0); 71a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta choosenConfig = compChooser.chooseConfig(egl, display); 7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 73a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta if (choosenConfig == null) { 7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta compChooser = new ComponentSizeChooser(8, 8, 8, 0, 32, 0); 7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta choosenConfig = compChooser.chooseConfig(egl, display); 76a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta if (choosenConfig == null) { 7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta compChooser = new ComponentSizeChooser(8, 8, 8, 8, 16, 0); 7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta choosenConfig = compChooser.chooseConfig(egl, display); 79a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta if (choosenConfig == null) { 8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta compChooser = new ComponentSizeChooser(8, 8, 8, 0, 16, 0); 8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta choosenConfig = compChooser.chooseConfig(egl, display); 8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 84a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta } 85a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta logger.info("JME3 using best EGL configuration available here: "); 87a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta } else { 88a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta ComponentSizeChooser compChooser = new ComponentSizeChooser(5, 6, 5, 0, 16, 0); 89a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta choosenConfig = compChooser.chooseConfig(egl, display); 9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta logger.info("JME3 using fastest EGL configuration available here: "); 9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 92a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 93a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta if (choosenConfig != null) { 94a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta logger.info("JME3 using choosen config: "); 95a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta logEGLConfig(choosenConfig, display, egl); 9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pixelFormat = getPixelFormat(choosenConfig, display, egl); 9759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta clientOpenGLESVersion = getOpenGLVersion(choosenConfig, display, egl); 9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return true; 99a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta } else { 10059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta logger.severe("###ERROR### Unable to get a valid OpenGL ES 2.0 config, nether Fastest nor Best found! Bug. Please report this."); 10159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta clientOpenGLESVersion = 1; 10259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta pixelFormat = PixelFormat.UNKNOWN; 10359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return false; 104a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta } 10559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 106a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 107a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta private int getPixelFormat(EGLConfig conf, EGLDisplay display, EGL10 egl) { 10859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int[] value = new int[1]; 109a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta int result = PixelFormat.RGB_565; 11059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 11159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta egl.eglGetConfigAttrib(display, conf, EGL10.EGL_RED_SIZE, value); 112a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta if (value[0] == 8) { 11359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta result = PixelFormat.RGBA_8888; 11459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /* 11559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta egl.eglGetConfigAttrib(display, conf, EGL10.EGL_ALPHA_SIZE, value); 11659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (value[0] == 8) 11759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta { 11859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta result = PixelFormat.RGBA_8888; 11959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 12059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta else 12159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta { 12259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta result = PixelFormat.RGB_888; 12359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }*/ 12459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 125a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 126a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta if (verbose) { 127a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta logger.log(Level.INFO, "Using PixelFormat {0}", result); 12859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 129a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 13059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //return result; TODO Test pixelformat 13159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return PixelFormat.TRANSPARENT; 13259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 133a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 134a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta private int getOpenGLVersion(EGLConfig conf, EGLDisplay display, EGL10 egl) { 13559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int[] value = new int[1]; 13659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int result = 1; 137a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 13859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta egl.eglGetConfigAttrib(display, conf, EGL10.EGL_RENDERABLE_TYPE, value); 13959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // Check if conf is OpenGL ES 2.0 140a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta if ((value[0] & EGL_OPENGL_ES2_BIT) != 0) { 14159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta result = 2; 14259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 14359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 144a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta return result; 14559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 146a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 14759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 14859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * log output with egl config details 149a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta * 15059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param conf 15159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param display 15259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param egl 15359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 154a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta public void logEGLConfig(EGLConfig conf, EGLDisplay display, EGL10 egl) { 15559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int[] value = new int[1]; 15659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 15759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta egl.eglGetConfigAttrib(display, conf, EGL10.EGL_RED_SIZE, value); 158a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta logger.info(String.format("EGL_RED_SIZE = %d", value[0])); 159a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 16059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta egl.eglGetConfigAttrib(display, conf, EGL10.EGL_GREEN_SIZE, value); 161a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta logger.info(String.format("EGL_GREEN_SIZE = %d", value[0])); 162a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 16359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta egl.eglGetConfigAttrib(display, conf, EGL10.EGL_BLUE_SIZE, value); 164a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta logger.info(String.format("EGL_BLUE_SIZE = %d", value[0])); 165a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 16659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta egl.eglGetConfigAttrib(display, conf, EGL10.EGL_ALPHA_SIZE, value); 167a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta logger.info(String.format("EGL_ALPHA_SIZE = %d", value[0])); 168a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 16959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta egl.eglGetConfigAttrib(display, conf, EGL10.EGL_DEPTH_SIZE, value); 170a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta logger.info(String.format("EGL_DEPTH_SIZE = %d", value[0])); 171a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 17259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta egl.eglGetConfigAttrib(display, conf, EGL10.EGL_STENCIL_SIZE, value); 173a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta logger.info(String.format("EGL_STENCIL_SIZE = %d", value[0])); 17459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 17559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta egl.eglGetConfigAttrib(display, conf, EGL10.EGL_RENDERABLE_TYPE, value); 176a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta logger.info(String.format("EGL_RENDERABLE_TYPE = %d", value[0])); 177a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 17859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta egl.eglGetConfigAttrib(display, conf, EGL10.EGL_SURFACE_TYPE, value); 179a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta logger.info(String.format("EGL_SURFACE_TYPE = %d", value[0])); 18059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 181a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 182a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta public int getClientOpenGLESVersion() { 18359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return clientOpenGLESVersion; 18459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 18559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 186a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta public void setClientOpenGLESVersion(int clientOpenGLESVersion) { 18759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.clientOpenGLESVersion = clientOpenGLESVersion; 18859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 189a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 190a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta public int getPixelFormat() { 19159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return pixelFormat; 19259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 193a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 194a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta private abstract class BaseConfigChooser implements EGLConfigChooser { 195a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 19659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private boolean bClientOpenGLESVersionSet; 197a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 198a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta public BaseConfigChooser(int[] configSpec) { 199a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta bClientOpenGLESVersionSet = false; 200a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta mConfigSpec = filterConfigSpec(configSpec); 201a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta } 202a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 203a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) { 204a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta int[] num_config = new int[1]; 205a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta if (!egl.eglChooseConfig(display, mConfigSpec, null, 0, 206a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta num_config)) { 207a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta throw new IllegalArgumentException("eglChooseConfig failed"); 208a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta } 209a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 210a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta int numConfigs = num_config[0]; 211a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 212a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta if (numConfigs <= 0) { 213a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta //throw new IllegalArgumentException("No configs match configSpec"); 214a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 215a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta return null; 216a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta } 217a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 218a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta EGLConfig[] configs = new EGLConfig[numConfigs]; 219a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta if (!egl.eglChooseConfig(display, mConfigSpec, configs, numConfigs, 220a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta num_config)) { 221a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta throw new IllegalArgumentException("eglChooseConfig#2 failed"); 222a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta } 223a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta EGLConfig config = chooseConfig(egl, display, configs); 224a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta //if (config == null) { 225a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta // throw new IllegalArgumentException("No config chosen"); 226a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta //} 227a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta return config; 228a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta } 229a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 230a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta abstract EGLConfig chooseConfig(EGL10 egl, EGLDisplay display, 231a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta EGLConfig[] configs); 232a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta protected int[] mConfigSpec; 233a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 234a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta private int[] filterConfigSpec(int[] configSpec) { 235a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta if (bClientOpenGLESVersionSet == true) { 236a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta return configSpec; 237a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta } 238a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta /* 239a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta * We know none of the subclasses define EGL_RENDERABLE_TYPE. And we 240a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta * know the configSpec is well formed. 241a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta */ 242a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta int len = configSpec.length; 243a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta int[] newConfigSpec = new int[len + 2]; 244a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta System.arraycopy(configSpec, 0, newConfigSpec, 0, len - 1); 245a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta newConfigSpec[len - 1] = EGL10.EGL_RENDERABLE_TYPE; 246a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta newConfigSpec[len] = 4; /* 247a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta * EGL_OPENGL_ES2_BIT 248a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta */ 249a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta newConfigSpec[len + 1] = EGL10.EGL_NONE; 250a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 251a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta bClientOpenGLESVersionSet = true; 252a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 253a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta return newConfigSpec; 254a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta } 25559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 256a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 25759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 258a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta * Choose a configuration with exactly the specified r,g,b,a sizes, and at 259a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta * least the specified depth and stencil sizes. 26059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 261a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta private class ComponentSizeChooser extends BaseConfigChooser { 262a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 263a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta private int[] mValue; 264a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta // Subclasses can adjust these values: 265a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta protected int mRedSize; 266a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta protected int mGreenSize; 267a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta protected int mBlueSize; 268a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta protected int mAlphaSize; 269a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta protected int mDepthSize; 270a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta protected int mStencilSize; 271a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta 27259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public ComponentSizeChooser(int redSize, int greenSize, int blueSize, 273a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta int alphaSize, int depthSize, int stencilSize) { 274a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta super(new int[]{ 275a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta EGL10.EGL_RED_SIZE, redSize, 276a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta EGL10.EGL_GREEN_SIZE, greenSize, 277a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta EGL10.EGL_BLUE_SIZE, blueSize, 278a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta EGL10.EGL_ALPHA_SIZE, alphaSize, 279a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta EGL10.EGL_DEPTH_SIZE, depthSize, 280a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta EGL10.EGL_STENCIL_SIZE, stencilSize, 281a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta EGL10.EGL_NONE}); 28259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta mValue = new int[1]; 28359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta mRedSize = redSize; 28459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta mGreenSize = greenSize; 28559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta mBlueSize = blueSize; 28659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta mAlphaSize = alphaSize; 28759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta mDepthSize = depthSize; 28859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta mStencilSize = stencilSize; 289a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta } 29059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 29159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 292a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display, EGLConfig[] configs) { 293a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta for (EGLConfig config : configs) { 29459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int d = findConfigAttrib(egl, display, config, 29559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta EGL10.EGL_DEPTH_SIZE, 0); 29659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int s = findConfigAttrib(egl, display, config, 29759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta EGL10.EGL_STENCIL_SIZE, 0); 298a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta if ((d >= mDepthSize) && (s >= mStencilSize)) { 29959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int r = findConfigAttrib(egl, display, config, 30059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta EGL10.EGL_RED_SIZE, 0); 30159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int g = findConfigAttrib(egl, display, config, 302a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta EGL10.EGL_GREEN_SIZE, 0); 30359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int b = findConfigAttrib(egl, display, config, 304a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta EGL10.EGL_BLUE_SIZE, 0); 30559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int a = findConfigAttrib(egl, display, config, 30659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta EGL10.EGL_ALPHA_SIZE, 0); 30759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if ((r == mRedSize) && (g == mGreenSize) 30859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta && (b == mBlueSize) && (a == mAlphaSize)) { 30959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return config; 31059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 31159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 31259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 31359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return null; 31459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 31559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 31659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private int findConfigAttrib(EGL10 egl, EGLDisplay display, 317a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta EGLConfig config, int attribute, int defaultValue) { 31859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 319a6b44658eb1c55295f132a36233a11aa2bd8f9cfScott Barta if (egl.eglGetConfigAttrib(display, config, attribute, mValue)) { 32059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return mValue[0]; 32159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 32259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return defaultValue; 32359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 32459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 32559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta} 326