我正在爲使用opengl/egl的Android進行開發。我的應用程序需要第二個上下文來從第二個線程加載紋理。爲什麼eglMakeCurrent()與EGL_BAD_MATCH失敗?
我的代碼工作正常,在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());
在我的Android 2.3設備(HTC Desire的),上面的初始化代碼作品完美,我可以使auxContext電流,負載紋理就好了。但在我的Android 4.0.3設備(Samsung Nexus S)和我的Android 4.1設備(Galaxy Note 2)eglMakeCurrent()失敗後,EGL_BAD_MATCH成功初始化後失敗。
有誰知道爲什麼我會收到此錯誤?
我注意到有時從Galaxy S2調用eglMakeCurrent時會得到EGL_BAD_MATCH。我相信我已經將錯誤條件縮小到了a)在不同的線程上創建上下文而不是當前的上下文,或者b)使上下文成爲當前第二線程而不從第一線程釋放它。 – nmr
看到的解決方案 – bitwise