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

Side by Side Diff: cc/tiles/software_image_decode_controller.cc

Issue 2256833006: cc, images: Add auto finish draw class to ensure robustness. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 4 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 | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "cc/tiles/software_image_decode_controller.h" 5 #include "cc/tiles/software_image_decode_controller.h"
6 6
7 #include <inttypes.h> 7 #include <inttypes.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 : task_map_(task_map), key_(key) {} 56 : task_map_(task_map), key_(key) {}
57 ~AutoRemoveKeyFromTaskMap() { task_map_->erase(key_); } 57 ~AutoRemoveKeyFromTaskMap() { task_map_->erase(key_); }
58 58
59 private: 59 private:
60 std::unordered_map<SoftwareImageDecodeController::ImageKey, 60 std::unordered_map<SoftwareImageDecodeController::ImageKey,
61 scoped_refptr<TileTask>, 61 scoped_refptr<TileTask>,
62 SoftwareImageDecodeController::ImageKeyHash>* task_map_; 62 SoftwareImageDecodeController::ImageKeyHash>* task_map_;
63 SoftwareImageDecodeController::ImageKey key_; 63 SoftwareImageDecodeController::ImageKey key_;
64 }; 64 };
65 65
66 class AutoDrawWithImageFinished {
67 public:
68 AutoDrawWithImageFinished(SoftwareImageDecodeController* controller,
69 const DrawImage& draw_image,
70 const DecodedDrawImage& decoded_draw_image)
71 : controller_(controller),
72 draw_image_(draw_image),
73 decoded_draw_image_(decoded_draw_image) {}
74 ~AutoDrawWithImageFinished() {
75 controller_->DrawWithImageFinished(draw_image_, decoded_draw_image_);
76 }
77
78 private:
79 SoftwareImageDecodeController* controller_;
80 DrawImage draw_image_;
ericrk 2016/08/19 20:38:43 nit: make these const, as they are only set in the
vmpstr 2016/08/21 03:59:33 Done. Did this for the key above as well.
81 DecodedDrawImage decoded_draw_image_;
82 };
83
66 class ImageDecodeTaskImpl : public TileTask { 84 class ImageDecodeTaskImpl : public TileTask {
67 public: 85 public:
68 ImageDecodeTaskImpl(SoftwareImageDecodeController* controller, 86 ImageDecodeTaskImpl(SoftwareImageDecodeController* controller,
69 const SoftwareImageDecodeController::ImageKey& image_key, 87 const SoftwareImageDecodeController::ImageKey& image_key,
70 const DrawImage& image, 88 const DrawImage& image,
71 const ImageDecodeController::TracingInfo& tracing_info) 89 const ImageDecodeController::TracingInfo& tracing_info)
72 : TileTask(true), 90 : TileTask(true),
73 controller_(controller), 91 controller_(controller),
74 image_key_(image_key), 92 image_key_(image_key),
75 image_(image), 93 image_(image),
(...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after
543 kNone_SkFilterQuality, SkMatrix::I()); 561 kNone_SkFilterQuality, SkMatrix::I());
544 ImageKey original_size_key = 562 ImageKey original_size_key =
545 ImageKey::FromDrawImage(original_size_draw_image); 563 ImageKey::FromDrawImage(original_size_draw_image);
546 // Sanity checks. 564 // Sanity checks.
547 DCHECK(original_size_key.can_use_original_decode()) 565 DCHECK(original_size_key.can_use_original_decode())
548 << original_size_key.ToString(); 566 << original_size_key.ToString();
549 DCHECK(full_image_rect.size() == original_size_key.target_size()); 567 DCHECK(full_image_rect.size() == original_size_key.target_size());
550 568
551 auto decoded_draw_image = GetDecodedImageForDrawInternal( 569 auto decoded_draw_image = GetDecodedImageForDrawInternal(
552 original_size_key, original_size_draw_image); 570 original_size_key, original_size_draw_image);
553 if (!decoded_draw_image.image()) { 571 AutoDrawWithImageFinished auto_finish_draw(this, original_size_draw_image,
554 DrawWithImageFinished(original_size_draw_image, decoded_draw_image); 572 decoded_draw_image);
573 if (!decoded_draw_image.image())
555 return nullptr; 574 return nullptr;
556 }
557 575
558 SkImageInfo subrect_info = CreateImageInfo( 576 SkImageInfo subrect_info = CreateImageInfo(
559 key.target_size().width(), key.target_size().height(), format_); 577 key.target_size().width(), key.target_size().height(), format_);
560 std::unique_ptr<base::DiscardableMemory> subrect_pixels; 578 std::unique_ptr<base::DiscardableMemory> subrect_pixels;
561 { 579 {
562 TRACE_EVENT0("disabled-by-default-cc.debug", 580 TRACE_EVENT0("disabled-by-default-cc.debug",
563 "SoftwareImageDecodeController::GetSubrectImageDecode - " 581 "SoftwareImageDecodeController::GetSubrectImageDecode - "
564 "allocate subrect pixels"); 582 "allocate subrect pixels");
565 subrect_pixels = 583 subrect_pixels =
566 base::DiscardableMemoryAllocator::GetInstance() 584 base::DiscardableMemoryAllocator::GetInstance()
567 ->AllocateLockedDiscardableMemory(subrect_info.minRowBytes() * 585 ->AllocateLockedDiscardableMemory(subrect_info.minRowBytes() *
568 subrect_info.height()); 586 subrect_info.height());
569 } 587 }
570 { 588 {
571 TRACE_EVENT0("disabled-by-default-cc.debug", 589 TRACE_EVENT0("disabled-by-default-cc.debug",
572 "SoftwareImageDecodeController::GetOriginalImageDecode - " 590 "SoftwareImageDecodeController::GetOriginalImageDecode - "
573 "read pixels"); 591 "read pixels");
574 bool result = decoded_draw_image.image()->readPixels( 592 bool result = decoded_draw_image.image()->readPixels(
575 subrect_info, subrect_pixels->data(), subrect_info.minRowBytes(), 593 subrect_info, subrect_pixels->data(), subrect_info.minRowBytes(),
576 key.src_rect().x(), key.src_rect().y(), SkImage::kDisallow_CachingHint); 594 key.src_rect().x(), key.src_rect().y(), SkImage::kDisallow_CachingHint);
577 // We have a decoded image, and we're reading into already allocated memory. 595 // We have a decoded image, and we're reading into already allocated memory.
578 // This should never fail. 596 // This should never fail.
579 DCHECK(result); 597 DCHECK(result);
580 // Release the original image, since we don't need it anymore.
581 DrawWithImageFinished(original_size_draw_image, decoded_draw_image);
582 } 598 }
583 return base::WrapUnique( 599 return base::WrapUnique(
584 new DecodedImage(subrect_info, std::move(subrect_pixels), 600 new DecodedImage(subrect_info, std::move(subrect_pixels),
585 SkSize::Make(-key.src_rect().x(), -key.src_rect().y()), 601 SkSize::Make(-key.src_rect().x(), -key.src_rect().y()),
586 next_tracing_id_.GetNext())); 602 next_tracing_id_.GetNext()));
587 } 603 }
588 604
589 std::unique_ptr<SoftwareImageDecodeController::DecodedImage> 605 std::unique_ptr<SoftwareImageDecodeController::DecodedImage>
590 SoftwareImageDecodeController::GetScaledImageDecode( 606 SoftwareImageDecodeController::GetScaledImageDecode(
591 const ImageKey& key, 607 const ImageKey& key,
592 sk_sp<const SkImage> image) { 608 sk_sp<const SkImage> image) {
593 // Construct a key to use in GetDecodedImageForDrawInternal(). 609 // Construct a key to use in GetDecodedImageForDrawInternal().
594 // This allows us to reuse an image in any cache if available. 610 // This allows us to reuse an image in any cache if available.
595 gfx::Rect full_image_rect(image->width(), image->height()); 611 gfx::Rect full_image_rect(image->width(), image->height());
596 DrawImage original_size_draw_image(std::move(image), 612 DrawImage original_size_draw_image(std::move(image),
597 gfx::RectToSkIRect(full_image_rect), 613 gfx::RectToSkIRect(full_image_rect),
598 kNone_SkFilterQuality, SkMatrix::I()); 614 kNone_SkFilterQuality, SkMatrix::I());
599 ImageKey original_size_key = 615 ImageKey original_size_key =
600 ImageKey::FromDrawImage(original_size_draw_image); 616 ImageKey::FromDrawImage(original_size_draw_image);
601 // Sanity checks. 617 // Sanity checks.
602 DCHECK(original_size_key.can_use_original_decode()) 618 DCHECK(original_size_key.can_use_original_decode())
603 << original_size_key.ToString(); 619 << original_size_key.ToString();
604 DCHECK(full_image_rect.size() == original_size_key.target_size()); 620 DCHECK(full_image_rect.size() == original_size_key.target_size());
605 621
606 auto decoded_draw_image = GetDecodedImageForDrawInternal( 622 auto decoded_draw_image = GetDecodedImageForDrawInternal(
607 original_size_key, original_size_draw_image); 623 original_size_key, original_size_draw_image);
608 if (!decoded_draw_image.image()) { 624 AutoDrawWithImageFinished auto_finish_draw(this, original_size_draw_image,
609 DrawWithImageFinished(original_size_draw_image, decoded_draw_image); 625 decoded_draw_image);
626 if (!decoded_draw_image.image())
610 return nullptr; 627 return nullptr;
611 }
612 628
613 SkPixmap decoded_pixmap; 629 SkPixmap decoded_pixmap;
614 bool result = decoded_draw_image.image()->peekPixels(&decoded_pixmap); 630 bool result = decoded_draw_image.image()->peekPixels(&decoded_pixmap);
615 DCHECK(result) << key.ToString(); 631 DCHECK(result) << key.ToString();
616 if (key.src_rect() != full_image_rect) { 632 if (key.src_rect() != full_image_rect) {
617 result = decoded_pixmap.extractSubset(&decoded_pixmap, 633 result = decoded_pixmap.extractSubset(&decoded_pixmap,
618 gfx::RectToSkIRect(key.src_rect())); 634 gfx::RectToSkIRect(key.src_rect()));
619 DCHECK(result) << key.ToString(); 635 DCHECK(result) << key.ToString();
620 } 636 }
621 637
(...skipping 14 matching lines...) Expand all
636 DCHECK(key.filter_quality() == kHigh_SkFilterQuality || 652 DCHECK(key.filter_quality() == kHigh_SkFilterQuality ||
637 key.filter_quality() == kMedium_SkFilterQuality); 653 key.filter_quality() == kMedium_SkFilterQuality);
638 { 654 {
639 TRACE_EVENT0("disabled-by-default-cc.debug", 655 TRACE_EVENT0("disabled-by-default-cc.debug",
640 "SoftwareImageDecodeController::ScaleImage - scale pixels"); 656 "SoftwareImageDecodeController::ScaleImage - scale pixels");
641 bool result = 657 bool result =
642 decoded_pixmap.scalePixels(scaled_pixmap, key.filter_quality()); 658 decoded_pixmap.scalePixels(scaled_pixmap, key.filter_quality());
643 DCHECK(result) << key.ToString(); 659 DCHECK(result) << key.ToString();
644 } 660 }
645 661
646 // Release the original sized decode. Any other intermediate result to release
647 // would be the subrect memory. However, that's in a scoped_ptr and will be
648 // deleted automatically when we return.
649 DrawWithImageFinished(original_size_draw_image, decoded_draw_image);
650
651 return base::WrapUnique( 662 return base::WrapUnique(
652 new DecodedImage(scaled_info, std::move(scaled_pixels), 663 new DecodedImage(scaled_info, std::move(scaled_pixels),
653 SkSize::Make(-key.src_rect().x(), -key.src_rect().y()), 664 SkSize::Make(-key.src_rect().x(), -key.src_rect().y()),
654 next_tracing_id_.GetNext())); 665 next_tracing_id_.GetNext()));
655 } 666 }
656 667
657 void SoftwareImageDecodeController::DrawWithImageFinished( 668 void SoftwareImageDecodeController::DrawWithImageFinished(
658 const DrawImage& image, 669 const DrawImage& image,
659 const DecodedDrawImage& decoded_image) { 670 const DecodedDrawImage& decoded_image) {
660 TRACE_EVENT1("disabled-by-default-cc.debug", 671 TRACE_EVENT1("disabled-by-default-cc.debug",
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after
1061 void SoftwareImageDecodeController::MemoryBudget::ResetUsage() { 1072 void SoftwareImageDecodeController::MemoryBudget::ResetUsage() {
1062 current_usage_bytes_ = 0; 1073 current_usage_bytes_ = 0;
1063 } 1074 }
1064 1075
1065 size_t SoftwareImageDecodeController::MemoryBudget::GetCurrentUsageSafe() 1076 size_t SoftwareImageDecodeController::MemoryBudget::GetCurrentUsageSafe()
1066 const { 1077 const {
1067 return current_usage_bytes_.ValueOrDie(); 1078 return current_usage_bytes_.ValueOrDie();
1068 } 1079 }
1069 1080
1070 } // namespace cc 1081 } // namespace cc
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698