10

I try to initialize GLES with EGL (because I want to draw from the main thread instead of using a Renderer and drawing from inside onDrawFrame). I get the error: "Make sure the SurfaceView or associated SurfaceHolder has a valid Surface". Obviously mEgl.eglCreateWindowSurface fails because surfaceHolder has not a valid surface. How do I get a SurfaceHolder with a valid Surface to proceed?

My Activity.onCreate method is:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    GLSurfaceView surfaceView = new GLSurfaceView(this);
    setContentView(surfaceView);
    SurfaceHolder surfaceHolder = surfaceView.getHolder();
    Surface surface = surfaceHolder.getSurface();
    Log.v("HelloAndroid", "surface.isValid()= " + Boolean.toString(surface.isValid()));

    EGL10 mEgl = (EGL10) EGLContext.getEGL();
    EGLDisplay mEglDisplay = mEgl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
    int[] version = new int[2];
    mEgl.eglInitialize(mEglDisplay, version);
    EGLConfig[] configs = new EGLConfig[1];
    int[] num_config = new int[1];
    int[] configSpec = {
            EGL10.EGL_NONE
    };
    mEgl.eglChooseConfig(mEglDisplay, configSpec, configs, 1, num_config);
    EGLConfig mEglConfig = configs[0];
    EGLContext mEglContext = mEgl.eglCreateContext(mEglDisplay, mEglConfig,
            EGL10.EGL_NO_CONTEXT, null);
    EGLSurface mEglSurface = null;
    Log.v("HelloAndroid", "M");
    mEglSurface = mEgl.eglCreateWindowSurface(mEglDisplay,
            mEglConfig, surfaceHolder, null);
    Log.v("HelloAndroid", "N");
    mEgl.eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface,
            mEglContext);
    Log.v("HelloAndroid", "O");
}

The log output I get with platform-tools/adb logcat is:

V/HelloAndroid( 1861): surface.isValid()= false
D/libEGL  ( 1861): egl.cfg not found, using default config
D/libEGL  ( 1861): loaded /system/lib/egl/libGLES_android.so
V/HelloAndroid( 1861): M
D/AndroidRuntime( 1861): Shutting down VM
W/dalvikvm( 1861): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
E/AndroidRuntime( 1861): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime( 1861): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.helloandroid/com.example.helloandroid.HelloAndroid}: java.lang.IllegalArgumentException: Make sure the SurfaceView or associated SurfaceHolder has a valid Surface
E/AndroidRuntime( 1861):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)

Any help is appreciated.

Charles
  • 50,943
  • 13
  • 104
  • 142
Thomas Mertes
  • 101
  • 1
  • 1
  • 3

2 Answers2

5

The check valid for surface should be did when surface is created. So, surface.isValid() should be called in onSurfaceCreated or onSurfaceChanged, obviously, you should add surfaceholder.callback.

Shivam Kumar
  • 1,892
  • 2
  • 21
  • 33
Lee
  • 51
  • 1
  • 2
2

Implement SurfaceHolder.Callback, and wait until you're told that the surface has been created. Also pay attention to when it is destroyed. You should only rely on the surface being valid between matching create and destroy calls.

Laurence Gonsalves
  • 137,896
  • 35
  • 246
  • 299
  • Is it normal for the holder to take a lot of time to take a lot of time to give a reading of surface.is Valid()=true during after the start of the application? – Ashwin Oct 21 '12 at 02:59