// Copyright 2012 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_DELEGATED_RENDERER_LAYER_IMPL_H_
#define CC_LAYERS_DELEGATED_RENDERER_LAYER_IMPL_H_

#include "base/containers/hash_tables.h"
#include "base/memory/scoped_ptr.h"
#include "cc/base/cc_export.h"
#include "cc/base/scoped_ptr_vector.h"
#include "cc/layers/layer_impl.h"

namespace cc {
class DelegatedFrameData;
class RenderPassSink;

class CC_EXPORT DelegatedRendererLayerImpl : public LayerImpl {
 public:
  static scoped_ptr<DelegatedRendererLayerImpl> Create(
      LayerTreeImpl* tree_impl, int id) {
    return make_scoped_ptr(new DelegatedRendererLayerImpl(tree_impl, id));
  }
  virtual ~DelegatedRendererLayerImpl();

  // LayerImpl overrides.
  virtual scoped_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl)
      override;
  virtual bool HasDelegatedContent() const override;
  virtual bool HasContributingDelegatedRenderPasses() const override;
  virtual RenderPassId FirstContributingRenderPassId() const override;
  virtual RenderPassId NextContributingRenderPassId(
      RenderPassId previous) const override;
  virtual void ReleaseResources() override;
  virtual bool WillDraw(DrawMode draw_mode,
                        ResourceProvider* resource_provider) override;
  virtual void AppendQuads(RenderPass* render_pass,
                           const Occlusion& occlusion_in_content_space,
                           AppendQuadsData* append_quads_data) override;
  virtual void PushPropertiesTo(LayerImpl* layer) override;

  void AppendContributingRenderPasses(RenderPassSink* render_pass_sink);

  // Creates an ID with the resource provider for the child renderer
  // that will be sending quads to the layer. Registers the callback to
  // inform when resources are no longer in use.
  void CreateChildIdIfNeeded(const ReturnCallback& return_callback);

  void SetFrameData(const DelegatedFrameData* frame_data,
                    const gfx::RectF& damage_in_frame);

  float inverse_device_scale_factor() const {
    return inverse_device_scale_factor_;
  }

 protected:
  DelegatedRendererLayerImpl(LayerTreeImpl* tree_impl, int id);

  int ChildIdForTesting() const { return child_id_; }
  const RenderPassList& RenderPassesInDrawOrderForTesting() const {
    return render_passes_in_draw_order_;
  }
  const ResourceProvider::ResourceIdArray& ResourcesForTesting() const {
    return resources_;
  }

 private:
  void ClearChildId();

  void AppendRainbowDebugBorder(RenderPass* render_pass,
                                AppendQuadsData* append_quads_data);

  void SetRenderPasses(RenderPassList* render_passes_in_draw_order);
  void ClearRenderPasses();

  // Returns |true| if the delegated_render_pass_id is part of the current
  // frame and can be converted.
  bool ConvertDelegatedRenderPassId(RenderPassId delegated_render_pass_id,
                                    RenderPassId* output_render_pass_id) const;

  void AppendRenderPassQuads(RenderPass* render_pass,
                             const Occlusion& occlusion_in_content_space,
                             AppendQuadsData* append_quads_data,
                             const RenderPass* delegated_render_pass,
                             const gfx::Size& frame_size) const;

  // LayerImpl overrides.
  virtual const char* LayerTypeAsString() const override;

  bool have_render_passes_to_push_;
  float inverse_device_scale_factor_;
  RenderPassList render_passes_in_draw_order_;
  base::hash_map<RenderPassId, int> render_passes_index_by_id_;
  ResourceProvider::ResourceIdArray resources_;

  int child_id_;
  bool own_child_id_;

  DISALLOW_COPY_AND_ASSIGN(DelegatedRendererLayerImpl);
};

}  // namespace cc

#endif  // CC_LAYERS_DELEGATED_RENDERER_LAYER_IMPL_H_
