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