| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/tiles/gpu_image_decode_cache.h" | 5 #include "cc/tiles/gpu_image_decode_cache.h" |
| 6 | 6 |
| 7 #include "cc/paint/draw_image.h" | 7 #include "cc/paint/draw_image.h" |
| 8 #include "cc/test/test_context_provider.h" | 8 #include "cc/test/test_context_provider.h" |
| 9 #include "cc/test/test_tile_task_runner.h" | 9 #include "cc/test/test_tile_task_runner.h" |
| 10 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
| 11 #include "third_party/skia/include/core/SkImageGenerator.h" |
| 11 #include "third_party/skia/include/core/SkRefCnt.h" | 12 #include "third_party/skia/include/core/SkRefCnt.h" |
| 12 | 13 |
| 13 namespace cc { | 14 namespace cc { |
| 14 namespace { | 15 namespace { |
| 15 | 16 |
| 16 gfx::ColorSpace DefaultColorSpace() { | 17 gfx::ColorSpace DefaultColorSpace() { |
| 17 return gfx::ColorSpace::CreateSRGB(); | 18 return gfx::ColorSpace::CreateSRGB(); |
| 18 } | 19 } |
| 19 | 20 |
| 20 PaintImage::Id s_paint_image_id = PaintImage::GetNextId(); | 21 PaintImage::Id s_paint_image_id = PaintImage::GetNextId(); |
| 21 | 22 |
| 22 PaintImage CreatePaintImage(sk_sp<SkImage> image) { | 23 PaintImage CreatePaintImage(sk_sp<SkImage> image) { |
| 23 return PaintImage(s_paint_image_id, image); | 24 return PaintImage(s_paint_image_id, image); |
| 24 } | 25 } |
| 25 | 26 |
| 26 size_t kGpuMemoryLimitBytes = 96 * 1024 * 1024; | 27 size_t kGpuMemoryLimitBytes = 96 * 1024 * 1024; |
| 27 class TestGpuImageDecodeCache : public GpuImageDecodeCache { | 28 class TestGpuImageDecodeCache : public GpuImageDecodeCache { |
| 28 public: | 29 public: |
| 29 explicit TestGpuImageDecodeCache(ContextProvider* context) | 30 explicit TestGpuImageDecodeCache(ContextProvider* context, |
| 31 ResourceFormat format) |
| 30 : GpuImageDecodeCache(context, | 32 : GpuImageDecodeCache(context, |
| 31 ResourceFormat::RGBA_8888, | 33 format, |
| 32 kGpuMemoryLimitBytes, | 34 kGpuMemoryLimitBytes, |
| 33 kGpuMemoryLimitBytes) {} | 35 kGpuMemoryLimitBytes) {} |
| 34 }; | 36 }; |
| 35 | 37 |
| 38 class TestImageGenerator : public SkImageGenerator { |
| 39 public: |
| 40 explicit TestImageGenerator(const SkImageInfo& info) |
| 41 : SkImageGenerator(info), |
| 42 image_backing_memory_(info.getSafeSize(info.minRowBytes()), 0), |
| 43 image_pixmap_(info, image_backing_memory_.data(), info.minRowBytes()) {} |
| 44 |
| 45 protected: |
| 46 bool onGetPixels(const SkImageInfo& info, |
| 47 void* pixels, |
| 48 size_t rowBytes, |
| 49 const Options&) override { |
| 50 return image_pixmap_.readPixels(info, pixels, rowBytes, 0, 0); |
| 51 } |
| 52 |
| 53 private: |
| 54 std::vector<uint8_t> image_backing_memory_; |
| 55 SkPixmap image_pixmap_; |
| 56 }; |
| 57 |
| 36 sk_sp<SkImage> CreateImage(int width, int height) { | 58 sk_sp<SkImage> CreateImage(int width, int height) { |
| 37 SkBitmap bitmap; | |
| 38 gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB(); | 59 gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB(); |
| 39 bitmap.allocPixels( | 60 std::unique_ptr<TestImageGenerator> generator(new TestImageGenerator( |
| 40 SkImageInfo::MakeN32Premul(width, height, color_space.ToSkColorSpace())); | 61 SkImageInfo::MakeN32Premul(width, height, color_space.ToSkColorSpace()))); |
| 41 bitmap.eraseColor(0); | 62 return SkImage::MakeFromGenerator(std::move(generator)); |
| 42 return SkImage::MakeFromBitmap(bitmap); | |
| 43 } | 63 } |
| 44 | 64 |
| 45 SkMatrix CreateMatrix(const SkSize& scale, bool is_decomposable) { | 65 SkMatrix CreateMatrix(const SkSize& scale, bool is_decomposable) { |
| 46 SkMatrix matrix; | 66 SkMatrix matrix; |
| 47 matrix.setScale(scale.width(), scale.height()); | 67 matrix.setScale(scale.width(), scale.height()); |
| 48 | 68 |
| 49 if (!is_decomposable) { | 69 if (!is_decomposable) { |
| 50 // Perspective is not decomposable, add it. | 70 // Perspective is not decomposable, add it. |
| 51 matrix[SkMatrix::kMPersp0] = 0.1f; | 71 matrix[SkMatrix::kMPersp0] = 0.1f; |
| 52 } | 72 } |
| 53 | 73 |
| 54 return matrix; | 74 return matrix; |
| 55 } | 75 } |
| 56 | 76 |
| 57 TEST(GpuImageDecodeCacheTest, GetTaskForImageSameImage) { | 77 using GpuImageDecodeCacheTest = ::testing::TestWithParam<ResourceFormat>; |
| 78 |
| 79 TEST_P(GpuImageDecodeCacheTest, GetTaskForImageSameImage) { |
| 58 auto context_provider = TestContextProvider::Create(); | 80 auto context_provider = TestContextProvider::Create(); |
| 59 context_provider->BindToCurrentThread(); | 81 context_provider->BindToCurrentThread(); |
| 60 TestGpuImageDecodeCache cache(context_provider.get()); | 82 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 61 sk_sp<SkImage> image = CreateImage(100, 100); | 83 sk_sp<SkImage> image = CreateImage(100, 100); |
| 62 bool is_decomposable = true; | 84 bool is_decomposable = true; |
| 63 SkFilterQuality quality = kHigh_SkFilterQuality; | 85 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 64 | 86 |
| 65 DrawImage draw_image( | 87 DrawImage draw_image( |
| 66 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), | 88 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), |
| 67 quality, CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable), | 89 quality, CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable), |
| 68 DefaultColorSpace()); | 90 DefaultColorSpace()); |
| 69 scoped_refptr<TileTask> task; | 91 scoped_refptr<TileTask> task; |
| 70 bool need_unref = cache.GetTaskForImageAndRef( | 92 bool need_unref = cache.GetTaskForImageAndRef( |
| (...skipping 11 matching lines...) Expand all Loading... |
| 82 EXPECT_TRUE(need_unref); | 104 EXPECT_TRUE(need_unref); |
| 83 EXPECT_TRUE(task.get() == another_task.get()); | 105 EXPECT_TRUE(task.get() == another_task.get()); |
| 84 | 106 |
| 85 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); | 107 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); |
| 86 TestTileTaskRunner::ProcessTask(task.get()); | 108 TestTileTaskRunner::ProcessTask(task.get()); |
| 87 | 109 |
| 88 cache.UnrefImage(draw_image); | 110 cache.UnrefImage(draw_image); |
| 89 cache.UnrefImage(draw_image); | 111 cache.UnrefImage(draw_image); |
| 90 } | 112 } |
| 91 | 113 |
| 92 TEST(GpuImageDecodeCacheTest, GetTaskForImageSmallerScale) { | 114 TEST_P(GpuImageDecodeCacheTest, GetTaskForImageSmallerScale) { |
| 93 auto context_provider = TestContextProvider::Create(); | 115 auto context_provider = TestContextProvider::Create(); |
| 94 context_provider->BindToCurrentThread(); | 116 context_provider->BindToCurrentThread(); |
| 95 TestGpuImageDecodeCache cache(context_provider.get()); | 117 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 96 sk_sp<SkImage> image = CreateImage(100, 100); | 118 sk_sp<SkImage> image = CreateImage(100, 100); |
| 97 bool is_decomposable = true; | 119 bool is_decomposable = true; |
| 98 SkFilterQuality quality = kHigh_SkFilterQuality; | 120 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 99 | 121 |
| 100 DrawImage draw_image( | 122 DrawImage draw_image( |
| 101 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), | 123 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), |
| 102 quality, CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable), | 124 quality, CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable), |
| 103 DefaultColorSpace()); | 125 DefaultColorSpace()); |
| 104 scoped_refptr<TileTask> task; | 126 scoped_refptr<TileTask> task; |
| 105 bool need_unref = cache.GetTaskForImageAndRef( | 127 bool need_unref = cache.GetTaskForImageAndRef( |
| (...skipping 11 matching lines...) Expand all Loading... |
| 117 EXPECT_TRUE(need_unref); | 139 EXPECT_TRUE(need_unref); |
| 118 EXPECT_TRUE(task.get() == another_task.get()); | 140 EXPECT_TRUE(task.get() == another_task.get()); |
| 119 | 141 |
| 120 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); | 142 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); |
| 121 TestTileTaskRunner::ProcessTask(task.get()); | 143 TestTileTaskRunner::ProcessTask(task.get()); |
| 122 | 144 |
| 123 cache.UnrefImage(draw_image); | 145 cache.UnrefImage(draw_image); |
| 124 cache.UnrefImage(another_draw_image); | 146 cache.UnrefImage(another_draw_image); |
| 125 } | 147 } |
| 126 | 148 |
| 127 TEST(GpuImageDecodeCacheTest, GetTaskForImageLowerQuality) { | 149 TEST_P(GpuImageDecodeCacheTest, GetTaskForImageLowerQuality) { |
| 128 auto context_provider = TestContextProvider::Create(); | 150 auto context_provider = TestContextProvider::Create(); |
| 129 context_provider->BindToCurrentThread(); | 151 context_provider->BindToCurrentThread(); |
| 130 TestGpuImageDecodeCache cache(context_provider.get()); | 152 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 131 sk_sp<SkImage> image = CreateImage(100, 100); | 153 sk_sp<SkImage> image = CreateImage(100, 100); |
| 132 bool is_decomposable = true; | 154 bool is_decomposable = true; |
| 133 SkMatrix matrix = CreateMatrix(SkSize::Make(0.4f, 0.4f), is_decomposable); | 155 SkMatrix matrix = CreateMatrix(SkSize::Make(0.4f, 0.4f), is_decomposable); |
| 134 | 156 |
| 135 DrawImage draw_image(CreatePaintImage(image), | 157 DrawImage draw_image(CreatePaintImage(image), |
| 136 SkIRect::MakeWH(image->width(), image->height()), | 158 SkIRect::MakeWH(image->width(), image->height()), |
| 137 kHigh_SkFilterQuality, matrix, DefaultColorSpace()); | 159 kHigh_SkFilterQuality, matrix, DefaultColorSpace()); |
| 138 scoped_refptr<TileTask> task; | 160 scoped_refptr<TileTask> task; |
| 139 bool need_unref = cache.GetTaskForImageAndRef( | 161 bool need_unref = cache.GetTaskForImageAndRef( |
| 140 draw_image, ImageDecodeCache::TracingInfo(), &task); | 162 draw_image, ImageDecodeCache::TracingInfo(), &task); |
| 141 EXPECT_TRUE(need_unref); | 163 EXPECT_TRUE(need_unref); |
| 142 EXPECT_TRUE(task); | 164 EXPECT_TRUE(task); |
| 143 | 165 |
| 144 DrawImage another_draw_image( | 166 DrawImage another_draw_image( |
| 145 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), | 167 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), |
| 146 kLow_SkFilterQuality, matrix, DefaultColorSpace()); | 168 kLow_SkFilterQuality, matrix, DefaultColorSpace()); |
| 147 scoped_refptr<TileTask> another_task; | 169 scoped_refptr<TileTask> another_task; |
| 148 need_unref = cache.GetTaskForImageAndRef( | 170 need_unref = cache.GetTaskForImageAndRef( |
| 149 another_draw_image, ImageDecodeCache::TracingInfo(), &another_task); | 171 another_draw_image, ImageDecodeCache::TracingInfo(), &another_task); |
| 150 EXPECT_TRUE(need_unref); | 172 EXPECT_TRUE(need_unref); |
| 151 EXPECT_TRUE(task.get() == another_task.get()); | 173 EXPECT_TRUE(task.get() == another_task.get()); |
| 152 | 174 |
| 153 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); | 175 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); |
| 154 TestTileTaskRunner::ProcessTask(task.get()); | 176 TestTileTaskRunner::ProcessTask(task.get()); |
| 155 | 177 |
| 156 cache.UnrefImage(draw_image); | 178 cache.UnrefImage(draw_image); |
| 157 cache.UnrefImage(another_draw_image); | 179 cache.UnrefImage(another_draw_image); |
| 158 } | 180 } |
| 159 | 181 |
| 160 TEST(GpuImageDecodeCacheTest, GetTaskForImageDifferentImage) { | 182 TEST_P(GpuImageDecodeCacheTest, GetTaskForImageDifferentImage) { |
| 161 auto context_provider = TestContextProvider::Create(); | 183 auto context_provider = TestContextProvider::Create(); |
| 162 context_provider->BindToCurrentThread(); | 184 context_provider->BindToCurrentThread(); |
| 163 TestGpuImageDecodeCache cache(context_provider.get()); | 185 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 164 bool is_decomposable = true; | 186 bool is_decomposable = true; |
| 165 SkFilterQuality quality = kHigh_SkFilterQuality; | 187 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 166 | 188 |
| 167 sk_sp<SkImage> first_image = CreateImage(100, 100); | 189 sk_sp<SkImage> first_image = CreateImage(100, 100); |
| 168 DrawImage first_draw_image( | 190 DrawImage first_draw_image( |
| 169 CreatePaintImage(first_image), | 191 CreatePaintImage(first_image), |
| 170 SkIRect::MakeWH(first_image->width(), first_image->height()), quality, | 192 SkIRect::MakeWH(first_image->width(), first_image->height()), quality, |
| 171 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), | 193 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), |
| 172 DefaultColorSpace()); | 194 DefaultColorSpace()); |
| 173 scoped_refptr<TileTask> first_task; | 195 scoped_refptr<TileTask> first_task; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 191 | 213 |
| 192 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get()); | 214 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get()); |
| 193 TestTileTaskRunner::ProcessTask(first_task.get()); | 215 TestTileTaskRunner::ProcessTask(first_task.get()); |
| 194 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); | 216 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); |
| 195 TestTileTaskRunner::ProcessTask(second_task.get()); | 217 TestTileTaskRunner::ProcessTask(second_task.get()); |
| 196 | 218 |
| 197 cache.UnrefImage(first_draw_image); | 219 cache.UnrefImage(first_draw_image); |
| 198 cache.UnrefImage(second_draw_image); | 220 cache.UnrefImage(second_draw_image); |
| 199 } | 221 } |
| 200 | 222 |
| 201 TEST(GpuImageDecodeCacheTest, GetTaskForImageLargerScale) { | 223 TEST_P(GpuImageDecodeCacheTest, GetTaskForImageLargerScale) { |
| 202 auto context_provider = TestContextProvider::Create(); | 224 auto context_provider = TestContextProvider::Create(); |
| 203 context_provider->BindToCurrentThread(); | 225 context_provider->BindToCurrentThread(); |
| 204 TestGpuImageDecodeCache cache(context_provider.get()); | 226 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 205 bool is_decomposable = true; | 227 bool is_decomposable = true; |
| 206 SkFilterQuality quality = kHigh_SkFilterQuality; | 228 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 207 | 229 |
| 208 sk_sp<SkImage> first_image = CreateImage(100, 100); | 230 sk_sp<SkImage> first_image = CreateImage(100, 100); |
| 209 DrawImage first_draw_image( | 231 DrawImage first_draw_image( |
| 210 CreatePaintImage(first_image), | 232 CreatePaintImage(first_image), |
| 211 SkIRect::MakeWH(first_image->width(), first_image->height()), quality, | 233 SkIRect::MakeWH(first_image->width(), first_image->height()), quality, |
| 212 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), | 234 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), |
| 213 DefaultColorSpace()); | 235 DefaultColorSpace()); |
| 214 scoped_refptr<TileTask> first_task; | 236 scoped_refptr<TileTask> first_task; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 245 EXPECT_TRUE(need_unref); | 267 EXPECT_TRUE(need_unref); |
| 246 EXPECT_TRUE(third_task.get() == second_task.get()); | 268 EXPECT_TRUE(third_task.get() == second_task.get()); |
| 247 | 269 |
| 248 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); | 270 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); |
| 249 TestTileTaskRunner::ProcessTask(second_task.get()); | 271 TestTileTaskRunner::ProcessTask(second_task.get()); |
| 250 | 272 |
| 251 cache.UnrefImage(second_draw_image); | 273 cache.UnrefImage(second_draw_image); |
| 252 cache.UnrefImage(third_draw_image); | 274 cache.UnrefImage(third_draw_image); |
| 253 } | 275 } |
| 254 | 276 |
| 255 TEST(GpuImageDecodeCacheTest, GetTaskForImageLargerScaleNoReuse) { | 277 TEST_P(GpuImageDecodeCacheTest, GetTaskForImageLargerScaleNoReuse) { |
| 256 auto context_provider = TestContextProvider::Create(); | 278 auto context_provider = TestContextProvider::Create(); |
| 257 context_provider->BindToCurrentThread(); | 279 context_provider->BindToCurrentThread(); |
| 258 TestGpuImageDecodeCache cache(context_provider.get()); | 280 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 259 bool is_decomposable = true; | 281 bool is_decomposable = true; |
| 260 SkFilterQuality quality = kHigh_SkFilterQuality; | 282 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 261 | 283 |
| 262 sk_sp<SkImage> first_image = CreateImage(100, 100); | 284 sk_sp<SkImage> first_image = CreateImage(100, 100); |
| 263 DrawImage first_draw_image( | 285 DrawImage first_draw_image( |
| 264 CreatePaintImage(first_image), | 286 CreatePaintImage(first_image), |
| 265 SkIRect::MakeWH(first_image->width(), first_image->height()), quality, | 287 SkIRect::MakeWH(first_image->width(), first_image->height()), quality, |
| 266 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), | 288 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), |
| 267 DefaultColorSpace()); | 289 DefaultColorSpace()); |
| 268 scoped_refptr<TileTask> first_task; | 290 scoped_refptr<TileTask> first_task; |
| (...skipping 28 matching lines...) Expand all Loading... |
| 297 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get()); | 319 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get()); |
| 298 TestTileTaskRunner::ProcessTask(first_task.get()); | 320 TestTileTaskRunner::ProcessTask(first_task.get()); |
| 299 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); | 321 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); |
| 300 TestTileTaskRunner::ProcessTask(second_task.get()); | 322 TestTileTaskRunner::ProcessTask(second_task.get()); |
| 301 | 323 |
| 302 cache.UnrefImage(first_draw_image); | 324 cache.UnrefImage(first_draw_image); |
| 303 cache.UnrefImage(second_draw_image); | 325 cache.UnrefImage(second_draw_image); |
| 304 cache.UnrefImage(third_draw_image); | 326 cache.UnrefImage(third_draw_image); |
| 305 } | 327 } |
| 306 | 328 |
| 307 TEST(GpuImageDecodeCacheTest, GetTaskForImageHigherQuality) { | 329 TEST_P(GpuImageDecodeCacheTest, GetTaskForImageHigherQuality) { |
| 308 auto context_provider = TestContextProvider::Create(); | 330 auto context_provider = TestContextProvider::Create(); |
| 309 context_provider->BindToCurrentThread(); | 331 context_provider->BindToCurrentThread(); |
| 310 TestGpuImageDecodeCache cache(context_provider.get()); | 332 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 311 bool is_decomposable = true; | 333 bool is_decomposable = true; |
| 312 SkMatrix matrix = CreateMatrix(SkSize::Make(0.4f, 0.4f), is_decomposable); | 334 SkMatrix matrix = CreateMatrix(SkSize::Make(0.4f, 0.4f), is_decomposable); |
| 313 | 335 |
| 314 sk_sp<SkImage> first_image = CreateImage(100, 100); | 336 sk_sp<SkImage> first_image = CreateImage(100, 100); |
| 315 DrawImage first_draw_image( | 337 DrawImage first_draw_image( |
| 316 CreatePaintImage(first_image), | 338 CreatePaintImage(first_image), |
| 317 SkIRect::MakeWH(first_image->width(), first_image->height()), | 339 SkIRect::MakeWH(first_image->width(), first_image->height()), |
| 318 kLow_SkFilterQuality, matrix, DefaultColorSpace()); | 340 kLow_SkFilterQuality, matrix, DefaultColorSpace()); |
| 319 scoped_refptr<TileTask> first_task; | 341 scoped_refptr<TileTask> first_task; |
| 320 bool need_unref = cache.GetTaskForImageAndRef( | 342 bool need_unref = cache.GetTaskForImageAndRef( |
| (...skipping 16 matching lines...) Expand all Loading... |
| 337 EXPECT_TRUE(need_unref); | 359 EXPECT_TRUE(need_unref); |
| 338 EXPECT_TRUE(second_task); | 360 EXPECT_TRUE(second_task); |
| 339 EXPECT_TRUE(first_task.get() != second_task.get()); | 361 EXPECT_TRUE(first_task.get() != second_task.get()); |
| 340 | 362 |
| 341 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); | 363 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); |
| 342 TestTileTaskRunner::ProcessTask(second_task.get()); | 364 TestTileTaskRunner::ProcessTask(second_task.get()); |
| 343 | 365 |
| 344 cache.UnrefImage(second_draw_image); | 366 cache.UnrefImage(second_draw_image); |
| 345 } | 367 } |
| 346 | 368 |
| 347 TEST(GpuImageDecodeCacheTest, GetTaskForImageAlreadyDecodedAndLocked) { | 369 TEST_P(GpuImageDecodeCacheTest, GetTaskForImageAlreadyDecodedAndLocked) { |
| 348 auto context_provider = TestContextProvider::Create(); | 370 auto context_provider = TestContextProvider::Create(); |
| 349 context_provider->BindToCurrentThread(); | 371 context_provider->BindToCurrentThread(); |
| 350 TestGpuImageDecodeCache cache(context_provider.get()); | 372 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 351 bool is_decomposable = true; | 373 bool is_decomposable = true; |
| 352 SkFilterQuality quality = kHigh_SkFilterQuality; | 374 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 353 | 375 |
| 354 sk_sp<SkImage> image = CreateImage(100, 100); | 376 sk_sp<SkImage> image = CreateImage(100, 100); |
| 355 DrawImage draw_image( | 377 DrawImage draw_image( |
| 356 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), | 378 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), |
| 357 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), | 379 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), |
| 358 DefaultColorSpace()); | 380 DefaultColorSpace()); |
| 359 scoped_refptr<TileTask> task; | 381 scoped_refptr<TileTask> task; |
| 360 bool need_unref = cache.GetTaskForImageAndRef( | 382 bool need_unref = cache.GetTaskForImageAndRef( |
| (...skipping 22 matching lines...) Expand all Loading... |
| 383 | 405 |
| 384 TestTileTaskRunner::ProcessTask(another_task.get()); | 406 TestTileTaskRunner::ProcessTask(another_task.get()); |
| 385 | 407 |
| 386 // Finally, complete the original decode task. | 408 // Finally, complete the original decode task. |
| 387 TestTileTaskRunner::CompleteTask(task->dependencies()[0].get()); | 409 TestTileTaskRunner::CompleteTask(task->dependencies()[0].get()); |
| 388 | 410 |
| 389 cache.UnrefImage(draw_image); | 411 cache.UnrefImage(draw_image); |
| 390 cache.UnrefImage(draw_image); | 412 cache.UnrefImage(draw_image); |
| 391 } | 413 } |
| 392 | 414 |
| 393 TEST(GpuImageDecodeCacheTest, GetTaskForImageAlreadyDecodedNotLocked) { | 415 TEST_P(GpuImageDecodeCacheTest, GetTaskForImageAlreadyDecodedNotLocked) { |
| 394 auto context_provider = TestContextProvider::Create(); | 416 auto context_provider = TestContextProvider::Create(); |
| 395 context_provider->BindToCurrentThread(); | 417 context_provider->BindToCurrentThread(); |
| 396 TestGpuImageDecodeCache cache(context_provider.get()); | 418 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 397 bool is_decomposable = true; | 419 bool is_decomposable = true; |
| 398 SkFilterQuality quality = kHigh_SkFilterQuality; | 420 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 399 | 421 |
| 400 sk_sp<SkImage> image = CreateImage(100, 100); | 422 sk_sp<SkImage> image = CreateImage(100, 100); |
| 401 DrawImage draw_image( | 423 DrawImage draw_image( |
| 402 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), | 424 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), |
| 403 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), | 425 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), |
| 404 DefaultColorSpace()); | 426 DefaultColorSpace()); |
| 405 scoped_refptr<TileTask> task; | 427 scoped_refptr<TileTask> task; |
| 406 bool need_unref = cache.GetTaskForImageAndRef( | 428 bool need_unref = cache.GetTaskForImageAndRef( |
| (...skipping 22 matching lines...) Expand all Loading... |
| 429 EXPECT_TRUE(another_task); | 451 EXPECT_TRUE(another_task); |
| 430 EXPECT_EQ(another_task->dependencies().size(), 1u); | 452 EXPECT_EQ(another_task->dependencies().size(), 1u); |
| 431 EXPECT_TRUE(task->dependencies()[0]); | 453 EXPECT_TRUE(task->dependencies()[0]); |
| 432 | 454 |
| 433 TestTileTaskRunner::ProcessTask(another_task->dependencies()[0].get()); | 455 TestTileTaskRunner::ProcessTask(another_task->dependencies()[0].get()); |
| 434 TestTileTaskRunner::ProcessTask(another_task.get()); | 456 TestTileTaskRunner::ProcessTask(another_task.get()); |
| 435 | 457 |
| 436 cache.UnrefImage(draw_image); | 458 cache.UnrefImage(draw_image); |
| 437 } | 459 } |
| 438 | 460 |
| 439 TEST(GpuImageDecodeCacheTest, GetTaskForImageAlreadyUploaded) { | 461 TEST_P(GpuImageDecodeCacheTest, GetTaskForImageAlreadyUploaded) { |
| 440 auto context_provider = TestContextProvider::Create(); | 462 auto context_provider = TestContextProvider::Create(); |
| 441 context_provider->BindToCurrentThread(); | 463 context_provider->BindToCurrentThread(); |
| 442 TestGpuImageDecodeCache cache(context_provider.get()); | 464 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 443 bool is_decomposable = true; | 465 bool is_decomposable = true; |
| 444 SkFilterQuality quality = kHigh_SkFilterQuality; | 466 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 445 | 467 |
| 446 sk_sp<SkImage> image = CreateImage(100, 100); | 468 sk_sp<SkImage> image = CreateImage(100, 100); |
| 447 DrawImage draw_image( | 469 DrawImage draw_image( |
| 448 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), | 470 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), |
| 449 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), | 471 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), |
| 450 DefaultColorSpace()); | 472 DefaultColorSpace()); |
| 451 scoped_refptr<TileTask> task; | 473 scoped_refptr<TileTask> task; |
| 452 bool need_unref = cache.GetTaskForImageAndRef( | 474 bool need_unref = cache.GetTaskForImageAndRef( |
| (...skipping 12 matching lines...) Expand all Loading... |
| 465 draw_image, ImageDecodeCache::TracingInfo(), &another_task); | 487 draw_image, ImageDecodeCache::TracingInfo(), &another_task); |
| 466 EXPECT_TRUE(need_unref); | 488 EXPECT_TRUE(need_unref); |
| 467 EXPECT_FALSE(another_task); | 489 EXPECT_FALSE(another_task); |
| 468 | 490 |
| 469 TestTileTaskRunner::CompleteTask(task.get()); | 491 TestTileTaskRunner::CompleteTask(task.get()); |
| 470 | 492 |
| 471 cache.UnrefImage(draw_image); | 493 cache.UnrefImage(draw_image); |
| 472 cache.UnrefImage(draw_image); | 494 cache.UnrefImage(draw_image); |
| 473 } | 495 } |
| 474 | 496 |
| 475 TEST(GpuImageDecodeCacheTest, GetTaskForImageCanceledGetsNewTask) { | 497 TEST_P(GpuImageDecodeCacheTest, GetTaskForImageCanceledGetsNewTask) { |
| 476 auto context_provider = TestContextProvider::Create(); | 498 auto context_provider = TestContextProvider::Create(); |
| 477 context_provider->BindToCurrentThread(); | 499 context_provider->BindToCurrentThread(); |
| 478 TestGpuImageDecodeCache cache(context_provider.get()); | 500 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 479 bool is_decomposable = true; | 501 bool is_decomposable = true; |
| 480 SkFilterQuality quality = kHigh_SkFilterQuality; | 502 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 481 | 503 |
| 482 sk_sp<SkImage> image = CreateImage(100, 100); | 504 sk_sp<SkImage> image = CreateImage(100, 100); |
| 483 DrawImage draw_image( | 505 DrawImage draw_image( |
| 484 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), | 506 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), |
| 485 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), | 507 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), |
| 486 DefaultColorSpace()); | 508 DefaultColorSpace()); |
| 487 scoped_refptr<TileTask> task; | 509 scoped_refptr<TileTask> task; |
| 488 bool need_unref = cache.GetTaskForImageAndRef( | 510 bool need_unref = cache.GetTaskForImageAndRef( |
| (...skipping 24 matching lines...) Expand all Loading... |
| 513 EXPECT_TRUE(need_unref); | 535 EXPECT_TRUE(need_unref); |
| 514 EXPECT_TRUE(third_task); | 536 EXPECT_TRUE(third_task); |
| 515 EXPECT_FALSE(third_task.get() == task.get()); | 537 EXPECT_FALSE(third_task.get() == task.get()); |
| 516 | 538 |
| 517 TestTileTaskRunner::ProcessTask(third_task->dependencies()[0].get()); | 539 TestTileTaskRunner::ProcessTask(third_task->dependencies()[0].get()); |
| 518 TestTileTaskRunner::ProcessTask(third_task.get()); | 540 TestTileTaskRunner::ProcessTask(third_task.get()); |
| 519 | 541 |
| 520 cache.UnrefImage(draw_image); | 542 cache.UnrefImage(draw_image); |
| 521 } | 543 } |
| 522 | 544 |
| 523 TEST(GpuImageDecodeCacheTest, GetTaskForImageCanceledWhileReffedGetsNewTask) { | 545 TEST_P(GpuImageDecodeCacheTest, GetTaskForImageCanceledWhileReffedGetsNewTask) { |
| 524 auto context_provider = TestContextProvider::Create(); | 546 auto context_provider = TestContextProvider::Create(); |
| 525 context_provider->BindToCurrentThread(); | 547 context_provider->BindToCurrentThread(); |
| 526 TestGpuImageDecodeCache cache(context_provider.get()); | 548 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 527 bool is_decomposable = true; | 549 bool is_decomposable = true; |
| 528 SkFilterQuality quality = kHigh_SkFilterQuality; | 550 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 529 | 551 |
| 530 sk_sp<SkImage> image = CreateImage(100, 100); | 552 sk_sp<SkImage> image = CreateImage(100, 100); |
| 531 DrawImage draw_image( | 553 DrawImage draw_image( |
| 532 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), | 554 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), |
| 533 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), | 555 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), |
| 534 DefaultColorSpace()); | 556 DefaultColorSpace()); |
| 535 scoped_refptr<TileTask> task; | 557 scoped_refptr<TileTask> task; |
| 536 bool need_unref = cache.GetTaskForImageAndRef( | 558 bool need_unref = cache.GetTaskForImageAndRef( |
| (...skipping 28 matching lines...) Expand all Loading... |
| 565 EXPECT_FALSE(third_task.get() == task.get()); | 587 EXPECT_FALSE(third_task.get() == task.get()); |
| 566 | 588 |
| 567 ASSERT_GT(third_task->dependencies().size(), 0u); | 589 ASSERT_GT(third_task->dependencies().size(), 0u); |
| 568 TestTileTaskRunner::ProcessTask(third_task->dependencies()[0].get()); | 590 TestTileTaskRunner::ProcessTask(third_task->dependencies()[0].get()); |
| 569 TestTileTaskRunner::ProcessTask(third_task.get()); | 591 TestTileTaskRunner::ProcessTask(third_task.get()); |
| 570 | 592 |
| 571 // Unref! | 593 // Unref! |
| 572 cache.UnrefImage(draw_image); | 594 cache.UnrefImage(draw_image); |
| 573 } | 595 } |
| 574 | 596 |
| 575 TEST(GpuImageDecodeCacheTest, NoTaskForImageAlreadyFailedDecoding) { | 597 TEST_P(GpuImageDecodeCacheTest, NoTaskForImageAlreadyFailedDecoding) { |
| 576 auto context_provider = TestContextProvider::Create(); | 598 auto context_provider = TestContextProvider::Create(); |
| 577 context_provider->BindToCurrentThread(); | 599 context_provider->BindToCurrentThread(); |
| 578 TestGpuImageDecodeCache cache(context_provider.get()); | 600 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 579 bool is_decomposable = true; | 601 bool is_decomposable = true; |
| 580 SkFilterQuality quality = kHigh_SkFilterQuality; | 602 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 581 | 603 |
| 582 sk_sp<SkImage> image = CreateImage(100, 100); | 604 sk_sp<SkImage> image = CreateImage(100, 100); |
| 583 DrawImage draw_image( | 605 DrawImage draw_image( |
| 584 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), | 606 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), |
| 585 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), | 607 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), |
| 586 DefaultColorSpace()); | 608 DefaultColorSpace()); |
| 587 scoped_refptr<TileTask> task; | 609 scoped_refptr<TileTask> task; |
| 588 bool need_unref = cache.GetTaskForImageAndRef( | 610 bool need_unref = cache.GetTaskForImageAndRef( |
| (...skipping 10 matching lines...) Expand all Loading... |
| 599 | 621 |
| 600 scoped_refptr<TileTask> another_task; | 622 scoped_refptr<TileTask> another_task; |
| 601 need_unref = cache.GetTaskForImageAndRef( | 623 need_unref = cache.GetTaskForImageAndRef( |
| 602 draw_image, ImageDecodeCache::TracingInfo(), &another_task); | 624 draw_image, ImageDecodeCache::TracingInfo(), &another_task); |
| 603 EXPECT_FALSE(need_unref); | 625 EXPECT_FALSE(need_unref); |
| 604 EXPECT_EQ(another_task.get(), nullptr); | 626 EXPECT_EQ(another_task.get(), nullptr); |
| 605 | 627 |
| 606 cache.UnrefImage(draw_image); | 628 cache.UnrefImage(draw_image); |
| 607 } | 629 } |
| 608 | 630 |
| 609 TEST(GpuImageDecodeCacheTest, GetDecodedImageForDraw) { | 631 TEST_P(GpuImageDecodeCacheTest, GetDecodedImageForDraw) { |
| 610 auto context_provider = TestContextProvider::Create(); | 632 auto context_provider = TestContextProvider::Create(); |
| 611 context_provider->BindToCurrentThread(); | 633 context_provider->BindToCurrentThread(); |
| 612 TestGpuImageDecodeCache cache(context_provider.get()); | 634 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 613 bool is_decomposable = true; | 635 bool is_decomposable = true; |
| 614 SkFilterQuality quality = kHigh_SkFilterQuality; | 636 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 615 | 637 |
| 616 sk_sp<SkImage> image = CreateImage(100, 100); | 638 sk_sp<SkImage> image = CreateImage(100, 100); |
| 617 DrawImage draw_image( | 639 DrawImage draw_image( |
| 618 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), | 640 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), |
| 619 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), | 641 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), |
| 620 DefaultColorSpace()); | 642 DefaultColorSpace()); |
| 621 scoped_refptr<TileTask> task; | 643 scoped_refptr<TileTask> task; |
| 622 bool need_unref = cache.GetTaskForImageAndRef( | 644 bool need_unref = cache.GetTaskForImageAndRef( |
| (...skipping 11 matching lines...) Expand all Loading... |
| 634 cache.GetDecodedImageForDraw(draw_image); | 656 cache.GetDecodedImageForDraw(draw_image); |
| 635 EXPECT_TRUE(decoded_draw_image.image()); | 657 EXPECT_TRUE(decoded_draw_image.image()); |
| 636 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); | 658 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); |
| 637 EXPECT_FALSE(decoded_draw_image.is_at_raster_decode()); | 659 EXPECT_FALSE(decoded_draw_image.is_at_raster_decode()); |
| 638 EXPECT_FALSE(cache.DiscardableIsLockedForTesting(draw_image)); | 660 EXPECT_FALSE(cache.DiscardableIsLockedForTesting(draw_image)); |
| 639 | 661 |
| 640 cache.DrawWithImageFinished(draw_image, decoded_draw_image); | 662 cache.DrawWithImageFinished(draw_image, decoded_draw_image); |
| 641 cache.UnrefImage(draw_image); | 663 cache.UnrefImage(draw_image); |
| 642 } | 664 } |
| 643 | 665 |
| 644 TEST(GpuImageDecodeCacheTest, GetLargeDecodedImageForDraw) { | 666 TEST_P(GpuImageDecodeCacheTest, GetLargeDecodedImageForDraw) { |
| 645 auto context_provider = TestContextProvider::Create(); | 667 auto context_provider = TestContextProvider::Create(); |
| 646 context_provider->BindToCurrentThread(); | 668 context_provider->BindToCurrentThread(); |
| 647 TestGpuImageDecodeCache cache(context_provider.get()); | 669 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 648 bool is_decomposable = true; | 670 bool is_decomposable = true; |
| 649 SkFilterQuality quality = kHigh_SkFilterQuality; | 671 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 650 | 672 |
| 651 sk_sp<SkImage> image = CreateImage(1, 24000); | 673 sk_sp<SkImage> image = CreateImage(1, 24000); |
| 652 DrawImage draw_image( | 674 DrawImage draw_image( |
| 653 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), | 675 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), |
| 654 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), | 676 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), |
| 655 DefaultColorSpace()); | 677 DefaultColorSpace()); |
| 656 scoped_refptr<TileTask> task; | 678 scoped_refptr<TileTask> task; |
| 657 bool need_unref = cache.GetTaskForImageAndRef( | 679 bool need_unref = cache.GetTaskForImageAndRef( |
| (...skipping 12 matching lines...) Expand all Loading... |
| 670 EXPECT_TRUE(decoded_draw_image.image()); | 692 EXPECT_TRUE(decoded_draw_image.image()); |
| 671 EXPECT_FALSE(decoded_draw_image.image()->isTextureBacked()); | 693 EXPECT_FALSE(decoded_draw_image.image()->isTextureBacked()); |
| 672 EXPECT_FALSE(decoded_draw_image.is_at_raster_decode()); | 694 EXPECT_FALSE(decoded_draw_image.is_at_raster_decode()); |
| 673 EXPECT_TRUE(cache.DiscardableIsLockedForTesting(draw_image)); | 695 EXPECT_TRUE(cache.DiscardableIsLockedForTesting(draw_image)); |
| 674 | 696 |
| 675 cache.DrawWithImageFinished(draw_image, decoded_draw_image); | 697 cache.DrawWithImageFinished(draw_image, decoded_draw_image); |
| 676 cache.UnrefImage(draw_image); | 698 cache.UnrefImage(draw_image); |
| 677 EXPECT_FALSE(cache.DiscardableIsLockedForTesting(draw_image)); | 699 EXPECT_FALSE(cache.DiscardableIsLockedForTesting(draw_image)); |
| 678 } | 700 } |
| 679 | 701 |
| 680 TEST(GpuImageDecodeCacheTest, GetDecodedImageForDrawAtRasterDecode) { | 702 TEST_P(GpuImageDecodeCacheTest, GetDecodedImageForDrawAtRasterDecode) { |
| 681 auto context_provider = TestContextProvider::Create(); | 703 auto context_provider = TestContextProvider::Create(); |
| 682 context_provider->BindToCurrentThread(); | 704 context_provider->BindToCurrentThread(); |
| 683 TestGpuImageDecodeCache cache(context_provider.get()); | 705 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 684 bool is_decomposable = true; | 706 bool is_decomposable = true; |
| 685 SkFilterQuality quality = kHigh_SkFilterQuality; | 707 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 686 | 708 |
| 687 cache.SetAllByteLimitsForTesting(0); | 709 cache.SetAllByteLimitsForTesting(0); |
| 688 | 710 |
| 689 sk_sp<SkImage> image = CreateImage(100, 100); | 711 sk_sp<SkImage> image = CreateImage(100, 100); |
| 690 DrawImage draw_image( | 712 DrawImage draw_image( |
| 691 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), | 713 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), |
| 692 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), | 714 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), |
| 693 DefaultColorSpace()); | 715 DefaultColorSpace()); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 704 DecodedDrawImage decoded_draw_image = | 726 DecodedDrawImage decoded_draw_image = |
| 705 cache.GetDecodedImageForDraw(draw_image); | 727 cache.GetDecodedImageForDraw(draw_image); |
| 706 EXPECT_TRUE(decoded_draw_image.image()); | 728 EXPECT_TRUE(decoded_draw_image.image()); |
| 707 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); | 729 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); |
| 708 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode()); | 730 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode()); |
| 709 EXPECT_FALSE(cache.DiscardableIsLockedForTesting(draw_image)); | 731 EXPECT_FALSE(cache.DiscardableIsLockedForTesting(draw_image)); |
| 710 | 732 |
| 711 cache.DrawWithImageFinished(draw_image, decoded_draw_image); | 733 cache.DrawWithImageFinished(draw_image, decoded_draw_image); |
| 712 } | 734 } |
| 713 | 735 |
| 714 TEST(GpuImageDecodeCacheTest, GetDecodedImageForDrawLargerScale) { | 736 TEST_P(GpuImageDecodeCacheTest, GetDecodedImageForDrawLargerScale) { |
| 715 auto context_provider = TestContextProvider::Create(); | 737 auto context_provider = TestContextProvider::Create(); |
| 716 context_provider->BindToCurrentThread(); | 738 context_provider->BindToCurrentThread(); |
| 717 TestGpuImageDecodeCache cache(context_provider.get()); | 739 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 718 bool is_decomposable = true; | 740 bool is_decomposable = true; |
| 719 SkFilterQuality quality = kHigh_SkFilterQuality; | 741 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 720 | 742 |
| 721 sk_sp<SkImage> image = CreateImage(100, 100); | 743 sk_sp<SkImage> image = CreateImage(100, 100); |
| 722 DrawImage draw_image( | 744 DrawImage draw_image( |
| 723 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), | 745 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), |
| 724 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), | 746 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), |
| 725 DefaultColorSpace()); | 747 DefaultColorSpace()); |
| 726 scoped_refptr<TileTask> task; | 748 scoped_refptr<TileTask> task; |
| 727 bool need_unref = cache.GetTaskForImageAndRef( | 749 bool need_unref = cache.GetTaskForImageAndRef( |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 763 EXPECT_FALSE(cache.DiscardableIsLockedForTesting(draw_image)); | 785 EXPECT_FALSE(cache.DiscardableIsLockedForTesting(draw_image)); |
| 764 | 786 |
| 765 EXPECT_FALSE(decoded_draw_image.image() == larger_decoded_draw_image.image()); | 787 EXPECT_FALSE(decoded_draw_image.image() == larger_decoded_draw_image.image()); |
| 766 | 788 |
| 767 cache.DrawWithImageFinished(draw_image, decoded_draw_image); | 789 cache.DrawWithImageFinished(draw_image, decoded_draw_image); |
| 768 cache.UnrefImage(draw_image); | 790 cache.UnrefImage(draw_image); |
| 769 cache.DrawWithImageFinished(larger_draw_image, larger_decoded_draw_image); | 791 cache.DrawWithImageFinished(larger_draw_image, larger_decoded_draw_image); |
| 770 cache.UnrefImage(larger_draw_image); | 792 cache.UnrefImage(larger_draw_image); |
| 771 } | 793 } |
| 772 | 794 |
| 773 TEST(GpuImageDecodeCacheTest, GetDecodedImageForDrawHigherQuality) { | 795 TEST_P(GpuImageDecodeCacheTest, GetDecodedImageForDrawHigherQuality) { |
| 774 auto context_provider = TestContextProvider::Create(); | 796 auto context_provider = TestContextProvider::Create(); |
| 775 context_provider->BindToCurrentThread(); | 797 context_provider->BindToCurrentThread(); |
| 776 TestGpuImageDecodeCache cache(context_provider.get()); | 798 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 777 bool is_decomposable = true; | 799 bool is_decomposable = true; |
| 778 SkMatrix matrix = CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable); | 800 SkMatrix matrix = CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable); |
| 779 | 801 |
| 780 sk_sp<SkImage> image = CreateImage(100, 100); | 802 sk_sp<SkImage> image = CreateImage(100, 100); |
| 781 DrawImage draw_image(CreatePaintImage(image), | 803 DrawImage draw_image(CreatePaintImage(image), |
| 782 SkIRect::MakeWH(image->width(), image->height()), | 804 SkIRect::MakeWH(image->width(), image->height()), |
| 783 kLow_SkFilterQuality, matrix, DefaultColorSpace()); | 805 kLow_SkFilterQuality, matrix, DefaultColorSpace()); |
| 784 scoped_refptr<TileTask> task; | 806 scoped_refptr<TileTask> task; |
| 785 bool need_unref = cache.GetTaskForImageAndRef( | 807 bool need_unref = cache.GetTaskForImageAndRef( |
| 786 draw_image, ImageDecodeCache::TracingInfo(), &task); | 808 draw_image, ImageDecodeCache::TracingInfo(), &task); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 821 | 843 |
| 822 EXPECT_FALSE(decoded_draw_image.image() == larger_decoded_draw_image.image()); | 844 EXPECT_FALSE(decoded_draw_image.image() == larger_decoded_draw_image.image()); |
| 823 | 845 |
| 824 cache.DrawWithImageFinished(draw_image, decoded_draw_image); | 846 cache.DrawWithImageFinished(draw_image, decoded_draw_image); |
| 825 cache.UnrefImage(draw_image); | 847 cache.UnrefImage(draw_image); |
| 826 cache.DrawWithImageFinished(higher_quality_draw_image, | 848 cache.DrawWithImageFinished(higher_quality_draw_image, |
| 827 larger_decoded_draw_image); | 849 larger_decoded_draw_image); |
| 828 cache.UnrefImage(higher_quality_draw_image); | 850 cache.UnrefImage(higher_quality_draw_image); |
| 829 } | 851 } |
| 830 | 852 |
| 831 TEST(GpuImageDecodeCacheTest, GetDecodedImageForDrawNegative) { | 853 TEST_P(GpuImageDecodeCacheTest, GetDecodedImageForDrawNegative) { |
| 832 auto context_provider = TestContextProvider::Create(); | 854 auto context_provider = TestContextProvider::Create(); |
| 833 context_provider->BindToCurrentThread(); | 855 context_provider->BindToCurrentThread(); |
| 834 TestGpuImageDecodeCache cache(context_provider.get()); | 856 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 835 bool is_decomposable = true; | 857 bool is_decomposable = true; |
| 836 SkFilterQuality quality = kHigh_SkFilterQuality; | 858 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 837 | 859 |
| 838 sk_sp<SkImage> image = CreateImage(100, 100); | 860 sk_sp<SkImage> image = CreateImage(100, 100); |
| 839 DrawImage draw_image( | 861 DrawImage draw_image( |
| 840 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), | 862 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), |
| 841 quality, CreateMatrix(SkSize::Make(-0.5f, 0.5f), is_decomposable), | 863 quality, CreateMatrix(SkSize::Make(-0.5f, 0.5f), is_decomposable), |
| 842 DefaultColorSpace()); | 864 DefaultColorSpace()); |
| 843 scoped_refptr<TileTask> task; | 865 scoped_refptr<TileTask> task; |
| 844 bool need_unref = cache.GetTaskForImageAndRef( | 866 bool need_unref = cache.GetTaskForImageAndRef( |
| (...skipping 13 matching lines...) Expand all Loading... |
| 858 EXPECT_EQ(decoded_draw_image.image()->width(), 50); | 880 EXPECT_EQ(decoded_draw_image.image()->width(), 50); |
| 859 EXPECT_EQ(decoded_draw_image.image()->height(), 50); | 881 EXPECT_EQ(decoded_draw_image.image()->height(), 50); |
| 860 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); | 882 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); |
| 861 EXPECT_FALSE(decoded_draw_image.is_at_raster_decode()); | 883 EXPECT_FALSE(decoded_draw_image.is_at_raster_decode()); |
| 862 EXPECT_FALSE(cache.DiscardableIsLockedForTesting(draw_image)); | 884 EXPECT_FALSE(cache.DiscardableIsLockedForTesting(draw_image)); |
| 863 | 885 |
| 864 cache.DrawWithImageFinished(draw_image, decoded_draw_image); | 886 cache.DrawWithImageFinished(draw_image, decoded_draw_image); |
| 865 cache.UnrefImage(draw_image); | 887 cache.UnrefImage(draw_image); |
| 866 } | 888 } |
| 867 | 889 |
| 868 TEST(GpuImageDecodeCacheTest, GetLargeScaledDecodedImageForDraw) { | 890 TEST_P(GpuImageDecodeCacheTest, GetLargeScaledDecodedImageForDraw) { |
| 869 auto context_provider = TestContextProvider::Create(); | 891 auto context_provider = TestContextProvider::Create(); |
| 870 context_provider->BindToCurrentThread(); | 892 context_provider->BindToCurrentThread(); |
| 871 TestGpuImageDecodeCache cache(context_provider.get()); | 893 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 872 bool is_decomposable = true; | 894 bool is_decomposable = true; |
| 873 SkFilterQuality quality = kHigh_SkFilterQuality; | 895 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 874 | 896 |
| 875 sk_sp<SkImage> image = CreateImage(1, 48000); | 897 sk_sp<SkImage> image = CreateImage(1, 48000); |
| 876 DrawImage draw_image( | 898 DrawImage draw_image( |
| 877 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), | 899 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), |
| 878 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), | 900 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), |
| 879 DefaultColorSpace()); | 901 DefaultColorSpace()); |
| 880 scoped_refptr<TileTask> task; | 902 scoped_refptr<TileTask> task; |
| 881 bool need_unref = cache.GetTaskForImageAndRef( | 903 bool need_unref = cache.GetTaskForImageAndRef( |
| (...skipping 15 matching lines...) Expand all Loading... |
| 897 EXPECT_EQ(24000, decoded_draw_image.image()->height()); | 919 EXPECT_EQ(24000, decoded_draw_image.image()->height()); |
| 898 EXPECT_FALSE(decoded_draw_image.image()->isTextureBacked()); | 920 EXPECT_FALSE(decoded_draw_image.image()->isTextureBacked()); |
| 899 EXPECT_FALSE(decoded_draw_image.is_at_raster_decode()); | 921 EXPECT_FALSE(decoded_draw_image.is_at_raster_decode()); |
| 900 EXPECT_TRUE(cache.DiscardableIsLockedForTesting(draw_image)); | 922 EXPECT_TRUE(cache.DiscardableIsLockedForTesting(draw_image)); |
| 901 | 923 |
| 902 cache.DrawWithImageFinished(draw_image, decoded_draw_image); | 924 cache.DrawWithImageFinished(draw_image, decoded_draw_image); |
| 903 cache.UnrefImage(draw_image); | 925 cache.UnrefImage(draw_image); |
| 904 EXPECT_FALSE(cache.DiscardableIsLockedForTesting(draw_image)); | 926 EXPECT_FALSE(cache.DiscardableIsLockedForTesting(draw_image)); |
| 905 } | 927 } |
| 906 | 928 |
| 907 TEST(GpuImageDecodeCacheTest, AtRasterUsedDirectlyIfSpaceAllows) { | 929 TEST_P(GpuImageDecodeCacheTest, AtRasterUsedDirectlyIfSpaceAllows) { |
| 908 auto context_provider = TestContextProvider::Create(); | 930 auto context_provider = TestContextProvider::Create(); |
| 909 context_provider->BindToCurrentThread(); | 931 context_provider->BindToCurrentThread(); |
| 910 TestGpuImageDecodeCache cache(context_provider.get()); | 932 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 911 bool is_decomposable = true; | 933 bool is_decomposable = true; |
| 912 SkFilterQuality quality = kHigh_SkFilterQuality; | 934 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 913 | 935 |
| 914 cache.SetAllByteLimitsForTesting(0); | 936 cache.SetAllByteLimitsForTesting(0); |
| 915 | 937 |
| 916 sk_sp<SkImage> image = CreateImage(100, 100); | 938 sk_sp<SkImage> image = CreateImage(100, 100); |
| 917 DrawImage draw_image( | 939 DrawImage draw_image( |
| 918 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), | 940 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), |
| 919 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), | 941 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), |
| 920 DefaultColorSpace()); | 942 DefaultColorSpace()); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 942 cache.DrawWithImageFinished(draw_image, decoded_draw_image); | 964 cache.DrawWithImageFinished(draw_image, decoded_draw_image); |
| 943 | 965 |
| 944 scoped_refptr<TileTask> another_task; | 966 scoped_refptr<TileTask> another_task; |
| 945 bool another_task_needs_unref = cache.GetTaskForImageAndRef( | 967 bool another_task_needs_unref = cache.GetTaskForImageAndRef( |
| 946 draw_image, ImageDecodeCache::TracingInfo(), &task); | 968 draw_image, ImageDecodeCache::TracingInfo(), &task); |
| 947 EXPECT_TRUE(another_task_needs_unref); | 969 EXPECT_TRUE(another_task_needs_unref); |
| 948 EXPECT_FALSE(another_task); | 970 EXPECT_FALSE(another_task); |
| 949 cache.UnrefImage(draw_image); | 971 cache.UnrefImage(draw_image); |
| 950 } | 972 } |
| 951 | 973 |
| 952 TEST(GpuImageDecodeCacheTest, | 974 TEST_P(GpuImageDecodeCacheTest, |
| 953 GetDecodedImageForDrawAtRasterDecodeMultipleTimes) { | 975 GetDecodedImageForDrawAtRasterDecodeMultipleTimes) { |
| 954 auto context_provider = TestContextProvider::Create(); | 976 auto context_provider = TestContextProvider::Create(); |
| 955 context_provider->BindToCurrentThread(); | 977 context_provider->BindToCurrentThread(); |
| 956 TestGpuImageDecodeCache cache(context_provider.get()); | 978 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 957 bool is_decomposable = true; | 979 bool is_decomposable = true; |
| 958 SkFilterQuality quality = kHigh_SkFilterQuality; | 980 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 959 | 981 |
| 960 cache.SetAllByteLimitsForTesting(0); | 982 cache.SetAllByteLimitsForTesting(0); |
| 961 | 983 |
| 962 sk_sp<SkImage> image = CreateImage(100, 100); | 984 sk_sp<SkImage> image = CreateImage(100, 100); |
| 963 DrawImage draw_image( | 985 DrawImage draw_image( |
| 964 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), | 986 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), |
| 965 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), | 987 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), |
| 966 DefaultColorSpace()); | 988 DefaultColorSpace()); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 977 | 999 |
| 978 DecodedDrawImage another_decoded_draw_image = | 1000 DecodedDrawImage another_decoded_draw_image = |
| 979 cache.GetDecodedImageForDraw(draw_image); | 1001 cache.GetDecodedImageForDraw(draw_image); |
| 980 EXPECT_EQ(decoded_draw_image.image()->uniqueID(), | 1002 EXPECT_EQ(decoded_draw_image.image()->uniqueID(), |
| 981 another_decoded_draw_image.image()->uniqueID()); | 1003 another_decoded_draw_image.image()->uniqueID()); |
| 982 | 1004 |
| 983 cache.DrawWithImageFinished(draw_image, decoded_draw_image); | 1005 cache.DrawWithImageFinished(draw_image, decoded_draw_image); |
| 984 cache.DrawWithImageFinished(draw_image, another_decoded_draw_image); | 1006 cache.DrawWithImageFinished(draw_image, another_decoded_draw_image); |
| 985 } | 1007 } |
| 986 | 1008 |
| 987 TEST(GpuImageDecodeCacheTest, | 1009 TEST_P(GpuImageDecodeCacheTest, |
| 988 GetLargeDecodedImageForDrawAtRasterDecodeMultipleTimes) { | 1010 GetLargeDecodedImageForDrawAtRasterDecodeMultipleTimes) { |
| 989 auto context_provider = TestContextProvider::Create(); | 1011 auto context_provider = TestContextProvider::Create(); |
| 990 context_provider->BindToCurrentThread(); | 1012 context_provider->BindToCurrentThread(); |
| 991 TestGpuImageDecodeCache cache(context_provider.get()); | 1013 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 992 bool is_decomposable = true; | 1014 bool is_decomposable = true; |
| 993 SkFilterQuality quality = kHigh_SkFilterQuality; | 1015 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 994 | 1016 |
| 995 sk_sp<SkImage> image = CreateImage(1, 24000); | 1017 sk_sp<SkImage> image = CreateImage(1, 24000); |
| 996 DrawImage draw_image( | 1018 DrawImage draw_image( |
| 997 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), | 1019 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), |
| 998 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), | 1020 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), |
| 999 DefaultColorSpace()); | 1021 DefaultColorSpace()); |
| 1000 | 1022 |
| 1001 // Must hold context lock before calling GetDecodedImageForDraw / | 1023 // Must hold context lock before calling GetDecodedImageForDraw / |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1015 cache.GetDecodedImageForDraw(draw_image); | 1037 cache.GetDecodedImageForDraw(draw_image); |
| 1016 EXPECT_TRUE(second_decoded_draw_image.image()); | 1038 EXPECT_TRUE(second_decoded_draw_image.image()); |
| 1017 EXPECT_FALSE(second_decoded_draw_image.image()->isTextureBacked()); | 1039 EXPECT_FALSE(second_decoded_draw_image.image()->isTextureBacked()); |
| 1018 EXPECT_TRUE(second_decoded_draw_image.is_at_raster_decode()); | 1040 EXPECT_TRUE(second_decoded_draw_image.is_at_raster_decode()); |
| 1019 EXPECT_TRUE(cache.DiscardableIsLockedForTesting(draw_image)); | 1041 EXPECT_TRUE(cache.DiscardableIsLockedForTesting(draw_image)); |
| 1020 | 1042 |
| 1021 cache.DrawWithImageFinished(draw_image, second_decoded_draw_image); | 1043 cache.DrawWithImageFinished(draw_image, second_decoded_draw_image); |
| 1022 EXPECT_FALSE(cache.DiscardableIsLockedForTesting(draw_image)); | 1044 EXPECT_FALSE(cache.DiscardableIsLockedForTesting(draw_image)); |
| 1023 } | 1045 } |
| 1024 | 1046 |
| 1025 TEST(GpuImageDecodeCacheTest, ZeroSizedImagesAreSkipped) { | 1047 TEST_P(GpuImageDecodeCacheTest, ZeroSizedImagesAreSkipped) { |
| 1026 auto context_provider = TestContextProvider::Create(); | 1048 auto context_provider = TestContextProvider::Create(); |
| 1027 context_provider->BindToCurrentThread(); | 1049 context_provider->BindToCurrentThread(); |
| 1028 TestGpuImageDecodeCache cache(context_provider.get()); | 1050 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 1029 bool is_decomposable = true; | 1051 bool is_decomposable = true; |
| 1030 SkFilterQuality quality = kHigh_SkFilterQuality; | 1052 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 1031 | 1053 |
| 1032 sk_sp<SkImage> image = CreateImage(100, 100); | 1054 sk_sp<SkImage> image = CreateImage(100, 100); |
| 1033 DrawImage draw_image( | 1055 DrawImage draw_image( |
| 1034 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), | 1056 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), |
| 1035 quality, CreateMatrix(SkSize::Make(0.f, 0.f), is_decomposable), | 1057 quality, CreateMatrix(SkSize::Make(0.f, 0.f), is_decomposable), |
| 1036 DefaultColorSpace()); | 1058 DefaultColorSpace()); |
| 1037 | 1059 |
| 1038 scoped_refptr<TileTask> task; | 1060 scoped_refptr<TileTask> task; |
| 1039 bool need_unref = cache.GetTaskForImageAndRef( | 1061 bool need_unref = cache.GetTaskForImageAndRef( |
| 1040 draw_image, ImageDecodeCache::TracingInfo(), &task); | 1062 draw_image, ImageDecodeCache::TracingInfo(), &task); |
| 1041 EXPECT_FALSE(task); | 1063 EXPECT_FALSE(task); |
| 1042 EXPECT_FALSE(need_unref); | 1064 EXPECT_FALSE(need_unref); |
| 1043 | 1065 |
| 1044 // Must hold context lock before calling GetDecodedImageForDraw / | 1066 // Must hold context lock before calling GetDecodedImageForDraw / |
| 1045 // DrawWithImageFinished. | 1067 // DrawWithImageFinished. |
| 1046 ContextProvider::ScopedContextLock context_lock(context_provider.get()); | 1068 ContextProvider::ScopedContextLock context_lock(context_provider.get()); |
| 1047 DecodedDrawImage decoded_draw_image = | 1069 DecodedDrawImage decoded_draw_image = |
| 1048 cache.GetDecodedImageForDraw(draw_image); | 1070 cache.GetDecodedImageForDraw(draw_image); |
| 1049 EXPECT_FALSE(decoded_draw_image.image()); | 1071 EXPECT_FALSE(decoded_draw_image.image()); |
| 1050 | 1072 |
| 1051 cache.DrawWithImageFinished(draw_image, decoded_draw_image); | 1073 cache.DrawWithImageFinished(draw_image, decoded_draw_image); |
| 1052 } | 1074 } |
| 1053 | 1075 |
| 1054 TEST(GpuImageDecodeCacheTest, NonOverlappingSrcRectImagesAreSkipped) { | 1076 TEST_P(GpuImageDecodeCacheTest, NonOverlappingSrcRectImagesAreSkipped) { |
| 1055 auto context_provider = TestContextProvider::Create(); | 1077 auto context_provider = TestContextProvider::Create(); |
| 1056 context_provider->BindToCurrentThread(); | 1078 context_provider->BindToCurrentThread(); |
| 1057 TestGpuImageDecodeCache cache(context_provider.get()); | 1079 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 1058 bool is_decomposable = true; | 1080 bool is_decomposable = true; |
| 1059 SkFilterQuality quality = kHigh_SkFilterQuality; | 1081 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 1060 | 1082 |
| 1061 sk_sp<SkImage> image = CreateImage(100, 100); | 1083 sk_sp<SkImage> image = CreateImage(100, 100); |
| 1062 DrawImage draw_image( | 1084 DrawImage draw_image( |
| 1063 CreatePaintImage(image), | 1085 CreatePaintImage(image), |
| 1064 SkIRect::MakeXYWH(150, 150, image->width(), image->height()), quality, | 1086 SkIRect::MakeXYWH(150, 150, image->width(), image->height()), quality, |
| 1065 CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable), | 1087 CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable), |
| 1066 DefaultColorSpace()); | 1088 DefaultColorSpace()); |
| 1067 | 1089 |
| 1068 scoped_refptr<TileTask> task; | 1090 scoped_refptr<TileTask> task; |
| 1069 bool need_unref = cache.GetTaskForImageAndRef( | 1091 bool need_unref = cache.GetTaskForImageAndRef( |
| 1070 draw_image, ImageDecodeCache::TracingInfo(), &task); | 1092 draw_image, ImageDecodeCache::TracingInfo(), &task); |
| 1071 EXPECT_FALSE(task); | 1093 EXPECT_FALSE(task); |
| 1072 EXPECT_FALSE(need_unref); | 1094 EXPECT_FALSE(need_unref); |
| 1073 | 1095 |
| 1074 // Must hold context lock before calling GetDecodedImageForDraw / | 1096 // Must hold context lock before calling GetDecodedImageForDraw / |
| 1075 // DrawWithImageFinished. | 1097 // DrawWithImageFinished. |
| 1076 ContextProvider::ScopedContextLock context_lock(context_provider.get()); | 1098 ContextProvider::ScopedContextLock context_lock(context_provider.get()); |
| 1077 DecodedDrawImage decoded_draw_image = | 1099 DecodedDrawImage decoded_draw_image = |
| 1078 cache.GetDecodedImageForDraw(draw_image); | 1100 cache.GetDecodedImageForDraw(draw_image); |
| 1079 EXPECT_FALSE(decoded_draw_image.image()); | 1101 EXPECT_FALSE(decoded_draw_image.image()); |
| 1080 | 1102 |
| 1081 cache.DrawWithImageFinished(draw_image, decoded_draw_image); | 1103 cache.DrawWithImageFinished(draw_image, decoded_draw_image); |
| 1082 } | 1104 } |
| 1083 | 1105 |
| 1084 TEST(GpuImageDecodeCacheTest, CanceledTasksDoNotCountAgainstBudget) { | 1106 TEST_P(GpuImageDecodeCacheTest, CanceledTasksDoNotCountAgainstBudget) { |
| 1085 auto context_provider = TestContextProvider::Create(); | 1107 auto context_provider = TestContextProvider::Create(); |
| 1086 context_provider->BindToCurrentThread(); | 1108 context_provider->BindToCurrentThread(); |
| 1087 TestGpuImageDecodeCache cache(context_provider.get()); | 1109 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 1088 bool is_decomposable = true; | 1110 bool is_decomposable = true; |
| 1089 SkFilterQuality quality = kHigh_SkFilterQuality; | 1111 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 1090 | 1112 |
| 1091 sk_sp<SkImage> image = CreateImage(100, 100); | 1113 sk_sp<SkImage> image = CreateImage(100, 100); |
| 1092 DrawImage draw_image(CreatePaintImage(image), | 1114 DrawImage draw_image(CreatePaintImage(image), |
| 1093 SkIRect::MakeXYWH(0, 0, image->width(), image->height()), | 1115 SkIRect::MakeXYWH(0, 0, image->width(), image->height()), |
| 1094 quality, | 1116 quality, |
| 1095 CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable), | 1117 CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable), |
| 1096 DefaultColorSpace()); | 1118 DefaultColorSpace()); |
| 1097 | 1119 |
| 1098 scoped_refptr<TileTask> task; | 1120 scoped_refptr<TileTask> task; |
| 1099 bool need_unref = cache.GetTaskForImageAndRef( | 1121 bool need_unref = cache.GetTaskForImageAndRef( |
| 1100 draw_image, ImageDecodeCache::TracingInfo(), &task); | 1122 draw_image, ImageDecodeCache::TracingInfo(), &task); |
| 1101 EXPECT_NE(0u, cache.GetBytesUsedForTesting()); | 1123 EXPECT_NE(0u, cache.GetBytesUsedForTesting()); |
| 1102 EXPECT_TRUE(task); | 1124 EXPECT_TRUE(task); |
| 1103 EXPECT_TRUE(need_unref); | 1125 EXPECT_TRUE(need_unref); |
| 1104 | 1126 |
| 1105 TestTileTaskRunner::CancelTask(task->dependencies()[0].get()); | 1127 TestTileTaskRunner::CancelTask(task->dependencies()[0].get()); |
| 1106 TestTileTaskRunner::CompleteTask(task->dependencies()[0].get()); | 1128 TestTileTaskRunner::CompleteTask(task->dependencies()[0].get()); |
| 1107 TestTileTaskRunner::CancelTask(task.get()); | 1129 TestTileTaskRunner::CancelTask(task.get()); |
| 1108 TestTileTaskRunner::CompleteTask(task.get()); | 1130 TestTileTaskRunner::CompleteTask(task.get()); |
| 1109 | 1131 |
| 1110 cache.UnrefImage(draw_image); | 1132 cache.UnrefImage(draw_image); |
| 1111 EXPECT_EQ(0u, cache.GetBytesUsedForTesting()); | 1133 EXPECT_EQ(0u, cache.GetBytesUsedForTesting()); |
| 1112 } | 1134 } |
| 1113 | 1135 |
| 1114 TEST(GpuImageDecodeCacheTest, ShouldAggressivelyFreeResources) { | 1136 TEST_P(GpuImageDecodeCacheTest, ShouldAggressivelyFreeResources) { |
| 1115 auto context_provider = TestContextProvider::Create(); | 1137 auto context_provider = TestContextProvider::Create(); |
| 1116 context_provider->BindToCurrentThread(); | 1138 context_provider->BindToCurrentThread(); |
| 1117 TestGpuImageDecodeCache cache(context_provider.get()); | 1139 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 1118 bool is_decomposable = true; | 1140 bool is_decomposable = true; |
| 1119 SkFilterQuality quality = kHigh_SkFilterQuality; | 1141 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 1120 | 1142 |
| 1121 sk_sp<SkImage> image = CreateImage(100, 100); | 1143 sk_sp<SkImage> image = CreateImage(100, 100); |
| 1122 DrawImage draw_image( | 1144 DrawImage draw_image( |
| 1123 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), | 1145 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), |
| 1124 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), | 1146 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), |
| 1125 DefaultColorSpace()); | 1147 DefaultColorSpace()); |
| 1126 scoped_refptr<TileTask> task; | 1148 scoped_refptr<TileTask> task; |
| 1127 { | 1149 { |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1168 EXPECT_TRUE(task); | 1190 EXPECT_TRUE(task); |
| 1169 | 1191 |
| 1170 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); | 1192 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); |
| 1171 TestTileTaskRunner::ProcessTask(task.get()); | 1193 TestTileTaskRunner::ProcessTask(task.get()); |
| 1172 cache.UnrefImage(draw_image); | 1194 cache.UnrefImage(draw_image); |
| 1173 | 1195 |
| 1174 EXPECT_GT(cache.GetBytesUsedForTesting(), 0u); | 1196 EXPECT_GT(cache.GetBytesUsedForTesting(), 0u); |
| 1175 } | 1197 } |
| 1176 } | 1198 } |
| 1177 | 1199 |
| 1178 TEST(GpuImageDecodeCacheTest, OrphanedImagesFreeOnReachingZeroRefs) { | 1200 TEST_P(GpuImageDecodeCacheTest, OrphanedImagesFreeOnReachingZeroRefs) { |
| 1179 auto context_provider = TestContextProvider::Create(); | 1201 auto context_provider = TestContextProvider::Create(); |
| 1180 context_provider->BindToCurrentThread(); | 1202 context_provider->BindToCurrentThread(); |
| 1181 TestGpuImageDecodeCache cache(context_provider.get()); | 1203 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 1182 bool is_decomposable = true; | 1204 bool is_decomposable = true; |
| 1183 SkFilterQuality quality = kHigh_SkFilterQuality; | 1205 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 1184 | 1206 |
| 1185 // Create a downscaled image. | 1207 // Create a downscaled image. |
| 1186 sk_sp<SkImage> first_image = CreateImage(100, 100); | 1208 sk_sp<SkImage> first_image = CreateImage(100, 100); |
| 1187 DrawImage first_draw_image( | 1209 DrawImage first_draw_image( |
| 1188 CreatePaintImage(first_image), | 1210 CreatePaintImage(first_image), |
| 1189 SkIRect::MakeWH(first_image->width(), first_image->height()), quality, | 1211 SkIRect::MakeWH(first_image->width(), first_image->height()), quality, |
| 1190 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), | 1212 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), |
| 1191 DefaultColorSpace()); | 1213 DefaultColorSpace()); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1227 // deleted. | 1249 // deleted. |
| 1228 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get()); | 1250 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get()); |
| 1229 TestTileTaskRunner::ProcessTask(first_task.get()); | 1251 TestTileTaskRunner::ProcessTask(first_task.get()); |
| 1230 cache.UnrefImage(first_draw_image); | 1252 cache.UnrefImage(first_draw_image); |
| 1231 | 1253 |
| 1232 // The budget should account for exactly one image. | 1254 // The budget should account for exactly one image. |
| 1233 EXPECT_EQ(cache.GetBytesUsedForTesting(), | 1255 EXPECT_EQ(cache.GetBytesUsedForTesting(), |
| 1234 cache.GetDrawImageSizeForTesting(second_draw_image)); | 1256 cache.GetDrawImageSizeForTesting(second_draw_image)); |
| 1235 } | 1257 } |
| 1236 | 1258 |
| 1237 TEST(GpuImageDecodeCacheTest, OrphanedZeroRefImagesImmediatelyDeleted) { | 1259 TEST_P(GpuImageDecodeCacheTest, OrphanedZeroRefImagesImmediatelyDeleted) { |
| 1238 auto context_provider = TestContextProvider::Create(); | 1260 auto context_provider = TestContextProvider::Create(); |
| 1239 context_provider->BindToCurrentThread(); | 1261 context_provider->BindToCurrentThread(); |
| 1240 TestGpuImageDecodeCache cache(context_provider.get()); | 1262 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 1241 bool is_decomposable = true; | 1263 bool is_decomposable = true; |
| 1242 SkFilterQuality quality = kHigh_SkFilterQuality; | 1264 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 1243 | 1265 |
| 1244 // Create a downscaled image. | 1266 // Create a downscaled image. |
| 1245 sk_sp<SkImage> first_image = CreateImage(100, 100); | 1267 sk_sp<SkImage> first_image = CreateImage(100, 100); |
| 1246 DrawImage first_draw_image( | 1268 DrawImage first_draw_image( |
| 1247 CreatePaintImage(first_image), | 1269 CreatePaintImage(first_image), |
| 1248 SkIRect::MakeWH(first_image->width(), first_image->height()), quality, | 1270 SkIRect::MakeWH(first_image->width(), first_image->height()), quality, |
| 1249 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), | 1271 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable), |
| 1250 DefaultColorSpace()); | 1272 DefaultColorSpace()); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 1279 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); | 1301 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); |
| 1280 TestTileTaskRunner::ProcessTask(second_task.get()); | 1302 TestTileTaskRunner::ProcessTask(second_task.get()); |
| 1281 | 1303 |
| 1282 cache.UnrefImage(second_draw_image); | 1304 cache.UnrefImage(second_draw_image); |
| 1283 | 1305 |
| 1284 // The budget should account for exactly one image. | 1306 // The budget should account for exactly one image. |
| 1285 EXPECT_EQ(cache.GetBytesUsedForTesting(), | 1307 EXPECT_EQ(cache.GetBytesUsedForTesting(), |
| 1286 cache.GetDrawImageSizeForTesting(second_draw_image)); | 1308 cache.GetDrawImageSizeForTesting(second_draw_image)); |
| 1287 } | 1309 } |
| 1288 | 1310 |
| 1289 TEST(GpuImageDecodeCacheTest, QualityCappedAtMedium) { | 1311 TEST_P(GpuImageDecodeCacheTest, QualityCappedAtMedium) { |
| 1290 auto context_provider = TestContextProvider::Create(); | 1312 auto context_provider = TestContextProvider::Create(); |
| 1291 context_provider->BindToCurrentThread(); | 1313 context_provider->BindToCurrentThread(); |
| 1292 TestGpuImageDecodeCache cache(context_provider.get()); | 1314 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 1293 sk_sp<SkImage> image = CreateImage(100, 100); | 1315 sk_sp<SkImage> image = CreateImage(100, 100); |
| 1294 bool is_decomposable = true; | 1316 bool is_decomposable = true; |
| 1295 SkMatrix matrix = CreateMatrix(SkSize::Make(0.4f, 0.4f), is_decomposable); | 1317 SkMatrix matrix = CreateMatrix(SkSize::Make(0.4f, 0.4f), is_decomposable); |
| 1296 | 1318 |
| 1297 // Create an image with kLow_FilterQuality. | 1319 // Create an image with kLow_FilterQuality. |
| 1298 DrawImage low_draw_image(CreatePaintImage(image), | 1320 DrawImage low_draw_image(CreatePaintImage(image), |
| 1299 SkIRect::MakeWH(image->width(), image->height()), | 1321 SkIRect::MakeWH(image->width(), image->height()), |
| 1300 kLow_SkFilterQuality, matrix, DefaultColorSpace()); | 1322 kLow_SkFilterQuality, matrix, DefaultColorSpace()); |
| 1301 scoped_refptr<TileTask> low_task; | 1323 scoped_refptr<TileTask> low_task; |
| 1302 bool need_unref = cache.GetTaskForImageAndRef( | 1324 bool need_unref = cache.GetTaskForImageAndRef( |
| (...skipping 28 matching lines...) Expand all Loading... |
| 1331 TestTileTaskRunner::ProcessTask(medium_task->dependencies()[0].get()); | 1353 TestTileTaskRunner::ProcessTask(medium_task->dependencies()[0].get()); |
| 1332 TestTileTaskRunner::ProcessTask(medium_task.get()); | 1354 TestTileTaskRunner::ProcessTask(medium_task.get()); |
| 1333 | 1355 |
| 1334 cache.UnrefImage(low_draw_image); | 1356 cache.UnrefImage(low_draw_image); |
| 1335 cache.UnrefImage(medium_draw_image); | 1357 cache.UnrefImage(medium_draw_image); |
| 1336 cache.UnrefImage(large_draw_image); | 1358 cache.UnrefImage(large_draw_image); |
| 1337 } | 1359 } |
| 1338 | 1360 |
| 1339 // Ensure that switching to a mipped version of an image after the initial | 1361 // Ensure that switching to a mipped version of an image after the initial |
| 1340 // cache entry creation doesn't cause a buffer overflow/crash. | 1362 // cache entry creation doesn't cause a buffer overflow/crash. |
| 1341 TEST(GpuImageDecodeCacheTest, GetDecodedImageForDrawMipUsageChange) { | 1363 TEST_P(GpuImageDecodeCacheTest, GetDecodedImageForDrawMipUsageChange) { |
| 1342 auto context_provider = TestContextProvider::Create(); | 1364 auto context_provider = TestContextProvider::Create(); |
| 1343 context_provider->BindToCurrentThread(); | 1365 context_provider->BindToCurrentThread(); |
| 1344 TestGpuImageDecodeCache cache(context_provider.get()); | 1366 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 1345 bool is_decomposable = true; | 1367 bool is_decomposable = true; |
| 1346 SkFilterQuality quality = kHigh_SkFilterQuality; | 1368 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 1347 | 1369 |
| 1348 // Create an image decode task and cache entry that does not need mips. | 1370 // Create an image decode task and cache entry that does not need mips. |
| 1349 sk_sp<SkImage> image = CreateImage(4000, 4000); | 1371 sk_sp<SkImage> image = CreateImage(4000, 4000); |
| 1350 DrawImage draw_image( | 1372 DrawImage draw_image( |
| 1351 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), | 1373 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), |
| 1352 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), | 1374 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), |
| 1353 DefaultColorSpace()); | 1375 DefaultColorSpace()); |
| 1354 scoped_refptr<TileTask> task; | 1376 scoped_refptr<TileTask> task; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1372 // Do an at-raster decode of the above image that *does* require mips. | 1394 // Do an at-raster decode of the above image that *does* require mips. |
| 1373 DrawImage draw_image_mips( | 1395 DrawImage draw_image_mips( |
| 1374 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), | 1396 CreatePaintImage(image), SkIRect::MakeWH(image->width(), image->height()), |
| 1375 quality, CreateMatrix(SkSize::Make(0.6f, 0.6f), is_decomposable), | 1397 quality, CreateMatrix(SkSize::Make(0.6f, 0.6f), is_decomposable), |
| 1376 DefaultColorSpace()); | 1398 DefaultColorSpace()); |
| 1377 DecodedDrawImage decoded_draw_image = | 1399 DecodedDrawImage decoded_draw_image = |
| 1378 cache.GetDecodedImageForDraw(draw_image_mips); | 1400 cache.GetDecodedImageForDraw(draw_image_mips); |
| 1379 cache.DrawWithImageFinished(draw_image_mips, decoded_draw_image); | 1401 cache.DrawWithImageFinished(draw_image_mips, decoded_draw_image); |
| 1380 } | 1402 } |
| 1381 | 1403 |
| 1382 TEST(GpuImageDecodeCacheTest, MemoryStateSuspended) { | 1404 TEST_P(GpuImageDecodeCacheTest, MemoryStateSuspended) { |
| 1383 auto context_provider = TestContextProvider::Create(); | 1405 auto context_provider = TestContextProvider::Create(); |
| 1384 context_provider->BindToCurrentThread(); | 1406 context_provider->BindToCurrentThread(); |
| 1385 TestGpuImageDecodeCache cache(context_provider.get()); | 1407 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 1386 | 1408 |
| 1387 // First Insert an image into our cache. | 1409 // First Insert an image into our cache. |
| 1388 sk_sp<SkImage> image = CreateImage(1, 1); | 1410 sk_sp<SkImage> image = CreateImage(1, 1); |
| 1389 bool is_decomposable = true; | 1411 bool is_decomposable = true; |
| 1390 SkMatrix matrix = CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable); | 1412 SkMatrix matrix = CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable); |
| 1391 DrawImage draw_image(CreatePaintImage(image), | 1413 DrawImage draw_image(CreatePaintImage(image), |
| 1392 SkIRect::MakeWH(image->width(), image->height()), | 1414 SkIRect::MakeWH(image->width(), image->height()), |
| 1393 kLow_SkFilterQuality, matrix, DefaultColorSpace()); | 1415 kLow_SkFilterQuality, matrix, DefaultColorSpace()); |
| 1394 scoped_refptr<TileTask> task; | 1416 scoped_refptr<TileTask> task; |
| 1395 bool need_unref = cache.GetTaskForImageAndRef( | 1417 bool need_unref = cache.GetTaskForImageAndRef( |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1443 need_unref = cache.GetTaskForImageAndRef( | 1465 need_unref = cache.GetTaskForImageAndRef( |
| 1444 draw_image, ImageDecodeCache::TracingInfo(), &task); | 1466 draw_image, ImageDecodeCache::TracingInfo(), &task); |
| 1445 EXPECT_TRUE(need_unref); | 1467 EXPECT_TRUE(need_unref); |
| 1446 EXPECT_TRUE(task); | 1468 EXPECT_TRUE(task); |
| 1447 | 1469 |
| 1448 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); | 1470 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); |
| 1449 TestTileTaskRunner::ProcessTask(task.get()); | 1471 TestTileTaskRunner::ProcessTask(task.get()); |
| 1450 cache.UnrefImage(draw_image); | 1472 cache.UnrefImage(draw_image); |
| 1451 } | 1473 } |
| 1452 | 1474 |
| 1453 TEST(GpuImageDecodeCacheTest, OutOfRasterDecodeTask) { | 1475 TEST_P(GpuImageDecodeCacheTest, OutOfRasterDecodeTask) { |
| 1454 auto context_provider = TestContextProvider::Create(); | 1476 auto context_provider = TestContextProvider::Create(); |
| 1455 context_provider->BindToCurrentThread(); | 1477 context_provider->BindToCurrentThread(); |
| 1456 TestGpuImageDecodeCache cache(context_provider.get()); | 1478 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 1457 | 1479 |
| 1458 sk_sp<SkImage> image = CreateImage(1, 1); | 1480 sk_sp<SkImage> image = CreateImage(1, 1); |
| 1459 bool is_decomposable = true; | 1481 bool is_decomposable = true; |
| 1460 SkMatrix matrix = CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable); | 1482 SkMatrix matrix = CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable); |
| 1461 DrawImage draw_image(CreatePaintImage(image), | 1483 DrawImage draw_image(CreatePaintImage(image), |
| 1462 SkIRect::MakeWH(image->width(), image->height()), | 1484 SkIRect::MakeWH(image->width(), image->height()), |
| 1463 kLow_SkFilterQuality, matrix, DefaultColorSpace()); | 1485 kLow_SkFilterQuality, matrix, DefaultColorSpace()); |
| 1464 | 1486 |
| 1465 scoped_refptr<TileTask> task; | 1487 scoped_refptr<TileTask> task; |
| 1466 bool need_unref = | 1488 bool need_unref = |
| 1467 cache.GetOutOfRasterDecodeTaskForImageAndRef(draw_image, &task); | 1489 cache.GetOutOfRasterDecodeTaskForImageAndRef(draw_image, &task); |
| 1468 EXPECT_TRUE(need_unref); | 1490 EXPECT_TRUE(need_unref); |
| 1469 EXPECT_TRUE(task); | 1491 EXPECT_TRUE(task); |
| 1470 EXPECT_TRUE(cache.IsInInUseCacheForTesting(draw_image)); | 1492 EXPECT_TRUE(cache.IsInInUseCacheForTesting(draw_image)); |
| 1471 | 1493 |
| 1472 // Run the decode task. | 1494 // Run the decode task. |
| 1473 TestTileTaskRunner::ProcessTask(task.get()); | 1495 TestTileTaskRunner::ProcessTask(task.get()); |
| 1474 | 1496 |
| 1475 // The image should remain in the cache till we unref it. | 1497 // The image should remain in the cache till we unref it. |
| 1476 EXPECT_TRUE(cache.IsInInUseCacheForTesting(draw_image)); | 1498 EXPECT_TRUE(cache.IsInInUseCacheForTesting(draw_image)); |
| 1477 cache.UnrefImage(draw_image); | 1499 cache.UnrefImage(draw_image); |
| 1478 } | 1500 } |
| 1479 | 1501 |
| 1480 TEST(GpuImageDecodeCacheTest, ZeroCacheNormalWorkingSet) { | 1502 TEST_P(GpuImageDecodeCacheTest, ZeroCacheNormalWorkingSet) { |
| 1481 // Setup - Image cache has a normal working set, but zero cache size. | 1503 // Setup - Image cache has a normal working set, but zero cache size. |
| 1482 auto context_provider = TestContextProvider::Create(); | 1504 auto context_provider = TestContextProvider::Create(); |
| 1483 context_provider->BindToCurrentThread(); | 1505 context_provider->BindToCurrentThread(); |
| 1484 GpuImageDecodeCache cache(context_provider.get(), ResourceFormat::RGBA_8888, | 1506 GpuImageDecodeCache cache(context_provider.get(), ResourceFormat::RGBA_8888, |
| 1485 kGpuMemoryLimitBytes, 0); | 1507 kGpuMemoryLimitBytes, 0); |
| 1486 bool is_decomposable = true; | 1508 bool is_decomposable = true; |
| 1487 SkFilterQuality quality = kHigh_SkFilterQuality; | 1509 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 1488 | 1510 |
| 1489 // Add an image to the cache. Due to normal working set, this should produce | 1511 // Add an image to the cache. Due to normal working set, this should produce |
| 1490 // a task and a ref. | 1512 // a task and a ref. |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1525 EXPECT_TRUE(task3); | 1547 EXPECT_TRUE(task3); |
| 1526 EXPECT_EQ(task3->dependencies().size(), 1u); | 1548 EXPECT_EQ(task3->dependencies().size(), 1u); |
| 1527 EXPECT_TRUE(task->dependencies()[0]); | 1549 EXPECT_TRUE(task->dependencies()[0]); |
| 1528 | 1550 |
| 1529 TestTileTaskRunner::ProcessTask(task3->dependencies()[0].get()); | 1551 TestTileTaskRunner::ProcessTask(task3->dependencies()[0].get()); |
| 1530 TestTileTaskRunner::ProcessTask(task3.get()); | 1552 TestTileTaskRunner::ProcessTask(task3.get()); |
| 1531 | 1553 |
| 1532 cache.UnrefImage(draw_image); | 1554 cache.UnrefImage(draw_image); |
| 1533 } | 1555 } |
| 1534 | 1556 |
| 1535 TEST(GpuImageDecodeCacheTest, SmallCacheNormalWorkingSet) { | 1557 TEST_P(GpuImageDecodeCacheTest, SmallCacheNormalWorkingSet) { |
| 1536 // Cache will fit one (but not two) 100x100 images. | 1558 // Cache will fit one (but not two) 100x100 images. |
| 1537 size_t cache_size = 190 * 100 * 4; | 1559 size_t cache_size = 190 * 100 * 4; |
| 1538 | 1560 |
| 1539 auto context_provider = TestContextProvider::Create(); | 1561 auto context_provider = TestContextProvider::Create(); |
| 1540 context_provider->BindToCurrentThread(); | 1562 context_provider->BindToCurrentThread(); |
| 1541 GpuImageDecodeCache cache(context_provider.get(), ResourceFormat::RGBA_8888, | 1563 GpuImageDecodeCache cache(context_provider.get(), ResourceFormat::RGBA_8888, |
| 1542 kGpuMemoryLimitBytes, cache_size); | 1564 kGpuMemoryLimitBytes, cache_size); |
| 1543 bool is_decomposable = true; | 1565 bool is_decomposable = true; |
| 1544 SkFilterQuality quality = kHigh_SkFilterQuality; | 1566 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 1545 | 1567 |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1619 EXPECT_EQ(task->dependencies().size(), 1u); | 1641 EXPECT_EQ(task->dependencies().size(), 1u); |
| 1620 EXPECT_TRUE(task->dependencies()[0]); | 1642 EXPECT_TRUE(task->dependencies()[0]); |
| 1621 | 1643 |
| 1622 // Run the task and unref the image. | 1644 // Run the task and unref the image. |
| 1623 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); | 1645 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); |
| 1624 TestTileTaskRunner::ProcessTask(task.get()); | 1646 TestTileTaskRunner::ProcessTask(task.get()); |
| 1625 cache.UnrefImage(draw_image); | 1647 cache.UnrefImage(draw_image); |
| 1626 } | 1648 } |
| 1627 } | 1649 } |
| 1628 | 1650 |
| 1629 TEST(GpuImageDecodeCacheTest, ClearCache) { | 1651 TEST_P(GpuImageDecodeCacheTest, ClearCache) { |
| 1630 auto context_provider = TestContextProvider::Create(); | 1652 auto context_provider = TestContextProvider::Create(); |
| 1631 context_provider->BindToCurrentThread(); | 1653 context_provider->BindToCurrentThread(); |
| 1632 TestGpuImageDecodeCache cache(context_provider.get()); | 1654 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 1633 bool is_decomposable = true; | 1655 bool is_decomposable = true; |
| 1634 SkFilterQuality quality = kHigh_SkFilterQuality; | 1656 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 1635 | 1657 |
| 1636 for (int i = 0; i < 10; ++i) { | 1658 for (int i = 0; i < 10; ++i) { |
| 1637 sk_sp<SkImage> image = CreateImage(100, 100); | 1659 sk_sp<SkImage> image = CreateImage(100, 100); |
| 1638 DrawImage draw_image( | 1660 DrawImage draw_image( |
| 1639 CreatePaintImage(image), | 1661 CreatePaintImage(image), |
| 1640 SkIRect::MakeWH(image->width(), image->height()), quality, | 1662 SkIRect::MakeWH(image->width(), image->height()), quality, |
| 1641 CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), | 1663 CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable), |
| 1642 DefaultColorSpace()); | 1664 DefaultColorSpace()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1655 EXPECT_EQ(cache.GetNumCacheEntriesForTesting(), 10u); | 1677 EXPECT_EQ(cache.GetNumCacheEntriesForTesting(), 10u); |
| 1656 | 1678 |
| 1657 // Tell our cache to clear resources. | 1679 // Tell our cache to clear resources. |
| 1658 cache.ClearCache(); | 1680 cache.ClearCache(); |
| 1659 | 1681 |
| 1660 // We should now have nothing in our cache. | 1682 // We should now have nothing in our cache. |
| 1661 EXPECT_EQ(cache.GetBytesUsedForTesting(), 0u); | 1683 EXPECT_EQ(cache.GetBytesUsedForTesting(), 0u); |
| 1662 EXPECT_EQ(cache.GetNumCacheEntriesForTesting(), 0u); | 1684 EXPECT_EQ(cache.GetNumCacheEntriesForTesting(), 0u); |
| 1663 } | 1685 } |
| 1664 | 1686 |
| 1665 TEST(GpuImageDecodeCacheTest, GetTaskForImageDifferentColorSpace) { | 1687 TEST_P(GpuImageDecodeCacheTest, GetTaskForImageDifferentColorSpace) { |
| 1666 auto context_provider = TestContextProvider::Create(); | 1688 auto context_provider = TestContextProvider::Create(); |
| 1667 context_provider->BindToCurrentThread(); | 1689 context_provider->BindToCurrentThread(); |
| 1668 TestGpuImageDecodeCache cache(context_provider.get()); | 1690 TestGpuImageDecodeCache cache(context_provider.get(), GetParam()); |
| 1669 bool is_decomposable = true; | 1691 bool is_decomposable = true; |
| 1670 SkFilterQuality quality = kHigh_SkFilterQuality; | 1692 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 1671 | 1693 |
| 1672 gfx::ColorSpace color_space_a = gfx::ColorSpace::CreateSRGB(); | 1694 gfx::ColorSpace color_space_a = gfx::ColorSpace::CreateSRGB(); |
| 1673 gfx::ColorSpace color_space_b = gfx::ColorSpace::CreateXYZD50(); | 1695 gfx::ColorSpace color_space_b = gfx::ColorSpace::CreateXYZD50(); |
| 1674 | 1696 |
| 1675 sk_sp<SkImage> first_image = CreateImage(100, 100); | 1697 sk_sp<SkImage> first_image = CreateImage(100, 100); |
| 1676 DrawImage first_draw_image( | 1698 DrawImage first_draw_image( |
| 1677 CreatePaintImage(first_image), | 1699 CreatePaintImage(first_image), |
| 1678 SkIRect::MakeWH(first_image->width(), first_image->height()), quality, | 1700 SkIRect::MakeWH(first_image->width(), first_image->height()), quality, |
| (...skipping 28 matching lines...) Expand all Loading... |
| 1707 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get()); | 1729 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get()); |
| 1708 TestTileTaskRunner::ProcessTask(first_task.get()); | 1730 TestTileTaskRunner::ProcessTask(first_task.get()); |
| 1709 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); | 1731 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); |
| 1710 TestTileTaskRunner::ProcessTask(second_task.get()); | 1732 TestTileTaskRunner::ProcessTask(second_task.get()); |
| 1711 | 1733 |
| 1712 cache.UnrefImage(first_draw_image); | 1734 cache.UnrefImage(first_draw_image); |
| 1713 cache.UnrefImage(second_draw_image); | 1735 cache.UnrefImage(second_draw_image); |
| 1714 cache.UnrefImage(third_draw_image); | 1736 cache.UnrefImage(third_draw_image); |
| 1715 } | 1737 } |
| 1716 | 1738 |
| 1739 INSTANTIATE_TEST_CASE_P(GpuImageDecodeCacheTests, |
| 1740 GpuImageDecodeCacheTest, |
| 1741 ::testing::Values(ResourceFormat::RGBA_8888, |
| 1742 ResourceFormat::RGBA_4444)); |
| 1743 |
| 1717 } // namespace | 1744 } // namespace |
| 1718 } // namespace cc | 1745 } // namespace cc |
| OLD | NEW |