Commit 879b5cdf authored by Khushal's avatar Khushal Committed by Commit Bot

ui/gl: Ensure surface reparenting during surface destruction.

When destroying a surface, it is important to also detach it from its
parent to ensure the surface is deleted.

Bug: 1076258
TBR=sunnyps@chromium.org

Change-Id: I27987a6340e92a1f6d717ada5d74d40e5f6e2e38
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2172124Reviewed-by: default avatarKhushal <khushalsagar@chromium.org>
Commit-Queue: Khushal <khushalsagar@chromium.org>
Auto-Submit: Khushal <khushalsagar@chromium.org>
Cr-Commit-Position: refs/heads/master@{#763670}
parent 80b779e6
...@@ -43,6 +43,9 @@ using pASurfaceTransaction_delete = void (*)(ASurfaceTransaction*); ...@@ -43,6 +43,9 @@ using pASurfaceTransaction_delete = void (*)(ASurfaceTransaction*);
using pASurfaceTransaction_apply = int64_t (*)(ASurfaceTransaction*); using pASurfaceTransaction_apply = int64_t (*)(ASurfaceTransaction*);
using pASurfaceTransaction_setOnComplete = using pASurfaceTransaction_setOnComplete =
void (*)(ASurfaceTransaction*, void* ctx, ASurfaceTransaction_OnComplete); void (*)(ASurfaceTransaction*, void* ctx, ASurfaceTransaction_OnComplete);
using pASurfaceTransaction_reparent = void (*)(ASurfaceTransaction*,
ASurfaceControl* surface_control,
ASurfaceControl* new_parent);
using pASurfaceTransaction_setVisibility = void (*)(ASurfaceTransaction*, using pASurfaceTransaction_setVisibility = void (*)(ASurfaceTransaction*,
ASurfaceControl*, ASurfaceControl*,
int8_t visibility); int8_t visibility);
...@@ -127,6 +130,7 @@ struct SurfaceControlMethods { ...@@ -127,6 +130,7 @@ struct SurfaceControlMethods {
LOAD_FUNCTION(main_dl_handle, ASurfaceTransaction_delete); LOAD_FUNCTION(main_dl_handle, ASurfaceTransaction_delete);
LOAD_FUNCTION(main_dl_handle, ASurfaceTransaction_apply); LOAD_FUNCTION(main_dl_handle, ASurfaceTransaction_apply);
LOAD_FUNCTION(main_dl_handle, ASurfaceTransaction_setOnComplete); LOAD_FUNCTION(main_dl_handle, ASurfaceTransaction_setOnComplete);
LOAD_FUNCTION(main_dl_handle, ASurfaceTransaction_reparent);
LOAD_FUNCTION(main_dl_handle, ASurfaceTransaction_setVisibility); LOAD_FUNCTION(main_dl_handle, ASurfaceTransaction_setVisibility);
LOAD_FUNCTION(main_dl_handle, ASurfaceTransaction_setZOrder); LOAD_FUNCTION(main_dl_handle, ASurfaceTransaction_setZOrder);
LOAD_FUNCTION(main_dl_handle, ASurfaceTransaction_setBuffer); LOAD_FUNCTION(main_dl_handle, ASurfaceTransaction_setBuffer);
...@@ -157,6 +161,7 @@ struct SurfaceControlMethods { ...@@ -157,6 +161,7 @@ struct SurfaceControlMethods {
pASurfaceTransaction_delete ASurfaceTransaction_deleteFn; pASurfaceTransaction_delete ASurfaceTransaction_deleteFn;
pASurfaceTransaction_apply ASurfaceTransaction_applyFn; pASurfaceTransaction_apply ASurfaceTransaction_applyFn;
pASurfaceTransaction_setOnComplete ASurfaceTransaction_setOnCompleteFn; pASurfaceTransaction_setOnComplete ASurfaceTransaction_setOnCompleteFn;
pASurfaceTransaction_reparent ASurfaceTransaction_reparentFn;
pASurfaceTransaction_setVisibility ASurfaceTransaction_setVisibilityFn; pASurfaceTransaction_setVisibility ASurfaceTransaction_setVisibilityFn;
pASurfaceTransaction_setZOrder ASurfaceTransaction_setZOrderFn; pASurfaceTransaction_setZOrder ASurfaceTransaction_setZOrderFn;
pASurfaceTransaction_setBuffer ASurfaceTransaction_setBufferFn; pASurfaceTransaction_setBuffer ASurfaceTransaction_setBufferFn;
...@@ -329,8 +334,14 @@ SurfaceControl::Surface::Surface(ANativeWindow* parent, const char* name) { ...@@ -329,8 +334,14 @@ SurfaceControl::Surface::Surface(ANativeWindow* parent, const char* name) {
} }
SurfaceControl::Surface::~Surface() { SurfaceControl::Surface::~Surface() {
if (surface_) if (surface_) {
// It is important to detach the surface from the tree before deleting it.
Transaction transaction;
transaction.SetParent(*this, nullptr);
transaction.Apply();
SurfaceControlMethods::Get().ASurfaceControl_releaseFn(surface_); SurfaceControlMethods::Get().ASurfaceControl_releaseFn(surface_);
}
} }
SurfaceControl::SurfaceStats::SurfaceStats() = default; SurfaceControl::SurfaceStats::SurfaceStats() = default;
...@@ -449,6 +460,13 @@ void SurfaceControl::Transaction::SetOnCompleteCb( ...@@ -449,6 +460,13 @@ void SurfaceControl::Transaction::SetOnCompleteCb(
transaction_, ack_ctx, &OnTransactionCompletedOnAnyThread); transaction_, ack_ctx, &OnTransactionCompletedOnAnyThread);
} }
void SurfaceControl::Transaction::SetParent(const Surface& surface,
const Surface* new_parent) {
SurfaceControlMethods::Get().ASurfaceTransaction_reparentFn(
transaction_, surface.surface(),
new_parent ? new_parent->surface() : nullptr);
}
void SurfaceControl::Transaction::Apply() { void SurfaceControl::Transaction::Apply() {
TRACE_EVENT_ASYNC_BEGIN0("gpu,benchmark", "SurfaceControlTransaction", id_); TRACE_EVENT_ASYNC_BEGIN0("gpu,benchmark", "SurfaceControlTransaction", id_);
SurfaceControlMethods::Get().ASurfaceTransaction_applyFn(transaction_); SurfaceControlMethods::Get().ASurfaceTransaction_applyFn(transaction_);
......
...@@ -122,6 +122,7 @@ class GL_EXPORT SurfaceControl { ...@@ -122,6 +122,7 @@ class GL_EXPORT SurfaceControl {
void SetOnCompleteCb( void SetOnCompleteCb(
OnCompleteCb cb, OnCompleteCb cb,
scoped_refptr<base::SingleThreadTaskRunner> task_runner); scoped_refptr<base::SingleThreadTaskRunner> task_runner);
void SetParent(const Surface& surface, const Surface* new_parent);
void Apply(); void Apply();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment