Android BakedOpRenderer上的GL错误
我在android模拟器MacOsX上有奇怪的错误。这个android应用程序在真实设备上运行良好。我在谷歌上搜索了很多,但是很少有关于它的讨论。我刚刚用一个基本的相对布局开发了这个片段。当我运行它时,我会得到这些错误 08-09 10:07:00.973 4271-4466/com.xxx.xxx E/OpenGLRenderer:GL错误:0x506 08-09 10:07:00.973 4271-4466/com.xxx.xxx A/OpenGLRenderer:GL错误!frameworks/base/libs/hwui/BakedOpRenderer.cpp:98 08-09 10:07:00.973 4271-4466/com.xxx.xxx A/libc:致命信号6(SIGABRT),tid 4466中的代码-6(渲染读取) [08-09 10:07:00.974 1261:1261 W/] 调试程序:处理请求:pid=4271 uid=10085 gid=10085 tid=4466Android BakedOpRenderer上的GL错误,android,Android,我在android模拟器MacOsX上有奇怪的错误。这个android应用程序在真实设备上运行良好。我在谷歌上搜索了很多,但是很少有关于它的讨论。我刚刚用一个基本的相对布局开发了这个片段。当我运行它时,我会得到这些错误 08-09 10:07:00.973 4271-4466/com.xxx.xxx E/OpenGLRenderer:GL错误:0x506 08-09 10:07:00.973 4271-4466/com.xxx.xxx A/OpenGLRenderer:GL错误!framewor
是否仍需要调试它以显示更多错误详细信息或修复此错误?此错误导致应用程序崩溃。这还不是一个很好的答案,但我发布此消息是希望它能帮助您找到答案 所以,我在chrome中的Pixel XL上点击了这个,然后查看源代码,我们在中点击了一个“断言”: } 在这里,我们正在点击
GL\u检查点(低)
块
宏如下所示:
(DEBUG\u OPENGL
似乎默认为DEBUG\u LEVEL\u LOW
)
实际执行此工作的函数DumpgleErrors如下所示:
在这里,我的问题变得很奇怪。您的日志中有GL错误:0x506
行,但我没有
您的错误是错误,看起来像
但是,如果您想获得更多信息,您需要使用类似于DEBUG\u LEVEL\u HIGH
的东西重新编译Android hwui库,也许还需要一个新版本
就我而言,我没有任何线索,因为chrome的崩溃没有在logcat
中留下“GL错误”。Grr
void BakedOpRenderer::endLayer() {
if (mRenderTarget.stencil) {
// if stencil was used for clipping, detach it and return it to pool
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0);
GL_CHECKPOINT(MODERATE);
mCaches.renderBufferCache.put(mRenderTarget.stencil);
mRenderTarget.stencil = nullptr;
}
mRenderTarget.lastStencilClip = nullptr;
mRenderTarget.offscreenBuffer->updateMeshFromRegion();
mRenderTarget.offscreenBuffer = nullptr; // It's in drawLayerOp's hands now.
// Detach the texture from the FBO
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
GL_CHECKPOINT(LOW);
mRenderState.deleteFramebuffer(mRenderTarget.frameBufferId);
mRenderTarget.frameBufferId = 0;
#if DEBUG_OPENGL
#define GL_CHECKPOINT(LEVEL) \
do { if (DEBUG_OPENGL >= DEBUG_LEVEL_##LEVEL) {\
LOG_ALWAYS_FATAL_IF(android::uirenderer::GLUtils::dumpGLErrors(),\
"GL errors! %s:%d", __FILE__, __LINE__);\
} } while (0)
#else
#define GL_CHECKPOINT(LEVEL)
#endif
bool GLUtils::dumpGLErrors() {
#if DEBUG_OPENGL >= DEBUG_LEVEL_HIGH
// If DEBUG_LEVEL_HIGH is set then every GLES call is already wrapped
// and asserts that there was no error. So this can just return success.
return false;
#else
bool errorObserved = false;
GLenum status = GL_NO_ERROR;
while ((status = glGetError()) != GL_NO_ERROR) {
errorObserved = true;
switch (status) {
case GL_INVALID_ENUM:
ALOGE("GL error: GL_INVALID_ENUM");
break;
case GL_INVALID_VALUE:
ALOGE("GL error: GL_INVALID_VALUE");
break;
case GL_INVALID_OPERATION:
ALOGE("GL error: GL_INVALID_OPERATION");
break;
case GL_OUT_OF_MEMORY:
ALOGE("GL error: Out of memory!");
break;
default:
ALOGE("GL error: 0x%x", status);
}
}
return errorObserved;
#endif
}