1// Copyright 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CC_LAYERS_DELEGATED_RENDERER_LAYER_IMPL_H_
6#define CC_LAYERS_DELEGATED_RENDERER_LAYER_IMPL_H_
7
8#include "base/containers/hash_tables.h"
9#include "base/memory/scoped_ptr.h"
10#include "cc/base/cc_export.h"
11#include "cc/base/scoped_ptr_vector.h"
12#include "cc/layers/layer_impl.h"
13
14namespace cc {
15class DelegatedFrameData;
16class RenderPassSink;
17
18class CC_EXPORT DelegatedRendererLayerImpl : public LayerImpl {
19 public:
20  static scoped_ptr<DelegatedRendererLayerImpl> Create(
21      LayerTreeImpl* tree_impl, int id) {
22    return make_scoped_ptr(new DelegatedRendererLayerImpl(tree_impl, id));
23  }
24  virtual ~DelegatedRendererLayerImpl();
25
26  // LayerImpl overrides.
27  virtual scoped_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl)
28      OVERRIDE;
29  virtual bool HasDelegatedContent() const OVERRIDE;
30  virtual bool HasContributingDelegatedRenderPasses() const OVERRIDE;
31  virtual RenderPass::Id FirstContributingRenderPassId() const OVERRIDE;
32  virtual RenderPass::Id NextContributingRenderPassId(
33      RenderPass::Id previous) const OVERRIDE;
34  virtual void DidLoseOutputSurface() OVERRIDE;
35  virtual bool WillDraw(DrawMode draw_mode,
36                        ResourceProvider* resource_provider) OVERRIDE;
37  virtual void AppendQuads(QuadSink* quad_sink,
38                           AppendQuadsData* append_quads_data) OVERRIDE;
39  virtual void PushPropertiesTo(LayerImpl* layer) OVERRIDE;
40
41  void AppendContributingRenderPasses(RenderPassSink* render_pass_sink);
42
43  void SetFrameData(scoped_ptr<DelegatedFrameData> frame_data,
44                    gfx::RectF damage_in_frame);
45
46  void CollectUnusedResources(TransferableResourceArray* resources_for_ack);
47
48  void SetDisplaySize(gfx::Size size);
49
50 protected:
51  DelegatedRendererLayerImpl(LayerTreeImpl* tree_impl, int id);
52
53  int ChildIdForTesting() const { return child_id_; }
54  const ScopedPtrVector<RenderPass>& RenderPassesInDrawOrderForTesting() const {
55    return render_passes_in_draw_order_;
56  }
57  const ResourceProvider::ResourceIdSet& ResourcesForTesting() const {
58    return resources_;
59  }
60
61 private:
62  // Creates an ID with the resource provider for the child renderer
63  // that will be sending quads to the layer.
64  void CreateChildIdIfNeeded();
65  void ClearChildId();
66
67  void AppendRainbowDebugBorder(QuadSink* quad_sink,
68                                AppendQuadsData* append_quads_data);
69
70  void SetRenderPasses(
71      ScopedPtrVector<RenderPass>* render_passes_in_draw_order);
72  void ClearRenderPasses();
73
74  RenderPass::Id ConvertDelegatedRenderPassId(
75      RenderPass::Id delegated_render_pass_id) const;
76
77  gfx::Transform DelegatedFrameToLayerSpaceTransform(gfx::Size frame_size)
78      const;
79
80  void AppendRenderPassQuads(
81      QuadSink* quad_sink,
82      AppendQuadsData* append_quads_data,
83      const RenderPass* delegated_render_pass,
84      gfx::Size frame_size) const;
85
86  // LayerImpl overrides.
87  virtual const char* LayerTypeAsString() const OVERRIDE;
88
89  bool have_render_passes_to_push_;
90  ScopedPtrVector<RenderPass> render_passes_in_draw_order_;
91  base::hash_map<RenderPass::Id, int> render_passes_index_by_id_;
92  ResourceProvider::ResourceIdSet resources_;
93
94  gfx::Size display_size_;
95  int child_id_;
96  bool own_child_id_;
97
98  DISALLOW_COPY_AND_ASSIGN(DelegatedRendererLayerImpl);
99};
100
101}  // namespace cc
102
103#endif  // CC_LAYERS_DELEGATED_RENDERER_LAYER_IMPL_H_
104