OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "components/exo/surface.h" | 5 #include "components/exo/surface.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/callback_helpers.h" | 9 #include "base/callback_helpers.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
457 | 457 |
458 UpdateResource(true); | 458 UpdateResource(true); |
459 } | 459 } |
460 | 460 |
461 cc::LocalSurfaceId old_local_surface_id = local_surface_id_; | 461 cc::LocalSurfaceId old_local_surface_id = local_surface_id_; |
462 if (needs_commit_to_new_surface_ || !local_surface_id_.is_valid()) { | 462 if (needs_commit_to_new_surface_ || !local_surface_id_.is_valid()) { |
463 needs_commit_to_new_surface_ = false; | 463 needs_commit_to_new_surface_ = false; |
464 local_surface_id_ = id_allocator_.GenerateId(); | 464 local_surface_id_ = id_allocator_.GenerateId(); |
465 } | 465 } |
466 | 466 |
| 467 // Move pending frame callbacks to the end of frame_callbacks_. |
| 468 frame_callbacks_.splice(frame_callbacks_.end(), pending_frame_callbacks_); |
| 469 |
| 470 // Move pending presentation callbacks to the end of presentation_callbacks_. |
| 471 presentation_callbacks_.splice(presentation_callbacks_.end(), |
| 472 pending_presentation_callbacks_); |
| 473 |
467 UpdateSurface(false); | 474 UpdateSurface(false); |
468 | 475 |
469 if (old_local_surface_id != local_surface_id_) { | 476 if (old_local_surface_id != local_surface_id_) { |
470 float contents_surface_to_layer_scale = 1.0; | 477 float contents_surface_to_layer_scale = 1.0; |
471 // The bounds must be updated before switching to the new surface, because | 478 // The bounds must be updated before switching to the new surface, because |
472 // the layer may be mirrored, in which case a surface change causes the | 479 // the layer may be mirrored, in which case a surface change causes the |
473 // mirror layer to update its surface using the latest bounds. | 480 // mirror layer to update its surface using the latest bounds. |
474 window_->layer()->SetBounds( | 481 window_->layer()->SetBounds( |
475 gfx::Rect(window_->layer()->bounds().origin(), content_size_)); | 482 gfx::Rect(window_->layer()->bounds().origin(), content_size_)); |
476 cc::SurfaceId surface_id(frame_sink_id_, local_surface_id_); | 483 cc::SurfaceId surface_id(frame_sink_id_, local_surface_id_); |
477 window_->layer()->SetShowPrimarySurface( | 484 window_->layer()->SetShowPrimarySurface( |
478 cc::SurfaceInfo(surface_id, contents_surface_to_layer_scale, | 485 cc::SurfaceInfo(surface_id, contents_surface_to_layer_scale, |
479 content_size_), | 486 content_size_), |
480 surface_reference_factory_); | 487 surface_reference_factory_); |
481 window_->layer()->SetFillsBoundsOpaquely( | 488 window_->layer()->SetFillsBoundsOpaquely( |
482 !current_resource_has_alpha_ || | 489 !current_resource_has_alpha_ || |
483 state_.blend_mode == SkBlendMode::kSrc || | 490 state_.blend_mode == SkBlendMode::kSrc || |
484 state_.opaque_region.contains( | 491 state_.opaque_region.contains( |
485 gfx::RectToSkIRect(gfx::Rect(content_size_)))); | 492 gfx::RectToSkIRect(gfx::Rect(content_size_)))); |
486 } | 493 } |
487 | 494 |
488 // Reset damage. | 495 // Reset damage. |
489 pending_damage_.setEmpty(); | 496 pending_damage_.setEmpty(); |
490 | 497 |
491 DCHECK(!current_resource_.id || | 498 DCHECK(!current_resource_.id || |
492 compositor_frame_sink_holder_->HasReleaseCallbackForResource( | 499 compositor_frame_sink_holder_->HasReleaseCallbackForResource( |
493 current_resource_.id)); | 500 current_resource_.id)); |
494 | 501 |
495 // Move pending frame callbacks to the end of frame_callbacks_. | |
496 frame_callbacks_.splice(frame_callbacks_.end(), pending_frame_callbacks_); | |
497 | |
498 // Move pending presentation callbacks to the end of presentation_callbacks_. | |
499 presentation_callbacks_.splice(presentation_callbacks_.end(), | |
500 pending_presentation_callbacks_); | |
501 | |
502 // Synchronize window hierarchy. This will position and update the stacking | 502 // Synchronize window hierarchy. This will position and update the stacking |
503 // order of all sub-surfaces after committing all pending state of sub-surface | 503 // order of all sub-surfaces after committing all pending state of sub-surface |
504 // descendants. | 504 // descendants. |
505 aura::Window* stacking_target = nullptr; | 505 aura::Window* stacking_target = nullptr; |
506 for (auto& sub_surface_entry : pending_sub_surfaces_) { | 506 for (auto& sub_surface_entry : pending_sub_surfaces_) { |
507 Surface* sub_surface = sub_surface_entry.first; | 507 Surface* sub_surface = sub_surface_entry.first; |
508 | 508 |
509 // Synchronsouly commit all pending state of the sub-surface and its | 509 // Synchronsouly commit all pending state of the sub-surface and its |
510 // decendents. | 510 // decendents. |
511 if (sub_surface->needs_commit_surface_hierarchy()) | 511 if (sub_surface->needs_commit_surface_hierarchy()) |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
598 return observers_.HasObserver(observer); | 598 return observers_.HasObserver(observer); |
599 } | 599 } |
600 | 600 |
601 std::unique_ptr<base::trace_event::TracedValue> Surface::AsTracedValue() const { | 601 std::unique_ptr<base::trace_event::TracedValue> Surface::AsTracedValue() const { |
602 std::unique_ptr<base::trace_event::TracedValue> value( | 602 std::unique_ptr<base::trace_event::TracedValue> value( |
603 new base::trace_event::TracedValue()); | 603 new base::trace_event::TracedValue()); |
604 value->SetString("name", window_->layer()->name()); | 604 value->SetString("name", window_->layer()->name()); |
605 return value; | 605 return value; |
606 } | 606 } |
607 | 607 |
608 void Surface::WillDraw() { | 608 void Surface::DidReceiveCompositorFrameAck() { |
609 active_frame_callbacks_.splice(active_frame_callbacks_.end(), | 609 active_frame_callbacks_.splice(active_frame_callbacks_.end(), |
610 frame_callbacks_); | 610 frame_callbacks_); |
611 swapping_presentation_callbacks_.splice( | 611 swapping_presentation_callbacks_.splice( |
612 swapping_presentation_callbacks_.end(), presentation_callbacks_); | 612 swapping_presentation_callbacks_.end(), presentation_callbacks_); |
613 UpdateNeedsBeginFrame(); | 613 UpdateNeedsBeginFrame(); |
614 } | 614 } |
615 | 615 |
616 void Surface::SetBeginFrameSource(cc::BeginFrameSource* begin_frame_source) { | 616 void Surface::SetBeginFrameSource(cc::BeginFrameSource* begin_frame_source) { |
617 if (needs_begin_frame_) { | 617 if (needs_begin_frame_) { |
618 DCHECK(begin_frame_source_); | 618 DCHECK(begin_frame_source_); |
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
876 render_pass->CreateAndAppendDrawQuad<cc::SolidColorDrawQuad>(); | 876 render_pass->CreateAndAppendDrawQuad<cc::SolidColorDrawQuad>(); |
877 solid_quad->SetNew(quad_state, quad_rect, quad_rect, SK_ColorBLACK, false); | 877 solid_quad->SetNew(quad_state, quad_rect, quad_rect, SK_ColorBLACK, false); |
878 } | 878 } |
879 | 879 |
880 frame.render_pass_list.push_back(std::move(render_pass)); | 880 frame.render_pass_list.push_back(std::move(render_pass)); |
881 compositor_frame_sink_holder_->GetCompositorFrameSink() | 881 compositor_frame_sink_holder_->GetCompositorFrameSink() |
882 ->SubmitCompositorFrame(local_surface_id_, std::move(frame)); | 882 ->SubmitCompositorFrame(local_surface_id_, std::move(frame)); |
883 } | 883 } |
884 | 884 |
885 } // namespace exo | 885 } // namespace exo |
OLD | NEW |