- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 OpenGL ES 2.0 和 Android NDK r8b。我有一个用于工作线程的共享上下文。当我尝试使用 eglMakeCurrent 将共享上下文绑定(bind)到工作线程时,我收到错误 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 的链接,那也会有帮助。
最佳答案
好吧,问题似乎在于 PBuffer 至少需要 1x1 像素才能工作,EGL_WIDTH 和 EGL_HEIGHT 的默认值为 0。
获胜配置:
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;
}
关于c++ - 为什么 eglMakeCurrent 因 EGL_BAD_ALLOC 而失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12443016/
我的程序在两个 Activity 之间切换,每个 Activity 都会膨胀一个使用 VBO 的派生 GLSurfaceView。 在两个Activity之间来回切换几次后,程序崩溃并抛出如下异常:
我不断收到此错误报告: Fatal Exception: java.lang.IllegalStateException eglMakeCurrent failed EGL_BAD_ALLOC and
我在 Google Play 上有一个用于倒数数字和字母的应用程序。在这个应用程序中,我有以下 Activity : 谷歌登录 文件 admob 服务 我使用 Google Analytics(分析)
我正在使用 OpenGL ES 2.0 和 Android NDK r8b。我有一个用于工作线程的共享上下文。当我尝试使用 eglMakeCurrent 将共享上下文绑定(bind)到工作线程时,我收
我正在使用抛出异常的 And 引擎开发游戏。其实我不知道发生异常的地方。市场上多次报道。 java.lang.RuntimeException: eglSwapBuffers failed:
在 Samsung Galaxy S6 上安装后第一次打开应用程序时出现 eglCreateWindowSurface GL Error EGL_BAD_ALLOC 并且相同的代码在其他设备上工作正常
我有一个处理图像的动态壁纸应用。 我在 Play 商店(但在 fabric.io 中没有)收到一些崩溃报告,其中包含此堆栈跟踪: *** *** *** *** *** *** *** *** ***
在使用 eglCreateWindowSurface() 绘制后,我无法将 Surface 锁定到 EGL(使用 Surface.lockCanvas(null))即使我用 Surface.unloc
在 Nexus 10 更新到 Android 4.4 后,我的应用程序中出现 EGL 错误:EGL_BAD_ALLOC。它会导致硬件加速关闭,后来由于以下错误而完全阻止应用程序。 为了导致错误,我使用
我是一名优秀的程序员,十分优秀!