1// Copyright 2014 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 CONTENT_RENDERER_PEPPER_PEPPER_COMPOSITOR_H_
6#define CONTENT_RENDERER_PEPPER_PEPPER_COMPOSITOR_H_
7
8#include "base/compiler_specific.h"
9#include "base/memory/scoped_ptr.h"
10#include "base/memory/weak_ptr.h"
11#include "ppapi/host/host_message_context.h"
12#include "ppapi/host/resource_host.h"
13#include "ppapi/shared_impl/compositor_layer_data.h"
14
15namespace base {
16class SharedMemory;
17}  // namespace
18
19namespace cc {
20class Layer;
21}  // namespace cc
22
23namespace content {
24
25class PepperPluginInstanceImpl;
26class RendererPpapiHost;
27
28class PepperCompositorHost : public ppapi::host::ResourceHost {
29 public:
30  PepperCompositorHost(RendererPpapiHost* host,
31                       PP_Instance instance,
32                       PP_Resource resource);
33  // Associates this device with the given plugin instance. You can pass NULL
34  // to clear the existing device. Returns true on success. In this case, a
35  // repaint of the page will also be scheduled. Failure means that the device
36  // is already bound to a different instance, and nothing will happen.
37  bool BindToInstance(PepperPluginInstanceImpl* new_instance);
38
39  const scoped_refptr<cc::Layer> layer() { return layer_; };
40
41  void ViewInitiatedPaint();
42  void ViewFlushedPaint();
43
44 private:
45  virtual ~PepperCompositorHost();
46
47  void ImageReleased(int32_t id,
48                     const scoped_ptr<base::SharedMemory>& shared_memory,
49                     uint32_t sync_point,
50                     bool is_lost);
51  void ResourceReleased(int32_t id,
52                        uint32_t sync_point,
53                        bool is_lost);
54  void SendCommitLayersReplyIfNecessary();
55  void UpdateLayer(const scoped_refptr<cc::Layer>& layer,
56                   const ppapi::CompositorLayerData* old_layer,
57                   const ppapi::CompositorLayerData* new_layer,
58                   scoped_ptr<base::SharedMemory> image_shm);
59
60  // ResourceMessageHandler overrides:
61  virtual int32_t OnResourceMessageReceived(
62      const IPC::Message& msg,
63      ppapi::host::HostMessageContext* context) OVERRIDE;
64
65  // ppapi::host::ResourceHost overrides:
66  virtual bool IsCompositorHost() OVERRIDE;
67
68  // Message handlers:
69  int32_t OnHostMsgCommitLayers(
70      ppapi::host::HostMessageContext* context,
71      const std::vector<ppapi::CompositorLayerData>& layers,
72      bool reset);
73
74  // Non-owning pointer to the plugin instance this context is currently bound
75  // to, if any. If the context is currently unbound, this will be NULL.
76  PepperPluginInstanceImpl* bound_instance_;
77
78  // The toplevel cc::Layer. It is the parent of other cc::Layers.
79  scoped_refptr<cc::Layer> layer_;
80
81  // A list of layers. It is used for updating layers' properties in
82  // subsequent CommitLayers() calls.
83  struct LayerData {
84    LayerData(const scoped_refptr<cc::Layer>& cc,
85              const ppapi::CompositorLayerData& pp);
86    ~LayerData();
87
88    scoped_refptr<cc::Layer> cc_layer;
89    ppapi::CompositorLayerData pp_layer;
90  };
91  std::vector<LayerData> layers_;
92
93  ppapi::host::ReplyMessageContext commit_layers_reply_context_;
94
95  base::WeakPtrFactory<PepperCompositorHost> weak_factory_;
96
97  DISALLOW_COPY_AND_ASSIGN(PepperCompositorHost);
98};
99
100}  // namespace content
101
102#endif  // CONTENT_RENDERER_PEPPER_PEPPER_COMPOSITOR_H_
103