Merge "Reparent surface control for Webview overlay" into sc-dev am: 4d7a36be41
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15106351 Change-Id: I3a097b69f97d18cdae6a66b899a391d7f4d6a3d5
This commit is contained in:
@@ -126,7 +126,14 @@ void WebViewFunctor::drawGl(const DrawGlInfo& drawInfo) {
|
||||
renderthread::CanvasContext::getActiveContext();
|
||||
if (activeContext != nullptr) {
|
||||
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!");
|
||||
|
||||
auto funcs = renderthread::RenderThread::getInstance().getASurfaceControlFunctions();
|
||||
mParentSurfaceControlGenerationId = activeContext->getSurfaceControlGenerationId();
|
||||
mSurfaceControl = funcs.createFunc(rootSurfaceControl, "Webview Overlay SurfaceControl");
|
||||
ASurfaceTransaction* transaction = funcs.transactionCreateFunc();
|
||||
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() {
|
||||
static WebViewFunctorManager sInstance;
|
||||
return sInstance;
|
||||
|
||||
@@ -84,6 +84,9 @@ public:
|
||||
return sp<Handle>{new Handle(*this)};
|
||||
}
|
||||
|
||||
private:
|
||||
void reparentSurfaceControl(ASurfaceControl* parent);
|
||||
|
||||
private:
|
||||
WebViewFunctorCallbacks mCallbacks;
|
||||
void* const mData;
|
||||
@@ -91,6 +94,7 @@ private:
|
||||
RenderMode mMode;
|
||||
bool mHasContext = false;
|
||||
bool mCreatedHandle = false;
|
||||
int32_t mParentSurfaceControlGenerationId = 0;
|
||||
ASurfaceControl* mSurfaceControl = nullptr;
|
||||
};
|
||||
|
||||
|
||||
@@ -201,6 +201,7 @@ void CanvasContext::setSurfaceControl(ASurfaceControl* surfaceControl) {
|
||||
funcs.releaseFunc(mSurfaceControl);
|
||||
}
|
||||
mSurfaceControl = surfaceControl;
|
||||
mSurfaceControlGenerationId++;
|
||||
mExpectSurfaceStats = surfaceControl != nullptr;
|
||||
if (mSurfaceControl != nullptr) {
|
||||
funcs.acquireFunc(mSurfaceControl);
|
||||
|
||||
@@ -110,6 +110,7 @@ public:
|
||||
GrDirectContext* getGrContext() const { return mRenderThread.getGrContext(); }
|
||||
|
||||
ASurfaceControl* getSurfaceControl() const { return mSurfaceControl; }
|
||||
int32_t getSurfaceControlGenerationId() const { return mSurfaceControlGenerationId; }
|
||||
|
||||
// Won't take effect until next EGLSurface creation
|
||||
void setSwapBehavior(SwapBehavior swapBehavior);
|
||||
@@ -253,6 +254,9 @@ private:
|
||||
// The SurfaceControl reference is passed from ViewRootImpl, can be set to
|
||||
// NULL to remove the reference
|
||||
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,
|
||||
// and defer repaint until it is un-stopped
|
||||
bool mStopped = false;
|
||||
|
||||
@@ -98,6 +98,10 @@ ASurfaceControlFunctions::ASurfaceControlFunctions() {
|
||||
LOG_ALWAYS_FATAL_IF(transactionApplyFunc == nullptr,
|
||||
"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 =
|
||||
(AST_setVisibility)dlsym(handle_, "ASurfaceTransaction_setVisibility");
|
||||
LOG_ALWAYS_FATAL_IF(transactionSetVisibilityFunc == nullptr,
|
||||
|
||||
@@ -94,6 +94,9 @@ typedef uint64_t (*ASCStats_getFrameNumber)(ASurfaceControlStats* stats);
|
||||
typedef ASurfaceTransaction* (*AST_create)();
|
||||
typedef void (*AST_delete)(ASurfaceTransaction* transaction);
|
||||
typedef void (*AST_apply)(ASurfaceTransaction* transaction);
|
||||
typedef void (*AST_reparent)(ASurfaceTransaction* aSurfaceTransaction,
|
||||
ASurfaceControl* aSurfaceControl,
|
||||
ASurfaceControl* newParentASurfaceControl);
|
||||
typedef void (*AST_setVisibility)(ASurfaceTransaction* transaction,
|
||||
ASurfaceControl* surface_control, int8_t visibility);
|
||||
typedef void (*AST_setZOrder)(ASurfaceTransaction* transaction, ASurfaceControl* surface_control,
|
||||
@@ -113,6 +116,7 @@ struct ASurfaceControlFunctions {
|
||||
AST_create transactionCreateFunc;
|
||||
AST_delete transactionDeleteFunc;
|
||||
AST_apply transactionApplyFunc;
|
||||
AST_reparent transactionReparentFunc;
|
||||
AST_setVisibility transactionSetVisibilityFunc;
|
||||
AST_setZOrder transactionSetZOrderFunc;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user