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

Commit a47c3cc5 authored by John Reck's avatar John Reck Committed by Android (Google) Code Review
Browse files

Merge "Remove sync flush"

parents ff0978fd 8ca3eecc
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ DeferredLayerUpdater::DeferredLayerUpdater(Layer* layer, OpenGLRenderer* rendere

DeferredLayerUpdater::~DeferredLayerUpdater() {
    SkSafeUnref(mColorFilter);
    setTransform(0);
    if (mLayer) {
        mCaches.resourceCache.decrementRefcount(mLayer);
    }
+1 −0
Original line number Diff line number Diff line
@@ -387,6 +387,7 @@ void CanvasContext::setup(int width, int height) {

void CanvasContext::processLayerUpdates(const Vector<DeferredLayerUpdater*>* layerUpdaters,
        bool* hasFunctors) {
    LOG_ALWAYS_FATAL_IF(!mCanvas, "Cannot process layer updates without a canvas!");
    mGlobalContext->makeCurrent(mEglSurface);
    for (size_t i = 0; i < layerUpdaters->size(); i++) {
        DeferredLayerUpdater* update = layerUpdaters->itemAt(i);
+6 −23
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@ namespace android {
namespace uirenderer {
namespace renderthread {

DrawFrameTask::DrawFrameTask() : mContext(0), mTaskMode(MODE_INVALID), mRenderNode(0) {
DrawFrameTask::DrawFrameTask() : mContext(0), mRenderNode(0) {
}

DrawFrameTask::~DrawFrameTask() {
@@ -69,23 +69,14 @@ void DrawFrameTask::drawFrame(RenderThread* renderThread) {
    LOG_ALWAYS_FATAL_IF(!mRenderNode.get(), "Cannot drawFrame with no render node!");
    LOG_ALWAYS_FATAL_IF(!mContext, "Cannot drawFrame with no CanvasContext!");

    postAndWait(renderThread, MODE_FULL);
    postAndWait(renderThread);

    // Reset the single-frame data
    mDirty.setEmpty();
    mRenderNode = 0;
}

void DrawFrameTask::flushStateChanges(RenderThread* renderThread) {
    LOG_ALWAYS_FATAL_IF(!mContext, "Cannot drawFrame with no CanvasContext!");

    postAndWait(renderThread, MODE_STATE_ONLY);
}

void DrawFrameTask::postAndWait(RenderThread* renderThread, TaskMode mode) {
    LOG_ALWAYS_FATAL_IF(mode == MODE_INVALID, "That's not a real mode, silly!");

    mTaskMode = mode;
void DrawFrameTask::postAndWait(RenderThread* renderThread) {
    AutoMutex _lock(mLock);
    renderThread->queue(this);
    mSignal.wait(mLock);
@@ -97,11 +88,6 @@ void DrawFrameTask::run() {
    // canUnblockUiThread is temporary until WebView has a solution for syncing frame state
    bool canUnblockUiThread = syncFrameState();

    if (mTaskMode == MODE_STATE_ONLY) {
        unblockUiThread();
        return;
    }

    // Grab a copy of everything we need
    Rect dirtyCopy(mDirty);
    sp<RenderNode> renderNode = mRenderNode;
@@ -125,12 +111,9 @@ bool DrawFrameTask::syncFrameState() {
    bool hasFunctors = false;
    mContext->processLayerUpdates(&mLayers, &hasFunctors);

    // If we don't have an mRenderNode this is a state flush only
    if (mRenderNode.get()) {
    TreeInfo info = {0};
    mRenderNode->prepareTree(info);
    hasFunctors |= info.hasFunctors;
    }

    return !hasFunctors;
}
+1 −9
Original line number Diff line number Diff line
@@ -56,18 +56,11 @@ public:
    void setRenderNode(RenderNode* renderNode);
    void setDirty(int left, int top, int right, int bottom);
    void drawFrame(RenderThread* renderThread);
    void flushStateChanges(RenderThread* renderThread);

    virtual void run();

private:
    enum TaskMode {
        MODE_INVALID,
        MODE_FULL,
        MODE_STATE_ONLY,
    };

    void postAndWait(RenderThread* renderThread, TaskMode mode);
    void postAndWait(RenderThread* renderThread);
    bool syncFrameState();
    void unblockUiThread();
    static void drawRenderNode(CanvasContext* context, RenderNode* renderNode, Rect* dirty);
@@ -80,7 +73,6 @@ private:
    /*********************************************
     *  Single frame data
     *********************************************/
    TaskMode mTaskMode;
    sp<RenderNode> mRenderNode;
    Rect mDirty;

+0 −7
Original line number Diff line number Diff line
@@ -75,9 +75,6 @@ CREATE_BRIDGE1(destroyContext, CanvasContext* context) {

void RenderProxy::destroyContext() {
    if (mContext) {
        // Flush any pending changes to ensure all garbage is destroyed
        mDrawFrameTask.flushStateChanges(&mRenderThread);

        SETUP_TASK(destroyContext);
        args->context = mContext;
        mContext = 0;
@@ -149,10 +146,6 @@ CREATE_BRIDGE1(destroyCanvas, CanvasContext* context) {
}

void RenderProxy::destroyCanvas() {
    // If the canvas is being destroyed we won't be drawing again anytime soon
    // So flush any pending state changes to allow for resource cleanup.
    mDrawFrameTask.flushStateChanges(&mRenderThread);

    SETUP_TASK(destroyCanvas);
    args->context = mContext;
    post(task);