为什么eglMakeCurrent()失败了EGL_BAD_MATCH?

bit*_*ise 19 c++ android opengl-es

我正在使用opengl/egl为Android开发.我的应用程序需要第二个上下文来从第二个线程加载纹理.

我的代码在android 2.3上工作正常,但是当我在4.0.3 android设备或模拟器上尝试代码时,eglMakeCurrent()在EGL_BAD_MATCH中失败.

第二个上下文和它的像素缓冲区的初始化也都可以正常工作,所以我不知道从哪里开始寻找这个错误.

这是初始化代码:

ANativeWindow *window = (ANativeWindow*)displaySurface;

EGLint dummy, format;

display = eglGetDisplay(EGL_DEFAULT_DISPLAY);

eglInitialize(display, 0, 0);

EGLint contextAttribs[] =
{
    EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE
};

const EGLint configAttribs[] =
{
    EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
    EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
    EGL_BLUE_SIZE, 8,
    EGL_GREEN_SIZE, 8,
    EGL_RED_SIZE, 8,
    EGL_ALPHA_SIZE, 8,
    EGL_BUFFER_SIZE, 32,
    EGL_DEPTH_SIZE, 24,
    EGL_NONE
};

EGLint numConfigs;
EGLConfig config;

eglChooseConfig(display, configAttribs, &config, 1, &numConfigs);
eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format);
ANativeWindow_setBuffersGeometry(window, 0, 0, format);

surface = eglCreateWindowSurface(display, config, window, NULL);
if(surface == NULL)
    Trace("error creating window surface: " + GetEglError());

context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs);
if(context == NULL)
    Trace("error creating main context: " + GetEglError());

const EGLint auxConfigAttribs[] =
{
    EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
    EGL_BLUE_SIZE, 8,
    EGL_GREEN_SIZE, 8,
    EGL_RED_SIZE, 8,
    EGL_ALPHA_SIZE, 8,
    EGL_DEPTH_SIZE, 0,
    EGL_STENCIL_SIZE, 0,
    EGL_NONE
};

EGLint pbufferAttribs[] =
{
    EGL_WIDTH, 1,
    EGL_HEIGHT, 1,
    EGL_TEXTURE_TARGET, EGL_NO_TEXTURE,
    EGL_TEXTURE_FORMAT, EGL_NO_TEXTURE,
    EGL_NONE
};

EGLint auxNumConfigs;
EGLConfig auxConfig;

eglChooseConfig(display, auxConfigAttribs, &auxConfig, 1, &auxNumConfigs);

auxSurface = eglCreatePbufferSurface(display, auxConfig, pbufferAttribs);
if(auxSurface == NULL)
    Trace("error creating pbuffer surface: " + GetEglError());

auxContext = eglCreateContext(display, auxConfig, context, contextAttribs);
if(auxSurface == NULL)
    Trace("error creating auxilliary context: " + GetEglError());

if(!eglMakeCurrent(display, surface, surface, context))
    Trace("could not make main context current: " + GetEglError());
Run Code Online (Sandbox Code Playgroud)

在我的Android 2.3设备(HTC Desire)上,上面的初始化代码工作正常,我可以使auxContext当前,并加载纹理就好了.

但是,在我的android 4.0.3设备(Samsung Nexus S)和我的Android 4.1设备(Galaxy Note 2)上,eglMakeCurrent()在成功初始化后失败了EGL_BAD_MATCH.

有谁知道为什么我可能会收到此错误?

Mat*_*son 11

啊,我实际上知道的事情.;)[花了5年时间研究各种EGL实现的最佳部分].

我很确定你surface的格式与实际的显示表面不同.我不确定区别是什么,或者你需要改变什么.或许EGL_DEPTH_SIZE?您可以尝试枚举可用的模式,看看是否有"可能".我知道,这有点痛苦,但过去我曾经做过几次 - 不同之处在于我通常可以查看EGL源代码并找出我做错了什么...... ;)

  • 我试着列举所有的配置,这导致了两个发现.首先,几乎每个支持EGL_WINDOW_BIT的显示配置也支持EGL_PBUFFER_BIT,这使得创建两个单独的配置完全没有意义.第二件事是,eglChooseConfig似乎在所有Android设备/版本上都无法正常工作.这可能是设计上的,因为这发生在没有GPU支持的其中一个仿真器上,但是我回来的配置甚至没有达到我提供的规格.所以我编写了自己的eglChooseConfig,并使用相同的配置两个表面,现在一切正常. (6认同)
  • 是的,完全有可能在一个,两个,五个或16个电话上运行设置,但在一个或两个其他电话上失败.我曾经一度负责测试EGL驱动程序的特定硬件模型,该模型使用了与我们现有的其他硬件不同的EGL配置集.因此,每当测试套件引入新测试时,它几乎肯定会破坏我的硬件,但对其他所有测试工作.然后面临的挑战是找到适用于所有平台的"良好妥协" - 或者添加一些代码来处理"如果我们有HW X,那么就这样做,否则就这样做". (2认同)
  • @Jerikc 我已经很长时间没有使用此代码了,所以我无法确定它是否适合您的需求,更不用说工作了,但它在这里:) - http://ideone.com/etNRSW (2认同)

ral*_*abb 5

如果你得到这个错误但没有处理这个表面或纹理的东西,去运行并输入.android转到AVD,你当前的Emulator通常在.img文件上删除用户日期文件,重新启动你的模拟器然后测试.这对我有用,如果它在您的设备上进行测试时发生,请清除数据并重新启动您的应用.为那些觉得有帮助的人干杯.

  • 是的,我知道,但由于某种原因,这个错误发生在我身上,并且接受的答案在我的案例中没有用.然后我解决了它并在这里发布.因此,如果其他人遇到这类错误,他们可能会发现它很有用. (13认同)