Add cc::MirrorLayer[Impl]

This new type of layer can be used to mirror contents of another layer.
When a mirror layer is set to mirror another layer, the latter is forced
to create a render pass so that the former can add a RenderPassDrawQuad
referring to that render pass, mirroring its contents.

Note that this CL does not add damage rect handling for the mirror
layer. That would be done in a follow-up CL.

The first use case for the mirror layer would be creating docked
magnifier on CrOS. The current implementation of docked magnifier does
not work with OOP-D.

BUG=947565

Change-Id: I1609edf53eb8c1ae8faff5345ee41dc547a916a3
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1652202
Reviewed-by: enne <[email protected]>
Commit-Queue: Mohsen Izadi <[email protected]>
Cr-Commit-Position: refs/heads/master@{#672744}
diff --git a/cc/layers/mirror_layer_impl.h b/cc/layers/mirror_layer_impl.h
new file mode 100644
index 0000000..0ab1a270
--- /dev/null
+++ b/cc/layers/mirror_layer_impl.h
@@ -0,0 +1,62 @@
+// Copyright 2019 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_LAYERS_MIRROR_LAYER_IMPL_H_
+#define CC_LAYERS_MIRROR_LAYER_IMPL_H_
+
+#include <memory>
+
+#include "base/memory/ptr_util.h"
+#include "cc/cc_export.h"
+#include "cc/layers/layer_impl.h"
+
+namespace cc {
+
+// This type of layer is used to mirror contents of another layer (specified by
+// |mirrored_layer_id_|) by forcing a render pass for the mirrored layer and
+// adding a RenderPassDrawQuad in the compositor frame for this layer referring
+// to that render pass. The mirroring layer should not be a descendant of the
+// mirrored layer (in terms of the effect tree). Due to ordering requirements
+// for render passes in the compositor frame, the render pass containing
+// mirroring layer should appear after the render pass created for the mirrored
+// layer. Currently, render passes are in reverse-draw order of the effect tree,
+// so we should be careful that this reverse-draw order does not conflict with
+// render pass ordering requirement mentioned above.
+// TODO(mohsen): If necessary, reorder render passes in compositor frame such
+// that the render pass containing mirroring layer appears after the render pass
+// created for the mirrored layer.
+class CC_EXPORT MirrorLayerImpl : public LayerImpl {
+ public:
+  static std::unique_ptr<MirrorLayerImpl> Create(LayerTreeImpl* tree_impl,
+                                                 int id) {
+    return base::WrapUnique(new MirrorLayerImpl(tree_impl, id));
+  }
+
+  MirrorLayerImpl(const MirrorLayerImpl&) = delete;
+  MirrorLayerImpl& operator=(const MirrorLayerImpl&) = delete;
+
+  ~MirrorLayerImpl() override;
+
+  void SetMirroredLayerId(int id) { mirrored_layer_id_ = id; }
+  int mirrored_layer_id() const { return mirrored_layer_id_; }
+
+  // LayerImpl overrides.
+  std::unique_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl) override;
+  void AppendQuads(viz::RenderPass* render_pass,
+                   AppendQuadsData* append_quads_data) override;
+  void PushPropertiesTo(LayerImpl* layer) override;
+  gfx::Rect GetDamageRect() const override;
+
+ protected:
+  MirrorLayerImpl(LayerTreeImpl* tree_impl, int id);
+
+ private:
+  const char* LayerTypeAsString() const override;
+
+  int mirrored_layer_id_ = 0;
+};
+
+}  // namespace cc
+
+#endif  // CC_LAYERS_MIRROR_LAYER_IMPL_H_