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