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)
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class CompositingIOSurfaceContext
23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    : public base::RefCounted<CompositingIOSurfaceContext>,
24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      public content::GpuDataManagerObserver {
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
2623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  enum {
2723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // The number used to look up the context used for async readback and for
2823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // initializing the IOSurface.
2923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    kOffscreenContextWindowNumber = -2,
3023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // The number used to look up the context used by CAOpenGLLayers.
3123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    kCALayerContextWindowNumber = -3,
3223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  };
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Get or create a GL context for the specified window with the specified
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // surface ordering. Share these GL contexts as much as possible because
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // creating and destroying them can be expensive
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // http://crbug.com/180463
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  static scoped_refptr<CompositingIOSurfaceContext> Get(int window_number);
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Mark that all the GL contexts in the same sharegroup as this context as
41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // invalid, so they shouldn't be returned anymore by Get, but rather, new
42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // contexts should be created. This is called as a precaution when unexpected
43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // GL errors occur.
44effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void PoisonContextAndSharegroup();
45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool HasBeenPoisoned() const { return poisoned_; }
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CGLContextObj cgl_context() const { return cgl_context_; }
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int window_number() const { return window_number_; }
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // content::GpuDataManagerObserver implementation.
51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void OnGpuSwitching() OVERRIDE;
52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  friend class base::RefCounted<CompositingIOSurfaceContext>;
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CompositingIOSurfaceContext(
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      int window_number,
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::ScopedTypeRef<CGLContextObj> clg_context_strong,
5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      CGLContextObj clg_context);
60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual ~CompositingIOSurfaceContext();
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int window_number_;
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ScopedTypeRef<CGLContextObj> cgl_context_strong_;
64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Weak, backed by |cgl_context_strong_|.
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CGLContextObj cgl_context_;
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool poisoned_;
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The global map from window number and window ordering to
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // context data.
71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  typedef std::map<int, CompositingIOSurfaceContext*> WindowMap;
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static base::LazyInstance<WindowMap> window_map_;
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static WindowMap* window_map();
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace content
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // CONTENT_BROWSER_RENDERER_HOST_COMPOSITING_IOSURFACE_CONTEXT_MAC_H_
79