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

Side by Side Diff: ui/compositor/layer.cc

Issue 228083002: Make ReflectorImpl use mailboxes (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 6 years, 8 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 | Annotate | Revision Log
« no previous file with comments | « ui/compositor/layer.h ('k') | ui/compositor/layer_owner_delegate.h » ('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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "ui/compositor/layer.h" 5 #include "ui/compositor/layer.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/debug/trace_event.h" 10 #include "base/debug/trace_event.h"
(...skipping 483 matching lines...) Expand 10 before | Expand all | Expand 10 after
494 void Layer::SwitchCCLayerForTest() { 494 void Layer::SwitchCCLayerForTest() {
495 scoped_refptr<cc::Layer> new_layer; 495 scoped_refptr<cc::Layer> new_layer;
496 if (Layer::UsingPictureLayer()) 496 if (Layer::UsingPictureLayer())
497 new_layer = cc::PictureLayer::Create(this); 497 new_layer = cc::PictureLayer::Create(this);
498 else 498 else
499 new_layer = cc::ContentLayer::Create(this); 499 new_layer = cc::ContentLayer::Create(this);
500 SwitchToLayer(new_layer); 500 SwitchToLayer(new_layer);
501 content_layer_ = new_layer; 501 content_layer_ = new_layer;
502 } 502 }
503 503
504 void Layer::SetExternalTexture(Texture* texture) {
505 DCHECK(texture);
506
507 // Hold a ref to the old |Texture| until we have updated all
508 // compositor references to the texture id that it holds.
509 scoped_refptr<ui::Texture> old_texture = texture_;
510
511 DCHECK_EQ(type_, LAYER_TEXTURED);
512 DCHECK(!solid_color_layer_.get());
513 texture_ = texture;
514 if (!texture_layer_.get()) {
515 scoped_refptr<cc::TextureLayer> new_layer = cc::TextureLayer::Create(this);
516 new_layer->SetFlipped(texture_->flipped());
517 SwitchToLayer(new_layer);
518 texture_layer_ = new_layer;
519 }
520 RecomputeDrawsContentAndUVRect();
521 }
522
523 void Layer::SetTextureMailbox( 504 void Layer::SetTextureMailbox(
524 const cc::TextureMailbox& mailbox, 505 const cc::TextureMailbox& mailbox,
525 scoped_ptr<cc::SingleReleaseCallback> release_callback, 506 scoped_ptr<cc::SingleReleaseCallback> release_callback,
526 float scale_factor) { 507 gfx::Size texture_size_in_dip) {
527 DCHECK_EQ(type_, LAYER_TEXTURED); 508 DCHECK_EQ(type_, LAYER_TEXTURED);
528 DCHECK(!solid_color_layer_.get()); 509 DCHECK(!solid_color_layer_.get());
529 texture_ = NULL; 510 DCHECK(mailbox.IsValid());
530 if (!texture_layer_.get() || !texture_layer_->uses_mailbox()) { 511 DCHECK(release_callback);
512 if (!texture_layer_) {
531 scoped_refptr<cc::TextureLayer> new_layer = 513 scoped_refptr<cc::TextureLayer> new_layer =
532 cc::TextureLayer::CreateForMailbox(this); 514 cc::TextureLayer::CreateForMailbox(this);
533 new_layer->SetFlipped(false); 515 new_layer->SetFlipped(true);
534 SwitchToLayer(new_layer); 516 SwitchToLayer(new_layer);
535 texture_layer_ = new_layer; 517 texture_layer_ = new_layer;
536 } 518 }
537 texture_layer_->SetTextureMailbox(mailbox, release_callback.Pass()); 519 if (mailbox_release_callback_)
520 mailbox_release_callback_->Run(0, false);
521 mailbox_release_callback_ = release_callback.Pass();
538 mailbox_ = mailbox; 522 mailbox_ = mailbox;
539 mailbox_scale_factor_ = scale_factor; 523 SetTextureSize(texture_size_in_dip);
540 RecomputeDrawsContentAndUVRect();
541 } 524 }
542 525
543 cc::TextureMailbox Layer::GetTextureMailbox(float* scale_factor) { 526 void Layer::SetTextureSize(gfx::Size texture_size_in_dip) {
544 if (scale_factor) 527 DCHECK(texture_layer_.get());
545 *scale_factor = mailbox_scale_factor_; 528 if (frame_size_in_dip_ == texture_size_in_dip)
546 return mailbox_; 529 return;
530 frame_size_in_dip_ = texture_size_in_dip;
531 RecomputeDrawsContentAndUVRect();
532 texture_layer_->SetNeedsDisplay();
547 } 533 }
548 534
549 void Layer::SetShowDelegatedContent(cc::DelegatedFrameProvider* frame_provider, 535 void Layer::SetShowDelegatedContent(cc::DelegatedFrameProvider* frame_provider,
550 gfx::Size frame_size_in_dip) { 536 gfx::Size frame_size_in_dip) {
551 DCHECK_EQ(type_, LAYER_TEXTURED); 537 DCHECK_EQ(type_, LAYER_TEXTURED);
552 538
553 scoped_refptr<cc::DelegatedRendererLayer> new_layer = 539 scoped_refptr<cc::DelegatedRendererLayer> new_layer =
554 cc::DelegatedRendererLayer::Create(frame_provider); 540 cc::DelegatedRendererLayer::Create(frame_provider);
555 SwitchToLayer(new_layer); 541 SwitchToLayer(new_layer);
556 delegated_renderer_layer_ = new_layer; 542 delegated_renderer_layer_ = new_layer;
557 543
558 delegated_frame_size_in_dip_ = frame_size_in_dip; 544 frame_size_in_dip_ = frame_size_in_dip;
559 RecomputeDrawsContentAndUVRect(); 545 RecomputeDrawsContentAndUVRect();
560 } 546 }
561 547
562 void Layer::SetShowPaintedContent() { 548 void Layer::SetShowPaintedContent() {
563 if (content_layer_.get()) 549 if (content_layer_.get())
564 return; 550 return;
565 551
566 scoped_refptr<cc::Layer> new_layer; 552 scoped_refptr<cc::Layer> new_layer;
567 if (Layer::UsingPictureLayer()) 553 if (Layer::UsingPictureLayer())
568 new_layer = cc::PictureLayer::Create(this); 554 new_layer = cc::PictureLayer::Create(this);
569 else 555 else
570 new_layer = cc::ContentLayer::Create(this); 556 new_layer = cc::ContentLayer::Create(this);
571 SwitchToLayer(new_layer); 557 SwitchToLayer(new_layer);
572 content_layer_ = new_layer; 558 content_layer_ = new_layer;
573 559
574 mailbox_ = cc::TextureMailbox(); 560 mailbox_ = cc::TextureMailbox();
575 texture_ = NULL; 561 if (mailbox_release_callback_) {
576 562 mailbox_release_callback_->Run(0, false);
563 mailbox_release_callback_.reset();
564 }
577 RecomputeDrawsContentAndUVRect(); 565 RecomputeDrawsContentAndUVRect();
578 } 566 }
579 567
580 void Layer::SetColor(SkColor color) { GetAnimator()->SetColor(color); } 568 void Layer::SetColor(SkColor color) { GetAnimator()->SetColor(color); }
581 569
582 bool Layer::SchedulePaint(const gfx::Rect& invalid_rect) { 570 bool Layer::SchedulePaint(const gfx::Rect& invalid_rect) {
583 if (type_ == LAYER_SOLID_COLOR || (!delegate_ && !texture_.get())) 571 if (type_ == LAYER_SOLID_COLOR || (!delegate_ && !mailbox_.IsValid()))
584 return false; 572 return false;
585 573
586 damaged_region_.op(invalid_rect.x(), 574 damaged_region_.op(invalid_rect.x(),
587 invalid_rect.y(), 575 invalid_rect.y(),
588 invalid_rect.right(), 576 invalid_rect.right(),
589 invalid_rect.bottom(), 577 invalid_rect.bottom(),
590 SkRegion::kUnion_Op); 578 SkRegion::kUnion_Op);
591 ScheduleDraw(); 579 ScheduleDraw();
592 return true; 580 return true;
593 } 581 }
594 582
595 void Layer::ScheduleDraw() { 583 void Layer::ScheduleDraw() {
596 Compositor* compositor = GetCompositor(); 584 Compositor* compositor = GetCompositor();
597 if (compositor) 585 if (compositor)
598 compositor->ScheduleDraw(); 586 compositor->ScheduleDraw();
599 } 587 }
600 588
601 void Layer::SendDamagedRects() { 589 void Layer::SendDamagedRects() {
602 if ((delegate_ || texture_.get()) && !damaged_region_.isEmpty()) { 590 if ((delegate_ || mailbox_.IsValid()) && !damaged_region_.isEmpty()) {
603 for (SkRegion::Iterator iter(damaged_region_); !iter.done(); iter.next()) { 591 for (SkRegion::Iterator iter(damaged_region_); !iter.done(); iter.next()) {
604 const SkIRect& sk_damaged = iter.rect(); 592 const SkIRect& sk_damaged = iter.rect();
605 gfx::Rect damaged( 593 gfx::Rect damaged(
606 sk_damaged.x(), 594 sk_damaged.x(),
607 sk_damaged.y(), 595 sk_damaged.y(),
608 sk_damaged.width(), 596 sk_damaged.width(),
609 sk_damaged.height()); 597 sk_damaged.height());
610 598
611 gfx::Rect damaged_in_pixel = ConvertRectToPixel(this, damaged); 599 gfx::Rect damaged_in_pixel = ConvertRectToPixel(this, damaged);
612 cc_layer_->SetNeedsDisplayRect(damaged_in_pixel); 600 cc_layer_->SetNeedsDisplayRect(damaged_in_pixel);
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
664 652
665 if (delegate_) 653 if (delegate_)
666 delegate_->OnPaintLayer(canvas.get()); 654 delegate_->OnPaintLayer(canvas.get());
667 if (scale_content) 655 if (scale_content)
668 canvas->Restore(); 656 canvas->Restore();
669 } 657 }
670 658
671 bool Layer::FillsBoundsCompletely() const { return fills_bounds_completely_; } 659 bool Layer::FillsBoundsCompletely() const { return fills_bounds_completely_; }
672 660
673 unsigned Layer::PrepareTexture() { 661 unsigned Layer::PrepareTexture() {
674 DCHECK(texture_layer_.get()); 662 NOTREACHED();
675 return texture_->PrepareTexture(); 663 return 0;
676 } 664 }
677 665
678 bool Layer::PrepareTextureMailbox( 666 bool Layer::PrepareTextureMailbox(
679 cc::TextureMailbox* mailbox, 667 cc::TextureMailbox* mailbox,
680 scoped_ptr<cc::SingleReleaseCallback>* release_callback, 668 scoped_ptr<cc::SingleReleaseCallback>* release_callback,
681 bool use_shared_memory) { 669 bool use_shared_memory) {
682 return false; 670 if (!mailbox_release_callback_)
671 return false;
672 *mailbox = mailbox_;
673 *release_callback = mailbox_release_callback_.Pass();
674 return true;
683 } 675 }
684 676
685 void Layer::SetForceRenderSurface(bool force) { 677 void Layer::SetForceRenderSurface(bool force) {
686 if (force_render_surface_ == force) 678 if (force_render_surface_ == force)
687 return; 679 return;
688 680
689 force_render_surface_ = force; 681 force_render_surface_ = force;
690 cc_layer_->SetForceRenderSurface(force_render_surface_); 682 cc_layer_->SetForceRenderSurface(force_render_surface_);
691 } 683 }
692 684
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after
939 transform.Scale(1.0f / device_scale_factor_, 1.0f / device_scale_factor_); 931 transform.Scale(1.0f / device_scale_factor_, 1.0f / device_scale_factor_);
940 transform.PreconcatTransform(cc_layer_->transform()); 932 transform.PreconcatTransform(cc_layer_->transform());
941 transform.Scale(device_scale_factor_, device_scale_factor_); 933 transform.Scale(device_scale_factor_, device_scale_factor_);
942 return transform; 934 return transform;
943 } 935 }
944 936
945 void Layer::RecomputeDrawsContentAndUVRect() { 937 void Layer::RecomputeDrawsContentAndUVRect() {
946 DCHECK(cc_layer_); 938 DCHECK(cc_layer_);
947 gfx::Size size(bounds_.size()); 939 gfx::Size size(bounds_.size());
948 if (texture_layer_.get()) { 940 if (texture_layer_.get()) {
949 gfx::Size texture_size; 941 size.SetToMin(frame_size_in_dip_);
950 if (!texture_layer_->uses_mailbox()) {
951 DCHECK(texture_.get());
952 float texture_scale_factor = 1.0f / texture_->device_scale_factor();
953 texture_size = gfx::ToFlooredSize(
954 gfx::ScaleSize(texture_->size(), texture_scale_factor));
955 } else {
956 DCHECK(mailbox_.IsSharedMemory());
957 float texture_scale_factor = 1.0f / mailbox_scale_factor_;
958 texture_size = gfx::ToFlooredSize(
959 gfx::ScaleSize(mailbox_.shared_memory_size(), texture_scale_factor));
960 }
961 size.SetToMin(texture_size);
962
963 gfx::PointF uv_top_left(0.f, 0.f); 942 gfx::PointF uv_top_left(0.f, 0.f);
964 gfx::PointF uv_bottom_right( 943 gfx::PointF uv_bottom_right(
965 static_cast<float>(size.width())/texture_size.width(), 944 static_cast<float>(size.width()) / frame_size_in_dip_.width(),
966 static_cast<float>(size.height())/texture_size.height()); 945 static_cast<float>(size.height()) / frame_size_in_dip_.height());
967 texture_layer_->SetUV(uv_top_left, uv_bottom_right); 946 texture_layer_->SetUV(uv_top_left, uv_bottom_right);
968 } else if (delegated_renderer_layer_.get()) { 947 } else if (delegated_renderer_layer_.get()) {
948 size.SetToMin(frame_size_in_dip_);
969 delegated_renderer_layer_->SetDisplaySize( 949 delegated_renderer_layer_->SetDisplaySize(
970 ConvertSizeToPixel(this, delegated_frame_size_in_dip_)); 950 ConvertSizeToPixel(this, frame_size_in_dip_));
971 size.SetToMin(delegated_frame_size_in_dip_);
972 } 951 }
973 cc_layer_->SetBounds(ConvertSizeToPixel(this, size)); 952 cc_layer_->SetBounds(ConvertSizeToPixel(this, size));
974 } 953 }
975 954
976 void Layer::RecomputePosition() { 955 void Layer::RecomputePosition() {
977 cc_layer_->SetPosition(gfx::ScalePoint( 956 cc_layer_->SetPosition(gfx::ScalePoint(
978 gfx::PointF(bounds_.x(), bounds_.y()), 957 gfx::PointF(bounds_.x(), bounds_.y()),
979 device_scale_factor_)); 958 device_scale_factor_));
980 } 959 }
981 960
982 } // namespace ui 961 } // namespace ui
OLDNEW
« no previous file with comments | « ui/compositor/layer.h ('k') | ui/compositor/layer_owner_delegate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698