xref: /aosp_15_r20/cts/hostsidetests/sustainedperf/shadertoy_android/src/GLtestView.java (revision b7c941bb3fa97aba169d73cee0bed2de8ac964bf)
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