Index: cc/layers/surface_layer.cc |
diff --git a/cc/layers/surface_layer.cc b/cc/layers/surface_layer.cc |
index ba577a00d58e7abd952b794ed1dd04d8f98640d3..f1909b4b9169098a8cc8e2050df4a87e218c55cb 100644 |
--- a/cc/layers/surface_layer.cc |
+++ b/cc/layers/surface_layer.cc |
@@ -4,21 +4,60 @@ |
#include "cc/layers/surface_layer.h" |
+#include "cc/base/swap_promise.h" |
#include "cc/layers/surface_layer_impl.h" |
+#include "cc/trees/layer_tree_host.h" |
namespace cc { |
-scoped_refptr<SurfaceLayer> SurfaceLayer::Create() { |
- return make_scoped_refptr(new SurfaceLayer); |
+class SatisfySwapPromise : public SwapPromise { |
+ public: |
+ SatisfySwapPromise(SurfaceSequence sequence, |
+ const SurfaceLayer::SatisfyCallback& satisfy_callback) |
+ : sequence_(sequence), satisfy_callback_(satisfy_callback) {} |
+ |
+ ~SatisfySwapPromise() override {} |
+ |
+ private: |
+ void DidSwap(CompositorFrameMetadata* metadata) override { |
+ metadata->satisfies_sequences.push_back(sequence_.sequence); |
+ } |
+ |
+ void DidNotSwap(DidNotSwapReason reason) override { |
+ satisfy_callback_.Run(sequence_); |
+ } |
+ int64 TraceId() const override { return 0; } |
+ |
+ SurfaceSequence sequence_; |
+ SurfaceLayer::SatisfyCallback satisfy_callback_; |
+ |
+ 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)); |
} |
-SurfaceLayer::SurfaceLayer() : Layer() { |
+SurfaceLayer::SurfaceLayer(const SatisfyCallback& satisfy_callback, |
+ const RequireCallback& require_callback) |
+ : Layer(), |
+ satisfy_callback_(satisfy_callback), |
+ require_callback_(require_callback) { |
} |
-SurfaceLayer::~SurfaceLayer() {} |
+SurfaceLayer::~SurfaceLayer() { |
+ DCHECK(!layer_tree_host()); |
+ DCHECK(destroy_sequence_.is_null()); |
+} |
void SurfaceLayer::SetSurfaceId(SurfaceId surface_id) { |
+ SatisfyDestroySequence(); |
surface_id_ = surface_id; |
+ CreateNewDestroySequence(); |
+ |
UpdateDrawsContent(HasDrawableContent()); |
SetNeedsPushProperties(); |
} |
@@ -31,6 +70,17 @@ bool SurfaceLayer::HasDrawableContent() const { |
return !surface_id_.is_null() && Layer::HasDrawableContent(); |
} |
+void SurfaceLayer::SetLayerTreeHost(LayerTreeHost* host) { |
+ if (layer_tree_host() == host) { |
+ Layer::SetLayerTreeHost(host); |
+ return; |
+ } |
+ |
+ SatisfyDestroySequence(); |
+ Layer::SetLayerTreeHost(host); |
+ CreateNewDestroySequence(); |
+} |
+ |
void SurfaceLayer::PushPropertiesTo(LayerImpl* layer) { |
Layer::PushPropertiesTo(layer); |
SurfaceLayerImpl* layer_impl = static_cast<SurfaceLayerImpl*>(layer); |
@@ -38,4 +88,22 @@ void SurfaceLayer::PushPropertiesTo(LayerImpl* layer) { |
layer_impl->SetSurfaceId(surface_id_); |
} |
+void SurfaceLayer::CreateNewDestroySequence() { |
+ DCHECK(destroy_sequence_.is_null()); |
+ if (layer_tree_host()) { |
+ destroy_sequence_ = layer_tree_host()->CreateSurfaceSequence(); |
+ require_callback_.Run(surface_id_, destroy_sequence_); |
+ } |
+} |
+ |
+void SurfaceLayer::SatisfyDestroySequence() { |
+ if (!layer_tree_host()) |
+ return; |
+ DCHECK(!destroy_sequence_.is_null()); |
+ scoped_ptr<SatisfySwapPromise> satisfy( |
+ new SatisfySwapPromise(destroy_sequence_, satisfy_callback_)); |
+ layer_tree_host()->QueueSwapPromise(satisfy.Pass()); |
+ destroy_sequence_ = SurfaceSequence(); |
+} |
+ |
} // namespace cc |