Index: cc/layers/surface_layer.cc |
diff --git a/cc/layers/surface_layer.cc b/cc/layers/surface_layer.cc |
index d3b25acf5f522151c45a473dd263c68d103f31a6..16323e07d7e3ad3d9c241c26571fe5ea8b12f55b 100644 |
--- a/cc/layers/surface_layer.cc |
+++ b/cc/layers/surface_layer.cc |
@@ -20,67 +20,56 @@ namespace cc { |
class SatisfySwapPromise : public SwapPromise { |
public: |
SatisfySwapPromise( |
- const SurfaceSequence& sequence, |
- const SurfaceLayer::SatisfyCallback& satisfy_callback, |
+ std::unique_ptr<SurfaceReferenceBase> surface_ref, |
scoped_refptr<base::SingleThreadTaskRunner> main_task_runner) |
- : sequence_(sequence), |
- satisfy_callback_(satisfy_callback), |
+ : surface_ref_(std::move(surface_ref)), |
main_task_runner_(std::move(main_task_runner)) {} |
~SatisfySwapPromise() override {} |
private: |
void DidActivate() override {} |
+ |
void WillSwap(CompositorFrameMetadata* metadata) override {} |
+ |
void DidSwap() override { |
- // DidSwap could run on compositor thread but satisfy callback must |
- // run on the main thread. |
- main_task_runner_->PostTask(FROM_HERE, |
- base::Bind(satisfy_callback_, sequence_)); |
+ main_task_runner_->DeleteSoon(FROM_HERE, surface_ref_.release()); |
} |
DidNotSwapAction DidNotSwap(DidNotSwapReason reason) override { |
- main_task_runner_->PostTask(FROM_HERE, |
- base::Bind(satisfy_callback_, sequence_)); |
+ main_task_runner_->DeleteSoon(FROM_HERE, surface_ref_.release()); |
return DidNotSwapAction::BREAK_PROMISE; |
} |
+ |
int64_t TraceId() const override { return 0; } |
- SurfaceSequence sequence_; |
- SurfaceLayer::SatisfyCallback satisfy_callback_; |
+ std::unique_ptr<SurfaceReferenceBase> surface_ref_; |
scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_; |
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<SurfaceReferenceFactory> ref_factory) { |
+ return make_scoped_refptr(new SurfaceLayer(std::move(ref_factory))); |
} |
-SurfaceLayer::SurfaceLayer(const SatisfyCallback& satisfy_callback, |
- const RequireCallback& require_callback) |
- : satisfy_callback_(satisfy_callback), |
- require_callback_(require_callback) {} |
+SurfaceLayer::SurfaceLayer(scoped_refptr<SurfaceReferenceFactory> ref_factory) |
+ : ref_factory_(std::move(ref_factory)) {} |
SurfaceLayer::~SurfaceLayer() { |
DCHECK(!layer_tree_host()); |
- DCHECK(!destroy_sequence_.is_valid()); |
} |
-void SurfaceLayer::SetSurfaceId(const SurfaceId& surface_id, |
- float scale, |
- const gfx::Size& size, |
- bool stretch_content_to_fill_bounds) { |
- SatisfyDestroySequence(); |
- surface_id_ = surface_id; |
- surface_size_ = size; |
- surface_scale_ = scale; |
+void SurfaceLayer::SetSurfaceInfo(const SurfaceInfo& surface_info, |
+ bool stretch_content_to_fill_bounds) { |
+ RemoveCurrentReference(); |
+ surface_info_ = surface_info; |
+ if (layer_tree_host()) { |
+ current_ref_ = |
+ ref_factory_->CreateReference(layer_tree_host(), surface_info_.id()); |
+ } |
stretch_content_to_fill_bounds_ = stretch_content_to_fill_bounds; |
- CreateNewDestroySequence(); |
- |
UpdateDrawsContent(HasDrawableContent()); |
SetNeedsPushProperties(); |
} |
@@ -91,7 +80,7 @@ std::unique_ptr<LayerImpl> SurfaceLayer::CreateLayerImpl( |
} |
bool SurfaceLayer::HasDrawableContent() const { |
- return surface_id_.is_valid() && Layer::HasDrawableContent(); |
+ return surface_info_.id().is_valid() && Layer::HasDrawableContent(); |
} |
void SurfaceLayer::SetLayerTreeHost(LayerTreeHost* host) { |
@@ -99,43 +88,29 @@ void SurfaceLayer::SetLayerTreeHost(LayerTreeHost* host) { |
Layer::SetLayerTreeHost(host); |
return; |
} |
- |
- SatisfyDestroySequence(); |
+ RemoveCurrentReference(); |
Layer::SetLayerTreeHost(host); |
- CreateNewDestroySequence(); |
+ if (layer_tree_host()) { |
+ current_ref_ = |
+ ref_factory_->CreateReference(layer_tree_host(), surface_info_.id()); |
+ } |
} |
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_); |
+ layer_impl->SetSurfaceInfo(surface_info_); |
layer_impl->SetStretchContentToFillBounds(stretch_content_to_fill_bounds_); |
} |
-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_); |
- } |
-} |
- |
-void SurfaceLayer::SatisfyDestroySequence() { |
- if (!layer_tree_host()) |
+void SurfaceLayer::RemoveCurrentReference() { |
+ if (!current_ref_) |
return; |
- DCHECK(destroy_sequence_.is_valid()); |
- auto satisfy = |
- base::MakeUnique<SatisfySwapPromise>(destroy_sequence_, satisfy_callback_, |
- base::ThreadTaskRunnerHandle::Get()); |
+ auto swap_promise = base::MakeUnique<SatisfySwapPromise>( |
+ std::move(current_ref_), base::ThreadTaskRunnerHandle::Get()); |
layer_tree_host()->GetSwapPromiseManager()->QueueSwapPromise( |
- std::move(satisfy)); |
- destroy_sequence_ = SurfaceSequence(); |
+ std::move(swap_promise)); |
} |
} // namespace cc |