Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d4fe4d3b authored by Chris Craik's avatar Chris Craik
Browse files

Fix framebuffer incomplete errors

bug:29127615

Primarily fixes case where 0 dimensioned layers could be
created/updated. Additionally, adds more logging in incomplete
framebuffer cases, if they still occur.

Change-Id: Ib90dbbafd6905aca3c8f46e64064e13a308f713d
parent fe089e3d
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -256,6 +256,7 @@ LOCAL_SRC_FILES += \
    tests/unit/MatrixTests.cpp \
    tests/unit/MatrixTests.cpp \
    tests/unit/OffscreenBufferPoolTests.cpp \
    tests/unit/OffscreenBufferPoolTests.cpp \
    tests/unit/RenderNodeTests.cpp \
    tests/unit/RenderNodeTests.cpp \
    tests/unit/RenderPropertiesTests.cpp \
    tests/unit/SkiaBehaviorTests.cpp \
    tests/unit/SkiaBehaviorTests.cpp \
    tests/unit/SnapshotTests.cpp \
    tests/unit/SnapshotTests.cpp \
    tests/unit/StringUtilsTests.cpp \
    tests/unit/StringUtilsTests.cpp \
+7 −2
Original line number Original line Diff line number Diff line
@@ -66,8 +66,13 @@ void BakedOpRenderer::startRepaintLayer(OffscreenBuffer* offscreenBuffer, const
            offscreenBuffer->texture.id(), 0);
            offscreenBuffer->texture.id(), 0);
    GL_CHECKPOINT(LOW);
    GL_CHECKPOINT(LOW);


    LOG_ALWAYS_FATAL_IF(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE,
    int status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
            "framebuffer incomplete!");
    LOG_ALWAYS_FATAL_IF(status != GL_FRAMEBUFFER_COMPLETE,
            "framebuffer incomplete, status %d, textureId %d, size %dx%d",
            status,
            offscreenBuffer->texture.id(),
            offscreenBuffer->texture.width(),
            offscreenBuffer->texture.height());


    // Change the viewport & ortho projection
    // Change the viewport & ortho projection
    setViewport(offscreenBuffer->viewportWidth, offscreenBuffer->viewportHeight);
    setViewport(offscreenBuffer->viewportWidth, offscreenBuffer->viewportHeight);
+3 −1
Original line number Original line Diff line number Diff line
@@ -86,7 +86,9 @@ void FrameBuilder::deferLayers(const LayerUpdateQueue& layers) {
            ATRACE_FORMAT("Optimize HW Layer DisplayList %s %ux%u",
            ATRACE_FORMAT("Optimize HW Layer DisplayList %s %ux%u",
                    layerNode->getName(), layerNode->getWidth(), layerNode->getHeight());
                    layerNode->getName(), layerNode->getWidth(), layerNode->getHeight());


            const Rect& layerDamage = layers.entries()[i].damage;
            Rect layerDamage = layers.entries()[i].damage;
            // TODO: ensure layer damage can't be larger than layer
            layerDamage.doIntersect(0, 0, layer->viewportWidth, layer->viewportHeight);
            layerNode->computeOrdering();
            layerNode->computeOrdering();


            // map current light center into RenderNode's coordinate space
            // map current light center into RenderNode's coordinate space
+2 −0
Original line number Original line Diff line number Diff line
@@ -319,6 +319,8 @@ void RenderNode::pushLayerUpdate(TreeInfo& info) {
        transformUpdateNeeded = true;
        transformUpdateNeeded = true;
    } else if (!layerMatchesWidthAndHeight(mLayer, getWidth(), getHeight())) {
    } else if (!layerMatchesWidthAndHeight(mLayer, getWidth(), getHeight())) {
#if HWUI_NEW_OPS
#if HWUI_NEW_OPS
        // TODO: remove now irrelevant, currently enqueued damage (respecting damage ordering)
        // Or, ideally, maintain damage between frames on node/layer so ordering is always correct
        RenderState& renderState = mLayer->renderState;
        RenderState& renderState = mLayer->renderState;
        if (properties().fitsOnLayer()) {
        if (properties().fitsOnLayer()) {
            mLayer = renderState.layerPool().resize(mLayer, getWidth(), getHeight());
            mLayer = renderState.layerPool().resize(mLayer, getWidth(), getHeight());
+3 −1
Original line number Original line Diff line number Diff line
@@ -611,7 +611,9 @@ public:
    bool fitsOnLayer() const {
    bool fitsOnLayer() const {
        const DeviceInfo* deviceInfo = DeviceInfo::get();
        const DeviceInfo* deviceInfo = DeviceInfo::get();
        return mPrimitiveFields.mWidth <= deviceInfo->maxTextureSize()
        return mPrimitiveFields.mWidth <= deviceInfo->maxTextureSize()
                        && mPrimitiveFields.mHeight <= deviceInfo->maxTextureSize();
                        && mPrimitiveFields.mHeight <= deviceInfo->maxTextureSize()
                        && mPrimitiveFields.mWidth > 0
                        && mPrimitiveFields.mHeight > 0;
    }
    }


    bool promotedToLayer() const {
    bool promotedToLayer() const {
Loading