在Samsung S4上打开GL错误配置错误

时间:2014-10-22 09:50:18

标签: android opengl-es

我在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)

错误是因为:

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

传递的配置是:8,8,8,8,24

尽管在最后移动上面的行。这是什么原因?

PS:在任何一种情况下,代码在Nexus5或MotoG上都能正常工作。 所有运行Kitkat 4.4.2的设备

1 个答案:

答案 0 :(得分:9)

我没有在documentation中明确指出,但是通过查看GLSurfaceView的{​​{3}},setEGLContextClientVersion()的情况确实如此。必须在 setEGLConfigChooser()之前调用

不会复制任何代码,因为我不确定这是否会侵犯版权,但如果您提取上述代码链接,则可以按照以下步骤操作:

  1. 代码中使用的setEGLContextChooser()的重载实例化了一个新的ComponentSizeChoser,并将指定的大小传递给构造函数。
  2. ComponentSizeChooser的构造函数调用基类构造函数,将打包到配置规范中的指定大小传递给基础构造函数。基类是BaseConfigChooser
  3. BaseConfigChooser的构造函数调用私有方法filterConfigSpec(),并将配置规范传递给它,
  4. filterConfigSpec()查看mEGLContextClientVersion成员变量的值,并使用它来确定EGL_RENDERABLE_TYPE属性的值,并将其添加到配置规范中。然后它返回带有此附加属性的配置规范。
  5. 返回BaseConfigChooser构造函数,修改后的配置规范将分配给成员变量。
  6. 此成员变量中的配置规范稍后在调用chooseConfig()方法时使用,其中选择了实际配置。
  7. mEGLContextClientVersionsetEGLContextClientVersion()设置的值。因此,如果在setEGLContextClientVersion()之前调用setEGLContextChooser(),则此方法设置的值将仅包含在配置选择中。

    某些设备提供支持ES 1.X和ES 2.0 / 3.0的配置,而其他设备则提供1.X和2.0 / 3.0支持的单独配置。这很可能是因为上下文创建成功的原因是&#34;错误&#34;在某些设备上订购,而在其他设备上则失败。