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