// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_RENDERER_HOST_ACCELERATED_PLUGIN_VIEW_MAC_H
#define CHROME_BROWSER_RENDERER_HOST_ACCELERATED_PLUGIN_VIEW_MAC_H
#import <Cocoa/Cocoa.h>
#include <QuartzCore/QuartzCore.h>
#include "base/memory/scoped_nsobject.h"
#include "ui/gfx/native_widget_types.h"
class RenderWidgetHostViewMac;
// Informal protocol implemented by windows that need to be informed explicitly
// about underlay surfaces.
@interface NSObject (UnderlayableSurface)
- (void)underlaySurfaceAdded;
- (void)underlaySurfaceRemoved;
@end
// This subclass of NSView hosts the output of accelerated plugins on
// the page.
// This class takes a couple of locks, some indirectly. The lock hiearchy is:
// 1. The DisplayLink lock, implicit to the display link owned by this view.
// It is taken by the framework before |DrawOneAcceleratedPluginCallback()|
// is called, and during CVDisplayLink* function calls.
// 2. The CGL lock, taken explicitly.
// 3. The AcceleratedSurfaceContainerManagerMac's lock, which it takes when any
// of its methods are called.
//
// No code should ever try to acquire a lock further up in the hierarchy if it
// already owns a lower lock. For example, while the CGL lock is taken, no
// CVDisplayLink* functions must be called.
@interface AcceleratedPluginView : NSView {
scoped_nsobject<NSOpenGLPixelFormat> glPixelFormat_;
CGLPixelFormatObj cglPixelFormat_; // weak, backed by |glPixelFormat_|.
scoped_nsobject<NSOpenGLContext> glContext_;
CGLContextObj cglContext_; // weak, backed by |glContext_|.
CVDisplayLinkRef displayLink_; // Owned by us.
RenderWidgetHostViewMac* renderWidgetHostView_; // weak
gfx::PluginWindowHandle pluginHandle_; // weak
// The number of swap buffers calls that have been requested by the
// GPU process, or a monotonically increasing number of calls to
// updateSwapBuffersCount:fromRenderer:routeId: if the update came
// from an accelerated plugin.
uint64 swapBuffersCount_;
// The number of swap buffers calls that have been processed by the
// display link thread. This is only used with the GPU process
// update path.
volatile uint64 acknowledgedSwapBuffersCount_;
// Auxiliary information needed to formulate an acknowledgment to
// the GPU process. These are constant after the first message.
// These are all zero for updates coming from a plugin process.
volatile int rendererId_;
volatile int32 routeId_;
volatile int gpuHostId_;
// Cocoa methods can only be called on the main thread, so have a copy of the
// view's size, since it's required on the displaylink thread.
NSSize cachedSize_;
// Rects that should show web content rather than plugin content.
scoped_nsobject<NSArray> cutoutRects_;
// -globalFrameDidChange: can be called recursively, this counts how often it
// holds the CGL lock.
int globalFrameDidChangeCGLLockCount_;
}
- (id)initWithRenderWidgetHostViewMac:(RenderWidgetHostViewMac*)r
pluginHandle:(gfx::PluginWindowHandle)pluginHandle;
- (void)drawView;
// Sets the list of rectangles that should show the web page, rather than the
// accelerated plugin. This is used to simulate the iframe-based trick that web
// pages have long used to show web content above windowed plugins on Windows
// and Linux.
- (void)setCutoutRects:(NSArray*)cutout_rects;
// Updates the number of swap buffers calls that have been requested.
// This is currently called with non-zero values only in response to
// updates from the GPU process. For accelerated plugins, all zeros
// are passed, and the view takes this as a hint that no flow control
// or acknowledgment of the swap buffers are desired.
- (void)updateSwapBuffersCount:(uint64)count
fromRenderer:(int)rendererId
routeId:(int32)routeId
gpuHostId:(int)gpuHostId;
// NSViews autorelease subviews when they die. The RWHVMac gets destroyed when
// RHWVCocoa gets dealloc'd, which means the AcceleratedPluginView child views
// can be around a little longer than the RWHVMac. This is called when the
// RWHVMac is about to be deleted (but it's still valid while this method runs).
- (void)onRenderWidgetHostViewGone;
// This _must_ be atomic, since it's accessed from several threads.
@property NSSize cachedSize;
@end
#endif // CHROME_BROWSER_RENDERER_HOST_ACCELERATED_PLUGIN_VIEW_MAC_H