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

Unified Diff: cc/surfaces/surface_ref_base.h

Issue 2514033002: Introducing SurfaceReferenceFactory (Closed)
Patch Set: fix Created 4 years 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: cc/surfaces/surface_ref_base.h
diff --git a/cc/surfaces/surface_ref_base.h b/cc/surfaces/surface_ref_base.h
new file mode 100644
index 0000000000000000000000000000000000000000..5e567699b8d634edc67d8d2ffea0933d0c8dccb4
--- /dev/null
+++ b/cc/surfaces/surface_ref_base.h
@@ -0,0 +1,106 @@
+// Copyright (c) 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CC_SURFACES_SURFACE_REF_BASE_H_
+#define CC_SURFACES_SURFACE_REF_BASE_H_
+
+#include <memory>
+
+#include "cc/surfaces/surface_id.h"
+#include "cc/surfaces/surface_sequence.h"
+#include "ui/gfx/geometry/size.h"
+
+namespace cc {
+
+class LayerTreeHost;
+class SurfaceRefInternal;
+class CompositorFrameMetadata;
+typedef std::unique_ptr<SurfaceRefInternal> SurfaceRefPtr;
+template <class T>
+class SurfaceRefBase;
+
+class SurfaceRefInternal {
Fady Samuel 2016/11/30 19:51:29 kylechar@ and I were chatting. My current thinking
+ public:
+ virtual SurfaceRefPtr Clone() const = 0;
+
+ ~SurfaceRefInternal();
+
+ SurfaceRefInternal* SetId(const SurfaceId& id) {
Fady Samuel 2016/11/30 19:51:29 Can we get rid of these setters? I'd prefer if id,
+ DCHECK(!is_active_);
+ id_ = id;
+ return this;
+ }
+ SurfaceRefInternal* SetScale(float scale) {
+ DCHECK(!is_active_);
+ scale_ = scale;
+ return this;
+ }
+ SurfaceRefInternal* SetSize(const gfx::Size& size) {
+ DCHECK(!is_active_);
+ size_ = size;
+ return this;
+ }
+ void SetHost(LayerTreeHost* host) {
Fady Samuel 2016/11/30 19:51:29 I'd prefer if the base class didn't know about Lay
+ DCHECK(!is_active_);
+ host_ = host;
+ }
+ void AllowSurfaceDestruction() {
Fady Samuel 2016/11/30 19:51:29 I'm super confused about these things. What does A
+ if (!is_active_)
+ return;
+ DCHECK(id_.is_valid());
+ AllowImpl();
+ is_active_ = false;
+ }
+ void BlockSurfaceDestruction() {
+ if (is_active_)
+ return;
+ BlockImpl();
+ is_active_ = true;
+ }
+ bool is_active() { return is_active_; }
Fady Samuel 2016/11/30 19:51:29 What does this mean?
+
+ void SetMetadata(const SurfaceId& id, float scale, const gfx::Size& size) {
Fady Samuel 2016/11/30 19:51:29 Do these quantities change? Maybe make this in the
+ SetId(id);
+ SetScale(scale);
+ SetSize(size);
+ }
+
+ void DelegateLock(CompositorFrameMetadata* metadata) {
+ DelegateLockImpl(metadata);
+ is_active_ = false;
+ }
+
+ const SurfaceId& id() const { return id_; }
+ float scale() const { return scale_; }
+ const gfx::Size& size() const { return size_; }
+ LayerTreeHost* host() const { return host_; }
Fady Samuel 2016/11/30 19:51:29 SurfaceRef/SurfaceEmbedding shouldn't know about L
+
+ protected:
+ virtual void AllowImpl() = 0;
+ virtual void BlockImpl() = 0;
+ virtual void DelegateLockImpl(CompositorFrameMetadata*) = 0;
+
+ private:
+ SurfaceId id_;
+ float scale_ = 1.f;
+ gfx::Size size_;
+ bool is_active_ = false;
Saman Sami 2016/11/30 18:05:52 rename?
+ LayerTreeHost* host_ = nullptr;
+ template <class U>
+ friend class SurfaceRefBase;
+};
+
+template <class T>
+class SurfaceRefBase : public SurfaceRefInternal {
+ public:
+ SurfaceRefPtr Clone() const override {
+ SurfaceRefPtr res(new T(*(T*)this));
Fady Samuel 2016/11/30 19:51:29 Use static_cast
+ res->is_active_ = false;
+ return res;
+ }
+};
+
+} // namespace cc
+
+#endif // CC_SURFACES_SURFACE_REF_BASE_H_

Powered by Google App Engine
This is Rietveld 408576698