Index: services/gfx/compositor/graph/resource_def.h |
diff --git a/services/gfx/compositor/graph/resource_def.h b/services/gfx/compositor/graph/resource_def.h |
index 9f3d8c8f3921029a4fbd219aa18283cbc3c09c7d..e29d3cf6ba4ccaebc85c2bbce28f8362cdc4b627 100644 |
--- a/services/gfx/compositor/graph/resource_def.h |
+++ b/services/gfx/compositor/graph/resource_def.h |
@@ -8,6 +8,8 @@ |
#include <memory> |
#include "base/macros.h" |
+#include "base/memory/ref_counted.h" |
+#include "base/memory/weak_ptr.h" |
#include "mojo/services/gfx/composition/interfaces/resources.mojom.h" |
#include "services/gfx/compositor/render/render_image.h" |
@@ -16,39 +18,53 @@ namespace compositor { |
class SceneDef; |
// Abstract scene graph resource definition. |
-class ResourceDef { |
+// |
+// Instances of this class are immutable and reference counted so they may |
+// be shared by multiple versions of the same scene. |
+class ResourceDef : public base::RefCounted<ResourceDef> { |
public: |
enum class Type { kScene, kImage }; |
- ResourceDef() = default; |
- virtual ~ResourceDef() = default; |
+ ResourceDef(); |
// Gets the resource type. |
virtual Type type() const = 0; |
+ protected: |
+ friend class base::RefCounted<ResourceDef>; |
+ virtual ~ResourceDef(); |
+ |
private: |
DISALLOW_COPY_AND_ASSIGN(ResourceDef); |
}; |
// Reference to another scene expressed as a resource definition. |
-// The pointer may be null if the referenced scene has become unavailable. |
class SceneResourceDef : public ResourceDef { |
public: |
- explicit SceneResourceDef(SceneDef* referenced_scene); |
- ~SceneResourceDef() override; |
+ explicit SceneResourceDef( |
+ const mojo::gfx::composition::SceneToken& scene_token, |
+ const base::WeakPtr<SceneDef>& referenced_scene); |
Type type() const override; |
- // The referenced scene, may be null if unavailable. |
- SceneDef* referenced_scene() { return referenced_scene_; } |
+ const mojo::gfx::composition::SceneToken& scene_token() const { |
+ return scene_token_; |
+ } |
+ |
+ // The referenced scene, may be null if the scene is unavailable. |
+ const base::WeakPtr<SceneDef>& referenced_scene() const { |
+ return referenced_scene_; |
+ } |
+ |
+ // Returns a copy of the resource without its referenced scene. |
+ scoped_refptr<const SceneResourceDef> Unlink() const; |
- // Clears the referenced scene. |
- // This is called by |SceneDef::UnlinkReferencedScene| when the |
- // referenced scene is no longer available. |
- void clear_referenced_scene() { referenced_scene_ = nullptr; } |
+ protected: |
+ ~SceneResourceDef() override; |
private: |
- SceneDef* referenced_scene_; |
+ mojo::gfx::composition::SceneToken scene_token_; |
+ base::WeakPtr<SceneDef> referenced_scene_; |
DISALLOW_COPY_AND_ASSIGN(SceneResourceDef); |
}; |
@@ -57,12 +73,14 @@ class SceneResourceDef : public ResourceDef { |
class ImageResourceDef : public ResourceDef { |
public: |
explicit ImageResourceDef(const std::shared_ptr<RenderImage>& image); |
- ~ImageResourceDef() override; |
Type type() const override; |
- // The referenced image, may be null if unavailable. |
- const std::shared_ptr<RenderImage>& image() { return image_; } |
+ // The referenced image, never null. |
+ const std::shared_ptr<RenderImage>& image() const { return image_; } |
+ |
+ protected: |
+ ~ImageResourceDef() override; |
private: |
std::shared_ptr<RenderImage> image_; |