Chromium Code Reviews| Index: cc/layers/surface_layer.cc |
| diff --git a/cc/layers/surface_layer.cc b/cc/layers/surface_layer.cc |
| index 0f8bd3380be1aa873bf5ed197dcafabad45a9c51..278a95e6fadf921f4c61d4bee70771c86ca7dc00 100644 |
| --- a/cc/layers/surface_layer.cc |
| +++ b/cc/layers/surface_layer.cc |
| @@ -18,57 +18,54 @@ namespace cc { |
| class SatisfySwapPromise : public SwapPromise { |
| public: |
| - SatisfySwapPromise(SurfaceSequence sequence, |
| - const SurfaceLayer::SatisfyCallback& satisfy_callback) |
| - : sequence_(sequence), satisfy_callback_(satisfy_callback) {} |
| + explicit SatisfySwapPromise(SurfaceRefPtr surface_ref) |
| + : surface_ref_(std::move(surface_ref)) {} |
| ~SatisfySwapPromise() override {} |
| private: |
| void DidActivate() override {} |
| void DidSwap(CompositorFrameMetadata* metadata) override { |
| - metadata->satisfies_sequences.push_back(sequence_.sequence); |
| + surface_ref_->DelegateLock(metadata); |
| } |
| DidNotSwapAction DidNotSwap(DidNotSwapReason reason) override { |
| - satisfy_callback_.Run(sequence_); |
| + surface_ref_->AllowSurfaceDestruction(); |
| return DidNotSwapAction::BREAK_PROMISE; |
| } |
| int64_t TraceId() const override { return 0; } |
| - SurfaceSequence sequence_; |
| - SurfaceLayer::SatisfyCallback satisfy_callback_; |
| + SurfaceRefPtr surface_ref_; |
| DISALLOW_COPY_AND_ASSIGN(SatisfySwapPromise); |
| }; |
| -scoped_refptr<SurfaceLayer> SurfaceLayer::Create( |
| - const SatisfyCallback& satisfy_callback, |
| - const RequireCallback& require_callback) { |
| - return make_scoped_refptr( |
| - new SurfaceLayer(satisfy_callback, require_callback)); |
| +scoped_refptr<SurfaceLayer> SurfaceLayer::Create() { |
| + return make_scoped_refptr(new SurfaceLayer()); |
| } |
| -SurfaceLayer::SurfaceLayer(const SatisfyCallback& satisfy_callback, |
| - const RequireCallback& require_callback) |
| - : surface_scale_(1.f), |
| - satisfy_callback_(satisfy_callback), |
| - require_callback_(require_callback) {} |
| +scoped_refptr<SurfaceLayer> SurfaceLayer::Create(SurfaceRefPtr surface_ref) { |
| + return make_scoped_refptr(new SurfaceLayer(std::move(surface_ref))); |
| +} |
| + |
| +SurfaceLayer::SurfaceLayer() {} |
| + |
| +SurfaceLayer::SurfaceLayer(SurfaceRefPtr surface_ref) { |
| + SetSurfaceRef(std::move(surface_ref)); |
| +} |
| SurfaceLayer::~SurfaceLayer() { |
| DCHECK(!layer_tree_host()); |
| - DCHECK(!destroy_sequence_.is_valid()); |
| } |
| -void SurfaceLayer::SetSurfaceId(const SurfaceId& surface_id, |
| - float scale, |
| - const gfx::Size& size) { |
| - SatisfyDestroySequence(); |
| - surface_id_ = surface_id; |
| - surface_size_ = size; |
| - surface_scale_ = scale; |
| - CreateNewDestroySequence(); |
| - |
| +void SurfaceLayer::SetSurfaceRef(SurfaceRefPtr surface_ref) { |
| + if (surface_ref_) |
| + RemoveReference(); |
| + surface_ref_ = std::move(surface_ref); |
| + if (layer_tree_host()) { |
| + surface_ref_->SetHost(layer_tree_host()); |
| + surface_ref_->BlockSurfaceDestruction(); |
| + } |
| UpdateDrawsContent(HasDrawableContent()); |
| SetNeedsPushProperties(); |
| } |
| @@ -79,7 +76,7 @@ std::unique_ptr<LayerImpl> SurfaceLayer::CreateLayerImpl( |
| } |
| bool SurfaceLayer::HasDrawableContent() const { |
| - return surface_id_.is_valid() && Layer::HasDrawableContent(); |
| + return surface_ref_->id().is_valid() && Layer::HasDrawableContent(); |
| } |
| void SurfaceLayer::SetLayerTreeHost(LayerTreeHost* host) { |
| @@ -87,41 +84,34 @@ void SurfaceLayer::SetLayerTreeHost(LayerTreeHost* host) { |
| Layer::SetLayerTreeHost(host); |
| return; |
| } |
| - |
| - SatisfyDestroySequence(); |
| + if (surface_ref_) |
| + RemoveReference(); |
| Layer::SetLayerTreeHost(host); |
| - CreateNewDestroySequence(); |
| + if (surface_ref_ && layer_tree_host()) { |
| + surface_ref_->SetHost(layer_tree_host()); |
| + surface_ref_->BlockSurfaceDestruction(); |
| + } |
| } |
| void SurfaceLayer::PushPropertiesTo(LayerImpl* layer) { |
| Layer::PushPropertiesTo(layer); |
| TRACE_EVENT0("cc", "SurfaceLayer::PushPropertiesTo"); |
| SurfaceLayerImpl* layer_impl = static_cast<SurfaceLayerImpl*>(layer); |
| - |
| - layer_impl->SetSurfaceId(surface_id_); |
| - layer_impl->SetSurfaceSize(surface_size_); |
| - layer_impl->SetSurfaceScale(surface_scale_); |
| -} |
| - |
| -void SurfaceLayer::CreateNewDestroySequence() { |
| - DCHECK(!destroy_sequence_.is_valid()); |
| - if (layer_tree_host()) { |
| - destroy_sequence_ = layer_tree_host() |
| - ->GetSurfaceSequenceGenerator() |
| - ->CreateSurfaceSequence(); |
| - require_callback_.Run(surface_id_, destroy_sequence_); |
| - } |
| + layer_impl->SetSurfaceId(surface_ref_->id()); |
|
Saman Sami
2016/11/30 18:05:51
Send clone maybe
|
| + layer_impl->SetSurfaceSize(surface_ref_->size()); |
| + layer_impl->SetSurfaceScale(surface_ref_->scale()); |
| } |
| -void SurfaceLayer::SatisfyDestroySequence() { |
| +void SurfaceLayer::RemoveReference() { |
| if (!layer_tree_host()) |
| return; |
| - DCHECK(destroy_sequence_.is_valid()); |
| + DCHECK(surface_ref_); |
| + SurfaceRefPtr clone = surface_ref_->Clone(); |
| std::unique_ptr<SatisfySwapPromise> satisfy( |
| - new SatisfySwapPromise(destroy_sequence_, satisfy_callback_)); |
| + new SatisfySwapPromise(std::move(surface_ref_))); |
| layer_tree_host()->GetSwapPromiseManager()->QueueSwapPromise( |
| std::move(satisfy)); |
| - destroy_sequence_ = SurfaceSequence(); |
| + surface_ref_ = std::move(clone); |
| } |
| } // namespace cc |