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

Commit 4d7a36be authored by Huihong Luo's avatar Huihong Luo Committed by Android (Google) Code Review
Browse files

Merge "Reparent surface control for Webview overlay" into sc-dev

parents 56dc1197 540fdf89
Loading
Loading
Loading
Loading
+20 −1
Original line number Original line Diff line number Diff line
@@ -126,7 +126,14 @@ void WebViewFunctor::drawGl(const DrawGlInfo& drawInfo) {
                renderthread::CanvasContext::getActiveContext();
                renderthread::CanvasContext::getActiveContext();
        if (activeContext != nullptr) {
        if (activeContext != nullptr) {
            ASurfaceControl* rootSurfaceControl = activeContext->getSurfaceControl();
            ASurfaceControl* rootSurfaceControl = activeContext->getSurfaceControl();
            if (rootSurfaceControl) overlayParams.overlaysMode = OverlaysMode::Enabled;
            if (rootSurfaceControl) {
                overlayParams.overlaysMode = OverlaysMode::Enabled;
                int32_t rgid = activeContext->getSurfaceControlGenerationId();
                if (mParentSurfaceControlGenerationId != rgid) {
                    reparentSurfaceControl(rootSurfaceControl);
                    mParentSurfaceControlGenerationId = rgid;
                }
            }
        }
        }
    }
    }


@@ -195,6 +202,7 @@ ASurfaceControl* WebViewFunctor::getSurfaceControl() {
    LOG_ALWAYS_FATAL_IF(rootSurfaceControl == nullptr, "Null root surface control!");
    LOG_ALWAYS_FATAL_IF(rootSurfaceControl == nullptr, "Null root surface control!");


    auto funcs = renderthread::RenderThread::getInstance().getASurfaceControlFunctions();
    auto funcs = renderthread::RenderThread::getInstance().getASurfaceControlFunctions();
    mParentSurfaceControlGenerationId = activeContext->getSurfaceControlGenerationId();
    mSurfaceControl = funcs.createFunc(rootSurfaceControl, "Webview Overlay SurfaceControl");
    mSurfaceControl = funcs.createFunc(rootSurfaceControl, "Webview Overlay SurfaceControl");
    ASurfaceTransaction* transaction = funcs.transactionCreateFunc();
    ASurfaceTransaction* transaction = funcs.transactionCreateFunc();
    activeContext->prepareSurfaceControlForWebview();
    activeContext->prepareSurfaceControlForWebview();
@@ -218,6 +226,17 @@ void WebViewFunctor::mergeTransaction(ASurfaceTransaction* transaction) {
    }
    }
}
}


void WebViewFunctor::reparentSurfaceControl(ASurfaceControl* parent) {
    ATRACE_NAME("WebViewFunctor::reparentSurfaceControl");
    if (mSurfaceControl == nullptr) return;

    auto funcs = renderthread::RenderThread::getInstance().getASurfaceControlFunctions();
    ASurfaceTransaction* transaction = funcs.transactionCreateFunc();
    funcs.transactionReparentFunc(transaction, mSurfaceControl, parent);
    mergeTransaction(transaction);
    funcs.transactionDeleteFunc(transaction);
}

WebViewFunctorManager& WebViewFunctorManager::instance() {
WebViewFunctorManager& WebViewFunctorManager::instance() {
    static WebViewFunctorManager sInstance;
    static WebViewFunctorManager sInstance;
    return sInstance;
    return sInstance;
+4 −0
Original line number Original line Diff line number Diff line
@@ -84,6 +84,9 @@ public:
        return sp<Handle>{new Handle(*this)};
        return sp<Handle>{new Handle(*this)};
    }
    }


private:
    void reparentSurfaceControl(ASurfaceControl* parent);

private:
private:
    WebViewFunctorCallbacks mCallbacks;
    WebViewFunctorCallbacks mCallbacks;
    void* const mData;
    void* const mData;
