BakedOpRenderer的GL错误

Eld*_*win 5 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错误!frameworks / base / libs / hwui / BakedOpRenderer.cpp:98

08-09 10:07:00.973 4271-4466 / com.xxx.xxx A / libc:致命信号6(SIGABRT),tid 4466(RenderThread)中的代码-6

[08-09 10:07:00.974 1261:1261 W /] debuggerd:处理请求:pid = 4271 uid = 10085 gid = 10085 tid = 4466

无论如何,是否有调试它以显示更多错误详细信息或解决此错误?此错误会导致应用崩溃。

Ale*_*cio 2

这还不是一个完整的答案,但我发帖希望它能帮助找到一个答案。

所以,我只是在 Chrome 中的 Pixel XL 上点击此按钮,并查看源代码,我们在BakedOpRenderer.cpp中点击了“断言” :

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;
Run Code Online (Sandbox Code Playgroud)

}

我们遇到GL_CHECKPOINT(LOW)障碍的地方。

该宏在 GLUtils.h 中定义为:

#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
Run Code Online (Sandbox Code Playgroud)

DEBUG_OPENGL似乎默认为DEBUG_LEVEL_LOW

实际执行此工作的函数 dumpGLErrors在 GLUtils.cpp 中定义,如下所示:

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
}
Run Code Online (Sandbox Code Playgroud)

在这里,我的问题变得很奇怪。你的日志里有这GL error: 0x506行,但我没有。

你的错误就是错误GL_INVALID_FRAMEBUFFER_OPERATION,看来你需要调查一下

但是,如果您想获取更多信息,则需要使用类似 的内容重新编译 Android hwui lib DEBUG_LEVEL_HIGH,也许还有其他选项

就我而言,我不知道,因为 chrome 中的崩溃并没有在logcat. 咕噜。