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