三星S4上的Open GL错误配置问题

5

我在三星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

将上面那行代码移到结尾处就可以正常工作。这是什么原因呢?

附注:这段代码在Nexus5或MotoG上都可以正常运行,在所有运行Android 4.4.2 Kitkat的设备上也可以正常运行。

1个回答

12
我在文档中没有清楚地看到,但从查看GLSurfaceView源代码中,似乎真的是需要在调用setEGLConfigChooser()之前调用setEGLContextClientVersion()

因为不确定是否会侵犯版权,所以没有复制任何代码,但如果您打开上面的代码链接,可以跟随以下步骤:

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

mEGLContextClientVersion是由setEGLContextClientVersion()设置的值。因此,只有在调用setEGLContextClientVersion()之前调用setEGLContextChooser()才会将使用该方法设置的值包含在配置选择中。

一些设备提供支持ES 1.X和ES 2.0/3.0的配置,而另一些则提供单独的1.X和2.0/3.0支持配置。这很可能是为什么在某些设备上以“错误”的顺序进行调用能够成功创建上下文,而在其他设备上则失败的原因。


谢谢你的回答,非常有帮助。不过,有一个拼写错误——“1. The overload of setEGLContextChooser()”应该是setEGLConfigChooser - Ray Lee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接