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