summaryrefslogtreecommitdiff
path: root/chromium/cc/tiles
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2019-07-31 15:50:41 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2019-08-30 12:35:23 +0000
commit7b2ffa587235a47d4094787d72f38102089f402a (patch)
tree30e82af9cbab08a7fa028bb18f4f2987a3f74dfa /chromium/cc/tiles
parentd94af01c90575348c4e81a418257f254b6f8d225 (diff)
downloadqtwebengine-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')
-rw-r--r--chromium/cc/tiles/checker_image_tracker.cc3
-rw-r--r--chromium/cc/tiles/checker_image_tracker.h1
-rw-r--r--chromium/cc/tiles/checker_image_tracker_unittest.cc13
-rw-r--r--chromium/cc/tiles/decoded_image_tracker.cc3
-rw-r--r--chromium/cc/tiles/decoded_image_tracker.h1
-rw-r--r--chromium/cc/tiles/decoded_image_tracker_unittest.cc46
-rw-r--r--chromium/cc/tiles/gpu_image_decode_cache.cc107
-rw-r--r--chromium/cc/tiles/gpu_image_decode_cache.h17
-rw-r--r--chromium/cc/tiles/gpu_image_decode_cache_perftest.cc44
-rw-r--r--chromium/cc/tiles/gpu_image_decode_cache_unittest.cc264
-rw-r--r--chromium/cc/tiles/image_controller_unittest.cc2
-rw-r--r--chromium/cc/tiles/paint_worklet_image_cache.cc12
-rw-r--r--chromium/cc/tiles/paint_worklet_image_cache_unittest.cc24
-rw-r--r--chromium/cc/tiles/software_image_decode_cache.cc41
-rw-r--r--chromium/cc/tiles/software_image_decode_cache.h7
-rw-r--r--chromium/cc/tiles/software_image_decode_cache_perftest.cc3
-rw-r--r--chromium/cc/tiles/software_image_decode_cache_unittest.cc228
-rw-r--r--chromium/cc/tiles/software_image_decode_cache_unittest_combinations.cc14
-rw-r--r--chromium/cc/tiles/software_image_decode_cache_utils.cc16
-rw-r--r--chromium/cc/tiles/software_image_decode_cache_utils.h10
-rw-r--r--chromium/cc/tiles/tile_draw_info.cc3
-rw-r--r--chromium/cc/tiles/tile_draw_info.h3
-rw-r--r--chromium/cc/tiles/tile_manager.cc74
-rw-r--r--chromium/cc/tiles/tile_manager.h5
-rw-r--r--chromium/cc/tiles/tile_manager_unittest.cc20
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()