Home | History | Annotate | Download | only in pepper
      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 
     15 namespace base {
     16 class SharedMemory;
     17 }  // namespace
     18 
     19 namespace cc {
     20 class Layer;
     21 }  // namespace cc
     22 
     23 namespace content {
     24 
     25 class PepperPluginInstanceImpl;
     26 class RendererPpapiHost;
     27 
     28 class 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