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

Commit c49e5b78 authored by Derek Sollenberger's avatar Derek Sollenberger Committed by Android (Google) Code Review
Browse files

Merge changes Ie9436715,Ib3054822

* changes:
  Refactor RenderState and remove unused functionality.
  Fix crash when EGLSurface is no longer valid.
parents 4f797ff2 28a4d993
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -29,12 +29,16 @@ DeferredLayerUpdater::DeferredLayerUpdater(RenderState& renderState)
        , mGLContextAttached(false)
        , mUpdateTexImage(false)
        , mLayer(nullptr) {
    renderState.registerDeferredLayerUpdater(this);
    renderState.registerContextCallback(this);
}

DeferredLayerUpdater::~DeferredLayerUpdater() {
    setTransform(nullptr);
    mRenderState.unregisterDeferredLayerUpdater(this);
    mRenderState.removeContextCallback(this);
    destroyLayer();
}

void DeferredLayerUpdater::onContextDestroyed() {
    destroyLayer();
}

+5 −1
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>

#include "renderstate/RenderState.h"
#include "surfacetexture/SurfaceTexture.h"
#include "Layer.h"
#include "Rect.h"
@@ -38,7 +39,7 @@ class RenderState;

// Container to hold the properties a layer should be set to at the start
// of a render pass
class DeferredLayerUpdater : public VirtualLightRefBase {
class DeferredLayerUpdater : public VirtualLightRefBase, public IGpuContextCallback {
public:
    // Note that DeferredLayerUpdater assumes it is taking ownership of the layer
    // and will not call incrementRef on it as a result.
@@ -98,6 +99,9 @@ public:

    void destroyLayer();

protected:
    void onContextDestroyed() override;

private:
    RenderState& mRenderState;

+3 −3
Original line number Diff line number Diff line
@@ -158,7 +158,7 @@ void RenderNode::pushLayerUpdate(TreeInfo& info) {
        CC_UNLIKELY(properties().getWidth() == 0) || CC_UNLIKELY(properties().getHeight() == 0) ||
        CC_UNLIKELY(!properties().fitsOnLayer())) {
        if (CC_UNLIKELY(hasLayer())) {
            renderthread::CanvasContext::destroyLayer(this);
            this->setLayerSurface(nullptr);
        }
        return;
    }
@@ -317,7 +317,7 @@ void RenderNode::deleteDisplayList(TreeObserver& observer, TreeInfo* info) {

void RenderNode::destroyHardwareResources(TreeInfo* info) {
    if (hasLayer()) {
        renderthread::CanvasContext::destroyLayer(this);
        this->setLayerSurface(nullptr);
    }
    setStagingDisplayList(nullptr);

@@ -327,7 +327,7 @@ void RenderNode::destroyHardwareResources(TreeInfo* info) {

void RenderNode::destroyLayers() {
    if (hasLayer()) {
        renderthread::CanvasContext::destroyLayer(this);
        this->setLayerSurface(nullptr);
    }
    if (mDisplayList) {
        mDisplayList->updateChildren([](RenderNode* child) { child->destroyLayers(); });
+0 −2
Original line number Diff line number Diff line
@@ -230,8 +230,6 @@ Bitmap::~Bitmap() {
            mPixelStorage.hardware.buffer = nullptr;
            break;
    }

    android::uirenderer::renderthread::RenderProxy::onBitmapDestroyed(getStableID());
}

bool Bitmap::hasHardwareMipMap() const {
+15 −1
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@
#include "SkiaPipeline.h"
#include "SkiaProfileRenderer.h"
#include "hwui/Bitmap.h"
#include "private/hwui/DrawGlInfo.h"
#include "renderstate/RenderState.h"
#include "renderthread/EglManager.h"
#include "renderthread/Frame.h"
@@ -43,7 +44,13 @@ namespace uirenderer {
namespace skiapipeline {

SkiaOpenGLPipeline::SkiaOpenGLPipeline(RenderThread& thread)
        : SkiaPipeline(thread), mEglManager(thread.eglManager()) {}
        : SkiaPipeline(thread), mEglManager(thread.eglManager()) {
    thread.renderState().registerContextCallback(this);
}

SkiaOpenGLPipeline::~SkiaOpenGLPipeline() {
    mRenderThread.renderState().removeContextCallback(this);
}

MakeCurrentResult SkiaOpenGLPipeline::makeCurrent() {
    // TODO: Figure out why this workaround is needed, see b/13913604
@@ -135,6 +142,13 @@ DeferredLayerUpdater* SkiaOpenGLPipeline::createTextureLayer() {
    return new DeferredLayerUpdater(mRenderThread.renderState());
}

void SkiaOpenGLPipeline::onContextDestroyed() {
    if (mEglSurface != EGL_NO_SURFACE) {
        mEglManager.destroySurface(mEglSurface);
        mEglSurface = EGL_NO_SURFACE;
    }
}

void SkiaOpenGLPipeline::onStop() {
    if (mEglManager.isCurrent(mEglSurface)) {
        mEglManager.makeCurrent(EGL_NO_SURFACE);
Loading