compositing_iosurface_context_mac.h revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef CONTENT_BROWSER_RENDERER_HOST_COMPOSITING_IOSURFACE_CONTEXT_MAC_H_
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define CONTENT_BROWSER_RENDERER_HOST_COMPOSITING_IOSURFACE_CONTEXT_MAC_H_
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#import <AppKit/NSOpenGL.h>
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <OpenGL/OpenGL.h>
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <map>
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/basictypes.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/lazy_instance.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/mac/scoped_nsobject.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/ref_counted.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
17c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/public/browser/gpu_data_manager_observer.h"
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gl/scoped_cgl.h"
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace content {
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)enum CoreAnimationStatus {
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CORE_ANIMATION_DISABLED,
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CORE_ANIMATION_ENABLED,
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)CoreAnimationStatus GetCoreAnimationStatus();
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class CompositingIOSurfaceShaderPrograms;
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class CompositingIOSurfaceContext
31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    : public base::RefCounted<CompositingIOSurfaceContext>,
32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      public content::GpuDataManagerObserver {
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
3423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  enum {
3523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // The number used to look up the context used for async readback and for
3623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // initializing the IOSurface.
3723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    kOffscreenContextWindowNumber = -2,
3823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // The number used to look up the context used by CAOpenGLLayers.
3923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    kCALayerContextWindowNumber = -3,
4023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  };
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Get or create a GL context for the specified window with the specified
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // surface ordering. Share these GL contexts as much as possible because
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // creating and destroying them can be expensive
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // http://crbug.com/180463
46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  static scoped_refptr<CompositingIOSurfaceContext> Get(int window_number);
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Mark that all the GL contexts in the same sharegroup as this context as
49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // invalid, so they shouldn't be returned anymore by Get, but rather, new
50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // contexts should be created. This is called as a precaution when unexpected
51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // GL errors occur.
52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void PoisonContextAndSharegroup();
53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool HasBeenPoisoned() const { return poisoned_; }
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CompositingIOSurfaceShaderPrograms* shader_program_cache() const {
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return shader_program_cache_.get();
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NSOpenGLContext* nsgl_context() const;
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CGLContextObj cgl_context() const { return cgl_context_; }
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool is_vsync_disabled() const { return is_vsync_disabled_; }
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int window_number() const { return window_number_; }
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // content::GpuDataManagerObserver implementation.
64c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void OnGpuSwitching() OVERRIDE;
65c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  friend class base::RefCounted<CompositingIOSurfaceContext>;
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CompositingIOSurfaceContext(
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      int window_number,
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NSOpenGLContext* nsgl_context,
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::ScopedTypeRef<CGLContextObj> clg_context_strong,
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CGLContextObj clg_context,
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      bool is_vsync_disabled_,
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scoped_ptr<CompositingIOSurfaceShaderPrograms> shader_program_cache);
76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual ~CompositingIOSurfaceContext();
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int window_number_;
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::scoped_nsobject<NSOpenGLContext> nsgl_context_;
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ScopedTypeRef<CGLContextObj> cgl_context_strong_;
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Weak, backed by |nsgl_context_| or |cgl_context_strong_|.
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CGLContextObj cgl_context_;
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool is_vsync_disabled_;
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<CompositingIOSurfaceShaderPrograms> shader_program_cache_;
86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool poisoned_;
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The global map from window number and window ordering to
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // context data.
90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  typedef std::map<int, CompositingIOSurfaceContext*> WindowMap;
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static base::LazyInstance<WindowMap> window_map_;
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static WindowMap* window_map();
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace content
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // CONTENT_BROWSER_RENDERER_HOST_COMPOSITING_IOSURFACE_CONTEXT_MAC_H_
98