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