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.
5 #ifndef CONTENT_RENDERER_CHILD_FRAME_COMPOSITING_HELPER_H_
6 #define CONTENT_RENDERER_CHILD_FRAME_COMPOSITING_HELPER_H_
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"
23 class CompositorFrame;
24 class CopyOutputResult;
26 class SolidColorLayer;
28 class DelegatedFrameProvider;
29 class DelegatedFrameResourceCollection;
30 class DelegatedRendererLayer;
35 class WebPluginContainer;
44 struct FrameHostMsg_CompositorFrameSwappedACK_Params;
45 struct FrameHostMsg_BuffersSwappedACK_Params;
46 struct FrameHostMsg_ReclaimCompositorResources_Params;
51 class BrowserPluginManager;
52 class RenderFrameImpl;
54 class CONTENT_EXPORT ChildFrameCompositingHelper
55 : public base::RefCounted<ChildFrameCompositingHelper>,
56 public cc::DelegatedFrameResourceCollectionClient {
58 static ChildFrameCompositingHelper* CreateCompositingHelperForBrowserPlugin(
59 const base::WeakPtr<BrowserPlugin>& browser_plugin);
60 static ChildFrameCompositingHelper* CreateCompositingHelperForRenderFrame(
61 blink::WebFrame* frame,
62 RenderFrameImpl* render_frame,
65 void CopyFromCompositingSurface(int request_id,
66 gfx::Rect source_rect,
68 void DidCommitCompositorFrame();
69 void EnableCompositing(bool);
70 void OnContainerDestroy();
71 void OnBuffersSwapped(const gfx::Size& size,
72 const gpu::Mailbox& mailbox,
75 float device_scale_factor);
76 void OnCompositorFrameSwapped(scoped_ptr<cc::CompositorFrame> frame,
78 uint32 output_surface_id,
80 void UpdateVisibility(bool);
81 void ChildFrameGone();
83 // cc::DelegatedFrameProviderClient implementation.
84 virtual void UnusedResourcesAreAvailable() OVERRIDE;
85 void SetContentsOpaque(bool);
88 // Friend RefCounted so that the dtor can be non-public.
89 friend class base::RefCounted<ChildFrameCompositingHelper>;
92 ChildFrameCompositingHelper(
93 const base::WeakPtr<BrowserPlugin>& browser_plugin,
94 blink::WebFrame* frame,
95 RenderFrameImpl* render_frame,
98 enum SwapBuffersType {
99 TEXTURE_IMAGE_TRANSPORT,
101 SOFTWARE_COMPOSITOR_FRAME,
103 struct SwapBuffersInfo {
107 SwapBuffersType type;
110 uint32 output_surface_id;
112 unsigned software_frame_id;
113 base::SharedMemory* shared_memory;
115 virtual ~ChildFrameCompositingHelper();
117 BrowserPluginManager* GetBrowserPluginManager();
118 blink::WebPluginContainer* GetContainer();
121 void SendCompositorFrameSwappedACKToBrowser(
122 FrameHostMsg_CompositorFrameSwappedACK_Params& params);
123 void SendBuffersSwappedACKToBrowser(
124 FrameHostMsg_BuffersSwappedACK_Params& params);
125 void SendReclaimCompositorResourcesToBrowser(
126 FrameHostMsg_ReclaimCompositorResources_Params& params);
127 void CheckSizeAndAdjustLayerProperties(const gfx::Size& new_size,
128 float device_scale_factor,
130 void OnBuffersSwappedPrivate(const SwapBuffersInfo& mailbox,
132 float device_scale_factor);
133 void MailboxReleased(SwapBuffersInfo mailbox,
136 void SendReturnedDelegatedResources();
137 void CopyFromCompositingSurfaceHasResult(
140 scoped_ptr<cc::CopyOutputResult> result);
142 int host_routing_id_;
144 uint32 last_output_surface_id_;
146 bool last_mailbox_valid_;
148 bool software_ack_pending_;
150 std::vector<unsigned> unacked_software_frames_;
152 gfx::Size buffer_size_;
154 // The lifetime of this weak pointer should be greater than the lifetime of
155 // other member objects, as they may access this pointer during their
157 base::WeakPtr<BrowserPlugin> browser_plugin_;
158 RenderFrameImpl* render_frame_;
160 scoped_refptr<cc::DelegatedFrameResourceCollection> resource_collection_;
161 scoped_refptr<cc::DelegatedFrameProvider> frame_provider_;
163 scoped_refptr<cc::SolidColorLayer> background_layer_;
164 scoped_refptr<cc::TextureLayer> texture_layer_;
165 scoped_refptr<cc::DelegatedRendererLayer> delegated_layer_;
166 scoped_ptr<blink::WebLayer> web_layer_;
167 blink::WebFrame* frame_;
169 DISALLOW_COPY_AND_ASSIGN(ChildFrameCompositingHelper);
172 } // namespace content
174 #endif // CONTENT_RENDERER_CHILD_FRAME_COMPOSITING_HELPER_H_