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"
271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/gfx/gpu_memory_buffer.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gpu_preference.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TransportTextureService;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct GPUCreateCommandBufferConfig;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class MessageLoop;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MessageLoopProxy;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace gpu {
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct Mailbox;
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace IPC {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncMessageFilter;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CommandBufferProxyImpl;
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class GpuChannelHost;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct GpuRenderingStats;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct GpuListenerInfo {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuListenerInfo();
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~GpuListenerInfo();
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtr<IPC::Listener> listener;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::MessageLoopProxy> loop;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CONTENT_EXPORT GpuChannelHostFactory {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef base::Callback<void(const gfx::Size)> CreateImageCallback;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~GpuChannelHostFactory() {}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsMainThread() = 0;
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual base::MessageLoop* GetMainLoop() = 0;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual scoped_refptr<base::MessageLoopProxy> GetIOLoopProxy() = 0;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual base::WaitableEvent* GetShutDownEvent() = 0;
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual scoped_ptr<base::SharedMemory> AllocateSharedMemory(size_t size) = 0;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int32 CreateViewCommandBuffer(
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int32 surface_id, const GPUCreateCommandBufferConfig& init_params) = 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;
801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual scoped_ptr<gfx::GpuMemoryBuffer> AllocateGpuMemoryBuffer(
811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      size_t width,
821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      size_t height,
831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      unsigned internalformat) = 0;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Encapsulates an IPC channel between the client and one GPU process.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On the GPU process side there's a corresponding GpuChannel.
887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Every method can be called on any thread with a message loop, except for the
897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// IO thread.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GpuChannelHost : public IPC::Sender,
917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       public base::RefCountedThreadSafe<GpuChannelHost> {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Must be called on the main thread (as defined by the factory).
947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  static scoped_refptr<GpuChannelHost> Create(
957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GpuChannelHostFactory* factory,
967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      int gpu_host_id,
977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const gpu::GPUInfo& gpu_info,
987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const IPC::ChannelHandle& channel_handle);
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Returns true if |handle| is a valid GpuMemoryBuffer handle that
1011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // can be shared to the GPU process.
1021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  static bool IsValidGpuMemoryBuffer(gfx::GpuMemoryBufferHandle handle);
1031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool IsLost() const {
1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    DCHECK(channel_filter_.get());
1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return channel_filter_->IsLost();
1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The GPU stats reported by the GPU process.
1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const gpu::GPUInfo& gpu_info() const { return gpu_info_; }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IPC::Sender implementation:
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Send(IPC::Message* msg) OVERRIDE;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create and connect to a command buffer in the GPU process.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandBufferProxyImpl* CreateViewCommandBuffer(
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int32 surface_id,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CommandBufferProxyImpl* share_group,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<int32>& attribs,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& active_url,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::GpuPreference gpu_preference);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create and connect to a command buffer in the GPU process.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandBufferProxyImpl* CreateOffscreenCommandBuffer(
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const gfx::Size& size,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CommandBufferProxyImpl* share_group,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<int32>& attribs,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& active_url,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::GpuPreference gpu_preference);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a video decoder in the GPU process.
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<media::VideoDecodeAccelerator> CreateVideoDecoder(
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int command_buffer_route_id,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      media::VideoCodecProfile profile,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      media::VideoDecodeAccelerator::Client* client);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Creates a video encoder in the GPU process.
1383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<media::VideoEncodeAccelerator> CreateVideoEncoder(
1393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      media::VideoEncodeAccelerator::Client* client);
1403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Destroy a command buffer created by this channel.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DestroyCommandBuffer(CommandBufferProxyImpl* command_buffer);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Collect rendering stats from GPU process.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CollectRenderingStatsForSurface(
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int surface_id, GpuRenderingStats* stats);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a route for the current message loop.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddRoute(int route_id, base::WeakPtr<IPC::Listener> listener);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveRoute(int route_id);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuChannelHostFactory* factory() const { return factory_; }
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int gpu_host_id() const { return gpu_host_id_; }
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns a handle to the shared memory that can be sent via IPC to the
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // GPU process. The caller is responsible for ensuring it is closed. Returns
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // an invalid handle on failure.
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::SharedMemoryHandle ShareToGpuProcess(
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::SharedMemoryHandle source_handle);
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Generates |num| unique mailbox names that can be used with
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GL_texture_mailbox_CHROMIUM. Unlike genMailboxCHROMIUM, this IPC is
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // handled only on the GPU process' IO thread, and so is not effectively
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a finish.
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool GenerateMailboxNames(unsigned num, std::vector<gpu::Mailbox>* names);
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Reserve one unused transfer buffer ID.
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32 ReserveTransferBufferId();
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Returns a GPU memory buffer handle to the buffer that can be sent via
1711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // IPC to the GPU process. The caller is responsible for ensuring it is
1721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // closed. Returns an invalid handle on failure.
1731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  gfx::GpuMemoryBufferHandle ShareGpuMemoryBufferToGpuProcess(
1741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      gfx::GpuMemoryBufferHandle source_handle);
1751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Reserve one unused gpu memory buffer ID.
1771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  int32 ReserveGpuMemoryBufferId();
1781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCountedThreadSafe<GpuChannelHost>;
1817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  GpuChannelHost(GpuChannelHostFactory* factory,
1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 int gpu_host_id,
1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 const gpu::GPUInfo& gpu_info);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~GpuChannelHost();
1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void Connect(const IPC::ChannelHandle& channel_handle);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A filter used internally to route incoming messages from the IO thread
1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // to the correct message loop. It also maintains some shared state between
1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // all the contexts.
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class MessageFilter : public IPC::ChannelProxy::MessageFilter {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
1927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    MessageFilter();
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Called on the IO thread.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void AddRoute(int route_id,
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  base::WeakPtr<IPC::Listener> listener,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  scoped_refptr<base::MessageLoopProxy> loop);
1987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Called on the IO thread.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void RemoveRoute(int route_id);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // IPC::ChannelProxy::MessageFilter implementation
2027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // (called on the IO thread):
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnChannelError() OVERRIDE;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // The following methods can be called on any thread.
2077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Whether the channel is lost.
2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    bool IsLost() const;
2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Gets mailboxes from the pool, and return the number of mailboxes to ask
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // the GPU process to maintain a good pool size. The caller is responsible
2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // for sending the GpuChannelMsg_GenerateMailboxNamesAsync message.
2147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    size_t GetMailboxNames(size_t num, std::vector<gpu::Mailbox>* names);
2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~MessageFilter();
2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    bool OnControlMessageReceived(const IPC::Message& msg);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Message handlers.
2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    void OnGenerateMailboxNamesReply(const std::vector<gpu::Mailbox>& names);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Threading notes: |listeners_| is only accessed on the IO thread. Every
2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // other field is protected by |lock_|.
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typedef base::hash_map<int, GpuListenerInfo> ListenerMap;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListenerMap listeners_;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Protects all fields below this one.
2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    mutable base::Lock lock_;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Whether the channel has been lost.
2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    bool lost_;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // A pool of valid mailbox names.
2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    std::vector<gpu::Mailbox> mailbox_name_pool_;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Number of pending mailbox requested from the GPU process.
2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    size_t requested_mailboxes_;
2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  };
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Threading notes: all fields are constant during the lifetime of |this|
2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // except:
2437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // - |next_transfer_buffer_id_|, atomic type
2441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // - |next_gpu_memory_buffer_id_|, atomic type
2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // - |proxies_|, protected by |context_lock_|
2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  GpuChannelHostFactory* const factory_;
2477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const int gpu_host_id_;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const gpu::GPUInfo gpu_info_;
2507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<IPC::SyncChannel> channel_;
2527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_refptr<MessageFilter> channel_filter_;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A filter for sending messages from thread other than the main thread.
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<IPC::SyncMessageFilter> sync_filter_;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Transfer buffer IDs are allocated in sequence.
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::AtomicSequenceNumber next_transfer_buffer_id_;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Gpu memory buffer IDs are allocated in sequence.
2611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  base::AtomicSequenceNumber next_gpu_memory_buffer_id_;
2621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Protects proxies_.
2647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  mutable base::Lock context_lock_;
2657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Used to look up a proxy from its routing id.
2667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  typedef base::hash_map<int, CommandBufferProxyImpl*> ProxyMap;
2677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ProxyMap proxies_;
2687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(GpuChannelHost);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_COMMON_GPU_CLIENT_GPU_CHANNEL_HOST_H_
275