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