1919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich/*
2919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich * Copyright (C) 2009 The Android Open Source Project
3919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich *
4919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich * Licensed under the Apache License, Version 2.0 (the "License");
5919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich * you may not use this file except in compliance with the License.
6919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich * You may obtain a copy of the License at
7919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich *
8919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich *      http://www.apache.org/licenses/LICENSE-2.0
9919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich *
10919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich * Unless required by applicable law or agreed to in writing, software
11919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich * distributed under the License is distributed on an "AS IS" BASIS,
12919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich * See the License for the specific language governing permissions and
14919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich * limitations under the License.
15919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich */
16919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich
17919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevichpackage com.android.gl2jni;
18919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich/*
19919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich * Copyright (C) 2008 The Android Open Source Project
20919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich *
21919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich * Licensed under the Apache License, Version 2.0 (the "License");
22919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich * you may not use this file except in compliance with the License.
23919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich * You may obtain a copy of the License at
24919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich *
25919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich *      http://www.apache.org/licenses/LICENSE-2.0
26919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich *
27919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich * Unless required by applicable law or agreed to in writing, software
28919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich * distributed under the License is distributed on an "AS IS" BASIS,
29919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
30919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich * See the License for the specific language governing permissions and
31919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich * limitations under the License.
32919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich */
33919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich
34919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich
35919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevichimport android.content.Context;
36919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevichimport android.opengl.GLSurfaceView;
37919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevichimport android.util.AttributeSet;
38919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevichimport android.util.Log;
39919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevichimport android.view.KeyEvent;
40919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevichimport android.view.MotionEvent;
41919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich
42919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevichimport javax.microedition.khronos.egl.EGL10;
43919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevichimport javax.microedition.khronos.egl.EGLConfig;
44919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevichimport javax.microedition.khronos.egl.EGLContext;
45919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevichimport javax.microedition.khronos.egl.EGLDisplay;
46919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevichimport javax.microedition.khronos.opengles.GL10;
4743123766f5fc3a73df77a03390679ec536ebe6e0Jack Palevich
48919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich/**
49919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich * An implementation of SurfaceView that uses the dedicated surface for
50919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich * displaying an OpenGL animation.  This allows the animation to run in a
51919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich * separate thread, without requiring that it be driven by the update mechanism
52919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich * of the view hierarchy.
53919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich *
54919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich * The application-specific rendering code is delegated to a GLView.Renderer
55919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich * instance.
56919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich */
57919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevichclass GL2JNIView extends GLSurfaceView {
58919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich    private static String TAG = "GL2JNIView";
5999dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich
6099dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich    public GL2JNIView(Context context) {
61919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich        super(context);
6299dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich        init(false, 0, 0);
63919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich    }
64919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich
6599dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich    public GL2JNIView(Context context, boolean translucent, int depth, int stencil) {
6699dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich        super(context);
6799dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich        init(translucent, depth, stencil);
68919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich    }
69919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich
7099dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich    private void init(boolean translucent, int depth, int stencil) {
71919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich        setEGLContextFactory(new ContextFactory());
7299dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich        setEGLConfigChooser( translucent ?
7399dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich              new ConfigChooser(8,8,8,8, depth, stencil) :
7499dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich              new ConfigChooser(5,6,5,0, depth, stencil));
75919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich        setRenderer(new Renderer());
76919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich    }
77919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich
78919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich    private static class ContextFactory implements GLSurfaceView.EGLContextFactory {
79919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich        private static int EGL_CONTEXT_CLIENT_VERSION = 0x3098;
80919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich        public EGLContext createContext(EGL10 egl, EGLDisplay display, EGLConfig eglConfig) {
8143123766f5fc3a73df77a03390679ec536ebe6e0Jack Palevich            Log.w(TAG, "creating OpenGL ES 2.0 context");
82919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich            checkEglError("Before eglCreateContext", egl);
83919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich            int[] attrib_list = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE };
84919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich            EGLContext context = egl.eglCreateContext(display, eglConfig, EGL10.EGL_NO_CONTEXT, attrib_list);
85919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich            checkEglError("After eglCreateContext", egl);
86919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich            return context;
87919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich        }
88919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich
89919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich        public void destroyContext(EGL10 egl, EGLDisplay display, EGLContext context) {
90919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich            egl.eglDestroyContext(display, context);
9143123766f5fc3a73df77a03390679ec536ebe6e0Jack Palevich        }
92919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich    }
93919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich
94919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich    private static void checkEglError(String prompt, EGL10 egl) {
95919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich        int error;
96919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich        while ((error = egl.eglGetError()) != EGL10.EGL_SUCCESS) {
97919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich            Log.e(TAG, String.format("%s: EGL error: 0x%x", prompt, error));
98919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich        }
99919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich    }
100919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich
101919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich    private static class ConfigChooser implements GLSurfaceView.EGLConfigChooser {
102919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich        private static int EGL_OPENGL_ES2_BIT = 4;
10343123766f5fc3a73df77a03390679ec536ebe6e0Jack Palevich        private static int[] s_configAttribs2 =
104919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich        {
10543123766f5fc3a73df77a03390679ec536ebe6e0Jack Palevich            EGL10.EGL_RED_SIZE, 4,
10643123766f5fc3a73df77a03390679ec536ebe6e0Jack Palevich            EGL10.EGL_GREEN_SIZE, 4,
10743123766f5fc3a73df77a03390679ec536ebe6e0Jack Palevich            EGL10.EGL_BLUE_SIZE, 4,
10843123766f5fc3a73df77a03390679ec536ebe6e0Jack Palevich            EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
10943123766f5fc3a73df77a03390679ec536ebe6e0Jack Palevich            EGL10.EGL_NONE
110919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich        };
11199dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich
11299dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich        public ConfigChooser(int r, int g, int b, int a, int depth, int stencil) {
11399dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich            mRedSize = r;
11499dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich            mGreenSize = g;
11599dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich            mBlueSize = b;
11699dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich            mAlphaSize = a;
11799dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich            mDepthSize = depth;
11899dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich            mStencilSize = stencil;
11999dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich        }
12099dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich
121919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich        public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) {
122919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich
123919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich            int[] num_config = new int[1];
124919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich            egl.eglChooseConfig(display, s_configAttribs2, null, 0, num_config);
125919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich
126919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich            int numConfigs = num_config[0];
127919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich
128919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich            if (numConfigs <= 0) {
129919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich                throw new IllegalArgumentException("No configs match configSpec");
130919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich            }
131919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich            EGLConfig[] configs = new EGLConfig[numConfigs];
132919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich            egl.eglChooseConfig(display, s_configAttribs2, configs, numConfigs, num_config);
13399dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich            // printConfigs(egl, display, configs);
13499dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich            return chooseConfig(egl, display, configs);
135919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich        }
13699dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich
13799dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich        public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display,
13899dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                EGLConfig[] configs) {
13999dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich            EGLConfig closestConfig = null;
14099dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich            int closestDistance = 1000;
14199dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich            for(EGLConfig config : configs) {
14299dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                int d = findConfigAttrib(egl, display, config,
14399dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                        EGL10.EGL_DEPTH_SIZE, 0);
14499dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                int s = findConfigAttrib(egl, display, config,
14599dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                        EGL10.EGL_STENCIL_SIZE, 0);
14699dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                if (d >= mDepthSize && s>= mStencilSize) {
14799dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    int r = findConfigAttrib(egl, display, config,
14899dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                            EGL10.EGL_RED_SIZE, 0);
14999dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    int g = findConfigAttrib(egl, display, config,
15099dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                             EGL10.EGL_GREEN_SIZE, 0);
15199dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    int b = findConfigAttrib(egl, display, config,
15299dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                              EGL10.EGL_BLUE_SIZE, 0);
15399dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    int a = findConfigAttrib(egl, display, config,
15499dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                            EGL10.EGL_ALPHA_SIZE, 0);
15599dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    int distance = Math.abs(r - mRedSize)
15699dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                                + Math.abs(g - mGreenSize)
15799dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                                + Math.abs(b - mBlueSize)
15899dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                                + Math.abs(a - mAlphaSize);
15999dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    if (distance < closestDistance) {
16099dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                        closestDistance = distance;
16199dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                        closestConfig = config;
16299dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    }
16399dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                }
16499dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich            }
16599dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich            return closestConfig;
16699dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich        }
16799dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich
16899dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich        private int findConfigAttrib(EGL10 egl, EGLDisplay display,
16999dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                EGLConfig config, int attribute, int defaultValue) {
17099dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich
17199dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich            if (egl.eglGetConfigAttrib(display, config, attribute, mValue)) {
17299dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                return mValue[0];
17399dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich            }
17499dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich            return defaultValue;
17599dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich        }
17699dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich
17799dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich        private void printConfigs(EGL10 egl, EGLDisplay display,
17899dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich            EGLConfig[] configs) {
17999dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich            int numConfigs = configs.length;
18099dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich            Log.w(TAG, String.format("%d configurations", numConfigs));
18199dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich            for (int i = 0; i < numConfigs; i++) {
18299dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                Log.w(TAG, String.format("Configuration %d:\n", i));
18399dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                printConfig(egl, display, configs[i]);
18499dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich            }
18599dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich        }
18699dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich
18799dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich        private void printConfig(EGL10 egl, EGLDisplay display,
18899dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                EGLConfig config) {
18999dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich            int[] attributes = {
19099dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    EGL10.EGL_BUFFER_SIZE,
19199dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    EGL10.EGL_ALPHA_SIZE,
19299dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    EGL10.EGL_BLUE_SIZE,
19399dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    EGL10.EGL_GREEN_SIZE,
19499dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    EGL10.EGL_RED_SIZE,
19599dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    EGL10.EGL_DEPTH_SIZE,
19699dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    EGL10.EGL_STENCIL_SIZE,
19799dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    EGL10.EGL_CONFIG_CAVEAT,
19899dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    EGL10.EGL_CONFIG_ID,
19999dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    EGL10.EGL_LEVEL,
20099dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    EGL10.EGL_MAX_PBUFFER_HEIGHT,
20199dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    EGL10.EGL_MAX_PBUFFER_PIXELS,
20299dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    EGL10.EGL_MAX_PBUFFER_WIDTH,
20399dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    EGL10.EGL_NATIVE_RENDERABLE,
20499dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    EGL10.EGL_NATIVE_VISUAL_ID,
20599dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    EGL10.EGL_NATIVE_VISUAL_TYPE,
20699dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    0x3030, // EGL10.EGL_PRESERVED_RESOURCES,
20799dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    EGL10.EGL_SAMPLES,
20899dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    EGL10.EGL_SAMPLE_BUFFERS,
20999dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    EGL10.EGL_SURFACE_TYPE,
21099dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    EGL10.EGL_TRANSPARENT_TYPE,
21199dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    EGL10.EGL_TRANSPARENT_RED_VALUE,
21299dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    EGL10.EGL_TRANSPARENT_GREEN_VALUE,
21399dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    EGL10.EGL_TRANSPARENT_BLUE_VALUE,
21499dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    0x3039, // EGL10.EGL_BIND_TO_TEXTURE_RGB,
21599dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    0x303A, // EGL10.EGL_BIND_TO_TEXTURE_RGBA,
21699dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    0x303B, // EGL10.EGL_MIN_SWAP_INTERVAL,
21799dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    0x303C, // EGL10.EGL_MAX_SWAP_INTERVAL,
21899dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    EGL10.EGL_LUMINANCE_SIZE,
21999dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    EGL10.EGL_ALPHA_MASK_SIZE,
22099dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    EGL10.EGL_COLOR_BUFFER_TYPE,
22199dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    EGL10.EGL_RENDERABLE_TYPE,
22299dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    0x3042 // EGL10.EGL_CONFORMANT
22399dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich            };
22499dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich            String[] names = {
22599dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_BUFFER_SIZE",
22699dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_ALPHA_SIZE",
22799dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_BLUE_SIZE",
22899dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_GREEN_SIZE",
22999dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_RED_SIZE",
23099dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_DEPTH_SIZE",
23199dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_STENCIL_SIZE",
23299dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_CONFIG_CAVEAT",
23399dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_CONFIG_ID",
23499dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_LEVEL",
23599dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_MAX_PBUFFER_HEIGHT",
23699dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_MAX_PBUFFER_PIXELS",
23799dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_MAX_PBUFFER_WIDTH",
23899dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_NATIVE_RENDERABLE",
23999dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_NATIVE_VISUAL_ID",
24099dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_NATIVE_VISUAL_TYPE",
24199dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_PRESERVED_RESOURCES",
24299dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_SAMPLES",
24399dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_SAMPLE_BUFFERS",
24499dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_SURFACE_TYPE",
24599dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_TRANSPARENT_TYPE",
24699dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_TRANSPARENT_RED_VALUE",
24799dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_TRANSPARENT_GREEN_VALUE",
24899dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_TRANSPARENT_BLUE_VALUE",
24999dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_BIND_TO_TEXTURE_RGB",
25099dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_BIND_TO_TEXTURE_RGBA",
25199dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_MIN_SWAP_INTERVAL",
25299dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_MAX_SWAP_INTERVAL",
25399dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_LUMINANCE_SIZE",
25499dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_ALPHA_MASK_SIZE",
25599dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_COLOR_BUFFER_TYPE",
25699dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_RENDERABLE_TYPE",
25799dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    "EGL_CONFORMANT"
25899dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich            };
25999dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich            int[] value = new int[1];
26099dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich            for (int i = 0; i < attributes.length; i++) {
26199dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                int attribute = attributes[i];
26299dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                String name = names[i];
26399dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                if ( egl.eglGetConfigAttrib(display, config, attribute, value)) {
26499dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    Log.w(TAG, String.format("  %s: %d\n", name, value[0]));
26599dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                } else {
26699dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    // Log.w(TAG, String.format("  %s: failed\n", name));
26799dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                    while (egl.eglGetError() != EGL10.EGL_SUCCESS);
26899dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich                }
26999dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich            }
27099dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich        }
27199dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich
27299dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich        // Subclasses can adjust these values:
27399dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich        protected int mRedSize;
27499dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich        protected int mGreenSize;
27599dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich        protected int mBlueSize;
27699dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich        protected int mAlphaSize;
27799dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich        protected int mDepthSize;
27899dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich        protected int mStencilSize;
27999dd08fc36f9d04fc6bd154cc763c0c4e62e733dJack Palevich        private int[] mValue = new int[1];
280919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich    }
281919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich
282919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich    private static class Renderer implements GLSurfaceView.Renderer {
283919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich        public void onDrawFrame(GL10 gl) {
284919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich            GL2JNILib.step();
285919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich        }
286919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich
287919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich        public void onSurfaceChanged(GL10 gl, int width, int height) {
288919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich            GL2JNILib.init(width, height);
289919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich        }
290919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich
291919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
292919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich            // Do nothing.
293919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich        }
294919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich    }
295919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich}
296919583553781f1e1885fa17f76d54008ebeca3c1Jack Palevich
297