- add sources.
[platform/framework/web/crosswalk.git] / src / content / browser / renderer_host / gpu_message_filter.h
1 // Copyright (c) 2012 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_BROWSER_RENDERER_HOST_GPU_MESSAGE_FILTER_H_
6 #define CONTENT_BROWSER_RENDERER_HOST_GPU_MESSAGE_FILTER_H_
7
8 #include <vector>
9
10 #include "base/memory/linked_ptr.h"
11 #include "base/memory/ref_counted.h"
12 #include "base/memory/weak_ptr.h"
13 #include "base/sequenced_task_runner_helpers.h"
14 #include "content/common/gpu/gpu_process_launch_causes.h"
15 #include "content/public/browser/browser_message_filter.h"
16 #include "ui/gfx/native_widget_types.h"
17
18 class GpuProcessHost;
19 struct GPUCreateCommandBufferConfig;
20
21 namespace gpu {
22 struct GPUInfo;
23 }
24
25 namespace content {
26 class RenderWidgetHelper;
27 class RenderWidgetHostViewFrameSubscriber;
28
29 // A message filter for messages from the renderer to the GpuProcessHost(UIShim)
30 // in the browser. Such messages are typically destined for the GPU process,
31 // but need to be mediated by the browser.
32 class GpuMessageFilter : public BrowserMessageFilter {
33  public:
34   GpuMessageFilter(int render_process_id,
35                    RenderWidgetHelper* render_widget_helper);
36
37   // BrowserMessageFilter methods:
38   virtual bool OnMessageReceived(const IPC::Message& message,
39                                  bool* message_was_ok) OVERRIDE;
40
41   // Signals that the handle for a surface id was updated, and it may be time to
42   // unblock existing CreateViewCommandBuffer requests using that surface.
43   void SurfaceUpdated(int32 surface_id);
44
45   // This set of API is used to subscribe to frame presentation events.
46   // See RenderWidgetHostViewFrameSubscriber for more details.
47   void BeginFrameSubscription(
48       int route_id,
49       scoped_ptr<RenderWidgetHostViewFrameSubscriber> subscriber);
50   void EndFrameSubscription(int route_id);
51
52  private:
53   friend class BrowserThread;
54   friend class base::DeleteHelper<GpuMessageFilter>;
55   struct CreateViewCommandBufferRequest;
56   struct FrameSubscription;
57
58   virtual ~GpuMessageFilter();
59
60   // Message handlers called on the browser IO thread:
61   void OnEstablishGpuChannel(CauseForGpuLaunch,
62                              IPC::Message* reply);
63   void OnCreateViewCommandBuffer(
64       int32 surface_id,
65       const GPUCreateCommandBufferConfig& init_params,
66       IPC::Message* reply);
67   // Helper callbacks for the message handlers.
68   void EstablishChannelCallback(IPC::Message* reply,
69                                 const IPC::ChannelHandle& channel,
70                                 const gpu::GPUInfo& gpu_info);
71   void CreateCommandBufferCallback(IPC::Message* reply, int32 route_id);
72
73   void BeginAllFrameSubscriptions();
74   void EndAllFrameSubscriptions();
75   void BeginFrameSubscriptionInternal(
76       linked_ptr<FrameSubscription> subscription);
77   void EndFrameSubscriptionInternal(
78       linked_ptr<FrameSubscription> subscription);
79
80   int gpu_process_id_;
81   int render_process_id_;
82   bool share_contexts_;
83
84   scoped_refptr<RenderWidgetHelper> render_widget_helper_;
85   std::vector<linked_ptr<CreateViewCommandBufferRequest> > pending_requests_;
86
87   base::WeakPtrFactory<GpuMessageFilter> weak_ptr_factory_;
88
89   typedef std::vector<linked_ptr<FrameSubscription> > FrameSubscriptionList;
90   FrameSubscriptionList frame_subscription_list_;
91
92   DISALLOW_COPY_AND_ASSIGN(GpuMessageFilter);
93 };
94
95 }  // namespace content
96
97 #endif  // CONTENT_BROWSER_RENDERER_HOST_GPU_MESSAGE_FILTER_H_