| 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_);
|
| }
|
| }
|
|
|
|
|