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