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

This commit is contained in:
Huihong Luo
2021-06-29 22:38:17 +00:00
committed by Android (Google) Code Review
6 changed files with 37 additions and 1 deletions

View File

@@ -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;

View File

@@ -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;
}; };

View File

@@ -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);

View File

@@ -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;

View File

@@ -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,

View File

@@ -94,6 +94,9 @@ typedef uint64_t (*ASCStats_getFrameNumber)(ASurfaceControlStats* stats);
typedef ASurfaceTransaction* (*AST_create)(); typedef ASurfaceTransaction* (*AST_create)();
typedef void (*AST_delete)(ASurfaceTransaction* transaction); typedef void (*AST_delete)(ASurfaceTransaction* transaction);
typedef void (*AST_apply)(ASurfaceTransaction* transaction); typedef void (*AST_apply)(ASurfaceTransaction* transaction);
typedef void (*AST_reparent)(ASurfaceTransaction* aSurfaceTransaction,
ASurfaceControl* aSurfaceControl,
ASurfaceControl* newParentASurfaceControl);
typedef void (*AST_setVisibility)(ASurfaceTransaction* transaction, typedef void (*AST_setVisibility)(ASurfaceTransaction* transaction,
ASurfaceControl* surface_control, int8_t visibility); ASurfaceControl* surface_control, int8_t visibility);
typedef void (*AST_setZOrder)(ASurfaceTransaction* transaction, ASurfaceControl* surface_control, typedef void (*AST_setZOrder)(ASurfaceTransaction* transaction, ASurfaceControl* surface_control,
@@ -113,6 +116,7 @@ struct ASurfaceControlFunctions {
AST_create transactionCreateFunc; AST_create transactionCreateFunc;
AST_delete transactionDeleteFunc; AST_delete transactionDeleteFunc;
AST_apply transactionApplyFunc; AST_apply transactionApplyFunc;
AST_reparent transactionReparentFunc;
AST_setVisibility transactionSetVisibilityFunc; AST_setVisibility transactionSetVisibilityFunc;
AST_setZOrder transactionSetZOrderFunc; AST_setZOrder transactionSetZOrderFunc;
}; };