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

Unified Diff: content/browser/compositor/delegated_frame_host.cc

Issue 666163006: Allow layers to signal that additional sequences are needed before surface destruction (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 1 month 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
Index: content/browser/compositor/delegated_frame_host.cc
diff --git a/content/browser/compositor/delegated_frame_host.cc b/content/browser/compositor/delegated_frame_host.cc
index ccf962abd6644b36eb1d6baa1428a75910b148c8..0a91f52694c91642ca2ce1094e3637b0b941875a 100644
--- a/content/browser/compositor/delegated_frame_host.cc
+++ b/content/browser/compositor/delegated_frame_host.cc
@@ -11,7 +11,9 @@
#include "cc/output/copy_output_request.h"
#include "cc/resources/single_release_callback.h"
#include "cc/resources/texture_mailbox.h"
+#include "cc/surfaces/surface.h"
#include "cc/surfaces/surface_factory.h"
+#include "cc/surfaces/surface_manager.h"
#include "content/browser/compositor/resize_lock.h"
#include "content/browser/gpu/compositor_util.h"
#include "content/common/gpu/client/gl_helper.h"
@@ -27,6 +29,28 @@
namespace content {
+namespace {
+
+void SatisfyCallback(cc::SurfaceManager* manager,
+ cc::SurfaceSequence sequence) {
+ std::vector<uint32_t> sequences;
+ sequences.push_back(sequence.sequence);
+ manager->DidSatisfySequences(sequence.id_namespace, &sequences);
+}
+
+void RequireCallback(cc::SurfaceManager* manager,
+ cc::SurfaceId id,
+ cc::SurfaceSequence sequence) {
+ cc::Surface* surface = manager->GetSurfaceForId(id);
+ if (!surface) {
+ LOG(ERROR) << "Attempting to require callback on nonexistent surface";
+ return;
+ }
+ surface->destruction_dependencies().insert(sequence);
+}
+
+} // namespace
+
////////////////////////////////////////////////////////////////////////////////
// DelegatedFrameHostClient
@@ -371,9 +395,9 @@ void DelegatedFrameHost::SwapDelegatedFrame(
EvictDelegatedFrame();
} else {
if (use_surfaces_) {
+ ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
+ cc::SurfaceManager* manager = factory->GetSurfaceManager();
if (!surface_factory_) {
- ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
- cc::SurfaceManager* manager = factory->GetSurfaceManager();
id_allocator_ =
factory->GetContextFactory()->CreateSurfaceIdAllocator();
surface_factory_ =
@@ -381,22 +405,16 @@ void DelegatedFrameHost::SwapDelegatedFrame(
}
if (surface_id_.is_null() || frame_size != current_surface_size_ ||
frame_size_in_dip != current_frame_size_in_dip_) {
- if (!surface_id_.is_null()) {
- if (compositor) {
- std::set<cc::SurfaceSequence> seq;
- seq.insert(compositor->InsertSurfaceSequenceForNextFrame());
- // Destruction of this surface needs to wait for compositors that
- // have drawn using it to swap frames that don't reference it.
- // TODO(jbauman): Handle cases where the compositor has been
- // changed since the last draw.
- surface_factory_->DestroyOnSequence(surface_id_, seq);
- } else {
- surface_factory_->Destroy(surface_id_);
- }
- }
+ if (!surface_id_.is_null())
+ surface_factory_->Destroy(surface_id_);
surface_id_ = id_allocator_->GenerateId();
surface_factory_->Create(surface_id_, frame_size);
- client_->GetLayer()->SetShowSurface(surface_id_, frame_size_in_dip);
+ // manager must outlive compositors using it.
+ client_->GetLayer()->SetShowSurface(
+ surface_id_,
+ base::Bind(&SatisfyCallback, base::Unretained(manager)),
+ base::Bind(&RequireCallback, base::Unretained(manager)),
+ frame_size_in_dip);
current_surface_size_ = frame_size;
}
scoped_ptr<cc::CompositorFrame> compositor_frame =
@@ -998,7 +1016,12 @@ void DelegatedFrameHost::OnLayerRecreated(ui::Layer* old_layer,
current_frame_size_in_dip_);
}
if (!surface_id_.is_null()) {
- new_layer->SetShowSurface(surface_id_, current_frame_size_in_dip_);
+ ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
+ cc::SurfaceManager* manager = factory->GetSurfaceManager();
+ new_layer->SetShowSurface(
+ surface_id_, base::Bind(&SatisfyCallback, base::Unretained(manager)),
+ base::Bind(&RequireCallback, base::Unretained(manager)),
+ current_frame_size_in_dip_);
}
}

Powered by Google App Engine
This is Rietveld 408576698