Chromium Code Reviews| 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 "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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |