Merge "Reparent surface control for Webview overlay" into sc-dev
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user