Home | History | Annotate | Download | only in browser_plugin
      1 // Copyright (c) 2013 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_BROWSER_PLUGIN_BROWSER_PLUGIN_COMPOSITING_HELPER_H_
      6 #define  CONTENT_RENDERER_BROWSER_PLUGIN_BROWSER_PLUGIN_COMPOSITING_HELPER_H_
      7 
      8 #include <string>
      9 #include <vector>
     10 
     11 #include "base/memory/ref_counted.h"
     12 #include "base/memory/scoped_ptr.h"
     13 #include "cc/layers/delegated_frame_resource_collection.h"
     14 #include "content/common/content_export.h"
     15 #include "gpu/command_buffer/common/mailbox.h"
     16 #include "ui/gfx/size.h"
     17 
     18 namespace base {
     19 class SharedMemory;
     20 }
     21 
     22 namespace cc {
     23 class CompositorFrame;
     24 class CopyOutputResult;
     25 class Layer;
     26 class SolidColorLayer;
     27 class TextureLayer;
     28 class DelegatedFrameProvider;
     29 class DelegatedFrameResourceCollection;
     30 class DelegatedRendererLayer;
     31 }
     32 
     33 namespace blink {
     34 class WebPluginContainer;
     35 class WebLayer;
     36 }
     37 
     38 namespace gfx {
     39 class Rect;
     40 class Size;
     41 }
     42 
     43 namespace content {
     44 
     45 class BrowserPluginManager;
     46 
     47 class CONTENT_EXPORT BrowserPluginCompositingHelper :
     48     public base::RefCounted<BrowserPluginCompositingHelper>,
     49     public cc::DelegatedFrameResourceCollectionClient {
     50  public:
     51   BrowserPluginCompositingHelper(blink::WebPluginContainer* container,
     52                                  BrowserPluginManager* manager,
     53                                  int instance_id,
     54                                  int host_routing_id);
     55   void CopyFromCompositingSurface(int request_id,
     56                                   gfx::Rect source_rect,
     57                                   gfx::Size dest_size);
     58   void DidCommitCompositorFrame();
     59   void EnableCompositing(bool);
     60   void OnContainerDestroy();
     61   void OnBuffersSwapped(const gfx::Size& size,
     62                         const std::string& mailbox_name,
     63                         int gpu_route_id,
     64                         int gpu_host_id,
     65                         float device_scale_factor);
     66   void OnCompositorFrameSwapped(scoped_ptr<cc::CompositorFrame> frame,
     67                                 int route_id,
     68                                 uint32 output_surface_id,
     69                                 int host_id);
     70   void UpdateVisibility(bool);
     71 
     72   // cc::DelegatedFrameProviderClient implementation.
     73   virtual void UnusedResourcesAreAvailable() OVERRIDE;
     74   void SetContentsOpaque(bool);
     75 
     76  protected:
     77   // Friend RefCounted so that the dtor can be non-public.
     78   friend class base::RefCounted<BrowserPluginCompositingHelper>;
     79  private:
     80   enum SwapBuffersType {
     81     TEXTURE_IMAGE_TRANSPORT,
     82     GL_COMPOSITOR_FRAME,
     83     SOFTWARE_COMPOSITOR_FRAME,
     84   };
     85   struct SwapBuffersInfo {
     86     SwapBuffersInfo();
     87 
     88     gpu::Mailbox name;
     89     SwapBuffersType type;
     90     gfx::Size size;
     91     int route_id;
     92     uint32 output_surface_id;
     93     int host_id;
     94     unsigned software_frame_id;
     95     base::SharedMemory* shared_memory;
     96   };
     97   virtual ~BrowserPluginCompositingHelper();
     98   void CheckSizeAndAdjustLayerProperties(const gfx::Size& new_size,
     99                                          float device_scale_factor,
    100                                          cc::Layer* layer);
    101   void OnBuffersSwappedPrivate(const SwapBuffersInfo& mailbox,
    102                                unsigned sync_point,
    103                                float device_scale_factor);
    104   void MailboxReleased(SwapBuffersInfo mailbox,
    105                        unsigned sync_point,
    106                        bool lost_resource);
    107   void SendReturnedDelegatedResources();
    108   void CopyFromCompositingSurfaceHasResult(
    109       int request_id,
    110       gfx::Size dest_size,
    111       scoped_ptr<cc::CopyOutputResult> result);
    112 
    113   int instance_id_;
    114   int host_routing_id_;
    115   int last_route_id_;
    116   uint32 last_output_surface_id_;
    117   int last_host_id_;
    118   bool last_mailbox_valid_;
    119   bool ack_pending_;
    120   bool software_ack_pending_;
    121   bool opaque_;
    122   std::vector<unsigned> unacked_software_frames_;
    123 
    124   gfx::Size buffer_size_;
    125 
    126   scoped_refptr<cc::DelegatedFrameResourceCollection> resource_collection_;
    127   scoped_refptr<cc::DelegatedFrameProvider> frame_provider_;
    128 
    129   scoped_refptr<cc::SolidColorLayer> background_layer_;
    130   scoped_refptr<cc::TextureLayer> texture_layer_;
    131   scoped_refptr<cc::DelegatedRendererLayer> delegated_layer_;
    132   scoped_ptr<blink::WebLayer> web_layer_;
    133   blink::WebPluginContainer* container_;
    134 
    135   scoped_refptr<BrowserPluginManager> browser_plugin_manager_;
    136 };
    137 
    138 }  // namespace content
    139 
    140 #endif  // CONTENT_RENDERER_BROWSER_PLUGIN_BROWSER_PLUGIN_COMPOSITING_HELPER_H_
    141