@@ -91,6 +94,7 @@ private:
    RenderMode mMode;
    RenderMode mMode;
    bool mHasContext = false;
    bool mHasContext = false;
    bool mCreatedHandle = false;
    bool mCreatedHandle = false;
    int32_t mParentSurfaceControlGenerationId = 0;
    ASurfaceControl* mSurfaceControl = nullptr;
    ASurfaceControl* mSurfaceControl = nullptr;
};
};


+1 −0
Original line number Original line Diff line number Diff line
@@ -201,6 +201,7 @@ void CanvasContext::setSurfaceControl(ASurfaceControl* surfaceControl) {
        funcs.releaseFunc(mSurfaceControl);
        funcs.releaseFunc(mSurfaceControl);
    }
    }
    mSurfaceControl = surfaceControl;
    mSurfaceControl = surfaceControl;
    mSurfaceControlGenerationId++;
    mExpectSurfaceStats = surfaceControl != nullptr;
    mExpectSurfaceStats = surfaceControl != nullptr;
    if (mSurfaceControl != nullptr) {
    if (mSurfaceControl != nullptr) {
        funcs.acquireFunc(mSurfaceControl);
        funcs.acquireFunc(mSurfaceControl);
+4 −0
Original line number Original line Diff line number Diff line
@@ -110,6 +110,7 @@ public:
    GrDirectContext* getGrContext() const { return mRenderThread.getGrContext(); }
    GrDirectContext* getGrContext() const { return mRenderThread.getGrContext(); }


    ASurfaceControl* getSurfaceControl() const { return mSurfaceControl; }
    ASurfaceControl* getSurfaceControl() const { return mSurfaceControl; }
    int32_t getSurfaceControlGenerationId() const { return mSurfaceControlGenerationId; }


    // Won't take effect until next EGLSurface creation
    // Won't take effect until next EGLSurface creation
    void setSwapBehavior(SwapBehavior swapBehavior);
    void setSwapBehavior(SwapBehavior swapBehavior);
@@ -253,6 +254,9 @@ private:
    // The SurfaceControl reference is passed from ViewRootImpl, can be set to
    // The SurfaceControl reference is passed from ViewRootImpl, can be set to
    // NULL to remove the reference
    // NULL to remove the reference
    ASurfaceControl* mSurfaceControl = nullptr;
    ASurfaceControl* mSurfaceControl = nullptr;
    // id to track surface control changes and WebViewFunctor uses it to determine
    // whether reparenting is needed
    int32_t mSurfaceControlGenerationId = 0;
    // stopped indicates the CanvasContext will reject actual redraw operations,
    // stopped indicates the CanvasContext will reject actual redraw operations,
    // and defer repaint until it is un-stopped
    // and defer repaint until it is un-stopped
    bool mStopped = false;
    bool mStopped = false;
+4 −0
Original line number Original line Diff line number Diff line
@@ -98,6 +98,10 @@ ASurfaceControlFunctions::ASurfaceControlFunctions() {
    LOG_ALWAYS_FATAL_IF(transactionApplyFunc == nullptr,
    LOG_ALWAYS_FATAL_IF(transactionApplyFunc == nullptr,
                        "Failed to find required symbol ASurfaceTransaction_apply!");
                        "Failed to find required symbol ASurfaceTransaction_apply!");


    transactionReparentFunc = (AST_reparent)dlsym(handle_, "ASurfaceTransaction_reparent");
    LOG_ALWAYS_FATAL_IF(transactionReparentFunc == nullptr,
                        "Failed to find required symbol transactionReparentFunc!");

    transactionSetVisibilityFunc =
    transactionSetVisibilityFunc =
            (AST_setVisibility)dlsym(handle_, "ASurfaceTransaction_setVisibility");
            (AST_setVisibility)dlsym(handle_, "ASurfaceTransaction_setVisibility");
    LOG_ALWAYS_FATAL_IF(transactionSetVisibilityFunc == nullptr,
    LOG_ALWAYS_FATAL_IF(transactionSetVisibilityFunc == nullptr,
Loading