Open GL error de configuración incorrecta en Samsung S4

Estoy recibiendo el siguiente error en Samsung S4

10-21 16:25:44.100: E/AndroidRuntime(29778): FATAL EXCEPTION: GLThread 11320 10-21 16:25:44.100: E/AndroidRuntime(29778): Process: <bundle ID>, PID: 29778 10-21 16:25:44.100: E/AndroidRuntime(29778): java.lang.RuntimeException: createContext failed: EGL_BAD_CONFIG 10-21 16:25:44.100: E/AndroidRuntime(29778): at android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.java:1201) 10-21 16:25:44.100: E/AndroidRuntime(29778): at android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.java:1192) 10-21 16:25:44.100: E/AndroidRuntime(29778): at android.opengl.GLSurfaceView$EglHelper.start(GLSurfaceView.java:1042) 10-21 16:25:44.100: E/AndroidRuntime(29778): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1409) 10-21 16:25:44.100: E/AndroidRuntime(29778): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1248) 

El error se debe a:

 this.setEGLContextFactory(new MyDefaultContextFactory()); this.setEGLConfigChooser(GL_RED_SIZE, GL_GREEN_SIZE, GL_BLUE_SIZE, GL_ALPHA_SIZE, GL_DEPTH_SIZE, 0);//<-this line this.setDebugFlags(GLSurfaceView.DEBUG_CHECK_GL_ERROR | GLSurfaceView.DEBUG_LOG_GL_CALLS); this.setPreserveEGLContextOnPause(true); this.setEGLContextClientVersion(2); 

Donde la configuración pasada es: 8,8,8,8,24

Mover la línea anterior al final funciona sin embargo. ¿Cuál es la razón de esto?

PS: El código funciona bien en Nexus5 o MotoG en ambos casos. Todos los dispositivos que ejecutan Kitkat 4.4.2

No lo veo claramente especificado en la documentación , pero mirando el código fuente de GLSurfaceView , realmente parece ser el caso que setEGLContextClientVersion() debe ser llamado antes de setEGLConfigChooser() .

No copiar ningún código porque no estoy seguro si eso violaría los derechos de autor, pero puedes seguirlo si subes el enlace de código arriba:

  1. La sobrecarga de setEGLContextChooser() utilizada en su código crea una instancia de ComponentSizeChoser , con los tamaños especificados pasados ​​al constructor.
  2. El constructor de ComponentSizeChooser invoca al constructor de clase base, pasando los tamaños especificados empaquetados en una especificación de configuración al constructor de base. La clase base es BaseConfigChooser .
  3. El constructor de BaseConfigChooser invoca un método privado filterConfigSpec() , pasándole la especificación de configuración,
  4. filterConfigSpec() examina el valor de la variable miembro mEGLContextClientVersion y la utiliza para determinar el valor del atributo EGL_RENDERABLE_TYPE , que añade a la especificación de configuración. A continuación, devuelve la especificación de configuración con este atributo adicional.
  5. De nuevo en el constructor BaseConfigChooser , la especificación de configuración modificada se asigna a una variable miembro.
  6. La especificación de configuración en esta variable miembro se utiliza más tarde cuando se llama al método chooseConfig() , donde se selecciona la configuración actual.

mEGLContextClientVersion es el valor establecido por setEGLContextClientVersion() . Por lo tanto, el valor establecido con este método sólo se incluirá en la selección de configuración si setEGLContextClientVersion() se llama antes de setEGLContextChooser() .

Algunos dispositivos proporcionan configuraciones que admiten tanto ES 1.X como ES 2.0 / 3.0, mientras que otros proporcionan configuraciones separadas para soporte 1.X y 2.0 / 3.0. Esto es más probable por qué la creación de contexto tiene éxito con las llamadas en el orden "incorrecto" en algunos dispositivos, mientras que falla en otros.

  • Texto movible en Opengl Android
  • Cómo detectar el clic en un objeto en OpenGL ES en la aplicación de Android?
  • OpenGL ES tutorial para android no parece funcionar
  • Diferencia entre OpenGL SL y OpenGL ES 2.0 SL
  • Portar un juego iPhone a Android - Texturas y búferes
  • Falta de controladores OpenGL en el emulador de Android
  • Biblioteca para dibujar texto en Opengles para android
  • Esfera texturada en OpenGL ES
  • GLSurfaceView que causa ANR después de la actividad se destruye
  • Android ICS: intento de error JNI para usar referencia local obsoleta 0x1
  • Llamar para comprobar si existe un EGLContext actual en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.