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