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

Commit 9138948d authored by Chris Craik's avatar Chris Craik Committed by Android (Google) Code Review
Browse files

Merge "Always flush renderstate in DeferredLayerUpdater::apply"

parents 3c5f924c 09df887c
Loading
Loading
Loading
Loading
+5 −18
Original line number Diff line number Diff line
@@ -98,6 +98,8 @@ void DeferredLayerUpdater::apply() {
                mUpdateTexImage = false;
                doUpdateTexImage();
            }
            GLenum renderTarget = mSurfaceTexture->getCurrentTextureTarget();
            static_cast<GlLayer*>(mLayer)->setRenderTarget(renderTarget);
        }
        if (mTransform) {
            mLayer->getTransform().load(*mTransform);
@@ -140,12 +142,8 @@ void DeferredLayerUpdater::doUpdateTexImage() {
        }
        #endif
        mSurfaceTexture->getTransformMatrix(transform);
        GLenum renderTarget = mSurfaceTexture->getCurrentTextureTarget();

        LOG_ALWAYS_FATAL_IF(renderTarget != GL_TEXTURE_2D && renderTarget != GL_TEXTURE_EXTERNAL_OES,
                "doUpdateTexImage target %x, 2d %x, EXT %x",
                renderTarget, GL_TEXTURE_2D, GL_TEXTURE_EXTERNAL_OES);
        updateLayer(forceFilter, renderTarget, transform);
        updateLayer(forceFilter, transform);
    }
}

@@ -155,28 +153,17 @@ void DeferredLayerUpdater::doUpdateVkTexImage() {
                        mLayer->getApi(), Layer::Api::OpenGL, Layer::Api::Vulkan);

    static const mat4 identityMatrix;
    updateLayer(false, GL_NONE, identityMatrix.data);
    updateLayer(false, identityMatrix.data);

    VkLayer* vkLayer = static_cast<VkLayer*>(mLayer);
    vkLayer->updateTexture();
}

void DeferredLayerUpdater::updateLayer(bool forceFilter, GLenum renderTarget,
        const float* textureTransform) {
void DeferredLayerUpdater::updateLayer(bool forceFilter, const float* textureTransform) {
    mLayer->setBlend(mBlend);
    mLayer->setForceFilter(forceFilter);
    mLayer->setSize(mWidth, mHeight);
    mLayer->getTexTransform().load(textureTransform);

    if (mLayer->getApi() == Layer::Api::OpenGL) {
        GlLayer* glLayer = static_cast<GlLayer*>(mLayer);
        if (renderTarget != glLayer->getRenderTarget()) {
            glLayer->setRenderTarget(renderTarget);
            glLayer->bindTexture();
            glLayer->setFilter(GL_NEAREST, false, true);
            glLayer->setWrap(GL_CLAMP_TO_EDGE, false, true);
        }
    }
}

void DeferredLayerUpdater::detachSurfaceTexture() {
+1 −1
Original line number Diff line number Diff line
@@ -101,7 +101,7 @@ public:

    void detachSurfaceTexture();

    void updateLayer(bool forceFilter, GLenum renderTarget, const float* textureTransform);
    void updateLayer(bool forceFilter, const float* textureTransform);

    void destroyLayer();

+9 −3
Original line number Diff line number Diff line
@@ -55,10 +55,16 @@ void GlLayer::onGlContextLost() {
    texture.deleteTexture();
}

void GlLayer::bindTexture() const {
void GlLayer::setRenderTarget(GLenum renderTarget) {
    if (renderTarget != getRenderTarget()) {
        // new render target: bind with new target, and update filter/wrap
        texture.mTarget = renderTarget;
        if (texture.mId) {
            caches.textureState().bindTexture(texture.target(), texture.mId);
        }
        texture.setFilter(GL_NEAREST, false, true);
        texture.setWrap(GL_CLAMP_TO_EDGE, false, true);
    }
}

void GlLayer::generateTexture() {
+1 −12
Original line number Diff line number Diff line
@@ -68,23 +68,12 @@ public:
        return texture.target();
    }

    inline void setRenderTarget(GLenum renderTarget) {
        texture.mTarget = renderTarget;
    }

    inline bool isRenderable() const {
        return texture.target() != GL_NONE;
    }

    void setWrap(GLenum wrap, bool bindTexture = false, bool force = false) {
        texture.setWrap(wrap, bindTexture, force);
    }

    void setFilter(GLenum filter, bool bindTexture = false, bool force = false) {
        texture.setFilter(filter, bindTexture, force);
    }
    void setRenderTarget(GLenum renderTarget);

    void bindTexture() const;
    void generateTexture();

    /**
+5 −1
Original line number Diff line number Diff line
@@ -74,7 +74,11 @@ sp<DeferredLayerUpdater> TestUtils::createTextureLayerUpdater(
    layerUpdater->setTransform(&transform);

    // updateLayer so it's ready to draw
    layerUpdater->updateLayer(true, GL_TEXTURE_EXTERNAL_OES, Matrix4::identity().data);
    layerUpdater->updateLayer(true, Matrix4::identity().data);
    if (layerUpdater->backingLayer()->getApi() == Layer::Api::OpenGL) {
        static_cast<GlLayer*>(layerUpdater->backingLayer())->setRenderTarget(
                GL_TEXTURE_EXTERNAL_OES);
    }
    return layerUpdater;
}

Loading