diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2019-07-31 15:50:41 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2019-08-30 12:35:23 +0000 |
commit | 7b2ffa587235a47d4094787d72f38102089f402a (patch) | |
tree | 30e82af9cbab08a7fa028bb18f4f2987a3f74dfa /chromium/cc/tiles | |
parent | d94af01c90575348c4e81a418257f254b6f8d225 (diff) | |
download | qtwebengine-chromium-7b2ffa587235a47d4094787d72f38102089f402a.tar.gz |
BASELINE: Update Chromium to 76.0.3809.94
Change-Id: I321c3f5f929c105aec0f98c5091ef6108822e647
Reviewed-by: Michael BrĂ¼ning <michael.bruning@qt.io>
Diffstat (limited to 'chromium/cc/tiles')
25 files changed, 537 insertions, 424 deletions
diff --git a/chromium/cc/tiles/checker_image_tracker.cc b/chromium/cc/tiles/checker_image_tracker.cc index 2308d922a35..6eda401d7a5 100644 --- a/chromium/cc/tiles/checker_image_tracker.cc +++ b/chromium/cc/tiles/checker_image_tracker.cc @@ -387,6 +387,7 @@ void CheckerImageTracker::UpdateDecodeState(const DrawImage& draw_image, std::max(decode_state->scale.fHeight, draw_image.scale().fHeight)); decode_state->filter_quality = std::max(decode_state->filter_quality, draw_image.filter_quality()); + decode_state->color_space = draw_image.target_color_space(); decode_state->frame_index = draw_image.frame_index(); } @@ -426,7 +427,7 @@ void CheckerImageTracker::ScheduleNextImageDecode() { it->second.filter_quality, SkMatrix::MakeScale(it->second.scale.width(), it->second.scale.height()), - it->second.frame_index); + it->second.frame_index, it->second.color_space); outstanding_image_decode_.emplace(candidate); break; } diff --git a/chromium/cc/tiles/checker_image_tracker.h b/chromium/cc/tiles/checker_image_tracker.h index f59f5a27620..ee5578f8fef 100644 --- a/chromium/cc/tiles/checker_image_tracker.h +++ b/chromium/cc/tiles/checker_image_tracker.h @@ -139,6 +139,7 @@ class CC_EXPORT CheckerImageTracker { DecodePolicy policy = DecodePolicy::SYNC; SkFilterQuality filter_quality = kNone_SkFilterQuality; SkSize scale = SkSize::MakeEmpty(); + gfx::ColorSpace color_space; size_t frame_index = PaintImage::kDefaultFrameIndex; }; diff --git a/chromium/cc/tiles/checker_image_tracker_unittest.cc b/chromium/cc/tiles/checker_image_tracker_unittest.cc index 44cba670c23..47dc8ab1306 100644 --- a/chromium/cc/tiles/checker_image_tracker_unittest.cc +++ b/chromium/cc/tiles/checker_image_tracker_unittest.cc @@ -125,7 +125,7 @@ class CheckerImageTrackerTest : public testing::Test, .TakePaintImage(), SkIRect::MakeWH(dimension, dimension), kNone_SkFilterQuality, SkMatrix::I(), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, gfx::ColorSpace()); } bool ShouldCheckerImage(const DrawImage& draw_image, WhichTree tree) { @@ -433,7 +433,8 @@ TEST_F(CheckerImageTrackerTest, CheckersOnlyStaticCompletedImages) { .set_paint_image_generator(CreatePaintImageGenerator(image_size)) .TakePaintImage(), SkIRect::MakeWH(image_size.width(), image_size.height()), - kNone_SkFilterQuality, SkMatrix::I(), PaintImage::kDefaultFrameIndex); + kNone_SkFilterQuality, SkMatrix::I(), PaintImage::kDefaultFrameIndex, + gfx::ColorSpace()); EXPECT_FALSE( ShouldCheckerImage(completed_paint_image, WhichTree::PENDING_TREE)); } @@ -460,10 +461,12 @@ TEST_F(CheckerImageTrackerTest, ChoosesMaxScaleAndQuality) { SetUpTracker(true); DrawImage image = CreateImage(ImageType::CHECKERABLE); - DrawImage scaled_image1(image, 0.5f, PaintImage::kDefaultFrameIndex); + DrawImage scaled_image1(image, 0.5f, PaintImage::kDefaultFrameIndex, + gfx::ColorSpace()); DrawImage scaled_image2 = DrawImage(image.paint_image(), image.src_rect(), kHigh_SkFilterQuality, - SkMatrix::MakeScale(1.8f), PaintImage::kDefaultFrameIndex); + SkMatrix::MakeScale(1.8f), PaintImage::kDefaultFrameIndex, + gfx::ColorSpace()); std::vector<DrawImage> draw_images = {scaled_image1, scaled_image2}; CheckerImageTracker::ImageDecodeQueue image_decode_queue = @@ -538,7 +541,7 @@ TEST_F(CheckerImageTrackerTest, UseSrcRectForSize) { DrawImage image = CreateImage(ImageType::CHECKERABLE); image = DrawImage(image.paint_image(), SkIRect::MakeWH(200, 200), image.filter_quality(), SkMatrix::I(), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, image.target_color_space()); EXPECT_FALSE(ShouldCheckerImage(image, WhichTree::PENDING_TREE)); } diff --git a/chromium/cc/tiles/decoded_image_tracker.cc b/chromium/cc/tiles/decoded_image_tracker.cc index 197b749f63e..5db3f198b6d 100644 --- a/chromium/cc/tiles/decoded_image_tracker.cc +++ b/chromium/cc/tiles/decoded_image_tracker.cc @@ -39,6 +39,7 @@ DecodedImageTracker::~DecodedImageTracker() { void DecodedImageTracker::QueueImageDecode( const PaintImage& image, + const gfx::ColorSpace& target_color_space, base::OnceCallback<void(bool)> callback) { size_t frame_index = PaintImage::kDefaultFrameIndex; TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("cc.debug"), @@ -49,7 +50,7 @@ void DecodedImageTracker::QueueImageDecode( // our own. auto image_bounds = SkIRect::MakeWH(image.width(), image.height()); DrawImage draw_image(image, image_bounds, kNone_SkFilterQuality, - SkMatrix::I(), frame_index); + SkMatrix::I(), frame_index, target_color_space); image_controller_->QueueImageDecode( draw_image, base::BindOnce(&DecodedImageTracker::ImageDecodeFinished, base::Unretained(this), std::move(callback), diff --git a/chromium/cc/tiles/decoded_image_tracker.h b/chromium/cc/tiles/decoded_image_tracker.h index a5f99abe5dd..4803dfa3a2e 100644 --- a/chromium/cc/tiles/decoded_image_tracker.h +++ b/chromium/cc/tiles/decoded_image_tracker.h @@ -38,6 +38,7 @@ class CC_EXPORT DecodedImageTracker { // completion. The callback takes a bool indicating whether the decode was // successful or not. void QueueImageDecode(const PaintImage& image, + const gfx::ColorSpace& target_color_space, base::OnceCallback<void(bool)> callback); // Unlock all locked images - used to respond to memory pressure or diff --git a/chromium/cc/tiles/decoded_image_tracker_unittest.cc b/chromium/cc/tiles/decoded_image_tracker_unittest.cc index e481894e866..8ffb4817bea 100644 --- a/chromium/cc/tiles/decoded_image_tracker_unittest.cc +++ b/chromium/cc/tiles/decoded_image_tracker_unittest.cc @@ -86,18 +86,44 @@ class DecodedImageTrackerTest : public testing::Test { TEST_F(DecodedImageTrackerTest, QueueImageLocksImages) { bool locked = false; decoded_image_tracker()->QueueImageDecode( - CreateDiscardablePaintImage(gfx::Size(1, 1)), + CreateDiscardablePaintImage(gfx::Size(1, 1)), gfx::ColorSpace(), base::BindOnce([](bool* locked, bool success) { *locked = true; }, base::Unretained(&locked))); EXPECT_TRUE(locked); EXPECT_EQ(1u, image_controller()->num_locked_images()); } +TEST_F(DecodedImageTrackerTest, Colorspace) { + bool locked = false; + gfx::ColorSpace decoded_color_space( + gfx::ColorSpace::PrimaryID::XYZ_D50, + gfx::ColorSpace::TransferID::IEC61966_2_1); + gfx::ColorSpace srgb_color_space = gfx::ColorSpace::CreateSRGB(); + auto paint_image = CreateDiscardablePaintImage(gfx::Size(1, 1)); + decoded_image_tracker()->QueueImageDecode( + paint_image, decoded_color_space, + base::BindOnce([](bool* locked, bool success) { *locked = true; }, + base::Unretained(&locked))); + + // Check that the decoded color space images are locked, but if the color + // space differs then that image is not locked. Note that we use the high + // filter quality here, since it shouldn't matter and the checks should + // succeed anyway. + DrawImage locked_draw_image( + paint_image, SkIRect::MakeWH(1, 1), kHigh_SkFilterQuality, SkMatrix::I(), + PaintImage::kDefaultFrameIndex, decoded_color_space); + EXPECT_TRUE(image_controller()->IsDrawImageLocked(locked_draw_image)); + DrawImage srgb_draw_image(paint_image, SkIRect::MakeWH(1, 1), + kHigh_SkFilterQuality, SkMatrix::I(), + PaintImage::kDefaultFrameIndex, srgb_color_space); + EXPECT_FALSE(image_controller()->IsDrawImageLocked(srgb_draw_image)); +} + TEST_F(DecodedImageTrackerTest, ImagesTimeOut) { // Add an image, this will start a 250ms timeout to release it. bool locked = false; decoded_image_tracker()->QueueImageDecode( - CreateDiscardablePaintImage(gfx::Size(1, 1)), + CreateDiscardablePaintImage(gfx::Size(1, 1)), gfx::ColorSpace(), base::BindOnce([](bool* locked, bool success) { *locked = true; }, base::Unretained(&locked))); EXPECT_TRUE(locked); @@ -109,7 +135,7 @@ TEST_F(DecodedImageTrackerTest, ImagesTimeOut) { // Add an image, this will not start a new timeout, as one is pending. decoded_image_tracker()->QueueImageDecode( - CreateDiscardablePaintImage(gfx::Size(1, 1)), + CreateDiscardablePaintImage(gfx::Size(1, 1)), gfx::ColorSpace(), base::BindOnce([](bool* locked, bool success) { *locked = true; }, base::Unretained(&locked))); EXPECT_TRUE(locked); @@ -130,7 +156,7 @@ TEST_F(DecodedImageTrackerTest, ImageUsedInDraw) { bool locked = false; auto paint_image_1 = CreateDiscardablePaintImage(gfx::Size(1, 1)); decoded_image_tracker()->QueueImageDecode( - paint_image_1, + paint_image_1, gfx::ColorSpace(), base::BindOnce([](bool* locked, bool success) { *locked = true; }, base::Unretained(&locked))); EXPECT_TRUE(locked); @@ -138,7 +164,7 @@ TEST_F(DecodedImageTrackerTest, ImageUsedInDraw) { auto paint_image_2 = CreateDiscardablePaintImage(gfx::Size(1, 1)); decoded_image_tracker()->QueueImageDecode( - paint_image_2, + paint_image_2, gfx::ColorSpace(), base::BindOnce([](bool* locked, bool success) { *locked = true; }, base::Unretained(&locked))); EXPECT_TRUE(locked); @@ -146,9 +172,11 @@ TEST_F(DecodedImageTrackerTest, ImageUsedInDraw) { // Create dummy draw images for each: DrawImage draw_image_1(paint_image_1, SkIRect::MakeWH(1, 1), - kHigh_SkFilterQuality, SkMatrix::I(), 0); + kHigh_SkFilterQuality, SkMatrix::I(), 0, + gfx::ColorSpace()); DrawImage draw_image_2(paint_image_2, SkIRect::MakeWH(1, 1), - kHigh_SkFilterQuality, SkMatrix::I(), 0); + kHigh_SkFilterQuality, SkMatrix::I(), 0, + gfx::ColorSpace()); // Both should be in the cache: EXPECT_TRUE(image_controller()->IsDrawImageLocked(draw_image_1)); @@ -166,13 +194,13 @@ TEST_F(DecodedImageTrackerTest, UnlockAllImages) { // Insert two images: bool locked = false; decoded_image_tracker()->QueueImageDecode( - CreateDiscardablePaintImage(gfx::Size(1, 1)), + CreateDiscardablePaintImage(gfx::Size(1, 1)), gfx::ColorSpace(), base::BindOnce([](bool* locked, bool success) { *locked = true; }, base::Unretained(&locked))); EXPECT_TRUE(locked); EXPECT_EQ(1u, image_controller()->num_locked_images()); decoded_image_tracker()->QueueImageDecode( - CreateDiscardablePaintImage(gfx::Size(1, 1)), + CreateDiscardablePaintImage(gfx::Size(1, 1)), gfx::ColorSpace(), base::BindOnce([](bool* locked, bool success) { *locked = true; }, base::Unretained(&locked))); EXPECT_TRUE(locked); diff --git a/chromium/cc/tiles/gpu_image_decode_cache.cc b/chromium/cc/tiles/gpu_image_decode_cache.cc index eaff9df998b..30ce3e45e4d 100644 --- a/chromium/cc/tiles/gpu_image_decode_cache.cc +++ b/chromium/cc/tiles/gpu_image_decode_cache.cc @@ -437,20 +437,24 @@ GpuImageDecodeCache::InUseCacheKey::FromDrawImage(const DrawImage& draw_image) { GpuImageDecodeCache::InUseCacheKey::InUseCacheKey(const DrawImage& draw_image) : frame_key(draw_image.frame_key()), upload_scale_mip_level(CalculateUploadScaleMipLevel(draw_image)), - filter_quality(CalculateDesiredFilterQuality(draw_image)) {} + filter_quality(CalculateDesiredFilterQuality(draw_image)), + target_color_space(draw_image.target_color_space()) {} bool GpuImageDecodeCache::InUseCacheKey::operator==( const InUseCacheKey& other) const { return frame_key == other.frame_key && upload_scale_mip_level == other.upload_scale_mip_level && - filter_quality == other.filter_quality; + filter_quality == other.filter_quality && + target_color_space == other.target_color_space; } size_t GpuImageDecodeCache::InUseCacheKeyHash::operator()( const InUseCacheKey& cache_key) const { - return base::HashInts(cache_key.frame_key.hash(), - base::HashInts(cache_key.upload_scale_mip_level, - cache_key.filter_quality)); + return base::HashInts( + cache_key.target_color_space.GetHash(), + base::HashInts(cache_key.frame_key.hash(), + base::HashInts(cache_key.upload_scale_mip_level, + cache_key.filter_quality))); } GpuImageDecodeCache::InUseCacheEntry::InUseCacheEntry( @@ -773,17 +777,20 @@ void GpuImageDecodeCache::UploadedImageData::ReportUsageStats() const { usage_stats_.first_lock_wasted); } -GpuImageDecodeCache::ImageData::ImageData(PaintImage::Id paint_image_id, - DecodedDataMode mode, - size_t size, - SkFilterQuality quality, - int upload_scale_mip_level, - bool needs_mips, - bool is_bitmap_backed, - bool is_yuv_format) +GpuImageDecodeCache::ImageData::ImageData( + PaintImage::Id paint_image_id, + DecodedDataMode mode, + size_t size, + const gfx::ColorSpace& target_color_space, + SkFilterQuality quality, + int upload_scale_mip_level, + bool needs_mips, + bool is_bitmap_backed, + bool is_yuv_format) : paint_image_id(paint_image_id), mode(mode), size(size), + target_color_space(target_color_space), quality(quality), upload_scale_mip_level(upload_scale_mip_level), needs_mips(needs_mips), @@ -853,8 +860,7 @@ GpuImageDecodeCache::GpuImageDecodeCache( SkColorType color_type, size_t max_working_set_bytes, int max_texture_size, - PaintImage::GeneratorClientId generator_client_id, - sk_sp<SkColorSpace> target_color_space) + PaintImage::GeneratorClientId generator_client_id) : color_type_(color_type), use_transfer_cache_(use_transfer_cache), context_(context), @@ -862,8 +868,7 @@ GpuImageDecodeCache::GpuImageDecodeCache( generator_client_id_(generator_client_id), persistent_cache_(PersistentCache::NO_AUTO_EVICT), max_working_set_bytes_(max_working_set_bytes), - max_working_set_items_(kMaxItemsInWorkingSet), - target_color_space_(std::move(target_color_space)) { + max_working_set_items_(kMaxItemsInWorkingSet) { // In certain cases, ThreadTaskRunnerHandle isn't set (Android Webview). // Don't register a dump provider in these cases. if (base::ThreadTaskRunnerHandle::IsSet()) { @@ -886,17 +891,6 @@ GpuImageDecodeCache::~GpuImageDecodeCache() { // It is safe to unregister, even if we didn't register in the constructor. base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider( this); - - // TODO(vmpstr): If we don't have a client name, it may cause problems in - // unittests, since most tests don't set the name but some do. The UMA system - // expects the name to be always the same. This assertion is violated in the - // tests that do set the name. - if (GetClientNameForMetrics()) { - UMA_HISTOGRAM_CUSTOM_COUNTS( - base::StringPrintf("Compositing.%s.CachedImagesCount.Gpu", - GetClientNameForMetrics()), - lifetime_max_items_in_cache_, 1, 1000, 20); - } } ImageDecodeCache::TaskResult GpuImageDecodeCache::GetTaskForImageAndRef( @@ -1588,9 +1582,6 @@ bool GpuImageDecodeCache::EnsureCapacity(size_t required_size) { "GpuImageDecodeCache::EnsureCapacity"); lock_.AssertAcquired(); - lifetime_max_items_in_cache_ = - std::max(lifetime_max_items_in_cache_, persistent_cache_.size()); - // While we are over preferred item capacity, we iterate through our set of // cached image data in LRU order, removing unreferenced images. for (auto it = persistent_cache_.rbegin(); @@ -1669,7 +1660,7 @@ void GpuImageDecodeCache::DecodeImageIfNecessary(const DrawImage& draw_image, return; } - TRACE_EVENT0("cc", "GpuImageDecodeCache::DecodeImage"); + TRACE_EVENT0("cc,benchmark", "GpuImageDecodeCache::DecodeImage"); RecordImageMipLevelUMA(image_data->upload_scale_mip_level); image_data->decode.ResetData(); @@ -1791,7 +1782,10 @@ void GpuImageDecodeCache::UploadImageIfNecessary(const DrawImage& draw_image, image_data->decode.mark_used(); sk_sp<SkColorSpace> color_space = - SupportsColorSpaceConversion() ? target_color_space_ : nullptr; + SupportsColorSpaceConversion() && + draw_image.target_color_space().IsValid() + ? draw_image.target_color_space().ToSkColorSpace() + : nullptr; // The value of |decoded_target_colorspace| takes into account the fact // that we might need to ignore an embedded image color space if |color_type_| // does not support color space conversions or that color conversion might @@ -1874,7 +1868,7 @@ void GpuImageDecodeCache::UploadImageIfNecessary(const DrawImage& draw_image, uploaded_image = CreateImageFromYUVATexturesInternal( uploaded_y_image.get(), uploaded_u_image.get(), uploaded_v_image.get(), image_width, image_height, &yuva_color_space, - decoded_target_colorspace); + color_space, decoded_target_colorspace); } // At-raster may have decoded this while we were unlocked. If so, ignore our @@ -2032,6 +2026,7 @@ GpuImageDecodeCache::CreateImageData(const DrawImage& draw_image) { return base::WrapRefCounted(new ImageData( draw_image.paint_image().stable_id(), mode, data_size, + draw_image.target_color_space(), CalculateDesiredFilterQuality(draw_image), upload_scale_mip_level, needs_mips, is_bitmap_backed, is_yuv)); } @@ -2112,6 +2107,7 @@ void GpuImageDecodeCache::UnlockImage(ImageData* image_data) { images_pending_unlock_.push_back(image_data->upload.y_image().get()); images_pending_unlock_.push_back(image_data->upload.u_image().get()); images_pending_unlock_.push_back(image_data->upload.v_image().get()); + yuv_images_pending_unlock_.push_back(image_data->upload.image()); } else { images_pending_unlock_.push_back(image_data->upload.image().get()); } @@ -2142,11 +2138,32 @@ void GpuImageDecodeCache::UnlockImage(ImageData* image_data) { } } +// YUV images are handled slightly differently because they are not themselves +// registered with the discardable memory system. We cannot use +// GlIdFromSkImage on these YUV SkImages to flush pending operations because +// doing so will flatten it to RGB. +void GpuImageDecodeCache::FlushYUVImages( + std::vector<sk_sp<SkImage>>* yuv_images) { + CheckContextLockAcquiredIfNecessary(); + lock_.AssertAcquired(); + for (auto& image : *yuv_images) { + image->flush(context_->GrContext()); + } + yuv_images->clear(); +} + // We always run pending operations in the following order: -// Lock > Unlock > Delete +// > Lock +// > Flush YUV images that will be unlocked +// > Unlock +// > Flush YUV images that will be deleted +// > Delete // This ensures that: // a) We never fully unlock an image that's pending lock (lock before unlock) // b) We never delete an image that has pending locks/unlocks. +// c) We never unlock or delete the underlying texture planes for a YUV +// image before all operations referencing it have completed. +// // As this can be run at-raster, to unlock/delete an image that was just used, // we need to call GlIdFromSkImage, which flushes pending IO on the image, // rather than just using a cached GL ID. @@ -2164,6 +2181,7 @@ void GpuImageDecodeCache::RunPendingContextThreadOperations() { } images_pending_complete_lock_.clear(); + FlushYUVImages(&yuv_images_pending_unlock_); for (auto* image : images_pending_unlock_) { context_->ContextGL()->UnlockDiscardableTextureCHROMIUM( GlIdFromSkImage(image)); @@ -2176,8 +2194,7 @@ void GpuImageDecodeCache::RunPendingContextThreadOperations() { } ids_pending_unlock_.clear(); - yuv_images_pending_deletion_.clear(); - + FlushYUVImages(&yuv_images_pending_deletion_); for (auto& image : images_pending_deletion_) { uint32_t texture_id = GlIdFromSkImage(image.get()); if (context_->ContextGL()->LockDiscardableTextureCHROMIUM(texture_id)) { @@ -2322,6 +2339,10 @@ bool GpuImageDecodeCache::IsCompatible(const ImageData* image_data, image_data->upload_scale_mip_level; bool quality_is_compatible = CalculateDesiredFilterQuality(draw_image) <= image_data->quality; + bool color_is_compatible = + image_data->target_color_space == draw_image.target_color_space(); + if (!color_is_compatible) + return false; if (is_scaled && (!scale_is_compatible || !quality_is_compatible)) return false; return true; @@ -2423,7 +2444,7 @@ sk_sp<SkColorSpace> GpuImageDecodeCache::ColorSpaceForImageDecode( return nullptr; if (mode == DecodedDataMode::kCpu) - return target_color_space_; + return image.target_color_space().ToSkColorSpace(); // For kGpu or kTransferCache images color conversion is handled during // upload, so keep the original colorspace here. @@ -2443,6 +2464,7 @@ sk_sp<SkImage> GpuImageDecodeCache::CreateImageFromYUVATexturesInternal( const size_t image_width, const size_t image_height, const SkYUVColorSpace* yuva_color_space, + sk_sp<SkColorSpace> target_color_space, sk_sp<SkColorSpace> decoded_color_space) const { DCHECK(uploaded_y_image); DCHECK(uploaded_u_image); @@ -2460,8 +2482,6 @@ sk_sp<SkImage> GpuImageDecodeCache::CreateImageFromYUVATexturesInternal( indices[SkYUVAIndex::kV_Index] = {2, SkColorChannel::kR}; indices[SkYUVAIndex::kA_Index] = {-1, SkColorChannel::kR}; - sk_sp<SkColorSpace> target_color_space = - SupportsColorSpaceConversion() ? target_color_space_ : nullptr; if (target_color_space && SkColorSpace::Equals(target_color_space.get(), decoded_color_space.get())) { target_color_space = nullptr; @@ -2551,13 +2571,18 @@ void GpuImageDecodeCache::UpdateMipsIfNeeded(const DrawImage& draw_image, SkYUVColorSpace yuva_color_space = SkYUVColorSpace::kRec601_SkYUVColorSpace; size_t width = image_y_with_mips_owned->width(); size_t height = image_y_with_mips_owned->height(); + sk_sp<SkColorSpace> color_space = + SupportsColorSpaceConversion() && + draw_image.target_color_space().IsValid() + ? draw_image.target_color_space().ToSkColorSpace() + : nullptr; sk_sp<SkColorSpace> decoded_color_space = ColorSpaceForImageDecode(draw_image, image_data->mode); sk_sp<SkImage> yuv_image_with_mips_owned = CreateImageFromYUVATexturesInternal( image_y_with_mips_owned.get(), image_u_with_mips_owned.get(), image_v_with_mips_owned.get(), width, height, &yuva_color_space, - decoded_color_space); + color_space, decoded_color_space); // In case of lost context if (!yuv_image_with_mips_owned) { DLOG(WARNING) << "TODO(crbug.com/740737): Context was lost. Early out."; diff --git a/chromium/cc/tiles/gpu_image_decode_cache.h b/chromium/cc/tiles/gpu_image_decode_cache.h index 3c3ff52532c..81ca6286703 100644 --- a/chromium/cc/tiles/gpu_image_decode_cache.h +++ b/chromium/cc/tiles/gpu_image_decode_cache.h @@ -108,8 +108,7 @@ class CC_EXPORT GpuImageDecodeCache SkColorType color_type, size_t max_working_set_bytes, int max_texture_size, - PaintImage::GeneratorClientId client_id, - sk_sp<SkColorSpace> target_color_space); + PaintImage::GeneratorClientId client_id); ~GpuImageDecodeCache() override; // Returns the GL texture ID backing the given SkImage. @@ -443,6 +442,7 @@ class CC_EXPORT GpuImageDecodeCache ImageData(PaintImage::Id paint_image_id, DecodedDataMode mode, size_t size, + const gfx::ColorSpace& target_color_space, SkFilterQuality quality, int upload_scale_mip_level, bool needs_mips, @@ -456,6 +456,7 @@ class CC_EXPORT GpuImageDecodeCache const PaintImage::Id paint_image_id; const DecodedDataMode mode; const size_t size; + gfx::ColorSpace target_color_space; SkFilterQuality quality; int upload_scale_mip_level; bool needs_mips = false; @@ -501,6 +502,7 @@ class CC_EXPORT GpuImageDecodeCache PaintImage::FrameKey frame_key; int upload_scale_mip_level; SkFilterQuality filter_quality; + gfx::ColorSpace target_color_space; }; struct InUseCacheKeyHash { size_t operator()(const InUseCacheKey&) const; @@ -551,6 +553,7 @@ class CC_EXPORT GpuImageDecodeCache const size_t image_width, const size_t image_height, const SkYUVColorSpace* yuva_color_space, + sk_sp<SkColorSpace> target_color_space, sk_sp<SkColorSpace> decoded_color_space) const; scoped_refptr<GpuImageDecodeCache::ImageData> CreateImageData( @@ -590,6 +593,10 @@ class CC_EXPORT GpuImageDecodeCache void UploadImageIfNecessary(const DrawImage& draw_image, ImageData* image_data); + // Flush pending operations on context_->GrContext() for each element of + // |yuv_images| and then clear the vector. + void FlushYUVImages(std::vector<sk_sp<SkImage>>* yuv_images); + // Runs pending operations that required the |context_| lock to be held, but // were queued up during a time when the |context_| lock was unavailable. // These including deleting, unlocking, and locking textures. @@ -657,16 +664,14 @@ class CC_EXPORT GpuImageDecodeCache std::vector<sk_sp<SkImage>> images_pending_deletion_; // Images that are backed by planar textures must be handled differently // to avoid inadvertently flattening to RGB and creating additional textures. + // See comment in RunPendingContextThreadOperations(). std::vector<sk_sp<SkImage>> yuv_images_pending_deletion_; + std::vector<sk_sp<SkImage>> yuv_images_pending_unlock_; const sk_sp<SkColorSpace> target_color_space_; std::vector<uint32_t> ids_pending_unlock_; std::vector<uint32_t> ids_pending_deletion_; - // Records the maximum number of items in the cache over the lifetime of the - // cache. This is updated anytime we are requested to reduce cache usage. - size_t lifetime_max_items_in_cache_ = 0u; - std::unique_ptr<base::MemoryPressureListener> memory_pressure_listener_; }; diff --git a/chromium/cc/tiles/gpu_image_decode_cache_perftest.cc b/chromium/cc/tiles/gpu_image_decode_cache_perftest.cc index f7d485e215e..a3b7e86666e 100644 --- a/chromium/cc/tiles/gpu_image_decode_cache_perftest.cc +++ b/chromium/cc/tiles/gpu_image_decode_cache_perftest.cc @@ -47,20 +47,19 @@ class GpuImageDecodeCachePerfTest kTimeCheckInterval), context_provider_(base::MakeRefCounted<TestInProcessContextProvider>( UseTransferCache(), - false /* support_locking */)) { + false /* support_locking */)), + cache_(context_provider_.get(), + UseTransferCache(), + kRGBA_8888_SkColorType, + kCacheSize, + MaxTextureSize(), + PaintImage::kDefaultGeneratorClientId) { // Initializing context here is ok because image decode cache does not use // context provider in its constructor. gpu::ContextResult result = context_provider_->BindToCurrentThread(); DCHECK_EQ(result, gpu::ContextResult::kSuccess); } - void CreateCache(sk_sp<SkColorSpace> color_space = nullptr) { - cache_ = std::make_unique<GpuImageDecodeCache>( - context_provider_.get(), UseTransferCache(), kRGBA_8888_SkColorType, - kCacheSize, MaxTextureSize(), PaintImage::kDefaultGeneratorClientId, - std::move(color_space)); - } - protected: size_t MaxTextureSize() const { switch (GetParam()) { @@ -89,7 +88,7 @@ class GpuImageDecodeCachePerfTest base::LapTimer timer_; scoped_refptr<TestInProcessContextProvider> context_provider_; - std::unique_ptr<GpuImageDecodeCache> cache_; + GpuImageDecodeCache cache_; }; INSTANTIATE_TEST_SUITE_P(P, @@ -99,7 +98,6 @@ INSTANTIATE_TEST_SUITE_P(P, TestMode::kSw)); TEST_P(GpuImageDecodeCachePerfTest, DecodeWithColorConversion) { - CreateCache(gfx::ColorSpace::CreateXYZD50().ToSkColorSpace()); timer_.Reset(); do { DrawImage image( @@ -108,10 +106,11 @@ TEST_P(GpuImageDecodeCachePerfTest, DecodeWithColorConversion) { .set_image(CreateImage(1024, 2048), PaintImage::GetNextContentId()) .TakePaintImage(), SkIRect::MakeWH(1024, 2048), kMedium_SkFilterQuality, - CreateMatrix(SkSize::Make(1.0f, 1.0f)), 0u); + CreateMatrix(SkSize::Make(1.0f, 1.0f)), 0u, + gfx::ColorSpace::CreateXYZD50()); - DecodedDrawImage decoded_image = cache_->GetDecodedImageForDraw(image); - cache_->DrawWithImageFinished(image, decoded_image); + DecodedDrawImage decoded_image = cache_.GetDecodedImageForDraw(image); + cache_.DrawWithImageFinished(image, decoded_image); timer_.NextLap(); } while (!timer_.HasTimeLimitExpired()); @@ -132,7 +131,6 @@ TEST_P(GpuImageDecodeCachePerfTestNoSw, DecodeWithMips) { context_provider_->GrContext(), SkBudgeted::kNo, SkImageInfo::MakeN32Premul(2048, 2048)); - CreateCache(); timer_.Reset(); do { DrawImage image( @@ -141,9 +139,9 @@ TEST_P(GpuImageDecodeCachePerfTestNoSw, DecodeWithMips) { .set_image(CreateImage(1024, 2048), PaintImage::GetNextContentId()) .TakePaintImage(), SkIRect::MakeWH(1024, 2048), kMedium_SkFilterQuality, - CreateMatrix(SkSize::Make(0.6f, 0.6f)), 0u); + CreateMatrix(SkSize::Make(0.6f, 0.6f)), 0u, gfx::ColorSpace()); - DecodedDrawImage decoded_image = cache_->GetDecodedImageForDraw(image); + DecodedDrawImage decoded_image = cache_.GetDecodedImageForDraw(image); if (GetParam() == TestMode::kGpu) { SkPaint paint; @@ -154,7 +152,7 @@ TEST_P(GpuImageDecodeCachePerfTestNoSw, DecodeWithMips) { surface->flush(); } - cache_->DrawWithImageFinished(image, decoded_image); + cache_.DrawWithImageFinished(image, decoded_image); timer_.NextLap(); } while (!timer_.HasTimeLimitExpired()); @@ -164,21 +162,21 @@ TEST_P(GpuImageDecodeCachePerfTestNoSw, DecodeWithMips) { TEST_P(GpuImageDecodeCachePerfTest, AcquireExistingImages) { timer_.Reset(); - CreateCache(gfx::ColorSpace::CreateXYZD50().ToSkColorSpace()); DrawImage image( PaintImageBuilder::WithDefault() .set_id(PaintImage::GetNextId()) .set_image(CreateImage(1024, 2048), PaintImage::GetNextContentId()) .TakePaintImage(), SkIRect::MakeWH(1024, 2048), kMedium_SkFilterQuality, - CreateMatrix(SkSize::Make(1.0f, 1.0f)), 0u); + CreateMatrix(SkSize::Make(1.0f, 1.0f)), 0u, + gfx::ColorSpace::CreateXYZD50()); - DecodedDrawImage decoded_image = cache_->GetDecodedImageForDraw(image); - cache_->DrawWithImageFinished(image, decoded_image); + DecodedDrawImage decoded_image = cache_.GetDecodedImageForDraw(image); + cache_.DrawWithImageFinished(image, decoded_image); do { - DecodedDrawImage decoded_image = cache_->GetDecodedImageForDraw(image); - cache_->DrawWithImageFinished(image, decoded_image); + DecodedDrawImage decoded_image = cache_.GetDecodedImageForDraw(image); + cache_.DrawWithImageFinished(image, decoded_image); timer_.NextLap(); } while (!timer_.HasTimeLimitExpired()); diff --git a/chromium/cc/tiles/gpu_image_decode_cache_unittest.cc b/chromium/cc/tiles/gpu_image_decode_cache_unittest.cc index 087f8b26620..77f3210c518 100644 --- a/chromium/cc/tiles/gpu_image_decode_cache_unittest.cc +++ b/chromium/cc/tiles/gpu_image_decode_cache_unittest.cc @@ -283,15 +283,10 @@ class GpuImageDecodeCacheTest } std::unique_ptr<GpuImageDecodeCache> CreateCache() { - return CreateCache(DefaultColorSpace()); - } - - std::unique_ptr<GpuImageDecodeCache> CreateCache( - const gfx::ColorSpace& color_space) { return std::make_unique<GpuImageDecodeCache>( context_provider_.get(), use_transfer_cache_, color_type_, kGpuMemoryLimitBytes, max_texture_size_, - PaintImage::kDefaultGeneratorClientId, color_space.ToSkColorSpace()); + PaintImage::kDefaultGeneratorClientId); } // Returns dimensions for an image that will not fit in GPU memory and hence @@ -446,7 +441,7 @@ TEST_P(GpuImageDecodeCacheTest, GetTaskForImageSameImage) { DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -455,7 +450,7 @@ TEST_P(GpuImageDecodeCacheTest, GetTaskForImageSameImage) { DrawImage another_draw_image( image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult another_result = cache->GetTaskForImageAndRef( another_draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(another_result.need_unref); @@ -477,7 +472,7 @@ TEST_P(GpuImageDecodeCacheTest, GetTaskForImageSmallerScale) { DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -490,7 +485,7 @@ TEST_P(GpuImageDecodeCacheTest, GetTaskForImageSmallerScale) { DrawImage another_draw_image( image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult another_result = cache->GetTaskForImageAndRef( another_draw_image, ImageDecodeCache::TracingInfo()); @@ -518,7 +513,7 @@ TEST_P(GpuImageDecodeCacheTest, GetTaskForImageLowerQuality) { DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), kHigh_SkFilterQuality, matrix, - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -526,7 +521,8 @@ TEST_P(GpuImageDecodeCacheTest, GetTaskForImageLowerQuality) { DrawImage another_draw_image( image, SkIRect::MakeWH(image.width(), image.height()), - kLow_SkFilterQuality, matrix, PaintImage::kDefaultFrameIndex); + kLow_SkFilterQuality, matrix, PaintImage::kDefaultFrameIndex, + DefaultColorSpace()); ImageDecodeCache::TaskResult another_result = cache->GetTaskForImageAndRef( another_draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(another_result.need_unref); @@ -548,7 +544,7 @@ TEST_P(GpuImageDecodeCacheTest, GetTaskForImageDifferentImage) { DrawImage first_draw_image( first_image, SkIRect::MakeWH(first_image.width(), first_image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult first_result = cache->GetTaskForImageAndRef( first_draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(first_result.need_unref); @@ -559,7 +555,7 @@ TEST_P(GpuImageDecodeCacheTest, GetTaskForImageDifferentImage) { second_image, SkIRect::MakeWH(second_image.width(), second_image.height()), quality, CreateMatrix(SkSize::Make(0.25f, 0.25f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult second_result = cache->GetTaskForImageAndRef( second_draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(second_result.need_unref); @@ -584,7 +580,7 @@ TEST_P(GpuImageDecodeCacheTest, GetTaskForImageLargerScale) { DrawImage first_draw_image( first_image, SkIRect::MakeWH(first_image.width(), first_image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult first_result = cache->GetTaskForImageAndRef( first_draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(first_result.need_unref); @@ -598,7 +594,7 @@ TEST_P(GpuImageDecodeCacheTest, GetTaskForImageLargerScale) { DrawImage second_draw_image( first_image, SkIRect::MakeWH(first_image.width(), first_image.height()), quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult second_result = cache->GetTaskForImageAndRef( second_draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(second_result.need_unref); @@ -608,7 +604,7 @@ TEST_P(GpuImageDecodeCacheTest, GetTaskForImageLargerScale) { DrawImage third_draw_image( first_image, SkIRect::MakeWH(first_image.width(), first_image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult third_result = cache->GetTaskForImageAndRef( third_draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(third_result.need_unref); @@ -630,7 +626,7 @@ TEST_P(GpuImageDecodeCacheTest, GetTaskForImageLargerScaleNoReuse) { DrawImage first_draw_image( first_image, SkIRect::MakeWH(first_image.width(), first_image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult first_result = cache->GetTaskForImageAndRef( first_draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(first_result.need_unref); @@ -639,7 +635,7 @@ TEST_P(GpuImageDecodeCacheTest, GetTaskForImageLargerScaleNoReuse) { DrawImage second_draw_image( first_image, SkIRect::MakeWH(first_image.width(), first_image.height()), quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult second_result = cache->GetTaskForImageAndRef( second_draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(second_result.need_unref); @@ -649,7 +645,7 @@ TEST_P(GpuImageDecodeCacheTest, GetTaskForImageLargerScaleNoReuse) { DrawImage third_draw_image( first_image, SkIRect::MakeWH(first_image.width(), first_image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult third_result = cache->GetTaskForImageAndRef( third_draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(third_result.need_unref); @@ -673,7 +669,8 @@ TEST_P(GpuImageDecodeCacheTest, GetTaskForImageHigherQuality) { PaintImage first_image = CreatePaintImageInternal(GetNormalImageSize()); DrawImage first_draw_image( first_image, SkIRect::MakeWH(first_image.width(), first_image.height()), - kLow_SkFilterQuality, matrix, PaintImage::kDefaultFrameIndex); + kLow_SkFilterQuality, matrix, PaintImage::kDefaultFrameIndex, + DefaultColorSpace()); ImageDecodeCache::TaskResult first_result = cache->GetTaskForImageAndRef( first_draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(first_result.need_unref); @@ -686,7 +683,8 @@ TEST_P(GpuImageDecodeCacheTest, GetTaskForImageHigherQuality) { DrawImage second_draw_image( first_image, SkIRect::MakeWH(first_image.width(), first_image.height()), - kHigh_SkFilterQuality, matrix, PaintImage::kDefaultFrameIndex); + kHigh_SkFilterQuality, matrix, PaintImage::kDefaultFrameIndex, + DefaultColorSpace()); ImageDecodeCache::TaskResult second_result = cache->GetTaskForImageAndRef( second_draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(second_result.need_unref); @@ -707,7 +705,7 @@ TEST_P(GpuImageDecodeCacheTest, GetTaskForImageAlreadyDecodedAndLocked) { DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -749,7 +747,7 @@ TEST_P(GpuImageDecodeCacheTest, GetTaskForImageAlreadyDecodedNotLocked) { DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -791,7 +789,7 @@ TEST_P(GpuImageDecodeCacheTest, GetTaskForImageAlreadyUploaded) { DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -822,7 +820,7 @@ TEST_P(GpuImageDecodeCacheTest, GetTaskForImageCanceledGetsNewTask) { DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -865,7 +863,7 @@ TEST_P(GpuImageDecodeCacheTest, GetTaskForImageCanceledWhileReffedGetsNewTask) { DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -912,7 +910,7 @@ TEST_P(GpuImageDecodeCacheTest, GetTaskForImageUploadCanceledButDecodeRun) { DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -941,7 +939,7 @@ TEST_P(GpuImageDecodeCacheTest, NoTaskForImageAlreadyFailedDecoding) { DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -971,7 +969,7 @@ TEST_P(GpuImageDecodeCacheTest, GetDecodedImageForDraw) { DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -1005,7 +1003,7 @@ TEST_P(GpuImageDecodeCacheTest, GetLargeDecodedImageForDraw) { DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -1041,7 +1039,7 @@ TEST_P(GpuImageDecodeCacheTest, GetDecodedImageForDrawAtRasterDecode) { DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); @@ -1075,7 +1073,7 @@ TEST_P(GpuImageDecodeCacheTest, GetDecodedImageForDrawLargerScale) { DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), kLow_SkFilterQuality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -1087,7 +1085,7 @@ TEST_P(GpuImageDecodeCacheTest, GetDecodedImageForDrawLargerScale) { DrawImage larger_draw_image( image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult larger_result = cache->GetTaskForImageAndRef( larger_draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(larger_result.need_unref); @@ -1129,7 +1127,7 @@ TEST_P(GpuImageDecodeCacheTest, GetDecodedImageForDrawHigherQuality) { PaintImage image = CreatePaintImageInternal(GetNormalImageSize()); DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), kLow_SkFilterQuality, matrix, - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -1140,7 +1138,8 @@ TEST_P(GpuImageDecodeCacheTest, GetDecodedImageForDrawHigherQuality) { DrawImage higher_quality_draw_image( image, SkIRect::MakeWH(image.width(), image.height()), - kHigh_SkFilterQuality, matrix, PaintImage::kDefaultFrameIndex); + kHigh_SkFilterQuality, matrix, PaintImage::kDefaultFrameIndex, + DefaultColorSpace()); ImageDecodeCache::TaskResult hq_result = cache->GetTaskForImageAndRef( higher_quality_draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(hq_result.need_unref); @@ -1182,7 +1181,7 @@ TEST_P(GpuImageDecodeCacheTest, GetDecodedImageForDrawNegative) { DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(-0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -1221,7 +1220,7 @@ TEST_P(GpuImageDecodeCacheTest, GetLargeScaledDecodedImageForDraw) { DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -1264,7 +1263,7 @@ TEST_P(GpuImageDecodeCacheTest, AtRasterUsedDirectlyIfSpaceAllows) { DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); @@ -1307,7 +1306,7 @@ TEST_P(GpuImageDecodeCacheTest, DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); // Must hold context lock before calling GetDecodedImageForDraw / // DrawWithImageFinished. @@ -1345,7 +1344,7 @@ TEST_P(GpuImageDecodeCacheTest, DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); // Must hold context lock before calling GetDecodedImageForDraw / // DrawWithImageFinished. @@ -1382,7 +1381,7 @@ TEST_P(GpuImageDecodeCacheTest, ZeroSizedImagesAreSkipped) { DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(0.f, 0.f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); @@ -1410,7 +1409,7 @@ TEST_P(GpuImageDecodeCacheTest, NonOverlappingSrcRectImagesAreSkipped) { image.width(), image.height()), quality, CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); @@ -1436,7 +1435,7 @@ TEST_P(GpuImageDecodeCacheTest, CanceledTasksDoNotCountAgainstBudget) { DrawImage draw_image( image, SkIRect::MakeXYWH(0, 0, image.width(), image.height()), quality, CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); @@ -1462,7 +1461,7 @@ TEST_P(GpuImageDecodeCacheTest, ShouldAggressivelyFreeResources) { DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); { ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef( draw_image, ImageDecodeCache::TracingInfo()); @@ -1524,7 +1523,7 @@ TEST_P(GpuImageDecodeCacheTest, OrphanedImagesFreeOnReachingZeroRefs) { DrawImage first_draw_image( first_image, SkIRect::MakeWH(first_image.width(), first_image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult first_result = cache->GetTaskForImageAndRef( first_draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(first_result.need_unref); @@ -1539,7 +1538,7 @@ TEST_P(GpuImageDecodeCacheTest, OrphanedImagesFreeOnReachingZeroRefs) { DrawImage second_draw_image( first_image, SkIRect::MakeWH(first_image.width(), first_image.height()), quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult second_result = cache->GetTaskForImageAndRef( second_draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(second_result.need_unref); @@ -1572,7 +1571,7 @@ TEST_P(GpuImageDecodeCacheTest, OrphanedZeroRefImagesImmediatelyDeleted) { DrawImage first_draw_image( first_image, SkIRect::MakeWH(first_image.width(), first_image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult first_result = cache->GetTaskForImageAndRef( first_draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(first_result.need_unref); @@ -1591,7 +1590,7 @@ TEST_P(GpuImageDecodeCacheTest, OrphanedZeroRefImagesImmediatelyDeleted) { DrawImage second_draw_image( first_image, SkIRect::MakeWH(first_image.width(), first_image.height()), quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult second_result = cache->GetTaskForImageAndRef( second_draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(second_result.need_unref); @@ -1615,9 +1614,10 @@ TEST_P(GpuImageDecodeCacheTest, QualityCappedAtMedium) { SkMatrix matrix = CreateMatrix(SkSize::Make(0.4f, 0.4f), is_decomposable); // Create an image with kLow_FilterQuality. - DrawImage low_draw_image( - image, SkIRect::MakeWH(image.width(), image.height()), - kLow_SkFilterQuality, matrix, PaintImage::kDefaultFrameIndex); + DrawImage low_draw_image(image, + SkIRect::MakeWH(image.width(), image.height()), + kLow_SkFilterQuality, matrix, + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult low_result = cache->GetTaskForImageAndRef( low_draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(low_result.need_unref); @@ -1627,7 +1627,8 @@ TEST_P(GpuImageDecodeCacheTest, QualityCappedAtMedium) { // should get a new task/ref. DrawImage medium_draw_image( image, SkIRect::MakeWH(image.width(), image.height()), - kMedium_SkFilterQuality, matrix, PaintImage::kDefaultFrameIndex); + kMedium_SkFilterQuality, matrix, PaintImage::kDefaultFrameIndex, + DefaultColorSpace()); ImageDecodeCache::TaskResult medium_result = cache->GetTaskForImageAndRef( medium_draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(medium_result.need_unref); @@ -1637,7 +1638,8 @@ TEST_P(GpuImageDecodeCacheTest, QualityCappedAtMedium) { // Get the same image at kHigh_FilterQuality. We should re-use medium. DrawImage high_quality_draw_image( image, SkIRect::MakeWH(image.width(), image.height()), - kHigh_SkFilterQuality, matrix, PaintImage::kDefaultFrameIndex); + kHigh_SkFilterQuality, matrix, PaintImage::kDefaultFrameIndex, + DefaultColorSpace()); ImageDecodeCache::TaskResult high_quality_result = cache->GetTaskForImageAndRef(high_quality_draw_image, ImageDecodeCache::TracingInfo()); @@ -1666,7 +1668,7 @@ TEST_P(GpuImageDecodeCacheTest, GetDecodedImageForDrawMipUsageChange) { DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -1688,7 +1690,7 @@ TEST_P(GpuImageDecodeCacheTest, GetDecodedImageForDrawMipUsageChange) { DrawImage draw_image_mips( image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(0.6f, 0.6f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); DecodedDrawImage decoded_draw_image = EnsureImageBacked(cache->GetDecodedImageForDraw(draw_image_mips)); cache->DrawWithImageFinished(draw_image_mips, decoded_draw_image); @@ -1702,7 +1704,7 @@ TEST_P(GpuImageDecodeCacheTest, OutOfRasterDecodeTask) { SkMatrix matrix = CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable); DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), kLow_SkFilterQuality, matrix, - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache->GetOutOfRasterDecodeTaskForImageAndRef(draw_image); @@ -1730,7 +1732,7 @@ TEST_P(GpuImageDecodeCacheTest, ZeroCacheNormalWorkingSet) { DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -1781,13 +1783,13 @@ TEST_P(GpuImageDecodeCacheTest, SmallCacheNormalWorkingSet) { DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); PaintImage image2 = CreatePaintImageInternal(GetNormalImageSize()); DrawImage draw_image2( image2, SkIRect::MakeWH(image2.width(), image2.height()), quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); // Add an image to the cache and un-ref it. { @@ -1864,7 +1866,7 @@ TEST_P(GpuImageDecodeCacheTest, ClearCache) { DrawImage draw_image( image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef( draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -1894,7 +1896,7 @@ TEST_P(GpuImageDecodeCacheTest, ClearCacheInUse) { DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -1919,16 +1921,64 @@ TEST_P(GpuImageDecodeCacheTest, ClearCacheInUse) { EXPECT_EQ(cache->GetNumCacheEntriesForTesting(), 0u); } -TEST_P(GpuImageDecodeCacheTest, GetTaskForLargeImage) { +TEST_P(GpuImageDecodeCacheTest, GetTaskForImageDifferentColorSpace) { + auto cache = CreateCache(); + bool is_decomposable = true; + SkFilterQuality quality = kHigh_SkFilterQuality; + + gfx::ColorSpace color_space_a = gfx::ColorSpace::CreateSRGB(); + gfx::ColorSpace color_space_b = gfx::ColorSpace::CreateXYZD50(); + + PaintImage first_image = CreatePaintImageInternal(gfx::Size(100, 100)); + DrawImage first_draw_image( + first_image, SkIRect::MakeWH(first_image.width(), first_image.height()), + quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), + PaintImage::kDefaultFrameIndex, color_space_a); + ImageDecodeCache::TaskResult first_result = cache->GetTaskForImageAndRef( + first_draw_image, ImageDecodeCache::TracingInfo()); + EXPECT_TRUE(first_result.need_unref); + EXPECT_TRUE(first_result.task); + + DrawImage second_draw_image( + first_image, SkIRect::MakeWH(first_image.width(), first_image.height()), + quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), + PaintImage::kDefaultFrameIndex, color_space_b); + ImageDecodeCache::TaskResult second_result = cache->GetTaskForImageAndRef( + second_draw_image, ImageDecodeCache::TracingInfo()); + EXPECT_TRUE(second_result.need_unref); + EXPECT_TRUE(second_result.task); + EXPECT_TRUE(first_result.task.get() != second_result.task.get()); + + DrawImage third_draw_image( + first_image, SkIRect::MakeWH(first_image.width(), first_image.height()), + quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), + PaintImage::kDefaultFrameIndex, color_space_a); + ImageDecodeCache::TaskResult third_result = cache->GetTaskForImageAndRef( + third_draw_image, ImageDecodeCache::TracingInfo()); + EXPECT_TRUE(third_result.need_unref); + EXPECT_TRUE(third_result.task.get() == first_result.task.get()); + + TestTileTaskRunner::ProcessTask(first_result.task->dependencies()[0].get()); + TestTileTaskRunner::ProcessTask(first_result.task.get()); + TestTileTaskRunner::ProcessTask(second_result.task->dependencies()[0].get()); + TestTileTaskRunner::ProcessTask(second_result.task.get()); + + cache->UnrefImage(first_draw_image); + cache->UnrefImage(second_draw_image); + cache->UnrefImage(third_draw_image); +} + +TEST_P(GpuImageDecodeCacheTest, GetTaskForLargeImageNonSRGBColorSpace) { auto cache = CreateCache(); bool is_decomposable = true; SkFilterQuality quality = kHigh_SkFilterQuality; + gfx::ColorSpace color_space = gfx::ColorSpace::CreateXYZD50(); PaintImage image = CreateLargePaintImageForSoftwareFallback(); DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, color_space); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -1966,9 +2016,10 @@ TEST_P(GpuImageDecodeCacheTest, CacheDecodesExpectedFrames) { bool is_decomposable = true; SkFilterQuality quality = kHigh_SkFilterQuality; - DrawImage draw_image( - image, SkIRect::MakeWH(image.width(), image.height()), quality, - CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), 1u); + DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), + quality, + CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), + 1u, DefaultColorSpace()); auto decoded_image = EnsureImageBacked(cache->GetDecodedImageForDraw(draw_image)); ASSERT_TRUE(decoded_image.image()); @@ -1978,7 +2029,8 @@ TEST_P(GpuImageDecodeCacheTest, CacheDecodesExpectedFrames) { cache->DrawWithImageFinished(draw_image, decoded_image); // Scaled. - DrawImage scaled_draw_image(draw_image, 0.5f, 2u); + DrawImage scaled_draw_image(draw_image, 0.5f, 2u, + draw_image.target_color_space()); decoded_image = EnsureImageBacked(cache->GetDecodedImageForDraw(scaled_draw_image)); ASSERT_TRUE(decoded_image.image()); @@ -1994,7 +2046,8 @@ TEST_P(GpuImageDecodeCacheTest, CacheDecodesExpectedFrames) { ASSERT_LT(subset_height, test_image_size.height()); DrawImage subset_draw_image( image, SkIRect::MakeWH(subset_width, subset_height), quality, - CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), 3u); + CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), 3u, + DefaultColorSpace()); decoded_image = EnsureImageBacked(cache->GetDecodedImageForDraw(subset_draw_image)); ASSERT_TRUE(decoded_image.image()); @@ -2014,7 +2067,7 @@ TEST_P(GpuImageDecodeCacheTest, OrphanedDataCancelledWhileReplaced) { DrawImage first_draw_image( first_image, SkIRect::MakeWH(first_image.width(), first_image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult first_result = cache->GetTaskForImageAndRef( first_draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(first_result.need_unref); @@ -2028,7 +2081,7 @@ TEST_P(GpuImageDecodeCacheTest, OrphanedDataCancelledWhileReplaced) { DrawImage second_draw_image( first_image, SkIRect::MakeWH(first_image.width(), first_image.height()), quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult second_result = cache->GetTaskForImageAndRef( second_draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(second_result.need_unref); @@ -2069,7 +2122,7 @@ TEST_P(GpuImageDecodeCacheTest, AlreadyBudgetedImagesAreNotAtRaster) { DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); const size_t bytes_for_test_image = GetBytesNeededForSingleImage(test_image_size); @@ -2116,7 +2169,7 @@ TEST_P(GpuImageDecodeCacheTest, ImageBudgetingByCount) { DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); // The image counts against our budget. viz::ContextProvider::ScopedContextLock context_lock(context_provider()); @@ -2130,7 +2183,7 @@ TEST_P(GpuImageDecodeCacheTest, ImageBudgetingByCount) { CreatePaintImageInternal(GetNormalImageSize()), SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); // Should be at raster. ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef( @@ -2157,7 +2210,7 @@ TEST_P(GpuImageDecodeCacheTest, ImageBudgetingBySize) { DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); const size_t bytes_for_test_image = GetBytesNeededForSingleImage(test_image_size); @@ -2179,7 +2232,7 @@ TEST_P(GpuImageDecodeCacheTest, ImageBudgetingBySize) { CreatePaintImageInternal(test_image_size), SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); // Should be at raster. ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef( @@ -2198,16 +2251,16 @@ TEST_P(GpuImageDecodeCacheTest, ImageBudgetingBySize) { TEST_P(GpuImageDecodeCacheTest, ColorConversionDuringDecodeForLargeImageNonSRGBColorSpace) { - gfx::ColorSpace color_space = gfx::ColorSpace::CreateXYZD50(); - auto cache = CreateCache(color_space); + auto cache = CreateCache(); bool is_decomposable = true; const SkFilterQuality quality = kHigh_SkFilterQuality; + gfx::ColorSpace color_space = gfx::ColorSpace::CreateXYZD50(); PaintImage image = CreateLargePaintImageForSoftwareFallback(); DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, color_space); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -2253,16 +2306,16 @@ TEST_P(GpuImageDecodeCacheTest, TEST_P(GpuImageDecodeCacheTest, ColorConversionDuringUploadForSmallImageNonSRGBColorSpace) { - gfx::ColorSpace color_space = gfx::ColorSpace::CreateDisplayP3D65(); - auto cache = CreateCache(color_space); + auto cache = CreateCache(); bool is_decomposable = true; const SkFilterQuality quality = kHigh_SkFilterQuality; + gfx::ColorSpace color_space = gfx::ColorSpace::CreateDisplayP3D65(); PaintImage image = CreatePaintImageInternal(gfx::Size(11, 12)); DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, color_space); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -2314,7 +2367,7 @@ TEST_P(GpuImageDecodeCacheTest, NonLazyImageUploadNoScale) { DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); viz::ContextProvider::ScopedContextLock context_lock(context_provider()); DecodedDrawImage decoded_draw_image = EnsureImageBacked(cache->GetDecodedImageForDraw(draw_image)); @@ -2339,7 +2392,7 @@ TEST_P(GpuImageDecodeCacheTest, NonLazyImageUploadTaskHasNoDeps) { DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto result = cache->GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -2363,7 +2416,7 @@ TEST_P(GpuImageDecodeCacheTest, NonLazyImageUploadTaskCancelled) { DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto result = cache->GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -2380,8 +2433,7 @@ TEST_P(GpuImageDecodeCacheTest, NonLazyImageLargeImageColorConverted) { // YUV bitmap images do not happen, so this test will always skip for YUV. return; } - auto color_space = gfx::ColorSpace::CreateDisplayP3D65(); - auto cache = CreateCache(color_space); + auto cache = CreateCache(); const bool should_cache_sw_image = cache->SupportsColorSpaceConversion() && !use_transfer_cache_; @@ -2389,10 +2441,10 @@ TEST_P(GpuImageDecodeCacheTest, NonLazyImageLargeImageColorConverted) { SkFilterQuality quality = kHigh_SkFilterQuality; PaintImage image = CreateBitmapImageInternal(GetLargeImageSize()); - DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), - quality, - CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), - PaintImage::kDefaultFrameIndex); + DrawImage draw_image( + image, SkIRect::MakeWH(image.width(), image.height()), quality, + CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), + PaintImage::kDefaultFrameIndex, gfx::ColorSpace::CreateDisplayP3D65()); viz::ContextProvider::ScopedContextLock context_lock(context_provider()); DecodedDrawImage decoded_draw_image = EnsureImageBacked(cache->GetDecodedImageForDraw(draw_image)); @@ -2404,8 +2456,9 @@ TEST_P(GpuImageDecodeCacheTest, NonLazyImageLargeImageColorConverted) { auto sw_image = cache->GetSWImageDecodeForTesting(draw_image); ASSERT_EQ(!!sw_image, should_cache_sw_image); if (should_cache_sw_image) { - EXPECT_TRUE(SkColorSpace::Equals(sw_image->colorSpace(), - color_space.ToSkColorSpace().get())); + EXPECT_TRUE(SkColorSpace::Equals( + sw_image->colorSpace(), + gfx::ColorSpace::CreateDisplayP3D65().ToSkColorSpace().get())); } } @@ -2422,7 +2475,7 @@ TEST_P(GpuImageDecodeCacheTest, NonLazyImageUploadDownscaled) { DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); viz::ContextProvider::ScopedContextLock context_lock(context_provider()); DecodedDrawImage decoded_draw_image = EnsureImageBacked(cache->GetDecodedImageForDraw(draw_image)); @@ -2447,7 +2500,7 @@ TEST_P(GpuImageDecodeCacheTest, KeepOnlyLast2ContentIds) { DrawImage draw_image( image, SkIRect::MakeWH(image.width(), image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); DecodedDrawImage decoded_draw_image = EnsureImageBacked(cache->GetDecodedImageForDraw(draw_image)); @@ -2504,7 +2557,7 @@ TEST_P(GpuImageDecodeCacheTest, DecodeToScale) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.5, 0.5), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); DecodedDrawImage decoded_image = EnsureImageBacked(cache->GetDecodedImageForDraw(draw_image)); const int expected_width = @@ -2551,7 +2604,7 @@ TEST_P(GpuImageDecodeCacheTest, DecodeToScaleNoneQuality) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.5, 0.5), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); DecodedDrawImage decoded_image = EnsureImageBacked(cache->GetDecodedImageForDraw(draw_image)); ASSERT_TRUE(decoded_image.image()); @@ -2571,16 +2624,15 @@ TEST_P(GpuImageDecodeCacheTest, DecodeToScaleNoneQuality) { TEST_P(GpuImageDecodeCacheTest, BasicMips) { auto decode_and_check_mips = [this](SkFilterQuality filter_quality, - SkSize scale, - const gfx::ColorSpace& color_space, + SkSize scale, gfx::ColorSpace color_space, bool should_have_mips) { - auto cache = CreateCache(color_space); + auto cache = CreateCache(); bool is_decomposable = true; PaintImage image = CreatePaintImageInternal(GetNormalImageSize()); DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), filter_quality, CreateMatrix(scale, is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, color_space); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef( draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -2656,7 +2708,7 @@ TEST_P(GpuImageDecodeCacheTest, MipsAddedSubsequentDraw) { DrawImage draw_image( image, SkIRect::MakeWH(image.width(), image.height()), filter_quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef( draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -2701,7 +2753,7 @@ TEST_P(GpuImageDecodeCacheTest, MipsAddedSubsequentDraw) { DrawImage draw_image( image, SkIRect::MakeWH(image.width(), image.height()), filter_quality, CreateMatrix(SkSize::Make(0.6f, 0.6f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef( draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -2754,7 +2806,7 @@ TEST_P(GpuImageDecodeCacheTest, MipsAddedWhileOriginalInUse) { DrawImage draw_image( image, SkIRect::MakeWH(image.width(), image.height()), filter_quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef( draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -2792,7 +2844,7 @@ TEST_P(GpuImageDecodeCacheTest, MipsAddedWhileOriginalInUse) { DrawImage draw_image( image, SkIRect::MakeWH(image.width(), image.height()), filter_quality, CreateMatrix(SkSize::Make(0.6f, 0.6f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef( draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -2873,7 +2925,7 @@ TEST_P(GpuImageDecodeCacheTest, GetBorderlineLargeDecodedImageForDraw) { almost_too_large_image.height()), quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache->GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); diff --git a/chromium/cc/tiles/image_controller_unittest.cc b/chromium/cc/tiles/image_controller_unittest.cc index 05c82a46340..1c3e0d3b215 100644 --- a/chromium/cc/tiles/image_controller_unittest.cc +++ b/chromium/cc/tiles/image_controller_unittest.cc @@ -233,7 +233,7 @@ DrawImage CreateDiscardableDrawImage(gfx::Size size) { return DrawImage(CreateDiscardablePaintImage(size), SkIRect::MakeWH(size.width(), size.height()), kNone_SkFilterQuality, SkMatrix::I(), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, gfx::ColorSpace()); } DrawImage CreateBitmapDrawImage(gfx::Size size) { diff --git a/chromium/cc/tiles/paint_worklet_image_cache.cc b/chromium/cc/tiles/paint_worklet_image_cache.cc index 639bf7d19b1..d0bd702cae7 100644 --- a/chromium/cc/tiles/paint_worklet_image_cache.cc +++ b/chromium/cc/tiles/paint_worklet_image_cache.cc @@ -48,10 +48,7 @@ void PaintWorkletImageCache::SetPaintWorkletLayerPainter( scoped_refptr<TileTask> PaintWorkletImageCache::GetTaskForPaintWorkletImage( const DrawImage& image) { - // As described in crbug.com/939192, the |painter_| could be null, and we - // should not create any raster task. - if (!painter_) - return nullptr; + DCHECK(painter_); DCHECK(image.paint_image().IsPaintWorklet()); return base::MakeRefCounted<PaintWorkletTaskImpl>(this, image.paint_image()); } @@ -74,6 +71,8 @@ void PaintWorkletImageCache::PaintImageInTask(const PaintImage& paint_image) { // matches the PaintGeneratedImage::Draw. sk_sp<PaintRecord> record = painter_->Paint(paint_image.paint_worklet_input()); + if (!record) + return; { base::AutoLock hold(records_lock_); // It is possible for two or more threads to both pass through the first @@ -89,10 +88,7 @@ void PaintWorkletImageCache::PaintImageInTask(const PaintImage& paint_image) { std::pair<sk_sp<PaintRecord>, base::OnceCallback<void()>> PaintWorkletImageCache::GetPaintRecordAndRef(PaintWorkletInput* input) { base::AutoLock hold(records_lock_); - // If the |painter_| was null when GetTaskForPaintWorkletImage was called - // there will be no cache entry for this input. - if (records_.find(input) == records_.end()) - return std::make_pair(sk_make_sp<PaintOpBuffer>(), base::DoNothing::Once()); + DCHECK(records_.find(input) != records_.end()); records_[input].used_ref_count++; records_[input].num_of_frames_not_accessed = 0u; // The PaintWorkletImageCache object lives as long as the LayerTreeHostImpl, diff --git a/chromium/cc/tiles/paint_worklet_image_cache_unittest.cc b/chromium/cc/tiles/paint_worklet_image_cache_unittest.cc index 6ae3c0a0036..7af4b9340c6 100644 --- a/chromium/cc/tiles/paint_worklet_image_cache_unittest.cc +++ b/chromium/cc/tiles/paint_worklet_image_cache_unittest.cc @@ -257,29 +257,5 @@ TEST(PaintWorkletImageCacheTest, CacheEntryLookup) { } } -TEST(PaintWorkletImageCacheTest, TaskIsNullWhenPainterIsNull) { - TestPaintWorkletImageCache cache; - PaintImage paint_image = CreatePaintImage(100, 100); - scoped_refptr<TileTask> task = - GetTaskForPaintWorkletImage(paint_image, &cache); - EXPECT_EQ(task, nullptr); -} - -TEST(PaintWorkletImageCacheTest, - RecordAndCallbackAreEmptyWhenInputWasntPainted) { - TestPaintWorkletImageCache cache; - std::unique_ptr<TestPaintWorkletLayerPainter> painter = - std::make_unique<TestPaintWorkletLayerPainter>(); - cache.SetPaintWorkletLayerPainter(std::move(painter)); - - // We request a record and callback without ever painting the input. - PaintImage paint_image = CreatePaintImage(100, 100); - std::pair<sk_sp<PaintRecord>, base::OnceCallback<void()>> result = - cache.GetPaintRecordAndRef(paint_image.paint_worklet_input()); - EXPECT_EQ(result.first->total_op_count(), 0u); - // This is an empty callback, running it should not crash. - std::move(result.second).Run(); -} - } // namespace } // namespace cc diff --git a/chromium/cc/tiles/software_image_decode_cache.cc b/chromium/cc/tiles/software_image_decode_cache.cc index c2bb32f6e81..f858a180756 100644 --- a/chromium/cc/tiles/software_image_decode_cache.cc +++ b/chromium/cc/tiles/software_image_decode_cache.cc @@ -16,7 +16,6 @@ #include "cc/base/histograms.h" #include "cc/raster/tile_task.h" #include "cc/tiles/mipmap_util.h" -#include "ui/gfx/color_space.h" #include "ui/gfx/skia_util.h" using base::trace_event::MemoryAllocatorDump; @@ -143,10 +142,8 @@ void RecordLockExistingCachedImageHistogram(TilePriority::PriorityBin bin, SoftwareImageDecodeCache::SoftwareImageDecodeCache( SkColorType color_type, size_t locked_memory_limit_bytes, - PaintImage::GeneratorClientId generator_client_id, - sk_sp<SkColorSpace> target_color_space) + PaintImage::GeneratorClientId generator_client_id) : decoded_images_(ImageMRUCache::NO_AUTO_EVICT), - target_color_space_(std::move(target_color_space)), locked_images_budget_(locked_memory_limit_bytes), color_type_(color_type), generator_client_id_(generator_client_id), @@ -167,16 +164,6 @@ SoftwareImageDecodeCache::~SoftwareImageDecodeCache() { // It is safe to unregister, even if we didn't register in the constructor. base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider( this); - // TODO(vmpstr): If we don't have a client name, it may cause problems in - // unittests, since most tests don't set the name but some do. The UMA system - // expects the name to be always the same. This assertion is violated in the - // tests that do set the name. - if (GetClientNameForMetrics()) { - UMA_HISTOGRAM_CUSTOM_COUNTS( - base::StringPrintf("Compositing.%s.CachedImagesCount.Software", - GetClientNameForMetrics()), - lifetime_max_items_in_cache_, 1, 1000, 20); - } } ImageDecodeCache::TaskResult SoftwareImageDecodeCache::GetTaskForImageAndRef( @@ -316,8 +303,8 @@ void SoftwareImageDecodeCache::UnrefImage(const CacheKey& key) { void SoftwareImageDecodeCache::DecodeImageInTask(const CacheKey& key, const PaintImage& paint_image, DecodeTaskType task_type) { - TRACE_EVENT1("cc", "SoftwareImageDecodeCache::DecodeImageInTask", "key", - key.ToString()); + TRACE_EVENT1("cc,benchmark", "SoftwareImageDecodeCache::DecodeImageInTask", + "key", key.ToString()); base::AutoLock lock(lock_); auto image_it = decoded_images_.Peek(key); @@ -367,9 +354,8 @@ void SoftwareImageDecodeCache::DecodeImageIfNecessary( // If we can use the original decode, we'll definitely need a decode. if (key.type() == CacheKey::kOriginal) { base::AutoUnlock release(lock_); - local_cache_entry = - Utils::DoDecodeImage(key, paint_image, color_type_, target_color_space_, - generator_client_id_); + local_cache_entry = Utils::DoDecodeImage(key, paint_image, color_type_, + generator_client_id_); } else { // Attempt to find a cached decode to generate a scaled/subrected decode // from. @@ -396,9 +382,8 @@ void SoftwareImageDecodeCache::DecodeImageIfNecessary( DCHECK(!should_decode_to_scale || !key.is_nearest_neighbor()); if (should_decode_to_scale) { base::AutoUnlock release(lock_); - local_cache_entry = - Utils::DoDecodeImage(key, paint_image, color_type_, - target_color_space_, generator_client_id_); + local_cache_entry = Utils::DoDecodeImage(key, paint_image, color_type_, + generator_client_id_); } // Couldn't decode to scale or find a cached candidate. Create the @@ -423,9 +408,9 @@ void SoftwareImageDecodeCache::DecodeImageIfNecessary( key.type() == CacheKey::kSubrectOriginal ? SkIRect::MakeWH(paint_image.width(), paint_image.height()) : gfx::RectToSkIRect(key.src_rect()); - DrawImage candidate_draw_image(paint_image, src_rect, - kNone_SkFilterQuality, SkMatrix::I(), - key.frame_key().frame_index()); + DrawImage candidate_draw_image( + paint_image, src_rect, kNone_SkFilterQuality, SkMatrix::I(), + key.frame_key().frame_index(), key.target_color_space()); candidate_key.emplace( CacheKey::FromDrawImage(candidate_draw_image, color_type_)); } @@ -526,7 +511,9 @@ bool SoftwareImageDecodeCache::UseCacheForDrawImage( // Cache images that need to be converted to a non-sRGB color space. // TODO(ccameron): Consider caching when any color conversion is required. // https://crbug.com/791828 - if (target_color_space_ && !target_color_space_->isSRGB()) { + const gfx::ColorSpace& dst_color_space = draw_image.target_color_space(); + if (dst_color_space.IsValid() && + dst_color_space != gfx::ColorSpace::CreateSRGB()) { return true; } @@ -587,8 +574,6 @@ void SoftwareImageDecodeCache::DrawWithImageFinished( void SoftwareImageDecodeCache::ReduceCacheUsageUntilWithinLimit(size_t limit) { TRACE_EVENT0("cc", "SoftwareImageDecodeCache::ReduceCacheUsageUntilWithinLimit"); - lifetime_max_items_in_cache_ = - std::max(lifetime_max_items_in_cache_, decoded_images_.size()); for (auto it = decoded_images_.rbegin(); decoded_images_.size() > limit && it != decoded_images_.rend();) { if (it->second->ref_count != 0) { diff --git a/chromium/cc/tiles/software_image_decode_cache.h b/chromium/cc/tiles/software_image_decode_cache.h index eb7cc161f1d..c3b7c03303d 100644 --- a/chromium/cc/tiles/software_image_decode_cache.h +++ b/chromium/cc/tiles/software_image_decode_cache.h @@ -34,8 +34,7 @@ class CC_EXPORT SoftwareImageDecodeCache SoftwareImageDecodeCache(SkColorType color_type, size_t locked_memory_limit_bytes, - PaintImage::GeneratorClientId generator_client_id, - sk_sp<SkColorSpace> target_color_space); + PaintImage::GeneratorClientId generator_client_id); ~SoftwareImageDecodeCache() override; // ImageDecodeCache overrides. @@ -151,16 +150,12 @@ class CC_EXPORT SoftwareImageDecodeCache PaintImage::FrameKeyHash> frame_key_to_image_keys_; - const sk_sp<SkColorSpace> target_color_space_; MemoryBudget locked_images_budget_; const SkColorType color_type_; const PaintImage::GeneratorClientId generator_client_id_; size_t max_items_in_cache_; - // Records the maximum number of items in the cache over the lifetime of the - // cache. This is updated anytime we are requested to reduce cache usage. - size_t lifetime_max_items_in_cache_ = 0u; }; } // namespace cc diff --git a/chromium/cc/tiles/software_image_decode_cache_perftest.cc b/chromium/cc/tiles/software_image_decode_cache_perftest.cc index f873c9774bb..fb99fb7c3f6 100644 --- a/chromium/cc/tiles/software_image_decode_cache_perftest.cc +++ b/chromium/cc/tiles/software_image_decode_cache_perftest.cc @@ -63,7 +63,8 @@ class SoftwareImageDecodeCachePerfTest : public testing::Test { PaintImage::GetNextContentId()) .TakePaintImage(), subrect, quality, - CreateMatrix(SkSize::Make(scale.first, scale.second)), 0u); + CreateMatrix(SkSize::Make(scale.first, scale.second)), 0u, + gfx::ColorSpace()); } } } diff --git a/chromium/cc/tiles/software_image_decode_cache_unittest.cc b/chromium/cc/tiles/software_image_decode_cache_unittest.cc index 18f6d88444b..3e31e7a9a4b 100644 --- a/chromium/cc/tiles/software_image_decode_cache_unittest.cc +++ b/chromium/cc/tiles/software_image_decode_cache_unittest.cc @@ -23,13 +23,9 @@ size_t kLockedMemoryLimitBytes = 128 * 1024 * 1024; class TestSoftwareImageDecodeCache : public SoftwareImageDecodeCache { public: TestSoftwareImageDecodeCache() - : TestSoftwareImageDecodeCache(DefaultColorSpace()) {} - - explicit TestSoftwareImageDecodeCache(const gfx::ColorSpace& color_space) : SoftwareImageDecodeCache(kN32_SkColorType, kLockedMemoryLimitBytes, - PaintImage::kDefaultGeneratorClientId, - color_space.ToSkColorSpace()) {} + PaintImage::kDefaultGeneratorClientId) {} }; SkMatrix CreateMatrix(const SkSize& scale, bool is_decomposable) { @@ -58,7 +54,7 @@ TEST(SoftwareImageDecodeCacheTest, ImageKeyNoneQuality) { paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), kNone_SkFilterQuality, CreateMatrix(SkSize::Make(0.5f, 1.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto key = SoftwareImageDecodeCache::CacheKey::FromDrawImage( draw_image, kN32_SkColorType); @@ -80,7 +76,7 @@ TEST(SoftwareImageDecodeCacheTest, paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), kLow_SkFilterQuality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto key = SoftwareImageDecodeCache::CacheKey::FromDrawImage( draw_image, kN32_SkColorType); @@ -98,7 +94,7 @@ TEST(SoftwareImageDecodeCacheTest, ImageKeyMediumQualityDropsToLowIfMipLevel0) { paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), kMedium_SkFilterQuality, CreateMatrix(SkSize::Make(0.75f, 0.75f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto key = SoftwareImageDecodeCache::CacheKey::FromDrawImage( draw_image, kN32_SkColorType); @@ -117,7 +113,7 @@ TEST(SoftwareImageDecodeCacheTest, LowUnscalableFormatStaysLow) { paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), kLow_SkFilterQuality, CreateMatrix(SkSize::Make(0.5f, 1.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto key = SoftwareImageDecodeCache::CacheKey::FromDrawImage( draw_image, kARGB_4444_SkColorType); @@ -136,7 +132,7 @@ TEST(SoftwareImageDecodeCacheTest, HighUnscalableFormatBecomesLow) { paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), kHigh_SkFilterQuality, CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto key = SoftwareImageDecodeCache::CacheKey::FromDrawImage( draw_image, kARGB_4444_SkColorType); @@ -155,7 +151,7 @@ TEST(SoftwareImageDecodeCacheTest, ImageKeyLowQualityKeptLowIfUpscale) { paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), kLow_SkFilterQuality, CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto key = SoftwareImageDecodeCache::CacheKey::FromDrawImage( draw_image, kN32_SkColorType); @@ -175,7 +171,7 @@ TEST(SoftwareImageDecodeCacheTest, ImageKeyMediumQuality) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.4f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto key = SoftwareImageDecodeCache::CacheKey::FromDrawImage( draw_image, kN32_SkColorType); @@ -194,7 +190,7 @@ TEST(SoftwareImageDecodeCacheTest, ImageKeyMediumQualityDropToLowIfEnlarging) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto key = SoftwareImageDecodeCache::CacheKey::FromDrawImage( draw_image, kN32_SkColorType); @@ -214,7 +210,7 @@ TEST(SoftwareImageDecodeCacheTest, ImageKeyMediumQualityDropToLowIfIdentity) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto key = SoftwareImageDecodeCache::CacheKey::FromDrawImage( draw_image, kN32_SkColorType); @@ -235,7 +231,7 @@ TEST(SoftwareImageDecodeCacheTest, DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(1.001f, 1.001f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto key = SoftwareImageDecodeCache::CacheKey::FromDrawImage( draw_image, kN32_SkColorType); @@ -256,7 +252,7 @@ TEST(SoftwareImageDecodeCacheTest, DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.999f, 0.999f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto key = SoftwareImageDecodeCache::CacheKey::FromDrawImage( draw_image, kN32_SkColorType); @@ -277,7 +273,7 @@ TEST(SoftwareImageDecodeCacheTest, DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 1.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto key = SoftwareImageDecodeCache::CacheKey::FromDrawImage( draw_image, kN32_SkColorType); @@ -298,7 +294,7 @@ TEST(SoftwareImageDecodeCacheTest, ImageKeyMediumQualityAt1_5Scale) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto key = SoftwareImageDecodeCache::CacheKey::FromDrawImage( draw_image, kN32_SkColorType); @@ -318,7 +314,7 @@ TEST(SoftwareImageDecodeCacheTest, ImageKeyMediumQualityAt1_0cale) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto key = SoftwareImageDecodeCache::CacheKey::FromDrawImage( draw_image, kN32_SkColorType); @@ -338,7 +334,7 @@ TEST(SoftwareImageDecodeCacheTest, ImageKeyLowQualityAt0_75Scale) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.75f, 0.75f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto key = SoftwareImageDecodeCache::CacheKey::FromDrawImage( draw_image, kN32_SkColorType); @@ -358,7 +354,7 @@ TEST(SoftwareImageDecodeCacheTest, ImageKeyMediumQualityAt0_5Scale) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto key = SoftwareImageDecodeCache::CacheKey::FromDrawImage( draw_image, kN32_SkColorType); @@ -377,7 +373,7 @@ TEST(SoftwareImageDecodeCacheTest, ImageKeyMediumQualityAt0_49Scale) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.49f, 0.49f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto key = SoftwareImageDecodeCache::CacheKey::FromDrawImage( draw_image, kN32_SkColorType); @@ -396,7 +392,7 @@ TEST(SoftwareImageDecodeCacheTest, ImageKeyMediumQualityAt0_1Scale) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.1f, 0.1f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto key = SoftwareImageDecodeCache::CacheKey::FromDrawImage( draw_image, kN32_SkColorType); @@ -415,7 +411,7 @@ TEST(SoftwareImageDecodeCacheTest, ImageKeyMediumQualityAt0_01Scale) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.01f, 0.01f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto key = SoftwareImageDecodeCache::CacheKey::FromDrawImage( draw_image, kN32_SkColorType); @@ -435,7 +431,7 @@ TEST(SoftwareImageDecodeCacheTest, DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.2f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto key = SoftwareImageDecodeCache::CacheKey::FromDrawImage( draw_image, kN32_SkColorType); @@ -454,7 +450,7 @@ TEST(SoftwareImageDecodeCacheTest, ImageKeyUpscaleIsLowQuality) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(2.5f, 1.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto key = SoftwareImageDecodeCache::CacheKey::FromDrawImage( draw_image, kN32_SkColorType); @@ -477,7 +473,7 @@ TEST(SoftwareImageDecodeCacheTest, ImageKeyHighQualityDropToMediumIfTooLarge) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.45f, 0.45f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto key = SoftwareImageDecodeCache::CacheKey::FromDrawImage( draw_image, kN32_SkColorType); @@ -497,7 +493,7 @@ TEST(SoftwareImageDecodeCacheTest, DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 1.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto key = SoftwareImageDecodeCache::CacheKey::FromDrawImage( draw_image, kN32_SkColorType); @@ -517,7 +513,7 @@ TEST(SoftwareImageDecodeCacheTest, ImageKeyHighQualityDropToLowIfIdentity) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto key = SoftwareImageDecodeCache::CacheKey::FromDrawImage( draw_image, kN32_SkColorType); @@ -538,7 +534,7 @@ TEST(SoftwareImageDecodeCacheTest, DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(1.001f, 1.001f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto key = SoftwareImageDecodeCache::CacheKey::FromDrawImage( draw_image, kN32_SkColorType); @@ -559,7 +555,7 @@ TEST(SoftwareImageDecodeCacheTest, DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.999f, 0.999f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto key = SoftwareImageDecodeCache::CacheKey::FromDrawImage( draw_image, kN32_SkColorType); @@ -594,7 +590,7 @@ TEST(SoftwareImageDecodeCacheTest, ImageKeyDownscaleMipLevelWithRounding) { paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), kMedium_SkFilterQuality, CreateMatrix(SkSize::Make(0.2f, 0.2f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto key = SoftwareImageDecodeCache::CacheKey::FromDrawImage( draw_image, kN32_SkColorType); @@ -614,7 +610,7 @@ TEST(SoftwareImageDecodeCacheTest, OriginalDecodesAreEqual) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto key = SoftwareImageDecodeCache::CacheKey::FromDrawImage( draw_image, kN32_SkColorType); @@ -628,7 +624,7 @@ TEST(SoftwareImageDecodeCacheTest, OriginalDecodesAreEqual) { DrawImage another_draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(1.5f, 1.5), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto another_key = SoftwareImageDecodeCache::CacheKey::FromDrawImage( another_draw_image, kN32_SkColorType); @@ -651,7 +647,7 @@ TEST(SoftwareImageDecodeCacheTest, ImageRectDoesNotContainSrcRect) { paint_image, SkIRect::MakeXYWH(25, 35, paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto key = SoftwareImageDecodeCache::CacheKey::FromDrawImage( draw_image, kN32_SkColorType); @@ -672,7 +668,7 @@ TEST(SoftwareImageDecodeCacheTest, ImageRectDoesNotContainSrcRectWithScale) { paint_image, SkIRect::MakeXYWH(20, 30, paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); auto key = SoftwareImageDecodeCache::CacheKey::FromDrawImage( draw_image, kN32_SkColorType); @@ -693,7 +689,7 @@ TEST(SoftwareImageDecodeCacheTest, GetTaskForImageSameImage) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache.GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -702,7 +698,7 @@ TEST(SoftwareImageDecodeCacheTest, GetTaskForImageSameImage) { DrawImage another_draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult another_result = cache.GetTaskForImageAndRef( another_draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(another_result.need_unref); @@ -723,7 +719,7 @@ TEST(SoftwareImageDecodeCacheTest, GetTaskForImageProcessUnrefCancel) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache.GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -753,7 +749,7 @@ TEST(SoftwareImageDecodeCacheTest, GetTaskForImageSameImageDifferentQuality) { paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), kHigh_SkFilterQuality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult high_quality_result = cache.GetTaskForImageAndRef(high_quality_draw_image, ImageDecodeCache::TracingInfo()); @@ -764,7 +760,7 @@ TEST(SoftwareImageDecodeCacheTest, GetTaskForImageSameImageDifferentQuality) { paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), kNone_SkFilterQuality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult none_quality_result = cache.GetTaskForImageAndRef(none_quality_draw_image, ImageDecodeCache::TracingInfo()); @@ -788,7 +784,7 @@ TEST(SoftwareImageDecodeCacheTest, GetTaskForImageSameImageDifferentSize) { DrawImage half_size_draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult half_size_result = cache.GetTaskForImageAndRef( half_size_draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(half_size_result.need_unref); @@ -797,7 +793,7 @@ TEST(SoftwareImageDecodeCacheTest, GetTaskForImageSameImageDifferentSize) { DrawImage quarter_size_draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.25f, 0.25f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult quarter_size_result = cache.GetTaskForImageAndRef(quarter_size_draw_image, ImageDecodeCache::TracingInfo()); @@ -822,7 +818,7 @@ TEST(SoftwareImageDecodeCacheTest, GetTaskForImageDifferentImage) { first_paint_image, SkIRect::MakeWH(first_paint_image.width(), first_paint_image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult first_result = cache.GetTaskForImageAndRef( first_draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(first_result.need_unref); @@ -833,18 +829,75 @@ TEST(SoftwareImageDecodeCacheTest, GetTaskForImageDifferentImage) { second_paint_image, SkIRect::MakeWH(second_paint_image.width(), second_paint_image.height()), quality, CreateMatrix(SkSize::Make(0.25f, 0.25f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); + ImageDecodeCache::TaskResult second_result = cache.GetTaskForImageAndRef( + second_draw_image, ImageDecodeCache::TracingInfo()); + EXPECT_TRUE(second_result.need_unref); + EXPECT_TRUE(second_result.task); + EXPECT_TRUE(first_result.task.get() != second_result.task.get()); + + TestTileTaskRunner::ProcessTask(first_result.task.get()); + TestTileTaskRunner::ProcessTask(second_result.task.get()); + + cache.UnrefImage(first_draw_image); + cache.UnrefImage(second_draw_image); +} + +// crbug.com/709341 +#if defined(MEMORY_SANITIZER) +#define MAYBE_GetTaskForImageDifferentColorSpace \ + DISABLED_GetTaskForImageDifferentColorSpace +#else +#define MAYBE_GetTaskForImageDifferentColorSpace \ + GetTaskForImageDifferentColorSpace +#endif +TEST(SoftwareImageDecodeCacheTest, MAYBE_GetTaskForImageDifferentColorSpace) { + TestSoftwareImageDecodeCache cache; + bool is_decomposable = true; + SkFilterQuality quality = kHigh_SkFilterQuality; + + gfx::ColorSpace color_space_a(gfx::ColorSpace::PrimaryID::XYZ_D50, + gfx::ColorSpace::TransferID::IEC61966_2_1); + gfx::ColorSpace color_space_b(gfx::ColorSpace::PrimaryID::SMPTE170M, + gfx::ColorSpace::TransferID::IEC61966_2_1); + gfx::ColorSpace color_space_c = gfx::ColorSpace::CreateSRGB(); + + PaintImage paint_image = CreatePaintImage(100, 100, color_space_a); + DrawImage first_draw_image( + paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), + quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), + PaintImage::kDefaultFrameIndex, color_space_b); + ImageDecodeCache::TaskResult first_result = cache.GetTaskForImageAndRef( + first_draw_image, ImageDecodeCache::TracingInfo()); + EXPECT_TRUE(first_result.need_unref); + EXPECT_TRUE(first_result.task); + + DrawImage second_draw_image( + paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), + quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), + PaintImage::kDefaultFrameIndex, color_space_c); ImageDecodeCache::TaskResult second_result = cache.GetTaskForImageAndRef( second_draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(second_result.need_unref); EXPECT_TRUE(second_result.task); EXPECT_TRUE(first_result.task.get() != second_result.task.get()); + DrawImage third_draw_image( + paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), + quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), + PaintImage::kDefaultFrameIndex, color_space_b); + ImageDecodeCache::TaskResult third_result = cache.GetTaskForImageAndRef( + third_draw_image, ImageDecodeCache::TracingInfo()); + EXPECT_TRUE(third_result.need_unref); + EXPECT_TRUE(third_result.task); + EXPECT_TRUE(first_result.task.get() == third_result.task.get()); + TestTileTaskRunner::ProcessTask(first_result.task.get()); TestTileTaskRunner::ProcessTask(second_result.task.get()); cache.UnrefImage(first_draw_image); cache.UnrefImage(second_draw_image); + cache.UnrefImage(third_draw_image); } TEST(SoftwareImageDecodeCacheTest, GetTaskForImageAlreadyDecoded) { @@ -856,7 +909,7 @@ TEST(SoftwareImageDecodeCacheTest, GetTaskForImageAlreadyDecoded) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache.GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -885,7 +938,7 @@ TEST(SoftwareImageDecodeCacheTest, GetTaskForImageAlreadyPrerolled) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache.GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -920,7 +973,7 @@ TEST(SoftwareImageDecodeCacheTest, GetTaskForImageCanceledGetsNewTask) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache.GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -961,7 +1014,7 @@ TEST(SoftwareImageDecodeCacheTest, DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache.GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -1001,7 +1054,7 @@ TEST(SoftwareImageDecodeCacheTest, GetDecodedImageForDraw) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache.GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -1034,7 +1087,7 @@ TEST(SoftwareImageDecodeCacheTest, paint_image, SkIRect::MakeXYWH(20, 30, paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache.GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -1065,7 +1118,7 @@ TEST(SoftwareImageDecodeCacheTest, GetDecodedImageForDrawAtRasterDecode) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); DecodedDrawImage decoded_draw_image = cache.GetDecodedImageForDraw(draw_image); @@ -1090,7 +1143,7 @@ TEST(SoftwareImageDecodeCacheTest, DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); DecodedDrawImage decoded_draw_image = cache.GetDecodedImageForDraw(draw_image); @@ -1120,7 +1173,7 @@ TEST(SoftwareImageDecodeCacheTest, ZeroSizedImagesAreSkipped) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.f, 0.f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache.GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); @@ -1144,7 +1197,7 @@ TEST(SoftwareImageDecodeCacheTest, NonOverlappingSrcRectImagesAreSkipped) { paint_image, SkIRect::MakeXYWH(150, 150, paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache.GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); @@ -1167,7 +1220,7 @@ TEST(SoftwareImageDecodeCacheTest, LowQualityFilterIsHandled) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache.GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); @@ -1195,7 +1248,7 @@ TEST(SoftwareImageDecodeCacheTest, LowQualityScaledSubrectIsHandled) { PaintImage paint_image = CreatePaintImage(100, 100); DrawImage draw_image(paint_image, SkIRect::MakeXYWH(10, 10, 80, 80), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache.GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); @@ -1228,7 +1281,7 @@ TEST(SoftwareImageDecodeCacheTest, NoneQualityScaledSubrectIsHandled) { PaintImage paint_image = CreatePaintImage(100, 100); DrawImage draw_image(paint_image, SkIRect::MakeXYWH(10, 10, 80, 80), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache.GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); @@ -1259,7 +1312,7 @@ TEST(SoftwareImageDecodeCacheTest, MediumQualityAt01_5ScaleIsHandled) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache.GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); @@ -1290,7 +1343,7 @@ TEST(SoftwareImageDecodeCacheTest, MediumQualityAt1_0ScaleIsHandled) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache.GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); @@ -1321,7 +1374,7 @@ TEST(SoftwareImageDecodeCacheTest, MediumQualityAt0_75ScaleIsHandled) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.75f, 0.75f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache.GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); @@ -1352,7 +1405,7 @@ TEST(SoftwareImageDecodeCacheTest, MediumQualityAt0_5ScaleIsHandled) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache.GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); @@ -1383,7 +1436,7 @@ TEST(SoftwareImageDecodeCacheTest, MediumQualityAt0_49ScaleIsHandled) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.49f, 0.49f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache.GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); @@ -1414,7 +1467,7 @@ TEST(SoftwareImageDecodeCacheTest, MediumQualityAt0_1ScaleIsHandled) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.1f, 0.1f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache.GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); @@ -1445,7 +1498,7 @@ TEST(SoftwareImageDecodeCacheTest, MediumQualityAt0_01ScaleIsHandled) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.01f, 0.01f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache.GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); @@ -1476,7 +1529,7 @@ TEST(SoftwareImageDecodeCacheTest, MediumQualityAt0_001ScaleIsHandled) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.001f, 0.001f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache.GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); @@ -1500,11 +1553,11 @@ TEST(SoftwareImageDecodeCacheTest, DrawImage draw_image_50( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); DrawImage draw_image_49( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.49f, 0.49f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result_50 = cache.GetTaskForImageAndRef( draw_image_50, ImageDecodeCache::TracingInfo()); @@ -1551,7 +1604,7 @@ TEST(SoftwareImageDecodeCacheTest, ClearCache) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache.GetTaskForImageAndRef( draw_image, ImageDecodeCache::TracingInfo()); EXPECT_TRUE(result.need_unref); @@ -1586,9 +1639,10 @@ TEST(SoftwareImageDecodeCacheTest, CacheDecodesExpectedFrames) { bool is_decomposable = true; SkFilterQuality quality = kHigh_SkFilterQuality; - DrawImage draw_image( - image, SkIRect::MakeWH(image.width(), image.height()), quality, - CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), 1u); + DrawImage draw_image(image, SkIRect::MakeWH(image.width(), image.height()), + quality, + CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), + 1u, DefaultColorSpace()); auto decoded_image = cache.GetDecodedImageForDraw(draw_image); ASSERT_TRUE(decoded_image.image()); ASSERT_EQ(generator->frames_decoded().size(), 1u); @@ -1597,7 +1651,8 @@ TEST(SoftwareImageDecodeCacheTest, CacheDecodesExpectedFrames) { cache.DrawWithImageFinished(draw_image, decoded_image); // Scaled. - DrawImage scaled_draw_image(draw_image, 0.5f, 2u); + DrawImage scaled_draw_image(draw_image, 0.5f, 2u, + draw_image.target_color_space()); decoded_image = cache.GetDecodedImageForDraw(scaled_draw_image); ASSERT_TRUE(decoded_image.image()); ASSERT_EQ(generator->frames_decoded().size(), 1u); @@ -1608,7 +1663,8 @@ TEST(SoftwareImageDecodeCacheTest, CacheDecodesExpectedFrames) { // Subset. DrawImage subset_draw_image( image, SkIRect::MakeWH(5, 5), quality, - CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), 3u); + CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), 3u, + DefaultColorSpace()); decoded_image = cache.GetDecodedImageForDraw(subset_draw_image); ASSERT_TRUE(decoded_image.image()); ASSERT_EQ(generator->frames_decoded().size(), 1u); @@ -1628,7 +1684,7 @@ TEST(SoftwareImageDecodeCacheTest, SizeSubrectingIsHandled) { DefaultColorSpace().ToSkColorSpace(), false); DrawImage draw_image(paint_image, SkIRect::MakeXYWH(0, 0, 10, 10), quality, CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); ImageDecodeCache::TaskResult result = cache.GetTaskForImageAndRef(draw_image, ImageDecodeCache::TracingInfo()); @@ -1661,7 +1717,7 @@ TEST(SoftwareImageDecodeCacheTest, EmptyTargetSizeDecode) { gfx::Size(100, 100), DefaultColorSpace().ToSkColorSpace()); DrawImage draw_image(paint_image, SkIRect::MakeWH(100, 100), quality, CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); DecodedDrawImage decoded_draw_image = cache.GetDecodedImageForDraw(draw_image); EXPECT_TRUE(decoded_draw_image.image()); @@ -1671,7 +1727,7 @@ TEST(SoftwareImageDecodeCacheTest, EmptyTargetSizeDecode) { DrawImage empty_draw_image( paint_image, SkIRect::MakeEmpty(), quality, CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); DecodedDrawImage empty_decoded_draw_image = cache.GetDecodedImageForDraw(empty_draw_image); EXPECT_FALSE(empty_decoded_draw_image.image()); @@ -1679,16 +1735,16 @@ TEST(SoftwareImageDecodeCacheTest, EmptyTargetSizeDecode) { } TEST(SoftwareImageDecodeCacheTest, BitmapImageColorConverted) { - gfx::ColorSpace target_color_space = gfx::ColorSpace::CreateDisplayP3D65(); - TestSoftwareImageDecodeCache cache(target_color_space); + TestSoftwareImageDecodeCache cache; bool is_decomposable = true; SkFilterQuality quality = kHigh_SkFilterQuality; + gfx::ColorSpace target_color_space = gfx::ColorSpace::CreateDisplayP3D65(); PaintImage paint_image = CreateBitmapImage(gfx::Size(100, 100)); DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, target_color_space); DecodedDrawImage decoded_draw_image = cache.GetDecodedImageForDraw(draw_image); @@ -1712,7 +1768,7 @@ TEST(SoftwareImageDecodeCacheTest, BitmapImageNotColorConverted) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); // The cache should not support this image. EXPECT_FALSE(cache.UseCacheForDrawImage(draw_image)); @@ -1738,7 +1794,7 @@ TEST(SoftwareImageDecodeCacheTest, DISABLED_ContentIdCaching) { paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(scale, scale), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); DecodedDrawImage decoded_draw_image = cache.GetDecodedImageForDraw(draw_image); EXPECT_TRUE(decoded_draw_image.image()); @@ -1777,7 +1833,7 @@ TEST(SoftwareImageDecodeCacheTest, DecodeToScale) { DrawImage draw_image1( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.5, 0.5), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); DecodedDrawImage decoded_image1 = cache.GetDecodedImageForDraw(draw_image1); ASSERT_TRUE(decoded_image1.image()); EXPECT_EQ(decoded_image1.image()->width(), 50); @@ -1794,7 +1850,7 @@ TEST(SoftwareImageDecodeCacheTest, DecodeToScale) { DrawImage draw_image2( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.25, 0.25), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); DecodedDrawImage decoded_image2 = cache.GetDecodedImageForDraw(draw_image2); ASSERT_TRUE(decoded_image2.image()); EXPECT_EQ(decoded_image2.image()->width(), 25); @@ -1834,7 +1890,7 @@ TEST(SoftwareImageDecodeCacheTest, DecodeToScaleSubrect) { // subrect vetoes decode to scale. DrawImage draw_image(paint_image, SkIRect::MakeWH(50, 50), quality, CreateMatrix(SkSize::Make(0.5, 0.5), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); DecodedDrawImage decoded_image = cache.GetDecodedImageForDraw(draw_image); ASSERT_TRUE(decoded_image.image()); EXPECT_EQ(decoded_image.image()->width(), 25); @@ -1870,7 +1926,7 @@ TEST(SoftwareImageDecodeCacheTest, DecodeToScaleNoneQuality) { DrawImage draw_image( paint_image, SkIRect::MakeWH(paint_image.width(), paint_image.height()), quality, CreateMatrix(SkSize::Make(0.5, 0.5), is_decomposable), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, DefaultColorSpace()); DecodedDrawImage decoded_image = cache.GetDecodedImageForDraw(draw_image); ASSERT_TRUE(decoded_image.image()); EXPECT_EQ(decoded_image.image()->width(), 100); diff --git a/chromium/cc/tiles/software_image_decode_cache_unittest_combinations.cc b/chromium/cc/tiles/software_image_decode_cache_unittest_combinations.cc index 03d3e09e2f5..5052a2a5d21 100644 --- a/chromium/cc/tiles/software_image_decode_cache_unittest_combinations.cc +++ b/chromium/cc/tiles/software_image_decode_cache_unittest_combinations.cc @@ -50,7 +50,7 @@ class BaseTest : public testing::Test { ? SkIRect::MakeWH(paint_image().width(), paint_image().height()) : src_rect, kMedium_SkFilterQuality, CreateMatrix(SkSize::Make(scale, scale), true), - PaintImage::kDefaultFrameIndex); + PaintImage::kDefaultFrameIndex, GetColorSpace()); } SoftwareImageDecodeCache& cache() { return *cache_; } @@ -80,8 +80,7 @@ class N32Cache : public virtual BaseTest { std::unique_ptr<SoftwareImageDecodeCache> CreateCache() override { return std::make_unique<SoftwareImageDecodeCache>( kN32_SkColorType, kLockedMemoryLimitBytes, - PaintImage::kDefaultGeneratorClientId, - GetColorSpace().ToSkColorSpace()); + PaintImage::kDefaultGeneratorClientId); } }; @@ -90,8 +89,7 @@ class RGBA4444Cache : public virtual BaseTest { std::unique_ptr<SoftwareImageDecodeCache> CreateCache() override { return std::make_unique<SoftwareImageDecodeCache>( kARGB_4444_SkColorType, kLockedMemoryLimitBytes, - PaintImage::kDefaultGeneratorClientId, - GetColorSpace().ToSkColorSpace()); + PaintImage::kDefaultGeneratorClientId); } }; @@ -100,8 +98,7 @@ class RGBA_F16Cache : public virtual BaseTest { std::unique_ptr<SoftwareImageDecodeCache> CreateCache() override { return std::make_unique<SoftwareImageDecodeCache>( kRGBA_F16_SkColorType, kLockedMemoryLimitBytes, - PaintImage::kDefaultGeneratorClientId, - GetColorSpace().ToSkColorSpace()); + PaintImage::kDefaultGeneratorClientId); } }; @@ -138,6 +135,9 @@ class Predecode : public virtual BaseTest { const DrawImage& draw_image, const gfx::Size& expected_size) override { auto decoded = cache().GetDecodedImageForDraw(draw_image); + EXPECT_TRUE(SkColorSpace::Equals( + decoded.image()->colorSpace(), + draw_image.target_color_space().ToSkColorSpace().get())); SCOPED_TRACE(base::StringPrintf("Failure from line %d", line)); EXPECT_EQ(decoded.image()->width(), expected_size.width()); EXPECT_EQ(decoded.image()->height(), expected_size.height()); diff --git a/chromium/cc/tiles/software_image_decode_cache_utils.cc b/chromium/cc/tiles/software_image_decode_cache_utils.cc index fac25c22ae6..b3dae159e5d 100644 --- a/chromium/cc/tiles/software_image_decode_cache_utils.cc +++ b/chromium/cc/tiles/software_image_decode_cache_utils.cc @@ -59,7 +59,6 @@ SoftwareImageDecodeCacheUtils::DoDecodeImage( const CacheKey& key, const PaintImage& paint_image, SkColorType color_type, - sk_sp<SkColorSpace> color_space, PaintImage::GeneratorClientId client_id) { SkISize target_size = SkISize::Make(key.target_size().width(), key.target_size().height()); @@ -75,7 +74,7 @@ SoftwareImageDecodeCacheUtils::DoDecodeImage( "SoftwareImageDecodeCacheUtils::DoDecodeImage - " "decode"); bool result = paint_image.Decode(target_pixels->data(), &target_info, - std::move(color_space), + key.target_color_space().ToSkColorSpace(), key.frame_key().frame_index(), client_id); if (!result) { target_pixels->Unlock(); @@ -181,7 +180,7 @@ SoftwareImageDecodeCacheUtils::CacheKey::FromDrawImage(const DrawImage& image, // the filter quality doesn't matter. Early out instead. if (target_size.IsEmpty()) { return CacheKey(frame_key, stable_id, kSubrectAndScale, false, src_rect, - target_size); + target_size, image.target_color_space()); } ProcessingType type = kOriginal; @@ -234,7 +233,7 @@ SoftwareImageDecodeCacheUtils::CacheKey::FromDrawImage(const DrawImage& image, } return CacheKey(frame_key, stable_id, type, is_nearest_neighbor, src_rect, - target_size); + target_size, image.target_color_space()); } SoftwareImageDecodeCacheUtils::CacheKey::CacheKey( @@ -243,13 +242,15 @@ SoftwareImageDecodeCacheUtils::CacheKey::CacheKey( ProcessingType type, bool is_nearest_neighbor, const gfx::Rect& src_rect, - const gfx::Size& target_size) + const gfx::Size& target_size, + const gfx::ColorSpace& target_color_space) : frame_key_(frame_key), stable_id_(stable_id), type_(type), is_nearest_neighbor_(is_nearest_neighbor), src_rect_(src_rect), - target_size_(target_size) { + target_size_(target_size), + target_color_space_(target_color_space) { if (type == kOriginal) { hash_ = frame_key_.hash(); } else { @@ -266,6 +267,8 @@ SoftwareImageDecodeCacheUtils::CacheKey::CacheKey( hash_ = base::HashInts(base::HashInts(src_rect_hash, target_size_hash), frame_key_.hash()); } + // Include the target color space in the hash regardless of scaling. + hash_ = base::HashInts(hash_, target_color_space.GetHash()); } SoftwareImageDecodeCacheUtils::CacheKey::CacheKey(const CacheKey& other) = @@ -287,6 +290,7 @@ std::string SoftwareImageDecodeCacheUtils::CacheKey::ToString() const { } str << "]\nis_nearest_neightbor[" << is_nearest_neighbor_ << "]\nsrc_rect[" << src_rect_.ToString() << "]\ntarget_size[" << target_size_.ToString() + << "]\ntarget_color_space[" << target_color_space_.ToString() << "]\nhash[" << hash_ << "]"; return str.str(); } diff --git a/chromium/cc/tiles/software_image_decode_cache_utils.h b/chromium/cc/tiles/software_image_decode_cache_utils.h index 42d7b0205ce..835d68c8492 100644 --- a/chromium/cc/tiles/software_image_decode_cache_utils.h +++ b/chromium/cc/tiles/software_image_decode_cache_utils.h @@ -16,6 +16,7 @@ #include "third_party/skia/include/core/SkImage.h" #include "third_party/skia/include/core/SkImageInfo.h" #include "third_party/skia/include/core/SkSize.h" +#include "ui/gfx/color_space.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/size.h" @@ -56,6 +57,7 @@ class SoftwareImageDecodeCacheUtils { // image. DCHECK(!is_nearest_neighbor_ || type_ == kOriginal); return frame_key_ == other.frame_key_ && type_ == other.type_ && + target_color_space_ == other.target_color_space_ && (type_ == kOriginal || (src_rect_ == other.src_rect_ && target_size_ == other.target_size_)); } @@ -68,6 +70,9 @@ class SoftwareImageDecodeCacheUtils { bool is_nearest_neighbor() const { return is_nearest_neighbor_; } gfx::Rect src_rect() const { return src_rect_; } gfx::Size target_size() const { return target_size_; } + const gfx::ColorSpace& target_color_space() const { + return target_color_space_; + } size_t get_hash() const { return hash_; } @@ -89,7 +94,8 @@ class SoftwareImageDecodeCacheUtils { ProcessingType type, bool is_nearest_neighbor, const gfx::Rect& src_rect, - const gfx::Size& size); + const gfx::Size& size, + const gfx::ColorSpace& target_color_space); PaintImage::FrameKey frame_key_; // The stable id is does not factor into the cache key's value for hashing @@ -100,6 +106,7 @@ class SoftwareImageDecodeCacheUtils { bool is_nearest_neighbor_; gfx::Rect src_rect_; gfx::Size target_size_; + gfx::ColorSpace target_color_space_; size_t hash_; }; @@ -179,7 +186,6 @@ class SoftwareImageDecodeCacheUtils { const CacheKey& key, const PaintImage& image, SkColorType color_type, - sk_sp<SkColorSpace> color_space, PaintImage::GeneratorClientId client_id); static std::unique_ptr<CacheEntry> GenerateCacheEntryFromCandidate( const CacheKey& key, diff --git a/chromium/cc/tiles/tile_draw_info.cc b/chromium/cc/tiles/tile_draw_info.cc index 0c09fa281d7..f5c3138851a 100644 --- a/chromium/cc/tiles/tile_draw_info.cc +++ b/chromium/cc/tiles/tile_draw_info.cc @@ -22,7 +22,6 @@ void TileDrawInfo::AsValueInto(base::trace_event::TracedValue* state) const { void TileDrawInfo::SetResource(ResourcePool::InUsePoolResource resource, bool resource_is_checker_imaged, - bool contents_swizzled, bool is_premultiplied) { DCHECK(!resource_); DCHECK(resource); @@ -30,7 +29,6 @@ void TileDrawInfo::SetResource(ResourcePool::InUsePoolResource resource, mode_ = RESOURCE_MODE; is_resource_ready_to_draw_ = false; resource_is_checker_imaged_ = resource_is_checker_imaged; - contents_swizzled_ = contents_swizzled; is_premultiplied_ = is_premultiplied; resource_ = std::move(resource); } @@ -46,7 +44,6 @@ ResourcePool::InUsePoolResource TileDrawInfo::TakeResource() { DCHECK(resource_); is_resource_ready_to_draw_ = false; resource_is_checker_imaged_ = false; - contents_swizzled_ = false; is_premultiplied_ = false; return std::move(resource_); } diff --git a/chromium/cc/tiles/tile_draw_info.h b/chromium/cc/tiles/tile_draw_info.h index 993fcdc1c30..c38cc45a3bd 100644 --- a/chromium/cc/tiles/tile_draw_info.h +++ b/chromium/cc/tiles/tile_draw_info.h @@ -72,7 +72,6 @@ class CC_EXPORT TileDrawInfo { return solid_color_; } - bool contents_swizzled() const { return contents_swizzled_; } bool is_premultiplied() const { return is_premultiplied_; } bool requires_resource() const { @@ -98,7 +97,6 @@ class CC_EXPORT TileDrawInfo { void SetResource(ResourcePool::InUsePoolResource resource, bool resource_is_checker_imaged, - bool contents_swizzled, bool is_premultiplied); ResourcePool::InUsePoolResource TakeResource(); @@ -117,7 +115,6 @@ class CC_EXPORT TileDrawInfo { Mode mode_ = RESOURCE_MODE; SkColor solid_color_ = SK_ColorWHITE; ResourcePool::InUsePoolResource resource_; - bool contents_swizzled_ = false; bool is_premultiplied_ = false; bool is_resource_ready_to_draw_ = false; diff --git a/chromium/cc/tiles/tile_manager.cc b/chromium/cc/tiles/tile_manager.cc index e797e6db4a4..165bb015145 100644 --- a/chromium/cc/tiles/tile_manager.cc +++ b/chromium/cc/tiles/tile_manager.cc @@ -40,37 +40,6 @@ namespace { // a tile is of solid color. const bool kUseColorEstimator = true; -DEFINE_SCOPED_UMA_HISTOGRAM_AREA_TIMER( - ScopedSoftwareRasterTaskTimer, - "Compositing.%s.RasterTask.RasterUs.Software", - "Compositing.%s.RasterTask.RasterPixelsPerMs2.Software") - -DEFINE_SCOPED_UMA_HISTOGRAM_AREA_TIMER( - ScopedGpuRasterTaskTimer, - "Compositing.%s.RasterTask.RasterUs.Gpu", - "Compositing.%s.RasterTask.RasterPixelsPerMs2.Gpu") - -class ScopedRasterTaskTimer { - public: - explicit ScopedRasterTaskTimer(bool use_gpu_rasterization) { - if (use_gpu_rasterization) - gpu_timer_.emplace(); - else - software_timer_.emplace(); - } - - void SetArea(int area) { - if (software_timer_) - software_timer_->SetArea(area); - if (gpu_timer_) - gpu_timer_->SetArea(area); - } - - private: - base::Optional<ScopedSoftwareRasterTaskTimer> software_timer_; - base::Optional<ScopedGpuRasterTaskTimer> gpu_timer_; -}; - // This class is wrapper for both ImageProvider and PaintWorkletImageProvider, // which is used in RasterSource::PlaybackSettings. It looks at the draw image // and decides which one of the two providers to dispatch the request to. @@ -132,7 +101,6 @@ class RasterTaskImpl : public TileTask { tile_tracing_id_(static_cast<void*>(tile)), new_content_id_(tile->id()), source_frame_number_(tile->source_frame_number()), - is_gpu_rasterization_(is_gpu_rasterization), raster_buffer_(std::move(raster_buffer)), image_provider_(std::move(image_provider)), url_(std::move(url)) { @@ -152,8 +120,6 @@ class RasterTaskImpl : public TileTask { frame_viewer_instrumentation::ScopedRasterTask raster_task( tile_tracing_id_, tile_resolution_, source_frame_number_, layer_id_); - ScopedRasterTaskTimer timer(is_gpu_rasterization_); - timer.SetArea(content_rect_.size().GetArea()); DCHECK(raster_source_); @@ -203,7 +169,6 @@ class RasterTaskImpl : public TileTask { void* tile_tracing_id_; uint64_t new_content_id_; int source_frame_number_; - bool is_gpu_rasterization_; std::unique_ptr<RasterBuffer> raster_buffer_; DispatchingImageProvider image_provider_; GURL url_; @@ -717,6 +682,8 @@ TileManager::PrioritizedWorkToSchedule TileManager::AssignGpuMemoryToTiles() { MemoryUsage memory_usage(resource_pool_->memory_usage_bytes(), resource_pool_->resource_count()); + gfx::ColorSpace raster_color_space = client_->GetRasterColorSpace(); + std::unique_ptr<RasterTilePriorityQueue> raster_priority_queue( client_->BuildRasterQueue(global_state_.tree_priority, RasterTilePriorityQueue::Type::ALL)); @@ -769,7 +736,8 @@ TileManager::PrioritizedWorkToSchedule TileManager::AssignGpuMemoryToTiles() { DCHECK(prioritized_tile.should_decode_checkered_images_for_tile()); AddCheckeredImagesToDecodeQueue( - prioritized_tile, CheckerImageTracker::DecodeType::kRaster, + prioritized_tile, raster_color_space, + CheckerImageTracker::DecodeType::kRaster, &work_to_schedule.checker_image_decode_queue); continue; } @@ -825,13 +793,15 @@ TileManager::PrioritizedWorkToSchedule TileManager::AssignGpuMemoryToTiles() { if (tile->raster_task_scheduled_with_checker_images() && prioritized_tile.should_decode_checkered_images_for_tile()) { AddCheckeredImagesToDecodeQueue( - prioritized_tile, CheckerImageTracker::DecodeType::kRaster, + prioritized_tile, raster_color_space, + CheckerImageTracker::DecodeType::kRaster, &work_to_schedule.checker_image_decode_queue); } } else { // Creating the raster task here will acquire resources, but // this resource usage has already been accounted for above. - auto raster_task = CreateRasterTask(prioritized_tile, &work_to_schedule); + auto raster_task = CreateRasterTask( + prioritized_tile, client_->GetRasterColorSpace(), &work_to_schedule); if (!raster_task) { continue; } @@ -871,7 +841,8 @@ TileManager::PrioritizedWorkToSchedule TileManager::AssignGpuMemoryToTiles() { if (tile->draw_info().is_checker_imaged() || tile->raster_task_scheduled_with_checker_images()) { AddCheckeredImagesToDecodeQueue( - prioritized_tile, CheckerImageTracker::DecodeType::kRaster, + prioritized_tile, raster_color_space, + CheckerImageTracker::DecodeType::kRaster, &work_to_schedule.checker_image_decode_queue); } } @@ -928,6 +899,7 @@ void TileManager::FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw( void TileManager::PartitionImagesForCheckering( const PrioritizedTile& prioritized_tile, + const gfx::ColorSpace& raster_color_space, std::vector<DrawImage>* sync_decoded_images, std::vector<PaintImage>* checkered_images, const gfx::Rect* invalidated_rect, @@ -950,7 +922,7 @@ void TileManager::PartitionImagesForCheckering( (*image_to_frame_index)[image.stable_id()] = frame_index; DrawImage draw_image(*original_draw_image, tile->raster_transform().scale(), - frame_index); + frame_index, raster_color_space); if (checker_image_tracker_.ShouldCheckerImage(draw_image, tree)) checkered_images->push_back(draw_image.paint_image()); else @@ -960,6 +932,7 @@ void TileManager::PartitionImagesForCheckering( void TileManager::AddCheckeredImagesToDecodeQueue( const PrioritizedTile& prioritized_tile, + const gfx::ColorSpace& raster_color_space, CheckerImageTracker::DecodeType decode_type, CheckerImageTracker::ImageDecodeQueue* image_decode_queue) { Tile* tile = prioritized_tile.tile(); @@ -972,7 +945,7 @@ void TileManager::AddCheckeredImagesToDecodeQueue( size_t frame_index = client_->GetFrameIndexForImage( original_draw_image->paint_image(), tree); DrawImage draw_image(*original_draw_image, tile->raster_transform().scale(), - frame_index); + frame_index, raster_color_space); if (checker_image_tracker_.ShouldCheckerImage(draw_image, tree)) { image_decode_queue->emplace_back(draw_image.paint_image(), decode_type); } @@ -1008,6 +981,8 @@ void TileManager::ScheduleTasks(PrioritizedWorkToSchedule work_to_schedule) { graph_.Reset(); + gfx::ColorSpace raster_color_space = client_->GetRasterColorSpace(); + scoped_refptr<TileTask> required_for_activation_done_task = CreateTaskSetFinishedTask( &TileManager::DidFinishRunningTileTasksRequiredForActivation); @@ -1063,8 +1038,9 @@ void TileManager::ScheduleTasks(PrioritizedWorkToSchedule work_to_schedule) { for (const PrioritizedTile& prioritized_tile : tiles_to_process_for_images) { std::vector<DrawImage> sync_decoded_images; std::vector<PaintImage> checkered_images; - PartitionImagesForCheckering(prioritized_tile, &sync_decoded_images, - &checkered_images, nullptr); + PartitionImagesForCheckering(prioritized_tile, raster_color_space, + &sync_decoded_images, &checkered_images, + nullptr); // Add the sync decoded images to |new_locked_images| so they can be added // to the task graph. @@ -1156,6 +1132,7 @@ void TileManager::ScheduleTasks(PrioritizedWorkToSchedule work_to_schedule) { scoped_refptr<TileTask> TileManager::CreateRasterTask( const PrioritizedTile& prioritized_tile, + const gfx::ColorSpace& raster_color_space, PrioritizedWorkToSchedule* work_to_schedule) { TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), "TileManager::CreateRasterTask"); @@ -1172,7 +1149,7 @@ scoped_refptr<TileTask> TileManager::CreateRasterTask( tile->id(), tile->invalidated_content_rect(), tile->invalidated_id(), &invalidated_rect); } - const gfx::ColorSpace& raster_color_space = client_->GetRasterColorSpace(); + bool partial_tile_decode = false; if (resource) { resource_content_id = tile->invalidated_id(); @@ -1203,8 +1180,8 @@ scoped_refptr<TileTask> TileManager::CreateRasterTask( base::flat_map<PaintImage::Id, size_t> image_id_to_current_frame_index; if (!skip_images) { PartitionImagesForCheckering( - prioritized_tile, &sync_decoded_images, &checkered_images, - partial_tile_decode ? &invalidated_rect : nullptr, + prioritized_tile, raster_color_space, &sync_decoded_images, + &checkered_images, partial_tile_decode ? &invalidated_rect : nullptr, &image_id_to_current_frame_index); } @@ -1268,7 +1245,7 @@ scoped_refptr<TileTask> TileManager::CreateRasterTask( } PlaybackImageProvider image_provider(image_controller_.cache(), - std::move(settings)); + raster_color_space, std::move(settings)); PaintWorkletImageProvider paint_worklet_image_provider( image_controller_.paint_worklet_image_cache()); DispatchingImageProvider dispatching_image_provider( @@ -1340,11 +1317,10 @@ void TileManager::OnRasterTaskCompleted( TileDrawInfo& draw_info = tile->draw_info(); if (exported) { - bool needs_swizzle = raster_buffer_provider_->IsResourceSwizzleRequired(); bool is_premultiplied = raster_buffer_provider_->IsResourcePremultiplied(); draw_info.SetResource(std::move(resource), raster_task_was_scheduled_with_checker_images, - needs_swizzle, is_premultiplied); + is_premultiplied); } else { resource_pool_->ReleaseResource(std::move(resource)); draw_info.set_oom(); diff --git a/chromium/cc/tiles/tile_manager.h b/chromium/cc/tiles/tile_manager.h index 30d55902837..015ce53e837 100644 --- a/chromium/cc/tiles/tile_manager.h +++ b/chromium/cc/tiles/tile_manager.h @@ -212,7 +212,7 @@ class CC_EXPORT TileManager : CheckerImageTrackerClient { } bool exported = resource_pool_->PrepareForExport(resource); DCHECK(exported); - draw_info.SetResource(std::move(resource), false, false, false); + draw_info.SetResource(std::move(resource), false, false); draw_info.set_resource_ready_for_draw(); } } @@ -355,6 +355,7 @@ class CC_EXPORT TileManager : CheckerImageTrackerClient { void FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw(Tile* tile); scoped_refptr<TileTask> CreateRasterTask( const PrioritizedTile& prioritized_tile, + const gfx::ColorSpace& raster_color_space, PrioritizedWorkToSchedule* work_to_schedule); std::unique_ptr<EvictionTilePriorityQueue> @@ -387,12 +388,14 @@ class CC_EXPORT TileManager : CheckerImageTrackerClient { void PartitionImagesForCheckering( const PrioritizedTile& prioritized_tile, + const gfx::ColorSpace& raster_color_space, std::vector<DrawImage>* sync_decoded_images, std::vector<PaintImage>* checkered_images, const gfx::Rect* invalidated_rect, base::flat_map<PaintImage::Id, size_t>* image_to_frame_index = nullptr); void AddCheckeredImagesToDecodeQueue( const PrioritizedTile& prioritized_tile, + const gfx::ColorSpace& raster_color_space, CheckerImageTracker::DecodeType decode_type, CheckerImageTracker::ImageDecodeQueue* image_decode_queue); diff --git a/chromium/cc/tiles/tile_manager_unittest.cc b/chromium/cc/tiles/tile_manager_unittest.cc index 43f7f2a354f..9c6d1e0516b 100644 --- a/chromium/cc/tiles/tile_manager_unittest.cc +++ b/chromium/cc/tiles/tile_manager_unittest.cc @@ -1540,6 +1540,9 @@ class TestSoftwareBacking : public ResourcePool::SoftwareBacking { // into the pixels in the array. class TestSoftwareRasterBufferProvider : public FakeRasterBufferProviderImpl { public: + static constexpr bool kIsGpuCompositing = true; + static constexpr viz::ResourceFormat kResourceFormat = viz::RGBA_8888; + std::unique_ptr<RasterBuffer> AcquireBufferForRaster( const ResourcePool::InUsePoolResource& resource, uint64_t resource_content_id, @@ -1549,7 +1552,7 @@ class TestSoftwareRasterBufferProvider : public FakeRasterBufferProviderImpl { backing->shared_bitmap_id = viz::SharedBitmap::GenerateId(); backing->pixels = std::make_unique<uint32_t[]>( viz::ResourceSizes::CheckedSizeInBytes<size_t>(resource.size(), - viz::RGBA_8888)); + kResourceFormat)); resource.set_software_backing(std::move(backing)); } auto* backing = @@ -1572,9 +1575,9 @@ class TestSoftwareRasterBufferProvider : public FakeRasterBufferProviderImpl { const RasterSource::PlaybackSettings& playback_settings, const GURL& url) override { RasterBufferProvider::PlaybackToMemory( - pixels_, viz::RGBA_8888, size_, /*stride=*/0, raster_source, + pixels_, kResourceFormat, size_, /*stride=*/0, raster_source, raster_full_rect, /*playback_rect=*/raster_full_rect, transform, - gfx::ColorSpace(), /*gpu_compositing=*/true, playback_settings); + gfx::ColorSpace(), kIsGpuCompositing, playback_settings); } private: @@ -1805,8 +1808,11 @@ TEST_F(PixelInspectTileManagerTest, LowResHasNoImage) { EXPECT_TRUE(tile->draw_info().IsReadyToDraw()); gfx::Size resource_size = tile->draw_info().resource_size(); - auto info = SkImageInfo::MakeN32Premul(resource_size.width(), - resource_size.height()); + SkColorType ct = ResourceFormatToClosestSkColorType( + TestSoftwareRasterBufferProvider::kIsGpuCompositing, + TestSoftwareRasterBufferProvider::kResourceFormat); + auto info = SkImageInfo::Make(resource_size.width(), resource_size.height(), + ct, kPremul_SkAlphaType); // CreateLayerTreeFrameSink() sets up a software compositing, so the // tile resource will be a bitmap. auto* backing = static_cast<TestSoftwareBacking*>( @@ -3363,9 +3369,9 @@ TEST_F(DecodedImageTrackerTileManagerTest, DecodedImageTrackerDropsLocksOnUse) { // Add the images to our decoded_image_tracker. host_impl()->tile_manager()->decoded_image_tracker().QueueImageDecode( - image1, base::DoNothing()); + image1, gfx::ColorSpace(), base::DoNothing()); host_impl()->tile_manager()->decoded_image_tracker().QueueImageDecode( - image2, base::DoNothing()); + image2, gfx::ColorSpace(), base::DoNothing()); EXPECT_EQ(0u, host_impl() ->tile_manager() ->decoded_image_tracker() |