Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3553)

Unified Diff: cc/trees/layer_tree_host_impl.cc

Issue 2252163003: Update Context Client Visibility to use Scoped Pattern (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix webview Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/trees/layer_tree_host_impl.h ('k') | cc/trees/layer_tree_host_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/trees/layer_tree_host_impl.cc
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index e8348462663420c8cacdd4407214991975fc40d6..d74ee91fb8254b288e5a7b9cd5e41c5e0e8f937c 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -84,7 +84,6 @@
#include "cc/trees/single_thread_proxy.h"
#include "cc/trees/tree_synchronizer.h"
#include "gpu/GLES2/gl2extchromium.h"
-#include "gpu/command_buffer/client/context_support.h"
#include "gpu/command_buffer/client/gles2_interface.h"
#include "ui/gfx/geometry/point_conversions.h"
#include "ui/gfx/geometry/rect_conversions.h"
@@ -157,33 +156,40 @@ void RecordCompositorSlowScrollMetric(InputHandler::ScrollInputType type,
}
}
-// Calls SetClientVisible on the provided |context_provider| and handles
-// additional cache cleanup.
-void UpdateVisibilityForContextProvider(int client_id,
- ContextProvider* context_provider,
- bool is_visible) {
+void UpdateVisibilityForContextProvider(
+ ContextProvider* context_provider,
+ std::unique_ptr<gpu::ContextSupport::ScopedVisibility>* scoped_visibility,
+ bool is_visible) {
if (!context_provider)
return;
+ if (!!*scoped_visibility == is_visible)
+ return;
+
gpu::ContextSupport* context_support = context_provider->ContextSupport();
- context_support->SetClientVisible(client_id, is_visible);
- bool aggressively_free_resources = !context_support->AnyClientsVisible();
- if (aggressively_free_resources) {
+ if (is_visible)
+ *scoped_visibility = context_support->ClientBecameVisible();
+ else
+ context_support->ClientBecameNotVisible(std::move(*scoped_visibility));
+
+ if (!context_support->AnyClientsVisible())
context_provider->DeleteCachedResources();
- }
- context_support->SetAggressivelyFreeResources(aggressively_free_resources);
}
// Same as UpdateVisibilityForContextProvider, except that the
// |context_provider| is locked before being used.
void LockAndUpdateVisibilityForContextProvider(
- int client_id,
ContextProvider* context_provider,
+ std::unique_ptr<gpu::ContextSupport::ScopedVisibility>* scoped_visibility,
bool is_visible) {
if (!context_provider)
return;
+ if (!!*scoped_visibility == is_visible)
+ return;
+
ContextProvider::ScopedContextLock hold(context_provider);
- UpdateVisibilityForContextProvider(client_id, context_provider, is_visible);
+ UpdateVisibilityForContextProvider(context_provider, scoped_visibility,
+ is_visible);
}
} // namespace
@@ -1298,8 +1304,8 @@ void LayerTreeHostImpl::UpdateTileManagerMemoryPolicy(
// work.
if (output_surface_) {
LockAndUpdateVisibilityForContextProvider(
- id_, output_surface_->worker_context_provider(),
- true /* is_visible */);
+ output_surface_->worker_context_provider(),
+ &worker_context_client_visibility_, true /* is_visible */);
}
// If |global_tile_state_.hard_memory_limit_in_bytes| is greater than 0, we
@@ -1392,8 +1398,8 @@ void LayerTreeHostImpl::NotifyAllTileTasksCompleted() {
}
if (output_surface_) {
LockAndUpdateVisibilityForContextProvider(
- id_, output_surface_->worker_context_provider(),
- false /* is_visible */);
+ output_surface_->worker_context_provider(),
+ &worker_context_client_visibility_, false /* is_visible */);
}
}
}
@@ -2133,7 +2139,8 @@ void LayerTreeHostImpl::SetVisible(bool visible) {
// Update visibility for the compositor context provider.
if (output_surface_) {
- UpdateVisibilityForContextProvider(id_, output_surface_->context_provider(),
+ UpdateVisibilityForContextProvider(output_surface_->context_provider(),
+ &main_context_client_visibility_,
visible);
}
}
@@ -2347,10 +2354,17 @@ void LayerTreeHostImpl::ReleaseOutputSurface() {
CleanUpTileManagerAndUIResources();
resource_provider_ = nullptr;
- // Detach from the old output surface and reset |output_surface_| pointer
- // as this surface is going to be destroyed independent of if binding the
- // new output surface succeeds or not.
if (output_surface_) {
+ // Ensure that any context client visibility is left in a good state.
+ UpdateVisibilityForContextProvider(output_surface_->context_provider(),
+ &main_context_client_visibility_, false);
+ LockAndUpdateVisibilityForContextProvider(
+ output_surface_->worker_context_provider(),
+ &worker_context_client_visibility_, false);
+
+ // Detach from the old output surface and reset |output_surface_| pointer
+ // as this surface is going to be destroyed independent of if binding the
+ // new output surface succeeds or not.
output_surface_->DetachFromClient();
output_surface_ = nullptr;
}
« no previous file with comments | « cc/trees/layer_tree_host_impl.h ('k') | cc/trees/layer_tree_host_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698