2017-10-11 108 views
-1

在使用PowerVR G6200 GPU(例如Sony Xperia M5(E5603)和Xiaomi Redmi Note 3(hennessy))的設備上,創建用於使用OpenGL ES 2進行渲染的EGL上下文失敗,同時,它適用於所有其它設備我測試:在PowerVR上使用EGLConfigChooser的java.lang.RuntimeException G6200

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; 
    } 
} 

的配置選擇器從GLSurfaceView子像這樣使用:

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) 

的配置選擇器是這樣實現的

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

回答

0

到哪裏此代碼的設備(Nexus 5x EGL configs)與非工作裝置(Xiaomi Redmi Note 3 EGL configs)在EGL配置的列表進行比較,我發現,雖然有匹配的CONFIGS,他們在一個屬性,即EGL_RENDERABLE_TYPE不同。

第一的Nexus 5X EGL配置匹配:

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) 

首先小蜜紅米手機注3 EGL配置匹配:

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) 

注意了Nexus 5X支持EGL_RENDERABLE_TYPEEGL_OPENGL_ES2_BIT(除了還支持EGL_OPENGL_ES_BIT具有相同的配置),所以我們很幸運,現有設備上的所有配置碰巧支持兩種可渲染類型。

還有另外一個配置的小蜜紅米手機注3支持ES2渲染的類型,但是這並沒有發生是第一個匹配的配置:

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) 

試圖用第一(配置ID 1)與ES2渲染上下文顯然不起作用,因爲配置不支持ES2可渲染。解決方法是,明確地請求渲染類型作爲EGL配置選擇器這樣的部分,修改在這樣的問題的例子:

 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, 
     }; 

注意,在的情況下,其中僅RGBA +深度/模板值需要另一種選擇是使用setEGLConfigChooser(int, int, int, int, int, int)而不是自定義實現,並且這將基於在setEGLContextClientVersion()中設置的值來請求EGL_RENDERABLE_TYPE

相關問題