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