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_GPU_CHANNEL_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_COMMON_GPU_GPU_CHANNEL_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <deque> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/id_map.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/memory/scoped_vector.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 1658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "base/process/process.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/gpu_command_buffer_stub.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/gpu_memory_manager.h" 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/common/gpu/gpu_result_codes.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/message_router.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_sync_channel.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_share_group.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gpu_preference.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct GPUCreateCommandBufferConfig; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MessageLoopProxy; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WaitableEvent; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu { 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PreemptionFlag; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace IPC { 405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass MessageFilter; 415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class DevToolsGpuAgent; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GpuChannelManager; 463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class GpuChannelMessageFilter; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GpuWatchdog; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Encapsulates an IPC channel between the GPU process and one renderer 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// process. On the renderer side there's a corresponding GpuChannelHost. 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class GpuChannel : public IPC::Listener, public IPC::Sender { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Takes ownership of the renderer process handle. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuChannel(GpuChannelManager* gpu_channel_manager, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuWatchdog* watchdog, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::GLShareGroup* share_group, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpu::gles2::MailboxManager* mailbox_manager, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int client_id, 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool software, 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool allow_future_sync_points); 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual ~GpuChannel(); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void Init(base::MessageLoopProxy* io_message_loop, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WaitableEvent* shutdown_event); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the GpuChannelManager that owns this channel. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuChannelManager* gpu_channel_manager() const { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gpu_channel_manager_; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the name of the associated IPC channel. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string GetChannelName(); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int TakeRendererFileDescriptor(); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_POSIX) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::ProcessId renderer_pid() const { return channel_->GetPeerPID(); } 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 804ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch int client_id() const { return client_id_; } 814ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 82424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) scoped_refptr<base::MessageLoopProxy> io_message_loop() const { 83424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return io_message_loop_; 84424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 85424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IPC::Listener implementation: 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnChannelError() OVERRIDE; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IPC::Sender implementation: 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Send(IPC::Message* msg) OVERRIDE; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Requeue the message that is currently being processed to the beginning of 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the queue. Used when the processing of a message gets aborted because of 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // unscheduling conditions. 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RequeueMessage(); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is called when a command buffer transitions from the unscheduled 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // state to the scheduled state, which potentially means the channel 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // transitions from the unscheduled to the scheduled state. When this occurs 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // deferred IPC messaged are handled. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnScheduled(); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This is called when a command buffer transitions between scheduled and 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // descheduled states. When any stub is descheduled, we stop preempting 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // other channels. 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void StubSchedulingChanged(bool scheduled); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CreateCommandBufferResult CreateViewCommandBuffer( 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::GLSurfaceHandle& window, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 surface_id, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GPUCreateCommandBufferConfig& init_params, 113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int32 route_id); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::GLShareGroup* share_group() const { return share_group_.get(); } 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuCommandBufferStub* LookupCommandBuffer(int32 route_id); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LoseAllContexts(); 1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void MarkAllContextsLost(); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 122c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Called to add a listener for a particular message routing ID. 123c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Returns true if succeeded. 124c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool AddRoute(int32 route_id, IPC::Listener* listener); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 126c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Called to remove a listener for a particular message routing ID. 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveRoute(int32 route_id); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gpu::PreemptionFlag* GetPreemptionFlag(); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool handle_messages_scheduled() const { return handle_messages_scheduled_; } 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint64 messages_processed() const { return messages_processed_; } 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If |preemption_flag->IsSet()|, any stub on this channel 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should stop issuing GL commands. Setting this to NULL stops deferral. 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetPreemptByFlag( 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<gpu::PreemptionFlag> preemption_flag); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CacheShader(const std::string& key, const std::string& shader); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void AddFilter(IPC::MessageFilter* filter); 1425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void RemoveFilter(IPC::MessageFilter* filter); 143424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 144effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch uint64 GetMemoryUsage(); 145effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool allow_future_sync_points() const { return allow_future_sync_points_; } 147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class GpuChannelMessageFilter; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnDestroy(); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool OnControlMessageReceived(const IPC::Message& msg); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void HandleMessage(); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Message handlers. 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnCreateOffscreenCommandBuffer( 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& size, 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GPUCreateCommandBufferConfig& init_params, 161c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int32 route_id, 162c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool* succeeded); 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnDestroyCommandBuffer(int32 route_id); 164c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void OnDevToolsStartEventsRecording(int32 route_id, bool* succeeded); 165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void OnDevToolsStopEventsRecording(); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Decrement the count of unhandled IPC messages and defer preemption. 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void MessageProcessed(); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Try to match the messages pattern for GL SwapBuffers operation in the 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // deferred message queue starting from the current processing message. 1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Return the number of messages that matches the given pattern, e.g. 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // AsyncFlush -> Echo sequence. 1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t MatchSwapBufferMessagesPattern(IPC::Message* current_message); 1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The lifetime of objects of this class is managed by a GpuChannelManager. 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The GpuChannelManager destroy all the GpuChannels that they own when they 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are destroyed. So a raw pointer is safe. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuChannelManager* gpu_channel_manager_; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<IPC::SyncChannel> channel_; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint64 messages_processed_; 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Whether the processing of IPCs on this channel is stalled and we should 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // preempt other GpuChannels. 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<gpu::PreemptionFlag> preempting_flag_; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If non-NULL, all stubs on this channel should stop processing GL 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // commands (via their GpuScheduler) when preempted_flag_->IsSet() 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<gpu::PreemptionFlag> preempted_flag_; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::deque<IPC::Message*> deferred_messages_; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The id of the client who is on the other side of the channel. 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int client_id_; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Uniquely identifies the channel within this GPU process. 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string channel_id_; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to implement message routing functionality to CommandBuffer objects 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageRouter router_; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The share group that all contexts associated with a particular renderer 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // process use. 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<gfx::GLShareGroup> share_group_; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<gpu::gles2::MailboxManager> mailbox_manager_; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef IDMap<GpuCommandBufferStub, IDMapOwnPointer> StubMap; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StubMap stubs_; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool log_messages_; // True if we should log sent and received messages. 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gpu::gles2::DisallowedFeatures disallowed_features_; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GpuWatchdog* watchdog_; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool software_; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handle_messages_scheduled_; 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC::Message* currently_processing_message_; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<GpuChannelMessageFilter> filter_; 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::MessageLoopProxy> io_message_loop_; 222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<DevToolsGpuAgent> devtools_gpu_agent_; 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t num_stubs_descheduled_; 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool allow_future_sync_points_; 227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Member variables should appear before the WeakPtrFactory, to ensure 2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // that any WeakPtrs to Controller are invalidated before its members 2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // variable's destructors are executed, rendering them invalid. 2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::WeakPtrFactory<GpuChannel> weak_factory_; 2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(GpuChannel); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CONTENT_COMMON_GPU_GPU_CHANNEL_H_ 239