summaryrefslogtreecommitdiffstats
path: root/content/browser/gpu_process_host.h
diff options
context:
space:
mode:
Diffstat (limited to 'content/browser/gpu_process_host.h')
-rw-r--r--content/browser/gpu_process_host.h119
1 files changed, 106 insertions, 13 deletions
diff --git a/content/browser/gpu_process_host.h b/content/browser/gpu_process_host.h
index 247f079..3ced7a6 100644
--- a/content/browser/gpu_process_host.h
+++ b/content/browser/gpu_process_host.h
@@ -6,10 +6,18 @@
#define CONTENT_BROWSER_GPU_PROCESS_HOST_H_
#pragma once
+#include <map>
+#include <queue>
+
+#include "base/callback.h"
+#include "base/memory/linked_ptr.h"
#include "base/threading/non_thread_safe.h"
#include "content/browser/browser_child_process_host.h"
-#include "content/common/gpu/gpu_feature_flags.h"
+#include "content/common/gpu/gpu_info.h"
#include "content/common/gpu/gpu_process_launch_causes.h"
+#include "ui/gfx/native_widget_types.h"
+
+struct GPUCreateCommandBufferConfig;
namespace IPC {
class Message;
@@ -18,27 +26,63 @@ class Message;
class GpuProcessHost : public BrowserChildProcessHost,
public base::NonThreadSafe {
public:
-
- // Create a GpuProcessHost with the given ID. The object can be found using
- // FromID with the same id.
- static GpuProcessHost* Create(
- int host_id,
- const GpuFeatureFlags& gpu_feature_flags,
- content::CauseForGpuLaunch);
+ // Creates a new GpuProcessHost or gets one for a particular
+ // renderer process, resulting in the launching of a GPU process if required.
+ // Returns null on failure. It is not safe to store the pointer once control
+ // has returned to the message loop as it can be destroyed. Instead store the
+ // associated GPU host ID. A renderer ID of zero means the browser process.
+ // This could return NULL if GPU access is not allowed (blacklisted).
+ static GpuProcessHost* GetForRenderer(int renderer_id,
+ content::CauseForGpuLaunch cause);
+
+ // Helper function to send the given message to the GPU process on the IO
+ // thread. Calls GetForRenderer and if a host is returned, sends it.
+ // Can be called from any thread.
+ static void SendOnIO(int renderer_id,
+ content::CauseForGpuLaunch cause,
+ IPC::Message* message);
// Get the GPU process host for the GPU process with the given ID. Returns
// null if the process no longer exists.
static GpuProcessHost* FromID(int host_id);
+ int host_id() const { return host_id_; }
virtual bool Send(IPC::Message* msg);
- // IPC::Channel::Listener implementation.
+ // ChildProcessHost implementation.
virtual bool OnMessageReceived(const IPC::Message& message);
+ virtual void OnChannelConnected(int32 peer_pid);
+
+ typedef Callback3<const IPC::ChannelHandle&,
+ base::ProcessHandle,
+ const GPUInfo&>::Type
+ EstablishChannelCallback;
+
+ // Tells the GPU process to create a new channel for communication with a
+ // renderer. Once the GPU process responds asynchronously with the IPC handle
+ // and GPUInfo, we call the callback.
+ void EstablishGpuChannel(
+ int renderer_id, EstablishChannelCallback* callback);
+
+ typedef Callback0::Type SynchronizeCallback;
+
+ // Sends a reply message later when the next GpuHostMsg_SynchronizeReply comes
+ // in.
+ void Synchronize(SynchronizeCallback* callback);
+
+ typedef Callback1<int32>::Type CreateCommandBufferCallback;
+
+ // Tells the GPU process to create a new command buffer that draws into the
+ // window associated with the given renderer.
+ void CreateViewCommandBuffer(
+ gfx::PluginWindowHandle compositing_surface,
+ int32 render_view_id,
+ int32 renderer_id,
+ const GPUCreateCommandBufferConfig& init_params,
+ CreateCommandBufferCallback* callback);
private:
- GpuProcessHost(int host_id,
- const GpuFeatureFlags& gpu_feature_flags,
- content::CauseForGpuLaunch);
+ GpuProcessHost(int host_id);
virtual ~GpuProcessHost();
bool Init();
@@ -51,12 +95,61 @@ class GpuProcessHost : public BrowserChildProcessHost,
virtual void OnChildDied();
virtual void OnProcessCrashed(int exit_code);
+ // Message handlers.
+ void OnChannelEstablished(const IPC::ChannelHandle& channel_handle);
+ void OnSynchronizeReply();
+ void OnCommandBufferCreated(const int32 route_id);
+ void OnDestroyCommandBuffer(
+ gfx::PluginWindowHandle window, int32 renderer_id, int32 render_view_id);
+ void OnGraphicsInfoCollected(const GPUInfo& gpu_info);
+
bool LaunchGpuProcess();
+ void SendOutstandingReplies();
+ void EstablishChannelError(
+ EstablishChannelCallback* callback,
+ const IPC::ChannelHandle& channel_handle,
+ base::ProcessHandle renderer_process_for_gpu,
+ const GPUInfo& gpu_info);
+ void CreateCommandBufferError(CreateCommandBufferCallback* callback,
+ int32 route_id);
+ void SynchronizeError(SynchronizeCallback* callback);
+
// The serial number of the GpuProcessHost / GpuProcessHostUIShim pair.
int host_id_;
- GpuFeatureFlags gpu_feature_flags_;
+ // These are the channel requests that we have already sent to
+ // the GPU process, but haven't heard back about yet.
+ std::queue<linked_ptr<EstablishChannelCallback> > channel_requests_;
+
+ // The pending synchronization requests we need to reply to.
+ std::queue<linked_ptr<SynchronizeCallback> > synchronize_requests_;
+
+ // The pending create command buffer requests we need to reply to.
+ std::queue<linked_ptr<CreateCommandBufferCallback> >
+ create_command_buffer_requests_;
+
+#if defined(OS_LINUX)
+ typedef std::pair<int32 /* renderer_id */,
+ int32 /* render_view_id */> ViewID;
+
+ // Encapsulates surfaces that we lock when creating view command buffers.
+ // We release this lock once the command buffer (or associated GPU process)
+ // is destroyed. This prevents the browser from destroying the surface
+ // while the GPU process is drawing to it.
+
+ // Multimap is used to simulate reference counting, see comment in
+ // GpuProcessHostUIShim::CreateViewCommandBuffer.
+ class SurfaceRef;
+ typedef std::multimap<ViewID, linked_ptr<SurfaceRef> > SurfaceRefMap;
+ SurfaceRefMap surface_refs_;
+#endif
+
+ // Qeueud messages to send when the process launches.
+ std::queue<IPC::Message*> queued_messages_;
+
+ // The handle for the GPU process or null if it is not known to be launched.
+ base::ProcessHandle gpu_process_;
DISALLOW_COPY_AND_ASSIGN(GpuProcessHost);
};