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