Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1271)

Unified Diff: chrome/browser/renderer_host/accelerated_plugin_view_mac.mm

Issue 6993043: Fix the mac hangup when force-compositing-mode is enabled (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: split raf-stall fix Created 9 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/renderer_host/accelerated_plugin_view_mac.mm
diff --git a/chrome/browser/renderer_host/accelerated_plugin_view_mac.mm b/chrome/browser/renderer_host/accelerated_plugin_view_mac.mm
index 82638b6ba48ace0e12344a09a76e4b2034a0f8c4..d4a59365b2988f7280d24f34150af39e2a393ef6 100644
--- a/chrome/browser/renderer_host/accelerated_plugin_view_mac.mm
+++ b/chrome/browser/renderer_host/accelerated_plugin_view_mac.mm
@@ -6,64 +6,22 @@
#include "base/command_line.h"
#include "base/debug/trace_event.h"
-#import "base/mac/scoped_nsautorelease_pool.h"
#include "chrome/browser/renderer_host/render_widget_host_view_mac.h"
#include "chrome/common/chrome_switches.h"
+#include "content/browser/browser_thread.h"
#include "ui/gfx/gl/gl_switches.h"
#include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h"
@implementation AcceleratedPluginView
-@synthesize cachedSize = cachedSize_;
-
-- (CVReturn)getFrameForTime:(const CVTimeStamp*)outputTime {
- // There is no autorelease pool when this method is called because it will be
- // called from a background thread.
- base::mac::ScopedNSAutoreleasePool pool;
-
- bool sendAck = (rendererId_ != 0 || routeId_ != 0);
- uint64 currentSwapBuffersCount = swapBuffersCount_;
- if (currentSwapBuffersCount == acknowledgedSwapBuffersCount_) {
- return kCVReturnSuccess;
- }
-
- [self drawView];
-
- acknowledgedSwapBuffersCount_ = currentSwapBuffersCount;
- if (sendAck && renderWidgetHostView_) {
- renderWidgetHostView_->AcknowledgeSwapBuffers(
- rendererId_,
- routeId_,
- gpuHostId_,
- acknowledgedSwapBuffersCount_);
- }
-
- return kCVReturnSuccess;
-}
-
-// This is the renderer output callback function
-static CVReturn DrawOneAcceleratedPluginCallback(
- CVDisplayLinkRef displayLink,
- const CVTimeStamp* now,
- const CVTimeStamp* outputTime,
- CVOptionFlags flagsIn,
- CVOptionFlags* flagsOut,
- void* displayLinkContext) {
- CVReturn result =
- [(AcceleratedPluginView*)displayLinkContext getFrameForTime:outputTime];
- return result;
-}
- (id)initWithRenderWidgetHostViewMac:(RenderWidgetHostViewMac*)r
pluginHandle:(gfx::PluginWindowHandle)pluginHandle {
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
if ((self = [super initWithFrame:NSZeroRect])) {
+ TRACE_EVENT0("browser",
+ "AcceleratedPluginView::initWithRenderWidgetHostViewMac");
renderWidgetHostView_ = r;
pluginHandle_ = pluginHandle;
- cachedSize_ = NSZeroSize;
- swapBuffersCount_ = 0;
- acknowledgedSwapBuffersCount_ = 0;
- rendererId_ = 0;
- routeId_ = 0;
- gpuHostId_ = 0;
[self setAutoresizingMask:NSViewMaxXMargin|NSViewMinYMargin];
@@ -90,15 +48,11 @@ static CVReturn DrawOneAcceleratedPluginCallback(
else
swapInterval = 1;
[glContext_ setValues:&swapInterval forParameter:NSOpenGLCPSwapInterval];
-
- // Set up a display link to do OpenGL rendering on a background thread.
- CVDisplayLinkCreateWithActiveCGDisplays(&displayLink_);
}
return self;
}
- (void)dealloc {
- CVDisplayLinkRelease(displayLink_);
if (renderWidgetHostView_)
renderWidgetHostView_->DeallocFakePluginWindowHandle(pluginHandle_);
[[NSNotificationCenter defaultCenter] removeObserver:self];
@@ -106,55 +60,36 @@ static CVReturn DrawOneAcceleratedPluginCallback(
}
- (void)drawView {
- TRACE_EVENT1("browser", "AcceleratedPluginViewMac::drawView",
- "frameNum", swapBuffersCount_);
- // Called on a background thread. Synchronized via the CGL context lock.
- CGLLockContext(cglContext_);
-
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ TRACE_EVENT0("browser", "AcceleratedPluginViewMac::drawView");
+ // Called on the UI thread.
if (renderWidgetHostView_) {
// TODO(thakis): Pixel or view coordinates for size?
+ NSRect frame = [self frame];
Nico 2011/06/08 16:52:46 no need for a variable
jbates 2011/06/08 17:54:42 Done.
renderWidgetHostView_->DrawAcceleratedSurfaceInstance(
- cglContext_, pluginHandle_, [self cachedSize]);
+ cglContext_, pluginHandle_, frame.size);
}
CGLFlushDrawable(cglContext_);
CGLSetCurrentContext(0);
- CGLUnlockContext(cglContext_);
}
- (void)setCutoutRects:(NSArray*)cutout_rects {
cutoutRects_.reset([cutout_rects copy]);
}
-- (void)updateSwapBuffersCount:(uint64)count
- fromRenderer:(int)rendererId
- routeId:(int32)routeId
- gpuHostId:(int)gpuHostId {
- if (rendererId == 0 && routeId == 0) {
- // This notification is coming from a plugin process, for which we
- // don't have flow control implemented right now. Fake up a swap
- // buffers count so that we can at least skip useless renders.
- ++swapBuffersCount_;
- } else {
- rendererId_ = rendererId;
- routeId_ = routeId;
- gpuHostId_ = gpuHostId;
- swapBuffersCount_ = count;
- }
-}
-
- (void)onRenderWidgetHostViewGone {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
if (!renderWidgetHostView_)
return;
- CGLLockContext(cglContext_);
// Deallocate the plugin handle while we still can.
renderWidgetHostView_->DeallocFakePluginWindowHandle(pluginHandle_);
renderWidgetHostView_ = NULL;
- CGLUnlockContext(cglContext_);
}
- (void)drawRect:(NSRect)rect {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
const NSRect* dirtyRects;
int dirtyRectCount;
[self getRectsBeingDrawn:&dirtyRects count:&dirtyRectCount];
@@ -203,8 +138,8 @@ static CVReturn DrawOneAcceleratedPluginCallback(
}
- (void)globalFrameDidChange:(NSNotification*)notification {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
globalFrameDidChangeCGLLockCount_++;
- CGLLockContext(cglContext_);
// This call to -update can call -globalFrameDidChange: again, see
// http://crbug.com/55754 comments 22 and 24.
[glContext_ update];
@@ -215,14 +150,7 @@ static CVReturn DrawOneAcceleratedPluginCallback(
glViewport(0, 0, size.width, size.height);
CGLSetCurrentContext(0);
- CGLUnlockContext(cglContext_);
globalFrameDidChangeCGLLockCount_--;
-
- if (globalFrameDidChangeCGLLockCount_ == 0) {
- // Make sure the view is synchronized with the correct display.
- CVDisplayLinkSetCurrentCGDisplayFromOpenGLContext(
- displayLink_, cglContext_, cglPixelFormat_);
- }
}
- (void)renewGState {
@@ -235,8 +163,7 @@ static CVReturn DrawOneAcceleratedPluginCallback(
- (void)lockFocus {
[super lockFocus];
- // If we're using OpenGL, make sure it is connected and that the display link
- // is running.
+ // If we're using OpenGL, make sure it is connected.
if ([glContext_ view] != self) {
[glContext_ setView:self];
@@ -245,25 +172,12 @@ static CVReturn DrawOneAcceleratedPluginCallback(
selector:@selector(globalFrameDidChange:)
name:NSViewGlobalFrameDidChangeNotification
object:self];
- CVDisplayLinkSetOutputCallback(
- displayLink_, &DrawOneAcceleratedPluginCallback, self);
- CVDisplayLinkSetCurrentCGDisplayFromOpenGLContext(
- displayLink_, cglContext_, cglPixelFormat_);
- CVDisplayLinkStart(displayLink_);
}
[glContext_ makeCurrentContext];
}
- (void)viewWillMoveToWindow:(NSWindow*)newWindow {
- // Stop the display link thread while the view is not visible.
- if (newWindow) {
- if (displayLink_ && !CVDisplayLinkIsRunning(displayLink_))
- CVDisplayLinkStart(displayLink_);
- } else {
- if (displayLink_ && CVDisplayLinkIsRunning(displayLink_))
- CVDisplayLinkStop(displayLink_);
- }
-
+ TRACE_EVENT0("renderer", "viewWillMoveToWindow");
// Inform the window hosting this accelerated view that it needs to be
// transparent.
if (![self isHiddenOrHasHiddenAncestor]) {
@@ -292,12 +206,10 @@ static CVReturn DrawOneAcceleratedPluginCallback(
- (void)setFrame:(NSRect)frameRect {
TRACE_EVENT0("browser", "AcceleratedPluginViewMac::setFrame");
- [self setCachedSize:frameRect.size];
[super setFrame:frameRect];
}
Nico 2011/06/08 16:52:46 If you don't need the trace output, remove this me
jbates 2011/06/08 17:54:42 Done.
- (void)setFrameSize:(NSSize)newSize {
- [self setCachedSize:newSize];
[super setFrameSize:newSize];
}
Nico 2011/06/08 16:52:46 Remove this method?
jbates 2011/06/08 17:54:42 Done.

Powered by Google App Engine
This is Rietveld 408576698