public synchronized void threadExiting(GLThread thread) {
   if (LOG_THREADS) {
     Log.i("GLThread", "exiting tid=" + thread.getId());
   }
   thread.mDone = true;
   if (mEglOwner == thread) {
     mEglOwner = null;
   }
   notifyAll();
 }
 public void setRenderer(GLSurfaceView.Renderer renderer) {
   checkRenderThreadState();
   if (mEGLConfigChooser == null) {
     mEGLConfigChooser =
         new BaseConfigChooser.SimpleEGLConfigChooser(true, mEGLContextClientVersion);
   }
   if (mEGLContextFactory == null) {
     mEGLContextFactory = new DefaultContextFactory(mEGLContextClientVersion);
   }
   if (mEGLWindowSurfaceFactory == null) {
     mEGLWindowSurfaceFactory = new DefaultWindowSurfaceFactory();
   }
   mGLThread =
       new GLThread(
           renderer,
           mEGLConfigChooser,
           mEGLContextFactory,
           mEGLWindowSurfaceFactory,
           mGLWrapper);
   mGLThread.start();
 }
 @Override
 public void onSurfaceCreated(SurfaceHolder holder) {
   Log.d(TAG, "onSurfaceCreated()");
   mGLThread.surfaceCreated(holder);
   super.onSurfaceCreated(holder);
 }
 @Override
 public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
   // Log.d(TAG, "onSurfaceChanged()");
   mGLThread.onWindowResize(width, height);
   super.onSurfaceChanged(holder, format, width, height);
 }
 @Override
 public void onDestroy() {
   super.onDestroy();
   // Log.d(TAG, "GLEngine.onDestroy()");
   mGLThread.requestExitAndWait();
 }
 public void queueEvent(Runnable r) {
   mGLThread.queueEvent(r);
 }
 public void onResume() {
   mGLThread.onResume();
 }
 public void onPause() {
   mGLThread.onPause();
 }
 public void requestRender() {
   mGLThread.requestRender();
 }
 public int getRenderMode() {
   return mGLThread.getRenderMode();
 }
 public void setRenderMode(int renderMode) {
   mGLThread.setRenderMode(renderMode);
 }