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

Side by Side Diff: content/browser/compositor/browser_compositor_view_private_mac.mm

Issue 388793003: Mac ÜC: Fix white page hangs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 5 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 unified diff | Download patch
« no previous file with comments | « no previous file | content/browser/gpu/gpu_process_host.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/compositor/browser_compositor_view_private_mac.h" 5 #include "content/browser/compositor/browser_compositor_view_private_mac.h"
6 6
7 #include "base/debug/trace_event.h" 7 #include "base/debug/trace_event.h"
8 #include "content/browser/compositor/gpu_process_transport_factory.h" 8 #include "content/browser/compositor/gpu_process_transport_factory.h"
9 #include "content/browser/renderer_host/compositing_iosurface_context_mac.h" 9 #include "content/browser/renderer_host/compositing_iosurface_context_mac.h"
10 #include "content/browser/renderer_host/compositing_iosurface_mac.h" 10 #include "content/browser/renderer_host/compositing_iosurface_mac.h"
11 #include "content/browser/renderer_host/software_layer_mac.h" 11 #include "content/browser/renderer_host/software_layer_mac.h"
12 #include "content/public/browser/context_factory.h" 12 #include "content/public/browser/context_factory.h"
13 #include "ui/base/cocoa/animation_utils.h" 13 #include "ui/base/cocoa/animation_utils.h"
14 #include "ui/gl/scoped_cgl.h" 14 #include "ui/gl/scoped_cgl.h"
15 15
16 @interface CompositingIOSurfaceLayer(Private)
17 - (void)immediatelyForceDisplayAndAck;
18 @end
19
16 //////////////////////////////////////////////////////////////////////////////// 20 ////////////////////////////////////////////////////////////////////////////////
17 // BrowserCompositorViewCocoa 21 // BrowserCompositorViewCocoa
18 22
19 @implementation BrowserCompositorViewCocoa : NSView 23 @implementation BrowserCompositorViewCocoa : NSView
20 24
21 - (id)init { 25 - (id)init {
22 if (self = [super init]) { 26 if (self = [super init]) {
23 accelerated_layer_output_surface_id_ = 0; 27 accelerated_layer_output_surface_id_ = 0;
24 client_ = NULL; 28 client_ = NULL;
25 helper_.reset(new content::BrowserCompositorViewCocoaHelper(self)); 29 helper_.reset(new content::BrowserCompositorViewCocoaHelper(self));
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 - (void)gotAcceleratedIOSurfaceFrame:(IOSurfaceID)surface_handle 95 - (void)gotAcceleratedIOSurfaceFrame:(IOSurfaceID)surface_handle
92 withOutputSurfaceID:(int)surface_id 96 withOutputSurfaceID:(int)surface_id
93 withLatencyInfo:(std::vector<ui::LatencyInfo>) latency_info 97 withLatencyInfo:(std::vector<ui::LatencyInfo>) latency_info
94 withPixelSize:(gfx::Size)pixel_size 98 withPixelSize:(gfx::Size)pixel_size
95 withScaleFactor:(float)scale_factor { 99 withScaleFactor:(float)scale_factor {
96 DCHECK(!accelerated_layer_output_surface_id_); 100 DCHECK(!accelerated_layer_output_surface_id_);
97 accelerated_layer_output_surface_id_ = surface_id; 101 accelerated_layer_output_surface_id_ = surface_id;
98 accelerated_latency_info_.insert(accelerated_latency_info_.end(), 102 accelerated_latency_info_.insert(accelerated_latency_info_.end(),
99 latency_info.begin(), latency_info.end()); 103 latency_info.begin(), latency_info.end());
100 104
105 // If the client that wanted to display this frame has disappeared, don't
106 // bother creating the layers, just un-block the compositor and quit.
107 if (!client_) {
108 [self layerDidDrawFrame];
109 return;
110 }
111
101 // Disable the fade-in animation as the layer is added, removed, or resized. 112 // Disable the fade-in animation as the layer is added, removed, or resized.
102 ScopedCAActionDisabler disabler; 113 ScopedCAActionDisabler disabler;
103 114
104 // If there is already an accelerated layer, but it has the wrong scale 115 // If there is already an accelerated layer, but it has the wrong scale
105 // factor or it was poisoned, remove the old layer and replace it. 116 // factor or it was poisoned, remove the old layer and replace it.
106 base::scoped_nsobject<CompositingIOSurfaceLayer> old_accelerated_layer; 117 base::scoped_nsobject<CompositingIOSurfaceLayer> old_accelerated_layer;
107 if (accelerated_layer_ && ( 118 if (accelerated_layer_ && (
108 [accelerated_layer_ context]->HasBeenPoisoned() || 119 [accelerated_layer_ context]->HasBeenPoisoned() ||
109 [accelerated_layer_ iosurface]->scale_factor() != scale_factor)) { 120 [accelerated_layer_ iosurface]->scale_factor() != scale_factor)) {
110 old_accelerated_layer = accelerated_layer_; 121 old_accelerated_layer = accelerated_layer_;
(...skipping 18 matching lines...) Expand all
129 result = [accelerated_layer_ iosurface]->SetIOSurfaceWithContextCurrent( 140 result = [accelerated_layer_ iosurface]->SetIOSurfaceWithContextCurrent(
130 [accelerated_layer_ context], surface_handle, pixel_size, scale_factor); 141 [accelerated_layer_ context], surface_handle, pixel_size, scale_factor);
131 if (!result) 142 if (!result)
132 LOG(ERROR) << "Failed SetIOSurface on CompositingIOSurfaceMac"; 143 LOG(ERROR) << "Failed SetIOSurface on CompositingIOSurfaceMac";
133 } 144 }
134 [accelerated_layer_ gotNewFrame]; 145 [accelerated_layer_ gotNewFrame];
135 146
136 // Set the bounds of the accelerated layer to match the size of the frame. 147 // Set the bounds of the accelerated layer to match the size of the frame.
137 // If the bounds changed, force the content to be displayed immediately. 148 // If the bounds changed, force the content to be displayed immediately.
138 CGRect new_layer_bounds = CGRectMake( 149 CGRect new_layer_bounds = CGRectMake(
139 0, 150 0,
140 0, 151 0,
141 [accelerated_layer_ iosurface]->dip_io_surface_size().width(), 152 [accelerated_layer_ iosurface]->dip_io_surface_size().width(),
142 [accelerated_layer_ iosurface]->dip_io_surface_size().height()); 153 [accelerated_layer_ iosurface]->dip_io_surface_size().height());
143 bool bounds_changed = !CGRectEqualToRect( 154 bool bounds_changed = !CGRectEqualToRect(
144 new_layer_bounds, [accelerated_layer_ bounds]); 155 new_layer_bounds, [accelerated_layer_ bounds]);
145 [accelerated_layer_ setBounds:new_layer_bounds]; 156 [accelerated_layer_ setBounds:new_layer_bounds];
146 if (bounds_changed || 157 if (bounds_changed ||
147 (client_ && client_->BrowserCompositorShouldDrawImmediately())) { 158 (client_ && client_->BrowserCompositorShouldDrawImmediately())) {
148 [accelerated_layer_ setNeedsDisplay]; 159 [accelerated_layer_ immediatelyForceDisplayAndAck];
149 [accelerated_layer_ displayIfNeeded];
150 } 160 }
151 161
152 // If there was a software layer or an old accelerated layer, remove it. 162 // If there was a software layer or an old accelerated layer, remove it.
153 // Disable the fade-out animation as the layer is removed. 163 // Disable the fade-out animation as the layer is removed.
154 { 164 {
155 [software_layer_ removeFromSuperlayer]; 165 [software_layer_ removeFromSuperlayer];
156 software_layer_.reset(); 166 software_layer_.reset();
157 [old_accelerated_layer resetClient]; 167 [old_accelerated_layer resetClient];
158 [old_accelerated_layer removeFromSuperlayer]; 168 [old_accelerated_layer removeFromSuperlayer];
159 old_accelerated_layer.reset(); 169 old_accelerated_layer.reset();
160 } 170 }
161 } 171 }
162 172
163 - (void)gotSoftwareFrame:(cc::SoftwareFrameData*)frame_data 173 - (void)gotSoftwareFrame:(cc::SoftwareFrameData*)frame_data
164 withScaleFactor:(float)scale_factor 174 withScaleFactor:(float)scale_factor
165 withCanvas:(SkCanvas*)canvas { 175 withCanvas:(SkCanvas*)canvas {
166 if (!frame_data || !canvas) 176 if (!frame_data || !canvas)
167 return; 177 return;
168 178
179 // If the client that requested frame has disappeared, quit immediately (no
180 // acknowledgement is needed to un-block the software compositor).
181 if (!client_)
182 return;
183
169 // If there is not a layer for software frames, create one. 184 // If there is not a layer for software frames, create one.
170 if (!software_layer_) { 185 if (!software_layer_) {
171 // Disable the fade-in animation as the layer is added. 186 // Disable the fade-in animation as the layer is added.
172 ScopedCAActionDisabler disabler; 187 ScopedCAActionDisabler disabler;
173 software_layer_.reset([[SoftwareLayer alloc] init]); 188 software_layer_.reset([[SoftwareLayer alloc] init]);
174 [[self layer] addSublayer:software_layer_]; 189 [[self layer] addSublayer:software_layer_];
175 } 190 }
176 191
177 SkImageInfo info; 192 SkImageInfo info;
178 size_t row_bytes; 193 size_t row_bytes;
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
220 235
221 void BrowserCompositorViewCocoaHelper::AcceleratedLayerDidDrawFrame( 236 void BrowserCompositorViewCocoaHelper::AcceleratedLayerDidDrawFrame(
222 bool succeeded) { 237 bool succeeded) {
223 [view_ layerDidDrawFrame]; 238 [view_ layerDidDrawFrame];
224 if (!succeeded) 239 if (!succeeded)
225 [view_ gotAcceleratedLayerError]; 240 [view_ gotAcceleratedLayerError];
226 } 241 }
227 242
228 } 243 }
229 244
OLDNEW
« no previous file with comments | « no previous file | content/browser/gpu/gpu_process_host.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698