【问题标题】:GL Errors on BakedOpRendererBakedOpRenderer 上的 GL 错误
【发布时间】:2017-08-09 03:13:26
【问题描述】:

我在安卓模拟器 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 错误!框架/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/] 调试器:处理请求:pid=4271 uid=10085 gid=10085 tid=4466

是否可以对其进行调试以显示更多错误详细信息或修复此错误?此错误会导致应用崩溃。

【问题讨论】:

    标签: android


    【解决方案1】:

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

    所以,我只是在我的 Pixel XL 上用 chrome 打了这个,然后查看源代码,我们在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;
    

    }

    我们遇到了GL_CHECKPOINT(LOW) 块。

    宏是defined in 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
    

    (DEBUG_OPENGL 似乎默认为DEBUG_LEVEL_LOW)

    实际完成工作的函数dumpGLErrors是defined in 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
    }
    

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

    您的错误是an GL_INVALID_FRAMEBUFFER_OPERATION 错误,它看起来像you need to look into that。

    但是,如果您想获得更多信息,则需要使用 DEBUG_LEVEL_HIGH 或 other options 之类的内容重新编译 Android hwui 库。

    就我而言,我不知道,因为 chrome 中的崩溃并没有在logcat 中留下“GL 错误”。呸。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-04
      • 1970-01-01
      相关资源
      最近更新 更多