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_MANAGER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_COMMON_GPU_GPU_CHANNEL_MANAGER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <deque>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/containers/scoped_ptr_hash_map.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"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h"
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/common/gpu/devtools_gpu_instrumentation.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/gpu_memory_manager.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_listener.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_sender.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_surface.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WaitableEvent;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GLShareGroup;
31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)struct GpuMemoryBufferHandle;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MailboxManager;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProgramCache;
38c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass ShaderTranslatorCache;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace IPC {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ChannelHandle;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct GPUCreateCommandBufferConfig;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GpuChannel;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GpuWatchdog;
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class MessageRouter;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncPointManager;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A GpuChannelManager is a thread responsible for issuing rendering commands
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// managing the lifetimes of GPU channels and forwarding IPC requests from the
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// browser process to them based on the corresponding renderer ID.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GpuChannelManager : public IPC::Listener,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          public IPC::Sender {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GpuChannelManager(MessageRouter* router,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    GpuWatchdog* watchdog,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    base::MessageLoopProxy* io_message_loop,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    base::WaitableEvent* shutdown_event);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~GpuChannelManager();
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove the channel for a particular renderer.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveChannel(int client_id);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Listener overrides.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sender overrides.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Send(IPC::Message* msg) OVERRIDE;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool HandleMessagesScheduled();
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint64 MessagesProcessed();
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void LoseAllContexts();
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<GpuChannelManager> weak_factory_;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int GenerateRouteID();
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddRoute(int32 routing_id, IPC::Listener* listener);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveRoute(int32 routing_id);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gpu::gles2::ProgramCache* program_cache();
87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  gpu::gles2::ShaderTranslatorCache* shader_translator_cache();
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuMemoryManager* gpu_memory_manager() { return &gpu_memory_manager_; }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GpuEventsDispatcher* gpu_devtools_events_dispatcher() {
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return &gpu_devtools_events_dispatcher_;
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuChannel* LookupChannel(int32 client_id);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SyncPointManager* sync_point_manager() { return sync_point_manager_.get(); }
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::GLSurface* GetDefaultOffscreenSurface();
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct ImageOperation {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ImageOperation(int32 sync_point, base::Closure callback);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~ImageOperation();
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32 sync_point;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Closure callback;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  typedef base::ScopedPtrHashMap<int, GpuChannel> GpuChannelMap;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::deque<ImageOperation*> ImageOperationQueue;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Message handlers.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnEstablishChannel(int client_id, bool share_context);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCloseChannel(const IPC::ChannelHandle& channel_handle);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnVisibilityChanged(
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int32 render_view_id, int32 client_id, bool visible);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCreateViewCommandBuffer(
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const gfx::GLSurfaceHandle& window,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int32 render_view_id,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int32 client_id,
121c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      const GPUCreateCommandBufferConfig& init_params,
122c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      int32 route_id);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CreateImage(
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::PluginWindowHandle window, int32 client_id, int32 image_id);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCreateImage(
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::PluginWindowHandle window, int32 client_id, int32 image_id);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteImage(int32 client_id, int32 image_id);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnDeleteImage(int32 client_id, int32 image_id, int32 sync_point);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnDeleteImageSyncPointRetired(ImageOperation*);
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnLoadedShader(std::string shader);
131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void OnCreateGpuMemoryBuffer(const gfx::GpuMemoryBufferHandle& handle,
132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                               const gfx::Size& size,
133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                               unsigned internalformat,
134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                               unsigned usage);
135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void OnDestroyGpuMemoryBuffer(const gfx::GpuMemoryBufferHandle& handle,
136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                int32 sync_point);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnLoseAllContexts();
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::MessageLoopProxy> io_message_loop_;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WaitableEvent* shutdown_event_;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to send and receive IPC messages from the browser process.
144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MessageRouter* const router_;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These objects manage channels to individual renderer processes there is
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // one channel for each renderer process that has connected to this GPU
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // process.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuChannelMap gpu_channels_;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<gfx::GLShareGroup> share_group_;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<gpu::gles2::MailboxManager> mailbox_manager_;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuMemoryManager gpu_memory_manager_;
153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GpuEventsDispatcher gpu_devtools_events_dispatcher_;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuWatchdog* watchdog_;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SyncPointManager> sync_point_manager_;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<gpu::gles2::ProgramCache> program_cache_;
157c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_refptr<gpu::gles2::ShaderTranslatorCache> shader_translator_cache_;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<gfx::GLSurface> default_offscreen_surface_;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ImageOperationQueue image_operations_;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(GpuChannelManager);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_COMMON_GPU_GPU_CHANNEL_MANAGER_H_
167