1*b7c941bbSAndroid Build Coastguard Worker /* 2*b7c941bbSAndroid Build Coastguard Worker * Copyright (C) 2016 The Android Open Source Project 3*b7c941bbSAndroid Build Coastguard Worker * 4*b7c941bbSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*b7c941bbSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*b7c941bbSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*b7c941bbSAndroid Build Coastguard Worker * 8*b7c941bbSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*b7c941bbSAndroid Build Coastguard Worker * 10*b7c941bbSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*b7c941bbSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*b7c941bbSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*b7c941bbSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*b7c941bbSAndroid Build Coastguard Worker * limitations under the License. 15*b7c941bbSAndroid Build Coastguard Worker */ 16*b7c941bbSAndroid Build Coastguard Worker 17*b7c941bbSAndroid Build Coastguard Worker package com.android.gputest; 18*b7c941bbSAndroid Build Coastguard Worker /* 19*b7c941bbSAndroid Build Coastguard Worker * Copyright (C) 2008 The Android Open Source Project 20*b7c941bbSAndroid Build Coastguard Worker * 21*b7c941bbSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 22*b7c941bbSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 23*b7c941bbSAndroid Build Coastguard Worker * You may obtain a copy of the License at 24*b7c941bbSAndroid Build Coastguard Worker * 25*b7c941bbSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 26*b7c941bbSAndroid Build Coastguard Worker * 27*b7c941bbSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 28*b7c941bbSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 29*b7c941bbSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 30*b7c941bbSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 31*b7c941bbSAndroid Build Coastguard Worker * limitations under the License. 32*b7c941bbSAndroid Build Coastguard Worker */ 33*b7c941bbSAndroid Build Coastguard Worker 34*b7c941bbSAndroid Build Coastguard Worker 35*b7c941bbSAndroid Build Coastguard Worker import android.content.Context; 36*b7c941bbSAndroid Build Coastguard Worker import android.graphics.PixelFormat; 37*b7c941bbSAndroid Build Coastguard Worker import android.opengl.GLSurfaceView; 38*b7c941bbSAndroid Build Coastguard Worker import android.util.AttributeSet; 39*b7c941bbSAndroid Build Coastguard Worker import android.util.Log; 40*b7c941bbSAndroid Build Coastguard Worker import android.view.KeyEvent; 41*b7c941bbSAndroid Build Coastguard Worker import android.view.MotionEvent; 42*b7c941bbSAndroid Build Coastguard Worker 43*b7c941bbSAndroid Build Coastguard Worker import javax.microedition.khronos.egl.EGL10; 44*b7c941bbSAndroid Build Coastguard Worker import javax.microedition.khronos.egl.EGLConfig; 45*b7c941bbSAndroid Build Coastguard Worker import javax.microedition.khronos.egl.EGLContext; 46*b7c941bbSAndroid Build Coastguard Worker import javax.microedition.khronos.egl.EGLDisplay; 47*b7c941bbSAndroid Build Coastguard Worker import javax.microedition.khronos.opengles.GL10; 48*b7c941bbSAndroid Build Coastguard Worker 49*b7c941bbSAndroid Build Coastguard Worker /** 50*b7c941bbSAndroid Build Coastguard Worker * A simple GLSurfaceView sub-class that demonstrate how to perform 51*b7c941bbSAndroid Build Coastguard Worker * OpenGL ES 2.0 rendering into a GL Surface. Note the following important 52*b7c941bbSAndroid Build Coastguard Worker * details: 53*b7c941bbSAndroid Build Coastguard Worker * 54*b7c941bbSAndroid Build Coastguard Worker * - The class must use a custom context factory to enable 2.0 rendering. 55*b7c941bbSAndroid Build Coastguard Worker * See ContextFactory class definition below. 56*b7c941bbSAndroid Build Coastguard Worker * 57*b7c941bbSAndroid Build Coastguard Worker * - The class must use a custom EGLConfigChooser to be able to select 58*b7c941bbSAndroid Build Coastguard Worker * an EGLConfig that supports 2.0. This is done by providing a config 59*b7c941bbSAndroid Build Coastguard Worker * specification to eglChooseConfig() that has the attribute 60*b7c941bbSAndroid Build Coastguard Worker * EGL10.ELG_RENDERABLE_TYPE containing the EGL_OPENGL_ES2_BIT flag 61*b7c941bbSAndroid Build Coastguard Worker * set. See ConfigChooser class definition below. 62*b7c941bbSAndroid Build Coastguard Worker * 63*b7c941bbSAndroid Build Coastguard Worker * - The class must select the surface's format, then choose an EGLConfig 64*b7c941bbSAndroid Build Coastguard Worker * that matches it exactly (with regards to red/green/blue/alpha channels 65*b7c941bbSAndroid Build Coastguard Worker * bit depths). Failure to do so would result in an EGL_BAD_MATCH error. 66*b7c941bbSAndroid Build Coastguard Worker */ 67*b7c941bbSAndroid Build Coastguard Worker class GLtestView extends GLSurfaceView { 68*b7c941bbSAndroid Build Coastguard Worker private static String TAG = "GLtestView"; 69*b7c941bbSAndroid Build Coastguard Worker private static final boolean DEBUG = false; 70*b7c941bbSAndroid Build Coastguard Worker GLtestView(Context context)71*b7c941bbSAndroid Build Coastguard Worker public GLtestView(Context context) { 72*b7c941bbSAndroid Build Coastguard Worker super(context); 73*b7c941bbSAndroid Build Coastguard Worker init(false, 0, 0); 74*b7c941bbSAndroid Build Coastguard Worker } 75*b7c941bbSAndroid Build Coastguard Worker GLtestView(Context context, boolean translucent, int depth, int stencil)76*b7c941bbSAndroid Build Coastguard Worker public GLtestView(Context context, boolean translucent, int depth, int stencil) { 77*b7c941bbSAndroid Build Coastguard Worker super(context); 78*b7c941bbSAndroid Build Coastguard Worker init(translucent, depth, stencil); 79*b7c941bbSAndroid Build Coastguard Worker } 80*b7c941bbSAndroid Build Coastguard Worker init(boolean translucent, int depth, int stencil)81*b7c941bbSAndroid Build Coastguard Worker private void init(boolean translucent, int depth, int stencil) { 82*b7c941bbSAndroid Build Coastguard Worker 83*b7c941bbSAndroid Build Coastguard Worker /* By default, GLSurfaceView() creates a RGB_565 opaque surface. 84*b7c941bbSAndroid Build Coastguard Worker * If we want a translucent one, we should change the surface's 85*b7c941bbSAndroid Build Coastguard Worker * format here, using PixelFormat.TRANSLUCENT for GL Surfaces 86*b7c941bbSAndroid Build Coastguard Worker * is interpreted as any 32-bit surface with alpha by SurfaceFlinger. 87*b7c941bbSAndroid Build Coastguard Worker */ 88*b7c941bbSAndroid Build Coastguard Worker if (translucent) { 89*b7c941bbSAndroid Build Coastguard Worker this.getHolder().setFormat(PixelFormat.TRANSLUCENT); 90*b7c941bbSAndroid Build Coastguard Worker } 91*b7c941bbSAndroid Build Coastguard Worker 92*b7c941bbSAndroid Build Coastguard Worker /* Setup the context factory for 2.0 rendering. 93*b7c941bbSAndroid Build Coastguard Worker * See ContextFactory class definition below 94*b7c941bbSAndroid Build Coastguard Worker */ 95*b7c941bbSAndroid Build Coastguard Worker setEGLContextFactory(new ContextFactory()); 96*b7c941bbSAndroid Build Coastguard Worker 97*b7c941bbSAndroid Build Coastguard Worker /* We need to choose an EGLConfig that matches the format of 98*b7c941bbSAndroid Build Coastguard Worker * our surface exactly. This is going to be done in our 99*b7c941bbSAndroid Build Coastguard Worker * custom config chooser. See ConfigChooser class definition 100*b7c941bbSAndroid Build Coastguard Worker * below. 101*b7c941bbSAndroid Build Coastguard Worker */ 102*b7c941bbSAndroid Build Coastguard Worker setEGLConfigChooser( translucent ? 103*b7c941bbSAndroid Build Coastguard Worker new ConfigChooser(8, 8, 8, 8, depth, stencil) : 104*b7c941bbSAndroid Build Coastguard Worker new ConfigChooser(5, 6, 5, 0, depth, stencil) ); 105*b7c941bbSAndroid Build Coastguard Worker 106*b7c941bbSAndroid Build Coastguard Worker /* Set the renderer responsible for frame rendering */ 107*b7c941bbSAndroid Build Coastguard Worker setRenderer(new Renderer()); 108*b7c941bbSAndroid Build Coastguard Worker } 109*b7c941bbSAndroid Build Coastguard Worker 110*b7c941bbSAndroid Build Coastguard Worker private static class ContextFactory implements GLSurfaceView.EGLContextFactory { 111*b7c941bbSAndroid Build Coastguard Worker private static int EGL_CONTEXT_CLIENT_VERSION = 0x3098; createContext(EGL10 egl, EGLDisplay display, EGLConfig eglConfig)112*b7c941bbSAndroid Build Coastguard Worker public EGLContext createContext(EGL10 egl, EGLDisplay display, EGLConfig eglConfig) { 113*b7c941bbSAndroid Build Coastguard Worker Log.w(TAG, "creating OpenGL ES 2.0 context"); 114*b7c941bbSAndroid Build Coastguard Worker checkEglError("Before eglCreateContext", egl); 115*b7c941bbSAndroid Build Coastguard Worker int[] attrib_list = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE }; 116*b7c941bbSAndroid Build Coastguard Worker EGLContext context = egl.eglCreateContext(display, eglConfig, EGL10.EGL_NO_CONTEXT, attrib_list); 117*b7c941bbSAndroid Build Coastguard Worker checkEglError("After eglCreateContext", egl); 118*b7c941bbSAndroid Build Coastguard Worker return context; 119*b7c941bbSAndroid Build Coastguard Worker } 120*b7c941bbSAndroid Build Coastguard Worker destroyContext(EGL10 egl, EGLDisplay display, EGLContext context)121*b7c941bbSAndroid Build Coastguard Worker public void destroyContext(EGL10 egl, EGLDisplay display, EGLContext context) { 122*b7c941bbSAndroid Build Coastguard Worker egl.eglDestroyContext(display, context); 123*b7c941bbSAndroid Build Coastguard Worker } 124*b7c941bbSAndroid Build Coastguard Worker } 125*b7c941bbSAndroid Build Coastguard Worker checkEglError(String prompt, EGL10 egl)126*b7c941bbSAndroid Build Coastguard Worker private static void checkEglError(String prompt, EGL10 egl) { 127*b7c941bbSAndroid Build Coastguard Worker int error; 128*b7c941bbSAndroid Build Coastguard Worker while ((error = egl.eglGetError()) != EGL10.EGL_SUCCESS) { 129*b7c941bbSAndroid Build Coastguard Worker Log.e(TAG, String.format("%s: EGL error: 0x%x", prompt, error)); 130*b7c941bbSAndroid Build Coastguard Worker } 131*b7c941bbSAndroid Build Coastguard Worker } 132*b7c941bbSAndroid Build Coastguard Worker 133*b7c941bbSAndroid Build Coastguard Worker private static class ConfigChooser implements GLSurfaceView.EGLConfigChooser { 134*b7c941bbSAndroid Build Coastguard Worker ConfigChooser(int r, int g, int b, int a, int depth, int stencil)135*b7c941bbSAndroid Build Coastguard Worker public ConfigChooser(int r, int g, int b, int a, int depth, int stencil) { 136*b7c941bbSAndroid Build Coastguard Worker mRedSize = r; 137*b7c941bbSAndroid Build Coastguard Worker mGreenSize = g; 138*b7c941bbSAndroid Build Coastguard Worker mBlueSize = b; 139*b7c941bbSAndroid Build Coastguard Worker mAlphaSize = a; 140*b7c941bbSAndroid Build Coastguard Worker mDepthSize = depth; 141*b7c941bbSAndroid Build Coastguard Worker mStencilSize = stencil; 142*b7c941bbSAndroid Build Coastguard Worker } 143*b7c941bbSAndroid Build Coastguard Worker 144*b7c941bbSAndroid Build Coastguard Worker /* This EGL config specification is used to specify 2.0 rendering. 145*b7c941bbSAndroid Build Coastguard Worker * We use a minimum size of 4 bits for red/green/blue, but will 146*b7c941bbSAndroid Build Coastguard Worker * perform actual matching in chooseConfig() below. 147*b7c941bbSAndroid Build Coastguard Worker */ 148*b7c941bbSAndroid Build Coastguard Worker private static int EGL_OPENGL_ES2_BIT = 4; 149*b7c941bbSAndroid Build Coastguard Worker private static int[] s_configAttribs2 = 150*b7c941bbSAndroid Build Coastguard Worker { 151*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_RED_SIZE, 4, 152*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_GREEN_SIZE, 4, 153*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_BLUE_SIZE, 4, 154*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, 155*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_NONE 156*b7c941bbSAndroid Build Coastguard Worker }; 157*b7c941bbSAndroid Build Coastguard Worker chooseConfig(EGL10 egl, EGLDisplay display)158*b7c941bbSAndroid Build Coastguard Worker public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) { 159*b7c941bbSAndroid Build Coastguard Worker 160*b7c941bbSAndroid Build Coastguard Worker /* Get the number of minimally matching EGL configurations 161*b7c941bbSAndroid Build Coastguard Worker */ 162*b7c941bbSAndroid Build Coastguard Worker int[] num_config = new int[1]; 163*b7c941bbSAndroid Build Coastguard Worker egl.eglChooseConfig(display, s_configAttribs2, null, 0, num_config); 164*b7c941bbSAndroid Build Coastguard Worker 165*b7c941bbSAndroid Build Coastguard Worker int numConfigs = num_config[0]; 166*b7c941bbSAndroid Build Coastguard Worker 167*b7c941bbSAndroid Build Coastguard Worker if (numConfigs <= 0) { 168*b7c941bbSAndroid Build Coastguard Worker throw new IllegalArgumentException("No configs match configSpec"); 169*b7c941bbSAndroid Build Coastguard Worker } 170*b7c941bbSAndroid Build Coastguard Worker 171*b7c941bbSAndroid Build Coastguard Worker /* Allocate then read the array of minimally matching EGL configs 172*b7c941bbSAndroid Build Coastguard Worker */ 173*b7c941bbSAndroid Build Coastguard Worker EGLConfig[] configs = new EGLConfig[numConfigs]; 174*b7c941bbSAndroid Build Coastguard Worker egl.eglChooseConfig(display, s_configAttribs2, configs, numConfigs, num_config); 175*b7c941bbSAndroid Build Coastguard Worker 176*b7c941bbSAndroid Build Coastguard Worker if (DEBUG) { 177*b7c941bbSAndroid Build Coastguard Worker printConfigs(egl, display, configs); 178*b7c941bbSAndroid Build Coastguard Worker } 179*b7c941bbSAndroid Build Coastguard Worker /* Now return the "best" one 180*b7c941bbSAndroid Build Coastguard Worker */ 181*b7c941bbSAndroid Build Coastguard Worker return chooseConfig(egl, display, configs); 182*b7c941bbSAndroid Build Coastguard Worker } 183*b7c941bbSAndroid Build Coastguard Worker chooseConfig(EGL10 egl, EGLDisplay display, EGLConfig[] configs)184*b7c941bbSAndroid Build Coastguard Worker public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display, 185*b7c941bbSAndroid Build Coastguard Worker EGLConfig[] configs) { 186*b7c941bbSAndroid Build Coastguard Worker for(EGLConfig config : configs) { 187*b7c941bbSAndroid Build Coastguard Worker int d = findConfigAttrib(egl, display, config, 188*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_DEPTH_SIZE, 0); 189*b7c941bbSAndroid Build Coastguard Worker int s = findConfigAttrib(egl, display, config, 190*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_STENCIL_SIZE, 0); 191*b7c941bbSAndroid Build Coastguard Worker 192*b7c941bbSAndroid Build Coastguard Worker // We need at least mDepthSize and mStencilSize bits 193*b7c941bbSAndroid Build Coastguard Worker if (d < mDepthSize || s < mStencilSize) 194*b7c941bbSAndroid Build Coastguard Worker continue; 195*b7c941bbSAndroid Build Coastguard Worker 196*b7c941bbSAndroid Build Coastguard Worker // We want an *exact* match for red/green/blue/alpha 197*b7c941bbSAndroid Build Coastguard Worker int r = findConfigAttrib(egl, display, config, 198*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_RED_SIZE, 0); 199*b7c941bbSAndroid Build Coastguard Worker int g = findConfigAttrib(egl, display, config, 200*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_GREEN_SIZE, 0); 201*b7c941bbSAndroid Build Coastguard Worker int b = findConfigAttrib(egl, display, config, 202*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_BLUE_SIZE, 0); 203*b7c941bbSAndroid Build Coastguard Worker int a = findConfigAttrib(egl, display, config, 204*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_ALPHA_SIZE, 0); 205*b7c941bbSAndroid Build Coastguard Worker 206*b7c941bbSAndroid Build Coastguard Worker if (r == mRedSize && g == mGreenSize && b == mBlueSize && a == mAlphaSize) 207*b7c941bbSAndroid Build Coastguard Worker return config; 208*b7c941bbSAndroid Build Coastguard Worker } 209*b7c941bbSAndroid Build Coastguard Worker return null; 210*b7c941bbSAndroid Build Coastguard Worker } 211*b7c941bbSAndroid Build Coastguard Worker findConfigAttrib(EGL10 egl, EGLDisplay display, EGLConfig config, int attribute, int defaultValue)212*b7c941bbSAndroid Build Coastguard Worker private int findConfigAttrib(EGL10 egl, EGLDisplay display, 213*b7c941bbSAndroid Build Coastguard Worker EGLConfig config, int attribute, int defaultValue) { 214*b7c941bbSAndroid Build Coastguard Worker 215*b7c941bbSAndroid Build Coastguard Worker if (egl.eglGetConfigAttrib(display, config, attribute, mValue)) { 216*b7c941bbSAndroid Build Coastguard Worker return mValue[0]; 217*b7c941bbSAndroid Build Coastguard Worker } 218*b7c941bbSAndroid Build Coastguard Worker return defaultValue; 219*b7c941bbSAndroid Build Coastguard Worker } 220*b7c941bbSAndroid Build Coastguard Worker printConfigs(EGL10 egl, EGLDisplay display, EGLConfig[] configs)221*b7c941bbSAndroid Build Coastguard Worker private void printConfigs(EGL10 egl, EGLDisplay display, 222*b7c941bbSAndroid Build Coastguard Worker EGLConfig[] configs) { 223*b7c941bbSAndroid Build Coastguard Worker int numConfigs = configs.length; 224*b7c941bbSAndroid Build Coastguard Worker Log.w(TAG, String.format("%d configurations", numConfigs)); 225*b7c941bbSAndroid Build Coastguard Worker for (int i = 0; i < numConfigs; i++) { 226*b7c941bbSAndroid Build Coastguard Worker Log.w(TAG, String.format("Configuration %d:\n", i)); 227*b7c941bbSAndroid Build Coastguard Worker printConfig(egl, display, configs[i]); 228*b7c941bbSAndroid Build Coastguard Worker } 229*b7c941bbSAndroid Build Coastguard Worker } 230*b7c941bbSAndroid Build Coastguard Worker printConfig(EGL10 egl, EGLDisplay display, EGLConfig config)231*b7c941bbSAndroid Build Coastguard Worker private void printConfig(EGL10 egl, EGLDisplay display, 232*b7c941bbSAndroid Build Coastguard Worker EGLConfig config) { 233*b7c941bbSAndroid Build Coastguard Worker int[] attributes = { 234*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_BUFFER_SIZE, 235*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_ALPHA_SIZE, 236*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_BLUE_SIZE, 237*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_GREEN_SIZE, 238*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_RED_SIZE, 239*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_DEPTH_SIZE, 240*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_STENCIL_SIZE, 241*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_CONFIG_CAVEAT, 242*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_CONFIG_ID, 243*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_LEVEL, 244*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_MAX_PBUFFER_HEIGHT, 245*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_MAX_PBUFFER_PIXELS, 246*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_MAX_PBUFFER_WIDTH, 247*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_NATIVE_RENDERABLE, 248*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_NATIVE_VISUAL_ID, 249*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_NATIVE_VISUAL_TYPE, 250*b7c941bbSAndroid Build Coastguard Worker 0x3030, // EGL10.EGL_PRESERVED_RESOURCES, 251*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_SAMPLES, 252*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_SAMPLE_BUFFERS, 253*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_SURFACE_TYPE, 254*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_TRANSPARENT_TYPE, 255*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_TRANSPARENT_RED_VALUE, 256*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_TRANSPARENT_GREEN_VALUE, 257*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_TRANSPARENT_BLUE_VALUE, 258*b7c941bbSAndroid Build Coastguard Worker 0x3039, // EGL10.EGL_BIND_TO_TEXTURE_RGB, 259*b7c941bbSAndroid Build Coastguard Worker 0x303A, // EGL10.EGL_BIND_TO_TEXTURE_RGBA, 260*b7c941bbSAndroid Build Coastguard Worker 0x303B, // EGL10.EGL_MIN_SWAP_INTERVAL, 261*b7c941bbSAndroid Build Coastguard Worker 0x303C, // EGL10.EGL_MAX_SWAP_INTERVAL, 262*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_LUMINANCE_SIZE, 263*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_ALPHA_MASK_SIZE, 264*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_COLOR_BUFFER_TYPE, 265*b7c941bbSAndroid Build Coastguard Worker EGL10.EGL_RENDERABLE_TYPE, 266*b7c941bbSAndroid Build Coastguard Worker 0x3042 // EGL10.EGL_CONFORMANT 267*b7c941bbSAndroid Build Coastguard Worker }; 268*b7c941bbSAndroid Build Coastguard Worker String[] names = { 269*b7c941bbSAndroid Build Coastguard Worker "EGL_BUFFER_SIZE", 270*b7c941bbSAndroid Build Coastguard Worker "EGL_ALPHA_SIZE", 271*b7c941bbSAndroid Build Coastguard Worker "EGL_BLUE_SIZE", 272*b7c941bbSAndroid Build Coastguard Worker "EGL_GREEN_SIZE", 273*b7c941bbSAndroid Build Coastguard Worker "EGL_RED_SIZE", 274*b7c941bbSAndroid Build Coastguard Worker "EGL_DEPTH_SIZE", 275*b7c941bbSAndroid Build Coastguard Worker "EGL_STENCIL_SIZE", 276*b7c941bbSAndroid Build Coastguard Worker "EGL_CONFIG_CAVEAT", 277*b7c941bbSAndroid Build Coastguard Worker "EGL_CONFIG_ID", 278*b7c941bbSAndroid Build Coastguard Worker "EGL_LEVEL", 279*b7c941bbSAndroid Build Coastguard Worker "EGL_MAX_PBUFFER_HEIGHT", 280*b7c941bbSAndroid Build Coastguard Worker "EGL_MAX_PBUFFER_PIXELS", 281*b7c941bbSAndroid Build Coastguard Worker "EGL_MAX_PBUFFER_WIDTH", 282*b7c941bbSAndroid Build Coastguard Worker "EGL_NATIVE_RENDERABLE", 283*b7c941bbSAndroid Build Coastguard Worker "EGL_NATIVE_VISUAL_ID", 284*b7c941bbSAndroid Build Coastguard Worker "EGL_NATIVE_VISUAL_TYPE", 285*b7c941bbSAndroid Build Coastguard Worker "EGL_PRESERVED_RESOURCES", 286*b7c941bbSAndroid Build Coastguard Worker "EGL_SAMPLES", 287*b7c941bbSAndroid Build Coastguard Worker "EGL_SAMPLE_BUFFERS", 288*b7c941bbSAndroid Build Coastguard Worker "EGL_SURFACE_TYPE", 289*b7c941bbSAndroid Build Coastguard Worker "EGL_TRANSPARENT_TYPE", 290*b7c941bbSAndroid Build Coastguard Worker "EGL_TRANSPARENT_RED_VALUE", 291*b7c941bbSAndroid Build Coastguard Worker "EGL_TRANSPARENT_GREEN_VALUE", 292*b7c941bbSAndroid Build Coastguard Worker "EGL_TRANSPARENT_BLUE_VALUE", 293*b7c941bbSAndroid Build Coastguard Worker "EGL_BIND_TO_TEXTURE_RGB", 294*b7c941bbSAndroid Build Coastguard Worker "EGL_BIND_TO_TEXTURE_RGBA", 295*b7c941bbSAndroid Build Coastguard Worker "EGL_MIN_SWAP_INTERVAL", 296*b7c941bbSAndroid Build Coastguard Worker "EGL_MAX_SWAP_INTERVAL", 297*b7c941bbSAndroid Build Coastguard Worker "EGL_LUMINANCE_SIZE", 298*b7c941bbSAndroid Build Coastguard Worker "EGL_ALPHA_MASK_SIZE", 299*b7c941bbSAndroid Build Coastguard Worker "EGL_COLOR_BUFFER_TYPE", 300*b7c941bbSAndroid Build Coastguard Worker "EGL_RENDERABLE_TYPE", 301*b7c941bbSAndroid Build Coastguard Worker "EGL_CONFORMANT" 302*b7c941bbSAndroid Build Coastguard Worker }; 303*b7c941bbSAndroid Build Coastguard Worker int[] value = new int[1]; 304*b7c941bbSAndroid Build Coastguard Worker for (int i = 0; i < attributes.length; i++) { 305*b7c941bbSAndroid Build Coastguard Worker int attribute = attributes[i]; 306*b7c941bbSAndroid Build Coastguard Worker String name = names[i]; 307*b7c941bbSAndroid Build Coastguard Worker if ( egl.eglGetConfigAttrib(display, config, attribute, value)) { 308*b7c941bbSAndroid Build Coastguard Worker Log.w(TAG, String.format(" %s: %d\n", name, value[0])); 309*b7c941bbSAndroid Build Coastguard Worker } else { 310*b7c941bbSAndroid Build Coastguard Worker // Log.w(TAG, String.format(" %s: failed\n", name)); 311*b7c941bbSAndroid Build Coastguard Worker while (egl.eglGetError() != EGL10.EGL_SUCCESS); 312*b7c941bbSAndroid Build Coastguard Worker } 313*b7c941bbSAndroid Build Coastguard Worker } 314*b7c941bbSAndroid Build Coastguard Worker } 315*b7c941bbSAndroid Build Coastguard Worker 316*b7c941bbSAndroid Build Coastguard Worker // Subclasses can adjust these values: 317*b7c941bbSAndroid Build Coastguard Worker protected int mRedSize; 318*b7c941bbSAndroid Build Coastguard Worker protected int mGreenSize; 319*b7c941bbSAndroid Build Coastguard Worker protected int mBlueSize; 320*b7c941bbSAndroid Build Coastguard Worker protected int mAlphaSize; 321*b7c941bbSAndroid Build Coastguard Worker protected int mDepthSize; 322*b7c941bbSAndroid Build Coastguard Worker protected int mStencilSize; 323*b7c941bbSAndroid Build Coastguard Worker private int[] mValue = new int[1]; 324*b7c941bbSAndroid Build Coastguard Worker } 325*b7c941bbSAndroid Build Coastguard Worker 326*b7c941bbSAndroid Build Coastguard Worker private static class Renderer implements GLSurfaceView.Renderer { onDrawFrame(GL10 gl)327*b7c941bbSAndroid Build Coastguard Worker public void onDrawFrame(GL10 gl) { 328*b7c941bbSAndroid Build Coastguard Worker GLtestLib.step(); 329*b7c941bbSAndroid Build Coastguard Worker } 330*b7c941bbSAndroid Build Coastguard Worker onSurfaceChanged(GL10 gl, int width, int height)331*b7c941bbSAndroid Build Coastguard Worker public void onSurfaceChanged(GL10 gl, int width, int height) { 332*b7c941bbSAndroid Build Coastguard Worker GLtestLib.init(width, height); 333*b7c941bbSAndroid Build Coastguard Worker } 334*b7c941bbSAndroid Build Coastguard Worker onSurfaceCreated(GL10 gl, EGLConfig config)335*b7c941bbSAndroid Build Coastguard Worker public void onSurfaceCreated(GL10 gl, EGLConfig config) { 336*b7c941bbSAndroid Build Coastguard Worker // Do nothing. 337*b7c941bbSAndroid Build Coastguard Worker } 338*b7c941bbSAndroid Build Coastguard Worker } 339*b7c941bbSAndroid Build Coastguard Worker } 340