Почему eglMakeCurrent завершается ошибкой с EGL_BAD_ALLOC?

Я использую OpenGL ES 2.0 и Android NDK r8b. У меня есть общий контекст, который я использую для рабочих потоков. Когда я пытаюсь связать общий контекст с рабочим потоком, используя eglMakeCurrent, я получаю ошибку EGL_BAD_ALLOC.

Что меня смущает, так это то, что этот код прекрасно работал раньше … и я не уверен, что я сделал, чтобы его сломать … В документации EGL говорится, что эта ошибка связана с недоступностью ресурсов, но я использую то же приложение который отлично работал на этом же устройстве, и все текстуры прекрасно загружаются из основного потока.

Так что может быть причиной этой ошибки?

Это моя инициализация egl:

bool Initialize(void *displaySurface)
{
assert(displaySurface);
ANativeWindow *window = (ANativeWindow*)displaySurface;

EGLint dummy, format;

display = eglGetDisplay(EGL_DEFAULT_DISPLAY);

eglInitialize(display, 0, 0);

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
};

const EGLint auxConfigAttribs[] =
{
EGL_SURFACE_TYPE, EGL_PBUFFER_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 contextAttribs[] =
{
EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE
};

EGLint numConfigs;
EGLConfig config;

//// create main context
eglChooseConfig(display, configAttribs, &config, 1, &numConfigs);
Trace("eglChooseConfig: " + GetEglError());

eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format);
Trace("eglGetConfigAttrib: " + GetEglError());

ANativeWindow_setBuffersGeometry(window, 0, 0, format);
Trace("ANativeWindow_setBuffersGeometry: " + GetEglError());

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

context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs);
Trace("eglCreateContext: " + GetEglError());

//// create auxiliary context
eglChooseConfig(display, auxConfigAttribs, &config, 1, &numConfigs);
Trace("AUX eglChooseConfig: " + GetEglError());

auxSurface = eglCreatePbufferSurface(display, config, NULL);
Trace("AUX eglCreatePbufferSurface: " + GetEglError());

auxContext = eglCreateContext(display, config, context, contextAttribs);
Trace("AUX eglCreateContext: " + GetEglError());

//// make main context current
eglMakeCurrent(display, surface, surface, context);
Trace("eglMakeCurrent: " + GetError());

eglQuerySurface(display, surface, EGL_WIDTH, &width);
eglQuerySurface(display, surface, EGL_HEIGHT, &height);

SetViewport(width, height);

EnableDepthBuffer(enableDepthTest);
EnableBackfaceCulling(enableBackfaceCull);
SetBackgroundColor(backgroundColor);

glDisable(GL_DITHER);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Trace("finished" + GetEglError());

alive = true;

return true;
}

редактировать: Я могу ошибаться, но эта ошибка, кажется, появилась одновременно с обновлением цепочки инструментов ndk … но я не могу проверить эту теорию, потому что у меня больше нет старых версий ndk .. Так что если кто-то была ссылка, где я могу получить NDK 7c, что также было бы полезно.

5

Решение

Что ж, похоже, проблема заключалась в том, что PBuffer должен иметь размер не менее 1×1 пикселей, чтобы он работал, а по умолчанию 0 для EGL_WIDTH и EGL_HEIGHT.

Победившая конфигурация:

bool Initialize(void *displaySurface)
{
assert(displaySurface);
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
};

//// create main context
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);
Trace("eglChooseConfig: " + GetEglError());

eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format);
Trace("eglGetConfigAttrib: " + GetEglError());

ANativeWindow_setBuffersGeometry(window, 0, 0, format);
Trace("ANativeWindow_setBuffersGeometry: " + GetEglError());

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

context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs);
Trace("eglCreateContext: " + GetEglError());

//// create auxiliary context

const EGLint auxConfigAttribs[] =
{
EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
EGL_BLUE_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_RED_SIZE, 8,
EGL_ALPHA_SIZE, 0,
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);
Trace("AUX eglChooseConfig: " + GetEglError());

auxSurface = eglCreatePbufferSurface(display, auxConfig, pbufferAttribs);
Trace("AUX eglCreatePbufferSurface: " + GetEglError());

auxContext = eglCreateContext(display, auxConfig, context, contextAttribs);
Trace("AUX eglCreateContext: " + GetEglError());

//// make main context current
eglMakeCurrent(display, surface, surface, context);
Trace("eglMakeCurrent main: " + GetError());

eglQuerySurface(display, surface, EGL_WIDTH, &width);
eglQuerySurface(display, surface, EGL_HEIGHT, &height);

SetViewport(width, height);

EnableDepthBuffer(enableDepthTest);
EnableBackfaceCulling(enableBackfaceCull);
SetBackgroundColor(backgroundColor);

glDisable(GL_DITHER);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Trace("finished" + GetEglError());

alive = true;

return true;
}
9

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]