1eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich/*
2eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich * Copyright (C) 2009 The Android Open Source Project
3eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich *
4eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich * Licensed under the Apache License, Version 2.0 (the "License");
5eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich * you may not use this file except in compliance with the License.
6eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich * You may obtain a copy of the License at
7eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich *
8eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich *      http://www.apache.org/licenses/LICENSE-2.0
9eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich *
10eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich * Unless required by applicable law or agreed to in writing, software
11eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich * distributed under the License is distributed on an "AS IS" BASIS,
12eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich * See the License for the specific language governing permissions and
14eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich * limitations under the License.
15eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich */
16eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
17eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichpackage com.android.glperf;
18eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich/*
19eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich * Copyright (C) 2008 The Android Open Source Project
20eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich *
21eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich * Licensed under the Apache License, Version 2.0 (the "License");
22eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich * you may not use this file except in compliance with the License.
23eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich * You may obtain a copy of the License at
24eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich *
25eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich *      http://www.apache.org/licenses/LICENSE-2.0
26eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich *
27eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich * Unless required by applicable law or agreed to in writing, software
28eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich * distributed under the License is distributed on an "AS IS" BASIS,
29eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
30eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich * See the License for the specific language governing permissions and
31eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich * limitations under the License.
32eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich */
33eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
34eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
35eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichimport android.content.Context;
36eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichimport android.opengl.GLSurfaceView;
37eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichimport android.util.AttributeSet;
38eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichimport android.util.Log;
39eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichimport android.view.KeyEvent;
40eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichimport android.view.MotionEvent;
41eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
42eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichimport javax.microedition.khronos.egl.EGL10;
43eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichimport javax.microedition.khronos.egl.EGLConfig;
44eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichimport javax.microedition.khronos.egl.EGLContext;
45eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichimport javax.microedition.khronos.egl.EGLDisplay;
46eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichimport javax.microedition.khronos.opengles.GL10;
47eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
48eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich/**
49eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich * An implementation of SurfaceView that uses the dedicated surface for
50eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich * displaying an OpenGL animation.  This allows the animation to run in a
51eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich * separate thread, without requiring that it be driven by the update mechanism
52eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich * of the view hierarchy.
53eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich *
54eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich * The application-specific rendering code is delegated to a GLView.Renderer
55eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich * instance.
56eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich */
57eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevichclass GLPerfView extends GLSurfaceView {
58eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    private static String TAG = "GLPerfView";
59eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
60eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    public GLPerfView(Context context) {
61eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        super(context);
62eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        init(false, 0, 0);
63eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
64eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
65eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    public GLPerfView(Context context, boolean translucent, int depth, int stencil) {
66eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        super(context);
67eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        init(translucent, depth, stencil);
68eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
69eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
70eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    private void init(boolean translucent, int depth, int stencil) {
71eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        setEGLContextFactory(new ContextFactory());
72eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        setEGLConfigChooser( translucent ?
73eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich              new ConfigChooser(8,8,8,8, depth, stencil) :
74eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich              new ConfigChooser(5,6,5,0, depth, stencil));
75eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        setRenderer(new Renderer());
76eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
77eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
78eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    private static class ContextFactory implements GLSurfaceView.EGLContextFactory {
79eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        private static int EGL_CONTEXT_CLIENT_VERSION = 0x3098;
80eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        public EGLContext createContext(EGL10 egl, EGLDisplay display, EGLConfig eglConfig) {
81eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            Log.w(TAG, "creating OpenGL ES 2.0 context");
82eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            checkEglError("Before eglCreateContext", egl);
83eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            int[] attrib_list = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE };
84eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            EGLContext context = egl.eglCreateContext(display, eglConfig, EGL10.EGL_NO_CONTEXT, attrib_list);
85eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            checkEglError("After eglCreateContext", egl);
86eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            return context;
87eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        }
88eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
89eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        public void destroyContext(EGL10 egl, EGLDisplay display, EGLContext context) {
90eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            egl.eglDestroyContext(display, context);
91eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        }
92eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
93eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
94eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    private static void checkEglError(String prompt, EGL10 egl) {
95eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        int error;
96eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        while ((error = egl.eglGetError()) != EGL10.EGL_SUCCESS) {
97eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            Log.e(TAG, String.format("%s: EGL error: 0x%x", prompt, error));
98eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        }
99eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
100eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
101eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    private static class ConfigChooser implements GLSurfaceView.EGLConfigChooser {
102eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        private static int EGL_OPENGL_ES2_BIT = 4;
103eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        private static int[] s_configAttribs2 =
104eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        {
105eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            EGL10.EGL_RED_SIZE, 4,
106eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            EGL10.EGL_GREEN_SIZE, 4,
107eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            EGL10.EGL_BLUE_SIZE, 4,
108eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
109eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            EGL10.EGL_NONE
110eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        };
111eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
112eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        public ConfigChooser(int r, int g, int b, int a, int depth, int stencil) {
113eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            mRedSize = r;
114eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            mGreenSize = g;
115eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            mBlueSize = b;
116eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            mAlphaSize = a;
117eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            mDepthSize = depth;
118eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            mStencilSize = stencil;
119eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        }
120eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
121eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) {
122eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
123eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            int[] num_config = new int[1];
124eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            egl.eglChooseConfig(display, s_configAttribs2, null, 0, num_config);
125eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
126eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            int numConfigs = num_config[0];
127eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
128eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            if (numConfigs <= 0) {
129eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                throw new IllegalArgumentException("No configs match configSpec");
130eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            }
131eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            EGLConfig[] configs = new EGLConfig[numConfigs];
132eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            egl.eglChooseConfig(display, s_configAttribs2, configs, numConfigs, num_config);
133eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            // printConfigs(egl, display, configs);
134eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            return chooseConfig(egl, display, configs);
135eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        }
136eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
137eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display,
138eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                EGLConfig[] configs) {
139eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            EGLConfig closestConfig = null;
140eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            int closestDistance = 1000;
141eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            for(EGLConfig config : configs) {
142eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                int d = findConfigAttrib(egl, display, config,
143eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                        EGL10.EGL_DEPTH_SIZE, 0);
144eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                int s = findConfigAttrib(egl, display, config,
145eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                        EGL10.EGL_STENCIL_SIZE, 0);
146eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                if (d >= mDepthSize && s>= mStencilSize) {
147eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    int r = findConfigAttrib(egl, display, config,
148eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                            EGL10.EGL_RED_SIZE, 0);
149eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    int g = findConfigAttrib(egl, display, config,
150eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                             EGL10.EGL_GREEN_SIZE, 0);
151eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    int b = findConfigAttrib(egl, display, config,
152eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                              EGL10.EGL_BLUE_SIZE, 0);
153eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    int a = findConfigAttrib(egl, display, config,
154eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                            EGL10.EGL_ALPHA_SIZE, 0);
155eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    int distance = Math.abs(r - mRedSize)
156eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                                + Math.abs(g - mGreenSize)
157eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                                + Math.abs(b - mBlueSize)
158eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                                + Math.abs(a - mAlphaSize);
159eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    if (distance < closestDistance) {
160eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                        closestDistance = distance;
161eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                        closestConfig = config;
162eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    }
163eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                }
164eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            }
165eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            return closestConfig;
166eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        }
167eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
168eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        private int findConfigAttrib(EGL10 egl, EGLDisplay display,
169eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                EGLConfig config, int attribute, int defaultValue) {
170eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
171eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            if (egl.eglGetConfigAttrib(display, config, attribute, mValue)) {
172eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                return mValue[0];
173eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            }
174eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            return defaultValue;
175eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        }
176eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
177eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        private void printConfigs(EGL10 egl, EGLDisplay display,
178eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            EGLConfig[] configs) {
179eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            int numConfigs = configs.length;
180eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            Log.w(TAG, String.format("%d configurations", numConfigs));
181eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            for (int i = 0; i < numConfigs; i++) {
182eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                Log.w(TAG, String.format("Configuration %d:\n", i));
183eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                printConfig(egl, display, configs[i]);
184eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            }
185eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        }
186eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
187eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        private void printConfig(EGL10 egl, EGLDisplay display,
188eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                EGLConfig config) {
189eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            int[] attributes = {
190eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    EGL10.EGL_BUFFER_SIZE,
191eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    EGL10.EGL_ALPHA_SIZE,
192eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    EGL10.EGL_BLUE_SIZE,
193eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    EGL10.EGL_GREEN_SIZE,
194eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    EGL10.EGL_RED_SIZE,
195eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    EGL10.EGL_DEPTH_SIZE,
196eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    EGL10.EGL_STENCIL_SIZE,
197eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    EGL10.EGL_CONFIG_CAVEAT,
198eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    EGL10.EGL_CONFIG_ID,
199eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    EGL10.EGL_LEVEL,
200eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    EGL10.EGL_MAX_PBUFFER_HEIGHT,
201eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    EGL10.EGL_MAX_PBUFFER_PIXELS,
202eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    EGL10.EGL_MAX_PBUFFER_WIDTH,
203eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    EGL10.EGL_NATIVE_RENDERABLE,
204eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    EGL10.EGL_NATIVE_VISUAL_ID,
205eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    EGL10.EGL_NATIVE_VISUAL_TYPE,
206eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    0x3030, // EGL10.EGL_PRESERVED_RESOURCES,
207eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    EGL10.EGL_SAMPLES,
208eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    EGL10.EGL_SAMPLE_BUFFERS,
209eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    EGL10.EGL_SURFACE_TYPE,
210eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    EGL10.EGL_TRANSPARENT_TYPE,
211eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    EGL10.EGL_TRANSPARENT_RED_VALUE,
212eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    EGL10.EGL_TRANSPARENT_GREEN_VALUE,
213eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    EGL10.EGL_TRANSPARENT_BLUE_VALUE,
214eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    0x3039, // EGL10.EGL_BIND_TO_TEXTURE_RGB,
215eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    0x303A, // EGL10.EGL_BIND_TO_TEXTURE_RGBA,
216eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    0x303B, // EGL10.EGL_MIN_SWAP_INTERVAL,
217eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    0x303C, // EGL10.EGL_MAX_SWAP_INTERVAL,
218eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    EGL10.EGL_LUMINANCE_SIZE,
219eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    EGL10.EGL_ALPHA_MASK_SIZE,
220eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    EGL10.EGL_COLOR_BUFFER_TYPE,
221eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    EGL10.EGL_RENDERABLE_TYPE,
222eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    0x3042 // EGL10.EGL_CONFORMANT
223eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            };
224eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            String[] names = {
225eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_BUFFER_SIZE",
226eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_ALPHA_SIZE",
227eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_BLUE_SIZE",
228eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_GREEN_SIZE",
229eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_RED_SIZE",
230eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_DEPTH_SIZE",
231eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_STENCIL_SIZE",
232eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_CONFIG_CAVEAT",
233eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_CONFIG_ID",
234eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_LEVEL",
235eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_MAX_PBUFFER_HEIGHT",
236eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_MAX_PBUFFER_PIXELS",
237eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_MAX_PBUFFER_WIDTH",
238eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_NATIVE_RENDERABLE",
239eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_NATIVE_VISUAL_ID",
240eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_NATIVE_VISUAL_TYPE",
241eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_PRESERVED_RESOURCES",
242eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_SAMPLES",
243eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_SAMPLE_BUFFERS",
244eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_SURFACE_TYPE",
245eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_TRANSPARENT_TYPE",
246eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_TRANSPARENT_RED_VALUE",
247eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_TRANSPARENT_GREEN_VALUE",
248eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_TRANSPARENT_BLUE_VALUE",
249eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_BIND_TO_TEXTURE_RGB",
250eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_BIND_TO_TEXTURE_RGBA",
251eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_MIN_SWAP_INTERVAL",
252eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_MAX_SWAP_INTERVAL",
253eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_LUMINANCE_SIZE",
254eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_ALPHA_MASK_SIZE",
255eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_COLOR_BUFFER_TYPE",
256eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_RENDERABLE_TYPE",
257eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    "EGL_CONFORMANT"
258eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            };
259eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            int[] value = new int[1];
260eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            for (int i = 0; i < attributes.length; i++) {
261eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                int attribute = attributes[i];
262eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                String name = names[i];
263eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                if ( egl.eglGetConfigAttrib(display, config, attribute, value)) {
264eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    Log.w(TAG, String.format("  %s: %d\n", name, value[0]));
265eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                } else {
266eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    // Log.w(TAG, String.format("  %s: failed\n", name));
267eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                    while (egl.eglGetError() != EGL10.EGL_SUCCESS);
268eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich                }
269eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            }
270eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        }
271eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
272eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        // Subclasses can adjust these values:
273eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        protected int mRedSize;
274eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        protected int mGreenSize;
275eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        protected int mBlueSize;
276eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        protected int mAlphaSize;
277eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        protected int mDepthSize;
278eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        protected int mStencilSize;
279eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        private int[] mValue = new int[1];
280eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
281eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
282eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    private static class Renderer implements GLSurfaceView.Renderer {
283eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        public void onDrawFrame(GL10 gl) {
284eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            GLPerfLib.step();
285eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        }
286eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
287eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        public void onSurfaceChanged(GL10 gl, int width, int height) {
288eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            GLPerfLib.init(width, height);
289eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        }
290eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
291eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
292eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich            // Do nothing.
293eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich        }
294eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich    }
295eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich}
296eb69d2ae19c89553c142a7b716fe2ac72e32080aJack Palevich
297