compositing_iosurface_context_mac.h revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/renderer_host/display_link_mac.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
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public base::RefCounted<CompositingIOSurfaceContext> {
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  enum { kOffscreenContextWindowNumber = -2 };
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Get or create a GL context for the specified window with the specified
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // surface ordering. Share these GL contexts as much as possible because
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // creating and destroying them can be expensive
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // http://crbug.com/180463
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  static scoped_refptr<CompositingIOSurfaceContext> Get(int window_number);
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Mark that all the currently existing GL contexts shouldn't be returned
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // anymore by Get, but rather, new contexts should be created. This is
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // called as a precaution when unexpected GL errors occur.
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  static void MarkExistingContextsAsNotShareable();
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CompositingIOSurfaceShaderPrograms* shader_program_cache() const {
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return shader_program_cache_.get();
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NSOpenGLContext* nsgl_context() const;
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CGLContextObj cgl_context() const { return cgl_context_; }
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool is_vsync_disabled() const { return is_vsync_disabled_; }
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int window_number() const { return window_number_; }
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool IsVendorIntel();
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DisplayLinkMac* display_link() { return display_link_; }
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  friend class base::RefCounted<CompositingIOSurfaceContext>;
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CompositingIOSurfaceContext(
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      int window_number,
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NSOpenGLContext* nsgl_context,
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::ScopedTypeRef<CGLContextObj> clg_context_strong,
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CGLContextObj clg_context,
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      bool is_vsync_disabled_,
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      scoped_refptr<DisplayLinkMac> display_link,
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      scoped_ptr<CompositingIOSurfaceShaderPrograms> shader_program_cache);
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ~CompositingIOSurfaceContext();
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int window_number_;
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::scoped_nsobject<NSOpenGLContext> nsgl_context_;
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ScopedTypeRef<CGLContextObj> cgl_context_strong_;
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Weak, backed by |nsgl_context_| or |cgl_context_strong_|.
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CGLContextObj cgl_context_;
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool is_vsync_disabled_;
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<CompositingIOSurfaceShaderPrograms> shader_program_cache_;
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool can_be_shared_;
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool initialized_is_intel_;
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool is_intel_;
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GLint screen_;
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Display link for getting vsync info.
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<DisplayLinkMac> display_link_;
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (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