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

Side by Side Diff: content/browser/renderer_host/browser_compositor_view_mac.mm

Issue 2123313002: Mac: Further clean up RWHVMac<->DelegatedFrameHost (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix crash in tryjob Created 4 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
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/renderer_host/browser_compositor_view_mac.h" 5 #include "content/browser/renderer_host/browser_compositor_view_mac.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <utility> 9 #include <utility>
10 10
11 #include "base/lazy_instance.h" 11 #include "base/lazy_instance.h"
12 #include "base/trace_event/trace_event.h" 12 #include "base/trace_event/trace_event.h"
13 #include "content/browser/compositor/image_transport_factory.h" 13 #include "content/browser/compositor/image_transport_factory.h"
14 #include "content/browser/renderer_host/resize_lock.h"
14 #include "content/public/browser/context_factory.h" 15 #include "content/public/browser/context_factory.h"
15 #include "ui/accelerated_widget_mac/accelerated_widget_mac.h" 16 #include "ui/accelerated_widget_mac/accelerated_widget_mac.h"
16 #include "ui/accelerated_widget_mac/window_resize_helper_mac.h" 17 #include "ui/accelerated_widget_mac/window_resize_helper_mac.h"
17 #include "ui/base/layout.h" 18 #include "ui/base/layout.h"
18 #include "ui/gfx/geometry/dip_util.h" 19 #include "ui/gfx/geometry/dip_util.h"
19 20
20 namespace content { 21 namespace content {
21 22
22 namespace { 23 namespace {
23 24
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 // RecyclableCompositorMac that we just populated. 143 // RecyclableCompositorMac that we just populated.
143 if (!g_browser_compositor_count) 144 if (!g_browser_compositor_count)
144 g_spare_recyclable_compositor.Get().reset(); 145 g_spare_recyclable_compositor.Get().reset();
145 } 146 }
146 147
147 //////////////////////////////////////////////////////////////////////////////// 148 ////////////////////////////////////////////////////////////////////////////////
148 // BrowserCompositorMac 149 // BrowserCompositorMac
149 150
150 BrowserCompositorMac::BrowserCompositorMac( 151 BrowserCompositorMac::BrowserCompositorMac(
151 ui::AcceleratedWidgetMacNSView* accelerated_widget_mac_ns_view, 152 ui::AcceleratedWidgetMacNSView* accelerated_widget_mac_ns_view,
152 DelegatedFrameHostClient* delegated_frame_host_client, 153 BrowserCompositorMacClient* client,
153 bool render_widget_host_is_hidden, 154 bool render_widget_host_is_hidden,
154 bool ns_view_attached_to_window) 155 bool ns_view_attached_to_window)
155 : accelerated_widget_mac_ns_view_(accelerated_widget_mac_ns_view), 156 : client_(client),
157 accelerated_widget_mac_ns_view_(accelerated_widget_mac_ns_view),
156 weak_factory_(this) { 158 weak_factory_(this) {
157 g_browser_compositor_count += 1; 159 g_browser_compositor_count += 1;
158 160
159 root_layer_.reset(new ui::Layer(ui::LAYER_SOLID_COLOR)); 161 root_layer_.reset(new ui::Layer(ui::LAYER_SOLID_COLOR));
160 delegated_frame_host_.reset( 162 delegated_frame_host_.reset(new DelegatedFrameHost(this));
161 new DelegatedFrameHost(delegated_frame_host_client));
162 163
163 SetRenderWidgetHostIsHidden(render_widget_host_is_hidden); 164 SetRenderWidgetHostIsHidden(render_widget_host_is_hidden);
164 SetNSViewAttachedToWindow(ns_view_attached_to_window); 165 SetNSViewAttachedToWindow(ns_view_attached_to_window);
165 } 166 }
166 167
167 BrowserCompositorMac::~BrowserCompositorMac() { 168 BrowserCompositorMac::~BrowserCompositorMac() {
168 DCHECK(has_been_destroyed_); 169 // Ensure that copy callbacks completed or cancelled during further tear-down
169 } 170 // do not call back into this.
170 171 weak_factory_.InvalidateWeakPtrs();
171 void BrowserCompositorMac::Destroy() {
172 if (has_been_destroyed_)
173 return;
174 172
175 TransitionToState(HasNoCompositor); 173 TransitionToState(HasNoCompositor);
176 delegated_frame_host_.reset(); 174 delegated_frame_host_.reset();
177 root_layer_.reset(); 175 root_layer_.reset();
178 has_been_destroyed_ = true;
179 176
180 DCHECK_GT(g_browser_compositor_count, 0u); 177 DCHECK_GT(g_browser_compositor_count, 0u);
181 g_browser_compositor_count -= 1; 178 g_browser_compositor_count -= 1;
182 179
183 // If there are no compositors allocated, destroy the recyclable 180 // If there are no compositors allocated, destroy the recyclable
184 // RecyclableCompositorMac. 181 // RecyclableCompositorMac.
185 if (!g_browser_compositor_count) 182 if (!g_browser_compositor_count)
186 g_spare_recyclable_compositor.Get().reset(); 183 g_spare_recyclable_compositor.Get().reset();
187 } 184 }
188 185
189 ui::AcceleratedWidgetMac* BrowserCompositorMac::GetAcceleratedWidgetMac() { 186 ui::AcceleratedWidgetMac* BrowserCompositorMac::GetAcceleratedWidgetMac() {
190 if (recyclable_compositor_) 187 if (recyclable_compositor_)
191 return recyclable_compositor_->accelerated_widget_mac(); 188 return recyclable_compositor_->accelerated_widget_mac();
192 return nullptr; 189 return nullptr;
193 } 190 }
194 191
195 ui::Layer* BrowserCompositorMac::GetRootLayer() {
196 return root_layer_.get();
197 }
198
199 DelegatedFrameHost* BrowserCompositorMac::GetDelegatedFrameHost() { 192 DelegatedFrameHost* BrowserCompositorMac::GetDelegatedFrameHost() {
200 DCHECK(delegated_frame_host_); 193 DCHECK(delegated_frame_host_);
201 return delegated_frame_host_.get(); 194 return delegated_frame_host_.get();
202 } 195 }
203 196
204 void BrowserCompositorMac::CopyCompleted( 197 void BrowserCompositorMac::CopyCompleted(
205 base::WeakPtr<BrowserCompositorMac> browser_compositor, 198 base::WeakPtr<BrowserCompositorMac> browser_compositor,
206 const ReadbackRequestCallback& callback, 199 const ReadbackRequestCallback& callback,
207 const SkBitmap& bitmap, 200 const SkBitmap& bitmap,
208 ReadbackResponse response) { 201 ReadbackResponse response) {
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 auto callback_with_decrement = 245 auto callback_with_decrement =
253 base::Bind(&BrowserCompositorMac::CopyToVideoFrameCompleted, 246 base::Bind(&BrowserCompositorMac::CopyToVideoFrameCompleted,
254 weak_factory_.GetWeakPtr(), callback); 247 weak_factory_.GetWeakPtr(), callback);
255 248
256 delegated_frame_host_->CopyFromCompositingSurfaceToVideoFrame( 249 delegated_frame_host_->CopyFromCompositingSurfaceToVideoFrame(
257 src_subrect, target, callback_with_decrement); 250 src_subrect, target, callback_with_decrement);
258 } 251 }
259 252
260 void BrowserCompositorMac::SwapCompositorFrame(uint32_t output_surface_id, 253 void BrowserCompositorMac::SwapCompositorFrame(uint32_t output_surface_id,
261 cc::CompositorFrame frame) { 254 cc::CompositorFrame frame) {
262 DCHECK(!has_been_destroyed_);
263
264 // Compute the frame size based on the root render pass rect size. 255 // Compute the frame size based on the root render pass rect size.
265 cc::RenderPass* root_pass = 256 cc::RenderPass* root_pass =
266 frame.delegated_frame_data->render_pass_list.back().get(); 257 frame.delegated_frame_data->render_pass_list.back().get();
267 float scale_factor = frame.metadata.device_scale_factor; 258 float scale_factor = frame.metadata.device_scale_factor;
268 gfx::Size pixel_size = root_pass->output_rect.size(); 259 gfx::Size pixel_size = root_pass->output_rect.size();
269 gfx::Size dip_size = gfx::ConvertSizeToDIP(scale_factor, pixel_size); 260 gfx::Size dip_size = gfx::ConvertSizeToDIP(scale_factor, pixel_size);
270 root_layer_->SetBounds(gfx::Rect(dip_size)); 261 root_layer_->SetBounds(gfx::Rect(dip_size));
271 if (recyclable_compositor_) { 262 if (recyclable_compositor_) {
272 recyclable_compositor_->compositor()->SetScaleAndSize(scale_factor, 263 recyclable_compositor_->compositor()->SetScaleAndSize(scale_factor,
273 pixel_size); 264 pixel_size);
274 } 265 }
275 delegated_frame_host_->SwapDelegatedFrame(output_surface_id, 266 delegated_frame_host_->SwapDelegatedFrame(output_surface_id,
276 std::move(frame)); 267 std::move(frame));
277 } 268 }
278 269
279 void BrowserCompositorMac::SetHasTransparentBackground(bool transparent) { 270 void BrowserCompositorMac::SetHasTransparentBackground(bool transparent) {
280 DCHECK(!has_been_destroyed_);
281 has_transparent_background_ = transparent; 271 has_transparent_background_ = transparent;
282 if (recyclable_compositor_) { 272 if (recyclable_compositor_) {
283 recyclable_compositor_->compositor()->SetHostHasTransparentBackground( 273 recyclable_compositor_->compositor()->SetHostHasTransparentBackground(
284 has_transparent_background_); 274 has_transparent_background_);
285 } 275 }
286 } 276 }
287 277
288 void BrowserCompositorMac::SetDisplayColorSpace( 278 void BrowserCompositorMac::SetDisplayColorSpace(
289 const gfx::ColorSpace& color_space) { 279 const gfx::ColorSpace& color_space) {
290 if (recyclable_compositor_) 280 if (recyclable_compositor_)
291 recyclable_compositor_->compositor()->SetDisplayColorSpace(color_space); 281 recyclable_compositor_->compositor()->SetDisplayColorSpace(color_space);
292 } 282 }
293 283
294 void BrowserCompositorMac::UpdateVSyncParameters( 284 void BrowserCompositorMac::UpdateVSyncParameters(
295 const base::TimeTicks& timebase, 285 const base::TimeTicks& timebase,
296 const base::TimeDelta& interval) { 286 const base::TimeDelta& interval) {
297 DCHECK(!has_been_destroyed_);
298 if (recyclable_compositor_) { 287 if (recyclable_compositor_) {
299 recyclable_compositor_->compositor() 288 recyclable_compositor_->compositor()
300 ->vsync_manager() 289 ->vsync_manager()
301 ->UpdateVSyncParameters(timebase, interval); 290 ->UpdateVSyncParameters(timebase, interval);
302 } 291 }
303 } 292 }
304 293
305 void BrowserCompositorMac::SetRenderWidgetHostIsHidden(bool hidden) { 294 void BrowserCompositorMac::SetRenderWidgetHostIsHidden(bool hidden) {
306 render_widget_host_is_hidden_ = hidden; 295 render_widget_host_is_hidden_ = hidden;
307 UpdateState(); 296 UpdateState();
308 } 297 }
309 298
310 void BrowserCompositorMac::SetNSViewAttachedToWindow(bool attached) { 299 void BrowserCompositorMac::SetNSViewAttachedToWindow(bool attached) {
311 ns_view_attached_to_window_ = attached; 300 ns_view_attached_to_window_ = attached;
312 UpdateState(); 301 UpdateState();
313 } 302 }
314 303
315 void BrowserCompositorMac::UpdateState() { 304 void BrowserCompositorMac::UpdateState() {
316 if (has_been_destroyed_) {
317 DCHECK(state_ == HasNoCompositor);
318 return;
319 }
320
321 if (!render_widget_host_is_hidden_ || outstanding_copy_count_ > 0) 305 if (!render_widget_host_is_hidden_ || outstanding_copy_count_ > 0)
322 TransitionToState(HasAttachedCompositor); 306 TransitionToState(HasAttachedCompositor);
323 else if (ns_view_attached_to_window_) 307 else if (ns_view_attached_to_window_)
324 TransitionToState(HasDetachedCompositor); 308 TransitionToState(HasDetachedCompositor);
325 else 309 else
326 TransitionToState(HasNoCompositor); 310 TransitionToState(HasNoCompositor);
327 } 311 }
328 312
329 void BrowserCompositorMac::TransitionToState(State new_state) { 313 void BrowserCompositorMac::TransitionToState(State new_state) {
330 // Transition HasNoCompositor -> HasDetachedCompositor. 314 // Transition HasNoCompositor -> HasDetachedCompositor.
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
379 state_ = HasNoCompositor; 363 state_ = HasNoCompositor;
380 } 364 }
381 } 365 }
382 366
383 // static 367 // static
384 void BrowserCompositorMac::DisableRecyclingForShutdown() { 368 void BrowserCompositorMac::DisableRecyclingForShutdown() {
385 g_has_shut_down = true; 369 g_has_shut_down = true;
386 g_spare_recyclable_compositor.Get().reset(); 370 g_spare_recyclable_compositor.Get().reset();
387 } 371 }
388 372
373 void BrowserCompositorMac::SetNeedsBeginFrames(bool needs_begin_frames) {
374 if (needs_begin_frames_ == needs_begin_frames)
375 return;
376
377 needs_begin_frames_ = needs_begin_frames;
378 if (begin_frame_source_) {
379 if (needs_begin_frames_)
380 begin_frame_source_->AddObserver(this);
381 else
382 begin_frame_source_->RemoveObserver(this);
383 }
384 }
385
386 ////////////////////////////////////////////////////////////////////////////////
387 // DelegatedFrameHost, public:
388
389 ui::Layer* BrowserCompositorMac::DelegatedFrameHostGetLayer() const {
390 return root_layer_.get();
391 }
392
393 bool BrowserCompositorMac::DelegatedFrameHostIsVisible() const {
394 // TODO(ccameron): This should return the same value as
395 // |render_widget_host_is_hidden_|, rather than going back to the
396 // RenderWidgetHostImpl.
397 return client_->BrowserCompositorMacIsVisible();
398 }
399
400 SkColor BrowserCompositorMac::DelegatedFrameHostGetGutterColor(
401 SkColor color) const {
402 return client_->BrowserCompositorMacGetGutterColor(color);
403 }
404
405 gfx::Size BrowserCompositorMac::DelegatedFrameHostDesiredSizeInDIP() const {
406 NSRect bounds = [client_->BrowserCompositorMacGetNSView() bounds];
407 return gfx::Size(bounds.size.width, bounds.size.height);
408 }
409
410 bool BrowserCompositorMac::DelegatedFrameCanCreateResizeLock() const {
411 // Mac uses the RenderWidgetResizeHelper instead of a resize lock.
412 return false;
413 }
414
415 std::unique_ptr<ResizeLock>
416 BrowserCompositorMac::DelegatedFrameHostCreateResizeLock(
417 bool defer_compositor_lock) {
418 NOTREACHED();
419 return std::unique_ptr<ResizeLock>();
420 }
421
422 void BrowserCompositorMac::DelegatedFrameHostResizeLockWasReleased() {
423 NOTREACHED();
424 }
425
426 void BrowserCompositorMac::DelegatedFrameHostSendCompositorSwapAck(
427 int output_surface_id,
428 const cc::CompositorFrameAck& ack) {
429 client_->BrowserCompositorMacSendCompositorSwapAck(output_surface_id, ack);
430 }
431
432 void BrowserCompositorMac::DelegatedFrameHostSendReclaimCompositorResources(
433 int output_surface_id,
434 const cc::CompositorFrameAck& ack) {
435 client_->BrowserCompositorMacSendReclaimCompositorResources(output_surface_id,
436 ack);
437 }
438
439 void BrowserCompositorMac::DelegatedFrameHostOnLostCompositorResources() {
440 client_->BrowserCompositorMacOnLostCompositorResources();
441 }
442
443 void BrowserCompositorMac::DelegatedFrameHostUpdateVSyncParameters(
444 const base::TimeTicks& timebase,
445 const base::TimeDelta& interval) {
446 client_->BrowserCompositorMacUpdateVSyncParameters(timebase, interval);
447 }
448
449 void BrowserCompositorMac::SetBeginFrameSource(cc::BeginFrameSource* source) {
450 if (begin_frame_source_ && needs_begin_frames_)
451 begin_frame_source_->RemoveObserver(this);
452 begin_frame_source_ = source;
453 if (begin_frame_source_ && needs_begin_frames_)
454 begin_frame_source_->AddObserver(this);
455 }
456
457 ////////////////////////////////////////////////////////////////////////////////
458 // cc::BeginFrameSourceBase, public:
459
460 void BrowserCompositorMac::OnBeginFrame(const cc::BeginFrameArgs& args) {
461 delegated_frame_host_->SetVSyncParameters(args.frame_time, args.interval);
462 client_->BrowserCompositorMacSendBeginFrame(args);
463 last_begin_frame_args_ = args;
464 }
465
466 const cc::BeginFrameArgs& BrowserCompositorMac::LastUsedBeginFrameArgs() const {
467 return last_begin_frame_args_;
468 }
469
470 void BrowserCompositorMac::OnBeginFrameSourcePausedChanged(bool paused) {
471 // Only used on Android WebView.
472 }
473
389 } // namespace content 474 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698