2017-10-11 2 views
-1

Auf Geräten, die die PowerVR G6200-GPU wie Sony Xperia M5 (E5603) und Xiaomi Redmi Note 3 (Hennessy) verwenden, schlägt das Erstellen eines EGL-Kontexts für das Rendern mit OpenGL ES 2 fehl. während es auf allen anderen Geräten funktioniert habe ich getestet:java.lang.RuntimeException mit EGLConfigChooser auf PowerVR G6200

java.lang.RuntimeException: 
    at android.opengl.GLSurfaceView$EglHelper.throwEglException (GLSurfaceView.java:1233) 
    at android.opengl.GLSurfaceView$EglHelper.throwEglException (GLSurfaceView.java:1224) 
    at android.opengl.GLSurfaceView$EglHelper.start (GLSurfaceView.java:1074) 
    at android.opengl.GLSurfaceView$GLThread.guardedRun (GLSurfaceView.java:1447) 
    at android.opengl.GLSurfaceView$GLThread.run (GLSurfaceView.java:1286) 

Die config-chooser wie folgt implementiert:

class CustomEGLConfigChooser implements GLSurfaceView.EGLConfigChooser { 
    public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) { 
     EGLConfig [] configs = new EGLConfig[1]; 
     int [] num_config = new int[1]; 
     int [] attrib_list = new int[] { 
      EGL10.EGL_RED_SIZE, 8, 
      EGL10.EGL_GREEN_SIZE, 8, 
      EGL10.EGL_BLUE_SIZE, 8, 
      EGL10.EGL_ALPHA_SIZE, 8, 
      EGL10.EGL_DEPTH_SIZE, 24, 
      EGL10.EGL_STENCIL_SIZE, 8, 
      EGL10.EGL_SURFACE_TYPE, EGL10.EGL_WINDOW_BIT, 
      EGL10.EGL_NONE, 
     }; 

     boolean res = egl.eglChooseConfig(display, attrib_list, configs, configs.length, num_config); 
     if (res && num_config[0] > 0) { 
      return configs[0]; 
     } 

     return null; 
    } 
} 

Die config-chooser von einer GLSurfaceView Unterklasse wie folgt verwendet:

public class GameView extends GLSurfaceView { 
    public GameView (Context context, ClientConfig clientConfig) { 
     super(context); 
     setEGLContextClientVersion(2); 
     setEGLConfigChooser(new CustomEGLConfigChooser()); 
    } 
} 

Antwort

0

die Liste der EGL-Konfigurationen auf ein Gerät Durch den Vergleich, wo dieser Code (Nexus 5x EGL configs) mit einem Nicht-Arbeitsgerät (Xiaomi Redmi Note 3 EGL configs) arbeitet, fand ich, dass es zwar passend configs ist, sie in einer Eigenschaft unterscheiden, nämlich EGL_RENDERABLE_TYPE.

erste Nexus 5x EGL Config, das passt:

EGL_CONFIG_ID: 11 
[...] 
EGL_ALPHA_SIZE: 8 
EGL_BLUE_SIZE: 8 
EGL_GREEN_SIZE: 8 
EGL_RED_SIZE: 8 
EGL_DEPTH_SIZE: 24 
EGL_STENCIL_SIZE: 8 
[...] 
EGL_RENDERABLE_TYPE: OpenGL_ES OpenGL_ES_2 (5) 

Erste Xiaomi Redmi Anmerkung 3 EGL Config, das passt:

EGL_CONFIG_ID: 1 
[...] 
EGL_ALPHA_SIZE: 8 
EGL_BLUE_SIZE: 8 
EGL_GREEN_SIZE: 8 
EGL_RED_SIZE: 8 
EGL_DEPTH_SIZE: 24 
EGL_STENCIL_SIZE: 8 
[...] 
EGL_RENDERABLE_TYPE: OpenGL_ES (1) 

Beachten Sie, dass das Nexus 5x EGL_RENDERABLE_TYPE mit EGL_OPENGL_ES2_BIT unterstützt (zusätzlich zu den auch Unterstützung EGL_OPENGL_ES_BIT mit der gleichen Konfiguration), so dass wir nur Glück gehabt haben, dass alle Konfigurationen auf den vorhandenen Geräten unterstützt beide rendernable Typen.

Es gibt eine andere Konfiguration für den Hinweis Xiaomi Redmi 3, die den ES2 darstellbaren Typ unterstützt, aber dies ist nicht geschehen die erste Konfiguration zu sein, die abgestimmt:

EGL_CONFIG_ID: 23 
[...] 
EGL_ALPHA_SIZE: 8 
EGL_BLUE_SIZE: 8 
EGL_GREEN_SIZE: 8 
EGL_RED_SIZE: 8 
EGL_DEPTH_SIZE: 24 
EGL_STENCIL_SIZE: 8 
[...] 
EGL_RENDERABLE_TYPE: OpenGL_ES_2 (4) 

Der Versuch, die erste (config-ID zu verwenden 1) mit einem ES2-Rendering-Kontext funktioniert offensichtlich nicht, da die Konfiguration keine ES2-Renderfähigkeiten unterstützt. Das Update ist explizit auf den darstellbaren Typen als Teil des EGL Config Chooser wie dies verlangt, das Beispiel in der Frage wie diese zu modifizieren:

 int [] attrib_list = new int[] { 
      EGL10.EGL_RED_SIZE, 8, 
      EGL10.EGL_GREEN_SIZE, 8, 
      EGL10.EGL_BLUE_SIZE, 8, 
      EGL10.EGL_ALPHA_SIZE, 8, 
      EGL10.EGL_DEPTH_SIZE, 24, 
      EGL10.EGL_STENCIL_SIZE, 8, 
      EGL10.EGL_SURFACE_TYPE, EGL10.EGL_WINDOW_BIT, 
      EGL10.EGL_RENDERABLE_TYPE, EGL10. EGL_OPENGL_ES2_BIT, 
      EGL10.EGL_NONE, 
     }; 

Beachten Sie, dass in dem Fall, in dem nur die RGBA + Tiefe/Stencil-Werte benötigen Eine andere Option besteht darin, anstelle einer benutzerdefinierten Implementierung setEGLConfigChooser(int, int, int, int, int, int) zu verwenden. Dadurch wird die Anforderung EGL_RENDERABLE_TYPE basierend auf dem in setEGLContextClientVersion() festgelegten Wert ausgeführt.

Verwandte Themen