Pracuję dla Androida, używając opengl/egl. Moja aplikacja wymaga drugiego kontekstu do ładowania tekstur z drugiego wątku.Dlaczego metoda eglMakeCurrent() kończy się niepowodzeniem z EGL_BAD_MATCH?
Mój kod działa poprawnie na Androidzie 2.3, ale kiedy próbuję kod na urządzeniu androidowym lub emulatorze 4.0.3, eglMakeCurrent() kończy się niepowodzeniem z EGL_BAD_MATCH.
Inicjowanie drugiego kontekstu i jego bufora pikseli działa również dobrze, więc nie jestem pewien, od czego zacząć szukanie tego błędu.
Jest to kod inicjalizacji:
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());
Na moim Android 2.3 urządzenie (HTC Desire), powyższy kod inicjalizacji działa idealnie i mogę zrobić prąd auxContext, a tekstury obciążenia dobrze.
ALE, na moim urządzeniu z Androidem 4.0.3 (Samsung Nexus S) i moim urządzeniu z Androidem 4.1 (Galaxy Note 2) eglMakeCurrent() kończy się niepowodzeniem z EGL_BAD_MATCH po pomyślnym zainicjowaniu.
Czy ktoś wie, dlaczego mogę uzyskać ten błąd?
zauważyłem, że mam EGL_BAD_MATCH Dzwoniąc eglMakeCurrent z Galaxy S2 czasami. Sądzę, że zawęziłem warunki błędu do a) tworząc kontekst na innym wątku, niż jest on tworzony, lub b) czyniąc kontekst bieżącym na drugim wątku bez ~ zwalniania go z pierwszego wątku. – nmr
zobacz komentarze zaznaczonej odpowiedzi dla rozwiązania – bitwise