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"
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/common/gpu/gpu_result_codes.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/message_router.h"
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/config/gpu_info.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_channel_handle.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_sync_channel.h"
255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ipc/message_filter.h"
261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/gfx/gpu_memory_buffer.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;
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class WaitableEvent;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace IPC {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncMessageFilter;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace media {
46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass VideoDecodeAccelerator;
47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass VideoEncodeAccelerator;
48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CommandBufferProxyImpl;
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class GpuChannelHost;
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)  virtual ~GpuChannelHostFactory() {}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsMainThread() = 0;
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual base::MessageLoop* GetMainLoop() = 0;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual scoped_refptr<base::MessageLoopProxy> GetIOLoopProxy() = 0;
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual scoped_ptr<base::SharedMemory> AllocateSharedMemory(size_t size) = 0;
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual CreateCommandBufferResult CreateViewCommandBuffer(
71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      int32 surface_id,
72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      const GPUCreateCommandBufferConfig& init_params,
73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      int32 route_id) = 0;
741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual scoped_ptr<gfx::GpuMemoryBuffer> AllocateGpuMemoryBuffer(
751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      size_t width,
761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      size_t height,
77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      unsigned internalformat,
78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      unsigned usage) = 0;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Encapsulates an IPC channel between the client and one GPU process.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On the GPU process side there's a corresponding GpuChannel.
837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Every method can be called on any thread with a message loop, except for the
847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// IO thread.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GpuChannelHost : public IPC::Sender,
867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                       public base::RefCountedThreadSafe<GpuChannelHost> {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Must be called on the main thread (as defined by the factory).
897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  static scoped_refptr<GpuChannelHost> Create(
907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GpuChannelHostFactory* factory,
917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const gpu::GPUInfo& gpu_info,
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const IPC::ChannelHandle& channel_handle,
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      base::WaitableEvent* shutdown_event);
947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Returns true if |handle| is a valid GpuMemoryBuffer handle that
961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // can be shared to the GPU process.
971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  static bool IsValidGpuMemoryBuffer(gfx::GpuMemoryBufferHandle handle);
981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool IsLost() const {
1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    DCHECK(channel_filter_.get());
1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return channel_filter_->IsLost();
1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The GPU stats reported by the GPU process.
1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const gpu::GPUInfo& gpu_info() const { return gpu_info_; }
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IPC::Sender implementation:
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Send(IPC::Message* msg) OVERRIDE;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create and connect to a command buffer in the GPU process.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandBufferProxyImpl* CreateViewCommandBuffer(
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int32 surface_id,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CommandBufferProxyImpl* share_group,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<int32>& attribs,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& active_url,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::GpuPreference gpu_preference);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create and connect to a command buffer in the GPU process.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandBufferProxyImpl* CreateOffscreenCommandBuffer(
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const gfx::Size& size,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CommandBufferProxyImpl* share_group,
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(
128c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      int command_buffer_route_id);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Creates a video encoder in the GPU process.
131c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_ptr<media::VideoEncodeAccelerator> CreateVideoEncoder(
132c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      int command_buffer_route_id);
1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Destroy a command buffer created by this channel.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DestroyCommandBuffer(CommandBufferProxyImpl* command_buffer);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a route for the current message loop.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddRoute(int route_id, base::WeakPtr<IPC::Listener> listener);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveRoute(int route_id);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuChannelHostFactory* factory() const { return factory_; }
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns a handle to the shared memory that can be sent via IPC to the
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // GPU process. The caller is responsible for ensuring it is closed. Returns
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // an invalid handle on failure.
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::SharedMemoryHandle ShareToGpuProcess(
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::SharedMemoryHandle source_handle);
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Reserve one unused transfer buffer ID.
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32 ReserveTransferBufferId();
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Returns a GPU memory buffer handle to the buffer that can be sent via
1531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // IPC to the GPU process. The caller is responsible for ensuring it is
1541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // closed. Returns an invalid handle on failure.
1551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  gfx::GpuMemoryBufferHandle ShareGpuMemoryBufferToGpuProcess(
1561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      gfx::GpuMemoryBufferHandle source_handle);
1571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Reserve one unused gpu memory buffer ID.
1591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  int32 ReserveGpuMemoryBufferId();
1601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
161c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Generate a route ID guaranteed to be unique for this channel.
162c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  int32 GenerateRouteID();
163c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCountedThreadSafe<GpuChannelHost>;
1667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  GpuChannelHost(GpuChannelHostFactory* factory,
1677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 const gpu::GPUInfo& gpu_info);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~GpuChannelHost();
169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void Connect(const IPC::ChannelHandle& channel_handle,
170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               base::WaitableEvent* shutdown_event);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A filter used internally to route incoming messages from the IO thread
1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // to the correct message loop. It also maintains some shared state between
1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // all the contexts.
1755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  class MessageFilter : public IPC::MessageFilter {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    MessageFilter();
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Called on the IO thread.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void AddRoute(int route_id,
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  base::WeakPtr<IPC::Listener> listener,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  scoped_refptr<base::MessageLoopProxy> loop);
1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Called on the IO thread.
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void RemoveRoute(int route_id);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    // IPC::MessageFilter implementation
1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // (called on the IO thread):
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnChannelError() OVERRIDE;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // The following methods can be called on any thread.
1927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Whether the channel is lost.
1947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    bool IsLost() const;
1957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~MessageFilter();
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Threading notes: |listeners_| is only accessed on the IO thread. Every
2007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // other field is protected by |lock_|.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typedef base::hash_map<int, GpuListenerInfo> ListenerMap;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListenerMap listeners_;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Protects all fields below this one.
2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    mutable base::Lock lock_;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // Whether the channel has been lost.
2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    bool lost_;
2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  };
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Threading notes: all fields are constant during the lifetime of |this|
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // except:
2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // - |next_transfer_buffer_id_|, atomic type
2141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // - |next_gpu_memory_buffer_id_|, atomic type
215c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // - |next_route_id_|, atomic type
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // - |proxies_|, protected by |context_lock_|
2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  GpuChannelHostFactory* const factory_;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const gpu::GPUInfo gpu_info_;
2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<IPC::SyncChannel> channel_;
2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_refptr<MessageFilter> channel_filter_;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A filter for sending messages from thread other than the main thread.
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<IPC::SyncMessageFilter> sync_filter_;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Transfer buffer IDs are allocated in sequence.
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::AtomicSequenceNumber next_transfer_buffer_id_;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Gpu memory buffer IDs are allocated in sequence.
2311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  base::AtomicSequenceNumber next_gpu_memory_buffer_id_;
2321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
233c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Route IDs are allocated in sequence.
234c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  base::AtomicSequenceNumber next_route_id_;
235c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Protects proxies_.
2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  mutable base::Lock context_lock_;
2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Used to look up a proxy from its routing id.
2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  typedef base::hash_map<int, CommandBufferProxyImpl*> ProxyMap;
2407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ProxyMap proxies_;
2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(GpuChannelHost);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_COMMON_GPU_CLIENT_GPU_CHANNEL_HOST_H_
248