169e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich/*
269e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich * Copyright (C) 2009 The Android Open Source Project
369e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich *
469e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich * Licensed under the Apache License, Version 2.0 (the "License");
569e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich * you may not use this file except in compliance with the License.
669e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich * You may obtain a copy of the License at
769e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich *
869e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich *      http://www.apache.org/licenses/LICENSE-2.0
969e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich *
1069e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich * Unless required by applicable law or agreed to in writing, software
1169e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich * distributed under the License is distributed on an "AS IS" BASIS,
1269e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1369e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich * See the License for the specific language governing permissions and
1469e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich * limitations under the License.
1569e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich */
1669e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich
1769e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevichpackage com.android.gldual;
1869e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich/*
1969e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich * Copyright (C) 2008 The Android Open Source Project
2069e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich *
2169e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich * Licensed under the Apache License, Version 2.0 (the "License");
2269e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich * you may not use this file except in compliance with the License.
2369e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich * You may obtain a copy of the License at
2469e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich *
2569e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich *      http://www.apache.org/licenses/LICENSE-2.0
2669e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich *
2769e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich * Unless required by applicable law or agreed to in writing, software
2869e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich * distributed under the License is distributed on an "AS IS" BASIS,
2969e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3069e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich * See the License for the specific language governing permissions and
3169e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich * limitations under the License.
3269e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich */
3369e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich
3469e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich
3569e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevichimport javax.microedition.khronos.egl.EGL10;
3669e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevichimport javax.microedition.khronos.egl.EGLConfig;
3769e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevichimport javax.microedition.khronos.egl.EGLContext;
3869e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevichimport javax.microedition.khronos.egl.EGLDisplay;
3969e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevichimport javax.microedition.khronos.opengles.GL10;
4069e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich
4169e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevichimport android.content.Context;
4269e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevichimport android.opengl.GLSurfaceView;
4369e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevichimport android.util.AttributeSet;
4469e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevichimport android.util.Log;
4569e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich
4669e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich/**
4769e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich * An implementation of SurfaceView that uses the dedicated surface for
4869e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich * displaying an OpenGL animation.  This allows the animation to run in a
4969e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich * separate thread, without requiring that it be driven by the update mechanism
5069e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich * of the view hierarchy.
5169e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich *
5269e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich * The application-specific rendering code is delegated to a GLView.Renderer
5369e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich * instance.
5469e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich */
5569e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevichclass GLDualGL2View extends GLSurfaceView {
5669e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich    private static String TAG = "GLDualGL2View";
5769e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich
5869e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich    public GLDualGL2View(Context context) {
5969e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        super(context);
6069e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        init(false, 0, 0);
6169e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich    }
6269e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich
6369e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich    public GLDualGL2View(Context context, AttributeSet set) {
6469e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        super(context, set);
6569e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        init(false, 0, 0);
6669e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich    }
6769e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich
6869e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich    public GLDualGL2View(Context context, boolean translucent, int depth, int stencil) {
6969e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        super(context);
7069e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        init(translucent, depth, stencil);
7169e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich    }
7269e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich
7369e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich    private void init(boolean translucent, int depth, int stencil) {
7469e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        setEGLContextFactory(new ContextFactory());
7569e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        setEGLConfigChooser( translucent ?
7669e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich              new ConfigChooser(8,8,8,8, depth, stencil) :
7769e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich              new ConfigChooser(5,6,5,0, depth, stencil));
7869e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        setRenderer(new Renderer());
7969e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich    }
8069e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich
8169e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich    private static class ContextFactory implements GLSurfaceView.EGLContextFactory {
8269e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        private static int EGL_CONTEXT_CLIENT_VERSION = 0x3098;
8369e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        public EGLContext createContext(EGL10 egl, EGLDisplay display, EGLConfig eglConfig) {
8469e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            Log.w(TAG, "creating OpenGL ES 2.0 context");
8569e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            checkEglError("Before eglCreateContext", egl);
8669e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            int[] attrib_list = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE };
8769e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            EGLContext context = egl.eglCreateContext(display, eglConfig, EGL10.EGL_NO_CONTEXT, attrib_list);
8869e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            checkEglError("After eglCreateContext", egl);
8969e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            return context;
9069e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        }
9169e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich
9269e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        public void destroyContext(EGL10 egl, EGLDisplay display, EGLContext context) {
9369e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            egl.eglDestroyContext(display, context);
9469e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        }
9569e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich    }
9669e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich
9769e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich    private static void checkEglError(String prompt, EGL10 egl) {
9869e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        int error;
9969e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        while ((error = egl.eglGetError()) != EGL10.EGL_SUCCESS) {
10069e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            Log.e(TAG, String.format("%s: EGL error: 0x%x", prompt, error));
10169e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        }
10269e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich    }
10369e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich
10469e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich    private static class ConfigChooser implements GLSurfaceView.EGLConfigChooser {
10569e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        private static int EGL_OPENGL_ES2_BIT = 4;
10669e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        private static int[] s_configAttribs2 =
10769e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        {
10869e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            EGL10.EGL_RED_SIZE, 4,
10969e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            EGL10.EGL_GREEN_SIZE, 4,
11069e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            EGL10.EGL_BLUE_SIZE, 4,
11169e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
11269e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            EGL10.EGL_NONE
11369e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        };
11469e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich
11569e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        public ConfigChooser(int r, int g, int b, int a, int depth, int stencil) {
11669e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            mRedSize = r;
11769e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            mGreenSize = g;
11869e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            mBlueSize = b;
11969e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            mAlphaSize = a;
12069e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            mDepthSize = depth;
12169e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            mStencilSize = stencil;
12269e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        }
12369e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich
12469e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) {
12569e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich
12669e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            int[] num_config = new int[1];
12769e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            egl.eglChooseConfig(display, s_configAttribs2, null, 0, num_config);
12869e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich
12969e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            int numConfigs = num_config[0];
13069e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich
13169e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            if (numConfigs <= 0) {
13269e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                throw new IllegalArgumentException("No configs match configSpec");
13369e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            }
13469e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            EGLConfig[] configs = new EGLConfig[numConfigs];
13569e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            egl.eglChooseConfig(display, s_configAttribs2, configs, numConfigs, num_config);
13669e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            // printConfigs(egl, display, configs);
13769e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            return chooseConfig(egl, display, configs);
13869e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        }
13969e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich
14069e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display,
14169e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                EGLConfig[] configs) {
14269e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            EGLConfig closestConfig = null;
14369e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            int closestDistance = 1000;
14469e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            for(EGLConfig config : configs) {
14569e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                int d = findConfigAttrib(egl, display, config,
14669e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                        EGL10.EGL_DEPTH_SIZE, 0);
14769e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                int s = findConfigAttrib(egl, display, config,
14869e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                        EGL10.EGL_STENCIL_SIZE, 0);
14969e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                if (d >= mDepthSize && s>= mStencilSize) {
15069e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    int r = findConfigAttrib(egl, display, config,
15169e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                            EGL10.EGL_RED_SIZE, 0);
15269e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    int g = findConfigAttrib(egl, display, config,
15369e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                             EGL10.EGL_GREEN_SIZE, 0);
15469e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    int b = findConfigAttrib(egl, display, config,
15569e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                              EGL10.EGL_BLUE_SIZE, 0);
15669e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    int a = findConfigAttrib(egl, display, config,
15769e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                            EGL10.EGL_ALPHA_SIZE, 0);
15869e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    int distance = Math.abs(r - mRedSize)
15969e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                                + Math.abs(g - mGreenSize)
16069e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                                + Math.abs(b - mBlueSize)
16169e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                                + Math.abs(a - mAlphaSize);
16269e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    if (distance < closestDistance) {
16369e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                        closestDistance = distance;
16469e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                        closestConfig = config;
16569e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    }
16669e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                }
16769e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            }
16869e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            return closestConfig;
16969e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        }
17069e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich
17169e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        private int findConfigAttrib(EGL10 egl, EGLDisplay display,
17269e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                EGLConfig config, int attribute, int defaultValue) {
17369e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich
17469e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            if (egl.eglGetConfigAttrib(display, config, attribute, mValue)) {
17569e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                return mValue[0];
17669e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            }
17769e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            return defaultValue;
17869e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        }
17969e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich
18069e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        private void printConfigs(EGL10 egl, EGLDisplay display,
18169e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            EGLConfig[] configs) {
18269e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            int numConfigs = configs.length;
18369e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            Log.w(TAG, String.format("%d configurations", numConfigs));
18469e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            for (int i = 0; i < numConfigs; i++) {
18569e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                Log.w(TAG, String.format("Configuration %d:\n", i));
18669e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                printConfig(egl, display, configs[i]);
18769e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            }
18869e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        }
18969e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich
19069e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        private void printConfig(EGL10 egl, EGLDisplay display,
19169e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                EGLConfig config) {
19269e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            int[] attributes = {
19369e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    EGL10.EGL_BUFFER_SIZE,
19469e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    EGL10.EGL_ALPHA_SIZE,
19569e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    EGL10.EGL_BLUE_SIZE,
19669e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    EGL10.EGL_GREEN_SIZE,
19769e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    EGL10.EGL_RED_SIZE,
19869e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    EGL10.EGL_DEPTH_SIZE,
19969e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    EGL10.EGL_STENCIL_SIZE,
20069e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    EGL10.EGL_CONFIG_CAVEAT,
20169e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    EGL10.EGL_CONFIG_ID,
20269e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    EGL10.EGL_LEVEL,
20369e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    EGL10.EGL_MAX_PBUFFER_HEIGHT,
20469e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    EGL10.EGL_MAX_PBUFFER_PIXELS,
20569e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    EGL10.EGL_MAX_PBUFFER_WIDTH,
20669e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    EGL10.EGL_NATIVE_RENDERABLE,
20769e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    EGL10.EGL_NATIVE_VISUAL_ID,
20869e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    EGL10.EGL_NATIVE_VISUAL_TYPE,
20969e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    0x3030, // EGL10.EGL_PRESERVED_RESOURCES,
21069e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    EGL10.EGL_SAMPLES,
21169e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    EGL10.EGL_SAMPLE_BUFFERS,
21269e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    EGL10.EGL_SURFACE_TYPE,
21369e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    EGL10.EGL_TRANSPARENT_TYPE,
21469e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    EGL10.EGL_TRANSPARENT_RED_VALUE,
21569e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    EGL10.EGL_TRANSPARENT_GREEN_VALUE,
21669e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    EGL10.EGL_TRANSPARENT_BLUE_VALUE,
21769e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    0x3039, // EGL10.EGL_BIND_TO_TEXTURE_RGB,
21869e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    0x303A, // EGL10.EGL_BIND_TO_TEXTURE_RGBA,
21969e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    0x303B, // EGL10.EGL_MIN_SWAP_INTERVAL,
22069e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    0x303C, // EGL10.EGL_MAX_SWAP_INTERVAL,
22169e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    EGL10.EGL_LUMINANCE_SIZE,
22269e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    EGL10.EGL_ALPHA_MASK_SIZE,
22369e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    EGL10.EGL_COLOR_BUFFER_TYPE,
22469e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    EGL10.EGL_RENDERABLE_TYPE,
22569e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    0x3042 // EGL10.EGL_CONFORMANT
22669e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            };
22769e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            String[] names = {
22869e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_BUFFER_SIZE",
22969e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_ALPHA_SIZE",
23069e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_BLUE_SIZE",
23169e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_GREEN_SIZE",
23269e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_RED_SIZE",
23369e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_DEPTH_SIZE",
23469e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_STENCIL_SIZE",
23569e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_CONFIG_CAVEAT",
23669e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_CONFIG_ID",
23769e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_LEVEL",
23869e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_MAX_PBUFFER_HEIGHT",
23969e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_MAX_PBUFFER_PIXELS",
24069e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_MAX_PBUFFER_WIDTH",
24169e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_NATIVE_RENDERABLE",
24269e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_NATIVE_VISUAL_ID",
24369e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_NATIVE_VISUAL_TYPE",
24469e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_PRESERVED_RESOURCES",
24569e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_SAMPLES",
24669e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_SAMPLE_BUFFERS",
24769e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_SURFACE_TYPE",
24869e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_TRANSPARENT_TYPE",
24969e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_TRANSPARENT_RED_VALUE",
25069e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_TRANSPARENT_GREEN_VALUE",
25169e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_TRANSPARENT_BLUE_VALUE",
25269e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_BIND_TO_TEXTURE_RGB",
25369e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_BIND_TO_TEXTURE_RGBA",
25469e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_MIN_SWAP_INTERVAL",
25569e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_MAX_SWAP_INTERVAL",
25669e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_LUMINANCE_SIZE",
25769e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_ALPHA_MASK_SIZE",
25869e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_COLOR_BUFFER_TYPE",
25969e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_RENDERABLE_TYPE",
26069e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    "EGL_CONFORMANT"
26169e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            };
26269e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            int[] value = new int[1];
26369e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            for (int i = 0; i < attributes.length; i++) {
26469e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                int attribute = attributes[i];
26569e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                String name = names[i];
26669e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                if ( egl.eglGetConfigAttrib(display, config, attribute, value)) {
26769e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    Log.w(TAG, String.format("  %s: %d\n", name, value[0]));
26869e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                } else {
26969e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    // Log.w(TAG, String.format("  %s: failed\n", name));
27069e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                    while (egl.eglGetError() != EGL10.EGL_SUCCESS);
27169e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich                }
27269e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            }
27369e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        }
27469e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich
27569e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        // Subclasses can adjust these values:
27669e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        protected int mRedSize;
27769e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        protected int mGreenSize;
27869e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        protected int mBlueSize;
27969e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        protected int mAlphaSize;
28069e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        protected int mDepthSize;
28169e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        protected int mStencilSize;
28269e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        private int[] mValue = new int[1];
28369e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich    }
28469e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich
28569e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich    private static class Renderer implements GLSurfaceView.Renderer {
28669e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        public void onDrawFrame(GL10 gl) {
28769e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            GLDualLib.step();
28869e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        }
28969e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich
29069e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        public void onSurfaceChanged(GL10 gl, int width, int height) {
29169e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            GLDualLib.init(width, height);
29269e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        }
29369e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich
29469e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
29569e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich            // Do nothing.
29669e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich        }
29769e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich    }
29869e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich}
29969e21f5f6e0d04539cd92848ea009dd615d88c2cJack Palevich
300