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

Unified Diff: content/browser/renderer_host/render_widget_host_view_mac.mm

Issue 316103004: Mac ÜC: Enable GPU back-pressure from the browser to the renderer (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@dip
Patch Set: Simplify Created 6 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: content/browser/renderer_host/render_widget_host_view_mac.mm
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm
index 35109e793820e9a8f79a4c2bab1c265e9c6b882e..0fd304e71da38d26002045e5f79f83bf7aed0389 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac.mm
+++ b/content/browser/renderer_host/render_widget_host_view_mac.mm
@@ -27,7 +27,6 @@
#include "base/sys_info.h"
#import "content/browser/accessibility/browser_accessibility_cocoa.h"
#include "content/browser/accessibility/browser_accessibility_manager_mac.h"
-#include "content/browser/compositor/browser_compositor_view_mac.h"
#include "content/browser/compositor/resize_lock.h"
#include "content/browser/frame_host/frame_tree.h"
#include "content/browser/frame_host/frame_tree_node.h"
@@ -424,7 +423,30 @@ RenderWidgetHostImpl* RenderWidgetHostViewMac::GetHost() {
void RenderWidgetHostViewMac::SchedulePaintInRect(
const gfx::Rect& damage_rect_in_dip) {
- [browser_compositor_view_ compositor]->Draw();
+ if (browser_compositor_lock_)
+ browser_compositor_damaged_during_lock_ = true;
+ else
+ [browser_compositor_view_ compositor]->ScheduleFullRedraw();
+}
+
+void RenderWidgetHostViewMac::DelegatedCompositorDidSwapBuffers() {
+ // If this view is not visible then do not lock the compositor, because the
+ // wait for the surface to be drawn will time out.
+ NSWindow* window = [cocoa_view_ window];
+ if (!window)
+ return;
+ if (window && [window respondsToSelector:@selector(occlusionState)]) {
+ bool window_is_occluded =
+ !([window occlusionState] & NSWindowOcclusionStateVisible);
+ if (window_is_occluded)
+ return;
+ }
+ browser_compositor_lock_ =
+ [browser_compositor_view_ compositor]->GetCompositorLock();
+}
+
+void RenderWidgetHostViewMac::DelegatedCompositorAbortedSwapBuffers() {
+ PostReleaseBrowserCompositorLock();
}
bool RenderWidgetHostViewMac::IsVisible() {
@@ -509,10 +531,6 @@ RenderWidgetHostViewMac::~RenderWidgetHostViewMac() {
// pointer.
cocoa_view_ = nil;
- // Delete the delegated frame state.
- delegated_frame_host_.reset();
- root_layer_.reset();
-
UnlockMouse();
// Make sure that the layer doesn't reach into the now-invalid object.
@@ -824,6 +842,23 @@ void RenderWidgetHostViewMac::UpdateDisplayLink() {
}
}
+void RenderWidgetHostViewMac::PostReleaseBrowserCompositorLock() {
+ base::MessageLoop::current()->PostTask(FROM_HERE,
+ base::Bind(&RenderWidgetHostViewMac::ReleaseBrowserCompositorLock,
+ weak_factory_.GetWeakPtr()));
+}
+
+void RenderWidgetHostViewMac::ReleaseBrowserCompositorLock() {
+ if (!browser_compositor_view_)
+ return;
+
+ browser_compositor_lock_ = NULL;
+ if (browser_compositor_damaged_during_lock_) {
+ browser_compositor_damaged_during_lock_ = false;
+ [browser_compositor_view_ compositor]->ScheduleFullRedraw();
+ }
+}
+
void RenderWidgetHostViewMac::SendVSyncParametersToRenderer() {
if (!render_widget_host_ || !display_link_)
return;
@@ -880,6 +915,7 @@ void RenderWidgetHostViewMac::WasHidden() {
// Any pending frames will not be displayed until this is shown again. Ack
// them now.
SendPendingSwapAck();
+ PostReleaseBrowserCompositorLock();
// If we have a renderer, then inform it that we are being hidden so it can
// reduce its resource utilization.
@@ -1104,6 +1140,13 @@ void RenderWidgetHostViewMac::Destroy() {
// object needs to survive until the stack unwinds.
pepper_fullscreen_window_.autorelease();
+ // Delete the delegated frame state, which will reach back into
+ // render_widget_host_.
+ browser_compositor_lock_ = NULL;
+ [browser_compositor_view_ resetClient];
+ delegated_frame_host_.reset();
+ root_layer_.reset();
+
// We get this call just before |render_widget_host_| deletes
// itself. But we are owned by |cocoa_view_|, which may be retained
// by some other code. Examples are WebContentsViewMac's
@@ -1892,8 +1935,8 @@ void RenderWidgetHostViewMac::OnSwapCompositorFrame(
if (frame->delegated_frame_data) {
if (!browser_compositor_view_) {
- browser_compositor_view_.reset(
- [[BrowserCompositorViewMac alloc] initWithSuperview:cocoa_view_]);
+ browser_compositor_view_.reset([[BrowserCompositorViewMac alloc]
+ initWithSuperview:cocoa_view_ withClient:this]);
root_layer_.reset(new ui::Layer(ui::LAYER_TEXTURED));
delegated_frame_host_.reset(new DelegatedFrameHost(this));
[browser_compositor_view_ compositor]->SetRootLayer(root_layer_.get());
@@ -2471,6 +2514,13 @@ SkBitmap::Config RenderWidgetHostViewMac::PreferredReadbackFormat() {
}
////////////////////////////////////////////////////////////////////////////////
+// BrowserCompositorViewMacClient, public:
+
+void RenderWidgetHostViewMac::BrowserCompositorDidDrawFrame() {
+ PostReleaseBrowserCompositorLock();
+}
+
+////////////////////////////////////////////////////////////////////////////////
// CompositingIOSurfaceLayerClient, public:
void RenderWidgetHostViewMac::AcceleratedLayerDidDrawFrame(bool succeeded) {

Powered by Google App Engine
This is Rietveld 408576698