gpu_channel_host.h revision 3551c9c881056c480085172ff9840cab31610854
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_COMMON_GPU_CLIENT_GPU_CHANNEL_HOST_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_COMMON_GPU_CLIENT_GPU_CHANNEL_HOST_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/atomic_sequence_num.h"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
1658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "base/process/process.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/content_export.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/gpu_process_launch_causes.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/message_router.h"
2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/config/gpu_info.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_channel_handle.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_channel_proxy.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_sync_channel.h"
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "media/video/video_decode_accelerator.h"
263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "media/video/video_encode_accelerator.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gpu_preference.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TransportTextureService;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct GPUCreateCommandBufferConfig;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class MessageLoop;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MessageLoopProxy;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace gpu {
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct Mailbox;
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace IPC {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncMessageFilter;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CommandBufferProxyImpl;
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class GpuChannelHost;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct GpuRenderingStats;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct GpuListenerInfo {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuListenerInfo();
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~GpuListenerInfo();
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtr<IPC::Listener> listener;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::MessageLoopProxy> loop;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CONTENT_EXPORT GpuChannelHostFactory {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef base::Callback<void(const gfx::Size)> CreateImageCallback;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~GpuChannelHostFactory() {}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsMainThread() = 0;
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual base::MessageLoop* GetMainLoop() = 0;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual scoped_refptr<base::MessageLoopProxy> GetIOLoopProxy() = 0;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual base::WaitableEvent* GetShutDownEvent() = 0;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual scoped_ptr<base::SharedMemory> AllocateSharedMemory(size_t size) = 0;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int32 CreateViewCommandBuffer(
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int32 surface_id, const GPUCreateCommandBufferConfig& init_params) = 0;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual GpuChannelHost* EstablishGpuChannelSync(CauseForGpuLaunch) = 0;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CreateImage(
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::PluginWindowHandle window,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int32 image_id,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const CreateImageCallback& callback) = 0;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DeleteImage(int32 image_id, int32 sync_point) = 0;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Encapsulates an IPC channel between the client and one GPU process.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On the GPU process side there's a corresponding GpuChannel.
847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Every method can be called on any thread with a message loop, except for the
857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// IO thread.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GpuChannelHost : public IPC::Sender,
877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       public base::RefCountedThreadSafe<GpuChannelHost> {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Must be called on the main thread (as defined by the factory).
907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  static scoped_refptr<GpuChannelHost> Create(
917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GpuChannelHostFactory* factory,
927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      int gpu_host_id,
937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      int client_id,
947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const gpu::GPUInfo& gpu_info,
957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const IPC::ChannelHandle& channel_handle);
967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool IsLost() const {
987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    DCHECK(channel_filter_.get());
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return channel_filter_->IsLost();
1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The GPU stats reported by the GPU process.
1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const gpu::GPUInfo& gpu_info() const { return gpu_info_; }
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IPC::Sender implementation:
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Send(IPC::Message* msg) OVERRIDE;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create and connect to a command buffer in the GPU process.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandBufferProxyImpl* CreateViewCommandBuffer(
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int32 surface_id,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CommandBufferProxyImpl* share_group,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& allowed_extensions,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<int32>& attribs,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& active_url,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::GpuPreference gpu_preference);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create and connect to a command buffer in the GPU process.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandBufferProxyImpl* CreateOffscreenCommandBuffer(
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const gfx::Size& size,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CommandBufferProxyImpl* share_group,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& allowed_extensions,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<int32>& attribs,
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& active_url,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::GpuPreference gpu_preference);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a video decoder in the GPU process.
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<media::VideoDecodeAccelerator> CreateVideoDecoder(
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int command_buffer_route_id,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      media::VideoCodecProfile profile,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      media::VideoDecodeAccelerator::Client* client);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Creates a video encoder in the GPU process.
1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<media::VideoEncodeAccelerator> CreateVideoEncoder(
1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      media::VideoEncodeAccelerator::Client* client);
1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Destroy a command buffer created by this channel.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DestroyCommandBuffer(CommandBufferProxyImpl* command_buffer);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Collect rendering stats from GPU process.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CollectRenderingStatsForSurface(
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int surface_id, GpuRenderingStats* stats);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a route for the current message loop.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddRoute(int route_id, base::WeakPtr<IPC::Listener> listener);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveRoute(int route_id);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuChannelHostFactory* factory() const { return factory_; }
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int gpu_host_id() const { return gpu_host_id_; }
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int client_id() const { return client_id_; }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns a handle to the shared memory that can be sent via IPC to the
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // GPU process. The caller is responsible for ensuring it is closed. Returns
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // an invalid handle on failure.
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::SharedMemoryHandle ShareToGpuProcess(
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::SharedMemoryHandle source_handle);
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Generates |num| unique mailbox names that can be used with
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GL_texture_mailbox_CHROMIUM. Unlike genMailboxCHROMIUM, this IPC is
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // handled only on the GPU process' IO thread, and so is not effectively
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a finish.
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool GenerateMailboxNames(unsigned num, std::vector<gpu::Mailbox>* names);
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Reserve one unused transfer buffer ID.
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32 ReserveTransferBufferId();
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCountedThreadSafe<GpuChannelHost>;
1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  GpuChannelHost(GpuChannelHostFactory* factory,
1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 int gpu_host_id,
1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 int client_id,
1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 const gpu::GPUInfo& gpu_info);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~GpuChannelHost();
1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void Connect(const IPC::ChannelHandle& channel_handle);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A filter used internally to route incoming messages from the IO thread
1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // to the correct message loop. It also maintains some shared state between
1787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // all the contexts.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class MessageFilter : public IPC::ChannelProxy::MessageFilter {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
1817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    MessageFilter();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Called on the IO thread.
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void AddRoute(int route_id,
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  base::WeakPtr<IPC::Listener> listener,
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  scoped_refptr<base::MessageLoopProxy> loop);
1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Called on the IO thread.
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void RemoveRoute(int route_id);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // IPC::ChannelProxy::MessageFilter implementation
1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // (called on the IO thread):
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnChannelError() OVERRIDE;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // The following methods can be called on any thread.
1967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Whether the channel is lost.
1987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    bool IsLost() const;
1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Gets mailboxes from the pool, and return the number of mailboxes to ask
2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // the GPU process to maintain a good pool size. The caller is responsible
2027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // for sending the GpuChannelMsg_GenerateMailboxNamesAsync message.
2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    size_t GetMailboxNames(size_t num, std::vector<gpu::Mailbox>* names);
2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~MessageFilter();
2077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    bool OnControlMessageReceived(const IPC::Message& msg);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Message handlers.
2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    void OnGenerateMailboxNamesReply(const std::vector<gpu::Mailbox>& names);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Threading notes: |listeners_| is only accessed on the IO thread. Every
2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // other field is protected by |lock_|.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typedef base::hash_map<int, GpuListenerInfo> ListenerMap;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListenerMap listeners_;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Protexts all fields below this one.
2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    mutable base::Lock lock_;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Whether the channel has been lost.
2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    bool lost_;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // A pool of valid mailbox names.
2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    std::vector<gpu::Mailbox> mailbox_name_pool_;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Number of pending mailbox requested from the GPU process.
2277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    size_t requested_mailboxes_;
2287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  };
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Threading notes: all fields are constant during the lifetime of |this|
2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // except:
2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // - |next_transfer_buffer_id_|, atomic type
2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // - |proxies_|, protected by |context_lock_|
2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  GpuChannelHostFactory* const factory_;
2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const int client_id_;
2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const int gpu_host_id_;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const gpu::GPUInfo gpu_info_;
2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<IPC::SyncChannel> channel_;
2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_refptr<MessageFilter> channel_filter_;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A filter for sending messages from thread other than the main thread.
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<IPC::SyncMessageFilter> sync_filter_;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Transfer buffer IDs are allocated in sequence.
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::AtomicSequenceNumber next_transfer_buffer_id_;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Protects proxies_.
2507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  mutable base::Lock context_lock_;
2517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Used to look up a proxy from its routing id.
2527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  typedef base::hash_map<int, CommandBufferProxyImpl*> ProxyMap;
2537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ProxyMap proxies_;
2547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(GpuChannelHost);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_COMMON_GPU_CLIENT_GPU_CHANNEL_HOST_H_
261