Android 模拟器和 OpenGL ES3:EGL_BAD_CONFIG

Bra*_*ram 6 android kvm android-virtual-device android-emulator opengl-es-3.0

我在我的 Ubuntu 主机上运行一个Android 虚拟设备。它使用的是 CPU/ABI Intel Atom (x86),而我使用的是主机 GPU。模拟器使用的是基于内核的虚拟机

使用的设置

只要我使用 OpenGL ES2 上下文,这就会非常有效。但是,如果我的应用程序尝试创建 OpenGL ES3 上下文,则使用...

const EGLint contextAttribs[] = {
    EGL_CONTEXT_CLIENT_VERSION, 3,
    EGL_NONE
};
context = eglCreateContext(display, config, NULL, contextAttribs);
Run Code Online (Sandbox Code Playgroud)

...然后我收到一个EGL_BAD_CONFIG错误:

I/biplane ( 2839): EGL: vendor Android version 1.4 Android META-EGL
I/biplane ( 2839): EGL: client apis OpenGL_ES
I/biplane ( 2839): number of EGL configurations that match our preferred criteria: 1
I/biplane ( 2839): R8 G8 B8 A8 DEPTH24
E/EGL_emulation( 2839): tid 2852: eglCreateContext(919): error 0x3005 (EGL_BAD_CONFIG)
Run Code Online (Sandbox Code Playgroud)

在硬件移动设备上请求 ES3 效果很好。但是当从模拟器请求它时,它失败了。从glxinfo可以看出,宿主机完全有能力做OpenGL ES3.0、ES3.1和ES3.2:

$ glxinfo | grep ES3
    GL_ARB_ES2_compatibility, GL_ARB_ES3_1_compatibility, 
    GL_ARB_ES3_2_compatibility, GL_ARB_ES3_compatibility, 
    GL_NV_ES3_1_compatibility, GL_NV_bindless_multi_draw_indirect, 
    GL_ARB_ES2_compatibility, GL_ARB_ES3_1_compatibility, 
    GL_ARB_ES3_2_compatibility, GL_ARB_ES3_compatibility, 
    GL_NV_ES3_1_compatibility, GL_NV_bindless_multi_draw_indirect, 
Run Code Online (Sandbox Code Playgroud)

有没有办法在 kvm 之上的 Android 虚拟设备上运行 OpenGL ES3 应用程序?

Bra*_*ram 10

Android Studio 3.0 及更高版本支持在模拟器中运行 GLES3 应用程序。

在撰写本文时,可以使用此版本的预览版本。请参阅:https : //android-developers.googleblog.com/2017/05/android-studio-3-0-canary1.html

启动模拟器后,您需要更改设置,然后重新启动模拟器,如下所示。

此外,请确保您的应用程序请求 ES3 上下文,因为 Android 示例代码 gles3jni 没有这样做。

在此处输入图片说明

2018 年 6 月更新

在最新的 Android Studio 中,我不能再选择 OpenGL ES3.1,即使它是同一台 PC。

在此处输入图片说明

为了使它工作,我必须向 ~/.android/ 目录添加一个文件。

cd ~/.android/
$ echo "GLESDynamicVersion = on" >> ~/.android/advancedFeatures.ini
Run Code Online (Sandbox Code Playgroud)

  • 现在它在“高级”选项卡中 (3认同)
  • 我想点赞100次!使用“GLESDynamicVersion = on”创建文件“advancedFeatures.ini”为我完成了这项工作。虽然我只能选择 OpenGL ES 2.0,但设备在请求时正在创建 3.1 上下文! (2认同)