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

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: disabled CVDisplayLink code, seems to work 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..da4f7bb91efce8011cace8e58807675585eec1c1 100644
--- a/chrome/browser/renderer_host/accelerated_plugin_view_mac.mm
+++ b/chrome/browser/renderer_host/accelerated_plugin_view_mac.mm
@@ -16,6 +16,9 @@
@synthesize cachedSize = cachedSize_;
- (CVReturn)getFrameForTime:(const CVTimeStamp*)outputTime {
+ TRACE_EVENT2("browser", "AcceleratedPluginView::getFrameForTime",
+ "swapBuffersCount_", swapBuffersCount_,
+ "acknowledgedSwapBuffersCount_", acknowledgedSwapBuffersCount_);
// There is no autorelease pool when this method is called because it will be
// called from a background thread.
base::mac::ScopedNSAutoreleasePool pool;
@@ -40,22 +43,24 @@
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;
-}
+///// 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 {
if ((self = [super initWithFrame:NSZeroRect])) {
+ TRACE_EVENT0("browser",
+ "AcceleratedPluginView::initWithRenderWidgetHostViewMac");
renderWidgetHostView_ = r;
pluginHandle_ = pluginHandle;
cachedSize_ = NSZeroSize;
@@ -91,16 +96,28 @@ static CVReturn DrawOneAcceleratedPluginCallback(
swapInterval = 1;
[glContext_ setValues:&swapInterval forParameter:NSOpenGLCPSwapInterval];
- // Set up a display link to do OpenGL rendering on a background thread.
- CVDisplayLinkCreateWithActiveCGDisplays(&displayLink_);
+/// // Set up a display link to do OpenGL rendering on a background thread.
+/// CVDisplayLinkCreateWithActiveCGDisplays(&displayLink_);
}
return self;
}
- (void)dealloc {
- CVDisplayLinkRelease(displayLink_);
- if (renderWidgetHostView_)
+///CVDisplayLinkRelease(displayLink_);
+ if (renderWidgetHostView_) {
+ bool sendAck = (rendererId_ != 0 || routeId_ != 0) &&
+ (swapBuffersCount_ != acknowledgedSwapBuffersCount_);
+ if (sendAck) {
+ // Prevent deadlock issues if the GPU process is expecting an ack of the
+ // SwapBuffers.
+ renderWidgetHostView_->AcknowledgeSwapBuffers(
+ rendererId_,
+ routeId_,
+ gpuHostId_,
+ swapBuffersCount_);
+ }
renderWidgetHostView_->DeallocFakePluginWindowHandle(pluginHandle_);
+ }
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
}
@@ -130,6 +147,8 @@ static CVReturn DrawOneAcceleratedPluginCallback(
fromRenderer:(int)rendererId
routeId:(int32)routeId
gpuHostId:(int)gpuHostId {
+ TRACE_EVENT2("browser", "AcceleratedPluginView::updateSwapBuffersCount",
+ "routeId", routeId, "count", count);
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
@@ -141,6 +160,7 @@ static CVReturn DrawOneAcceleratedPluginCallback(
gpuHostId_ = gpuHostId;
swapBuffersCount_ = count;
}
+ [self getFrameForTime:NULL];
}
- (void)onRenderWidgetHostViewGone {
@@ -218,11 +238,11 @@ static CVReturn DrawOneAcceleratedPluginCallback(
CGLUnlockContext(cglContext_);
globalFrameDidChangeCGLLockCount_--;
- if (globalFrameDidChangeCGLLockCount_ == 0) {
- // Make sure the view is synchronized with the correct display.
- CVDisplayLinkSetCurrentCGDisplayFromOpenGLContext(
- displayLink_, cglContext_, cglPixelFormat_);
- }
+///if (globalFrameDidChangeCGLLockCount_ == 0) {
+/// // Make sure the view is synchronized with the correct display.
+/// CVDisplayLinkSetCurrentCGDisplayFromOpenGLContext(
+/// displayLink_, cglContext_, cglPixelFormat_);
+///}
}
- (void)renewGState {
@@ -245,24 +265,30 @@ static CVReturn DrawOneAcceleratedPluginCallback(
selector:@selector(globalFrameDidChange:)
name:NSViewGlobalFrameDidChangeNotification
object:self];
- CVDisplayLinkSetOutputCallback(
- displayLink_, &DrawOneAcceleratedPluginCallback, self);
- CVDisplayLinkSetCurrentCGDisplayFromOpenGLContext(
- displayLink_, cglContext_, cglPixelFormat_);
- CVDisplayLinkStart(displayLink_);
+/// 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_EVENT1("renderer", "viewWillMoveToWindow",
+ "newWindow", newWindow);
+///if (newWindow) {
+/// if (displayLink_ && !CVDisplayLinkIsRunning(displayLink_)) {
+/// TRACE_EVENT0("renderer", "CVDisplayLinkStart");
+/// CVDisplayLinkStart(displayLink_);
+/// }
+///} else {
+/// if (displayLink_ && CVDisplayLinkIsRunning(displayLink_)) {
+/// TRACE_EVENT0("renderer", "CVDisplayLinkStop");
+/// CVDisplayLinkStop(displayLink_);
+/// }
+///}
// Inform the window hosting this accelerated view that it needs to be
// transparent.

Powered by Google App Engine
This is Rietveld 408576698