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_controller.h" | 5 #include "cc/tiles/gpu_image_decode_controller.h" |
6 | 6 |
7 #include "cc/playback/draw_image.h" | 7 #include "cc/playback/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" |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 TEST(GpuImageDecodeControllerTest, GetTaskForImageSameImage) { | 43 TEST(GpuImageDecodeControllerTest, GetTaskForImageSameImage) { |
44 auto context_provider = TestContextProvider::Create(); | 44 auto context_provider = TestContextProvider::Create(); |
45 context_provider->BindToCurrentThread(); | 45 context_provider->BindToCurrentThread(); |
46 TestGpuImageDecodeController controller(context_provider.get()); | 46 TestGpuImageDecodeController controller(context_provider.get()); |
47 sk_sp<SkImage> image = CreateImage(100, 100); | 47 sk_sp<SkImage> image = CreateImage(100, 100); |
48 bool is_decomposable = true; | 48 bool is_decomposable = true; |
49 SkFilterQuality quality = kHigh_SkFilterQuality; | 49 SkFilterQuality quality = kHigh_SkFilterQuality; |
50 | 50 |
51 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 51 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
52 quality, | 52 quality, |
53 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | 53 CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable)); |
54 scoped_refptr<TileTask> task; | 54 scoped_refptr<TileTask> task; |
55 bool need_unref = controller.GetTaskForImageAndRef( | 55 bool need_unref = controller.GetTaskForImageAndRef( |
56 draw_image, ImageDecodeController::TracingInfo(), &task); | 56 draw_image, ImageDecodeController::TracingInfo(), &task); |
57 EXPECT_TRUE(need_unref); | 57 EXPECT_TRUE(need_unref); |
58 EXPECT_TRUE(task); | 58 EXPECT_TRUE(task); |
59 | 59 |
60 DrawImage another_draw_image( | 60 DrawImage another_draw_image( |
61 image, SkIRect::MakeWH(image->width(), image->height()), quality, | 61 image, SkIRect::MakeWH(image->width(), image->height()), quality, |
62 CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable)); | 62 CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable)); |
63 scoped_refptr<TileTask> another_task; | 63 scoped_refptr<TileTask> another_task; |
64 need_unref = controller.GetTaskForImageAndRef( | 64 need_unref = controller.GetTaskForImageAndRef( |
65 another_draw_image, ImageDecodeController::TracingInfo(), &another_task); | 65 another_draw_image, ImageDecodeController::TracingInfo(), &another_task); |
66 EXPECT_TRUE(need_unref); | 66 EXPECT_TRUE(need_unref); |
67 EXPECT_TRUE(task.get() == another_task.get()); | 67 EXPECT_TRUE(task.get() == another_task.get()); |
68 | 68 |
69 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); | 69 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); |
70 TestTileTaskRunner::ProcessTask(task.get()); | 70 TestTileTaskRunner::ProcessTask(task.get()); |
71 | 71 |
72 controller.UnrefImage(draw_image); | 72 controller.UnrefImage(draw_image); |
73 controller.UnrefImage(draw_image); | 73 controller.UnrefImage(draw_image); |
74 } | 74 } |
75 | 75 |
| 76 TEST(GpuImageDecodeControllerTest, GetTaskForImageSmallerScale) { |
| 77 auto context_provider = TestContextProvider::Create(); |
| 78 context_provider->BindToCurrentThread(); |
| 79 TestGpuImageDecodeController controller(context_provider.get()); |
| 80 sk_sp<SkImage> image = CreateImage(100, 100); |
| 81 bool is_decomposable = true; |
| 82 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 83 |
| 84 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
| 85 quality, |
| 86 CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable)); |
| 87 scoped_refptr<TileTask> task; |
| 88 bool need_unref = controller.GetTaskForImageAndRef( |
| 89 draw_image, ImageDecodeController::TracingInfo(), &task); |
| 90 EXPECT_TRUE(need_unref); |
| 91 EXPECT_TRUE(task); |
| 92 |
| 93 DrawImage another_draw_image( |
| 94 image, SkIRect::MakeWH(image->width(), image->height()), quality, |
| 95 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| 96 scoped_refptr<TileTask> another_task; |
| 97 need_unref = controller.GetTaskForImageAndRef( |
| 98 another_draw_image, ImageDecodeController::TracingInfo(), &another_task); |
| 99 EXPECT_TRUE(need_unref); |
| 100 EXPECT_TRUE(task.get() == another_task.get()); |
| 101 |
| 102 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); |
| 103 TestTileTaskRunner::ProcessTask(task.get()); |
| 104 |
| 105 controller.UnrefImage(draw_image); |
| 106 controller.UnrefImage(another_draw_image); |
| 107 } |
| 108 |
| 109 TEST(GpuImageDecodeControllerTest, GetTaskForImageLowerQuality) { |
| 110 auto context_provider = TestContextProvider::Create(); |
| 111 context_provider->BindToCurrentThread(); |
| 112 TestGpuImageDecodeController controller(context_provider.get()); |
| 113 sk_sp<SkImage> image = CreateImage(100, 100); |
| 114 bool is_decomposable = true; |
| 115 SkMatrix matrix = CreateMatrix(SkSize::Make(0.4f, 0.4f), is_decomposable); |
| 116 |
| 117 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
| 118 kHigh_SkFilterQuality, matrix); |
| 119 scoped_refptr<TileTask> task; |
| 120 bool need_unref = controller.GetTaskForImageAndRef( |
| 121 draw_image, ImageDecodeController::TracingInfo(), &task); |
| 122 EXPECT_TRUE(need_unref); |
| 123 EXPECT_TRUE(task); |
| 124 |
| 125 DrawImage another_draw_image(image, |
| 126 SkIRect::MakeWH(image->width(), image->height()), |
| 127 kLow_SkFilterQuality, matrix); |
| 128 scoped_refptr<TileTask> another_task; |
| 129 need_unref = controller.GetTaskForImageAndRef( |
| 130 another_draw_image, ImageDecodeController::TracingInfo(), &another_task); |
| 131 EXPECT_TRUE(need_unref); |
| 132 EXPECT_TRUE(task.get() == another_task.get()); |
| 133 |
| 134 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); |
| 135 TestTileTaskRunner::ProcessTask(task.get()); |
| 136 |
| 137 controller.UnrefImage(draw_image); |
| 138 controller.UnrefImage(another_draw_image); |
| 139 } |
| 140 |
76 TEST(GpuImageDecodeControllerTest, GetTaskForImageDifferentImage) { | 141 TEST(GpuImageDecodeControllerTest, GetTaskForImageDifferentImage) { |
77 auto context_provider = TestContextProvider::Create(); | 142 auto context_provider = TestContextProvider::Create(); |
78 context_provider->BindToCurrentThread(); | 143 context_provider->BindToCurrentThread(); |
79 TestGpuImageDecodeController controller(context_provider.get()); | 144 TestGpuImageDecodeController controller(context_provider.get()); |
80 bool is_decomposable = true; | 145 bool is_decomposable = true; |
81 SkFilterQuality quality = kHigh_SkFilterQuality; | 146 SkFilterQuality quality = kHigh_SkFilterQuality; |
82 | 147 |
83 sk_sp<SkImage> first_image = CreateImage(100, 100); | 148 sk_sp<SkImage> first_image = CreateImage(100, 100); |
84 DrawImage first_draw_image( | 149 DrawImage first_draw_image( |
85 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), | 150 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), |
(...skipping 18 matching lines...) Expand all Loading... |
104 | 169 |
105 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get()); | 170 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get()); |
106 TestTileTaskRunner::ProcessTask(first_task.get()); | 171 TestTileTaskRunner::ProcessTask(first_task.get()); |
107 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); | 172 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); |
108 TestTileTaskRunner::ProcessTask(second_task.get()); | 173 TestTileTaskRunner::ProcessTask(second_task.get()); |
109 | 174 |
110 controller.UnrefImage(first_draw_image); | 175 controller.UnrefImage(first_draw_image); |
111 controller.UnrefImage(second_draw_image); | 176 controller.UnrefImage(second_draw_image); |
112 } | 177 } |
113 | 178 |
| 179 TEST(GpuImageDecodeControllerTest, GetTaskForImageLargerScale) { |
| 180 auto context_provider = TestContextProvider::Create(); |
| 181 context_provider->BindToCurrentThread(); |
| 182 TestGpuImageDecodeController controller(context_provider.get()); |
| 183 bool is_decomposable = true; |
| 184 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 185 |
| 186 sk_sp<SkImage> first_image = CreateImage(100, 100); |
| 187 DrawImage first_draw_image( |
| 188 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), |
| 189 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| 190 scoped_refptr<TileTask> first_task; |
| 191 bool need_unref = controller.GetTaskForImageAndRef( |
| 192 first_draw_image, ImageDecodeController::TracingInfo(), &first_task); |
| 193 EXPECT_TRUE(need_unref); |
| 194 EXPECT_TRUE(first_task); |
| 195 |
| 196 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get()); |
| 197 TestTileTaskRunner::ProcessTask(first_task.get()); |
| 198 |
| 199 controller.UnrefImage(first_draw_image); |
| 200 |
| 201 DrawImage second_draw_image( |
| 202 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), |
| 203 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); |
| 204 scoped_refptr<TileTask> second_task; |
| 205 need_unref = controller.GetTaskForImageAndRef( |
| 206 second_draw_image, ImageDecodeController::TracingInfo(), &second_task); |
| 207 EXPECT_TRUE(need_unref); |
| 208 EXPECT_TRUE(second_task); |
| 209 EXPECT_TRUE(first_task.get() != second_task.get()); |
| 210 |
| 211 DrawImage third_draw_image( |
| 212 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), |
| 213 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| 214 scoped_refptr<TileTask> third_task; |
| 215 need_unref = controller.GetTaskForImageAndRef( |
| 216 third_draw_image, ImageDecodeController::TracingInfo(), &third_task); |
| 217 EXPECT_TRUE(need_unref); |
| 218 EXPECT_TRUE(third_task.get() == second_task.get()); |
| 219 |
| 220 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); |
| 221 TestTileTaskRunner::ProcessTask(second_task.get()); |
| 222 |
| 223 controller.UnrefImage(second_draw_image); |
| 224 controller.UnrefImage(third_draw_image); |
| 225 } |
| 226 |
| 227 TEST(GpuImageDecodeControllerTest, GetTaskForImageLargerScaleNoReuse) { |
| 228 auto context_provider = TestContextProvider::Create(); |
| 229 context_provider->BindToCurrentThread(); |
| 230 TestGpuImageDecodeController controller(context_provider.get()); |
| 231 bool is_decomposable = true; |
| 232 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 233 |
| 234 sk_sp<SkImage> first_image = CreateImage(100, 100); |
| 235 DrawImage first_draw_image( |
| 236 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), |
| 237 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| 238 scoped_refptr<TileTask> first_task; |
| 239 bool need_unref = controller.GetTaskForImageAndRef( |
| 240 first_draw_image, ImageDecodeController::TracingInfo(), &first_task); |
| 241 EXPECT_TRUE(need_unref); |
| 242 EXPECT_TRUE(first_task); |
| 243 |
| 244 DrawImage second_draw_image( |
| 245 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), |
| 246 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); |
| 247 scoped_refptr<TileTask> second_task; |
| 248 need_unref = controller.GetTaskForImageAndRef( |
| 249 second_draw_image, ImageDecodeController::TracingInfo(), &second_task); |
| 250 EXPECT_TRUE(need_unref); |
| 251 EXPECT_TRUE(second_task); |
| 252 EXPECT_TRUE(first_task.get() != second_task.get()); |
| 253 |
| 254 DrawImage third_draw_image( |
| 255 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), |
| 256 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| 257 scoped_refptr<TileTask> third_task; |
| 258 need_unref = controller.GetTaskForImageAndRef( |
| 259 third_draw_image, ImageDecodeController::TracingInfo(), &third_task); |
| 260 EXPECT_TRUE(need_unref); |
| 261 EXPECT_TRUE(third_task.get() == first_task.get()); |
| 262 |
| 263 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get()); |
| 264 TestTileTaskRunner::ProcessTask(first_task.get()); |
| 265 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); |
| 266 TestTileTaskRunner::ProcessTask(second_task.get()); |
| 267 |
| 268 controller.UnrefImage(first_draw_image); |
| 269 controller.UnrefImage(second_draw_image); |
| 270 controller.UnrefImage(third_draw_image); |
| 271 } |
| 272 |
| 273 TEST(GpuImageDecodeControllerTest, GetTaskForImageHigherQuality) { |
| 274 auto context_provider = TestContextProvider::Create(); |
| 275 context_provider->BindToCurrentThread(); |
| 276 TestGpuImageDecodeController controller(context_provider.get()); |
| 277 bool is_decomposable = true; |
| 278 SkMatrix matrix = CreateMatrix(SkSize::Make(0.4f, 0.4f), is_decomposable); |
| 279 |
| 280 sk_sp<SkImage> first_image = CreateImage(100, 100); |
| 281 DrawImage first_draw_image( |
| 282 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), |
| 283 kLow_SkFilterQuality, matrix); |
| 284 scoped_refptr<TileTask> first_task; |
| 285 bool need_unref = controller.GetTaskForImageAndRef( |
| 286 first_draw_image, ImageDecodeController::TracingInfo(), &first_task); |
| 287 EXPECT_TRUE(need_unref); |
| 288 EXPECT_TRUE(first_task); |
| 289 |
| 290 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get()); |
| 291 TestTileTaskRunner::ProcessTask(first_task.get()); |
| 292 |
| 293 controller.UnrefImage(first_draw_image); |
| 294 |
| 295 DrawImage second_draw_image( |
| 296 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), |
| 297 kHigh_SkFilterQuality, matrix); |
| 298 scoped_refptr<TileTask> second_task; |
| 299 need_unref = controller.GetTaskForImageAndRef( |
| 300 second_draw_image, ImageDecodeController::TracingInfo(), &second_task); |
| 301 EXPECT_TRUE(need_unref); |
| 302 EXPECT_TRUE(second_task); |
| 303 EXPECT_TRUE(first_task.get() != second_task.get()); |
| 304 |
| 305 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); |
| 306 TestTileTaskRunner::ProcessTask(second_task.get()); |
| 307 |
| 308 controller.UnrefImage(second_draw_image); |
| 309 } |
| 310 |
114 TEST(GpuImageDecodeControllerTest, GetTaskForImageAlreadyDecodedAndLocked) { | 311 TEST(GpuImageDecodeControllerTest, GetTaskForImageAlreadyDecodedAndLocked) { |
115 auto context_provider = TestContextProvider::Create(); | 312 auto context_provider = TestContextProvider::Create(); |
116 context_provider->BindToCurrentThread(); | 313 context_provider->BindToCurrentThread(); |
117 TestGpuImageDecodeController controller(context_provider.get()); | 314 TestGpuImageDecodeController controller(context_provider.get()); |
118 bool is_decomposable = true; | 315 bool is_decomposable = true; |
119 SkFilterQuality quality = kHigh_SkFilterQuality; | 316 SkFilterQuality quality = kHigh_SkFilterQuality; |
120 | 317 |
121 sk_sp<SkImage> image = CreateImage(100, 100); | 318 sk_sp<SkImage> image = CreateImage(100, 100); |
122 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 319 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
123 quality, | 320 quality, |
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
401 TEST(GpuImageDecodeControllerTest, GetLargeDecodedImageForDraw) { | 598 TEST(GpuImageDecodeControllerTest, GetLargeDecodedImageForDraw) { |
402 auto context_provider = TestContextProvider::Create(); | 599 auto context_provider = TestContextProvider::Create(); |
403 context_provider->BindToCurrentThread(); | 600 context_provider->BindToCurrentThread(); |
404 TestGpuImageDecodeController controller(context_provider.get()); | 601 TestGpuImageDecodeController controller(context_provider.get()); |
405 bool is_decomposable = true; | 602 bool is_decomposable = true; |
406 SkFilterQuality quality = kHigh_SkFilterQuality; | 603 SkFilterQuality quality = kHigh_SkFilterQuality; |
407 | 604 |
408 sk_sp<SkImage> image = CreateImage(1, 24000); | 605 sk_sp<SkImage> image = CreateImage(1, 24000); |
409 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 606 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
410 quality, | 607 quality, |
411 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | 608 CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); |
412 scoped_refptr<TileTask> task; | 609 scoped_refptr<TileTask> task; |
413 bool need_unref = controller.GetTaskForImageAndRef( | 610 bool need_unref = controller.GetTaskForImageAndRef( |
414 draw_image, ImageDecodeController::TracingInfo(), &task); | 611 draw_image, ImageDecodeController::TracingInfo(), &task); |
415 EXPECT_TRUE(need_unref); | 612 EXPECT_TRUE(need_unref); |
416 EXPECT_TRUE(task); | 613 EXPECT_TRUE(task); |
417 | 614 |
418 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); | 615 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); |
419 TestTileTaskRunner::ProcessTask(task.get()); | 616 TestTileTaskRunner::ProcessTask(task.get()); |
420 | 617 |
421 // Must hold context lock before calling GetDecodedImageForDraw / | 618 // Must hold context lock before calling GetDecodedImageForDraw / |
(...skipping 17 matching lines...) Expand all Loading... |
439 TestGpuImageDecodeController controller(context_provider.get()); | 636 TestGpuImageDecodeController controller(context_provider.get()); |
440 bool is_decomposable = true; | 637 bool is_decomposable = true; |
441 SkFilterQuality quality = kHigh_SkFilterQuality; | 638 SkFilterQuality quality = kHigh_SkFilterQuality; |
442 | 639 |
443 controller.SetCachedItemLimitForTesting(0); | 640 controller.SetCachedItemLimitForTesting(0); |
444 controller.SetCachedBytesLimitForTesting(0); | 641 controller.SetCachedBytesLimitForTesting(0); |
445 | 642 |
446 sk_sp<SkImage> image = CreateImage(100, 100); | 643 sk_sp<SkImage> image = CreateImage(100, 100); |
447 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 644 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
448 quality, | 645 quality, |
449 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | 646 CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); |
450 | 647 |
451 scoped_refptr<TileTask> task; | 648 scoped_refptr<TileTask> task; |
452 bool need_unref = controller.GetTaskForImageAndRef( | 649 bool need_unref = controller.GetTaskForImageAndRef( |
453 draw_image, ImageDecodeController::TracingInfo(), &task); | 650 draw_image, ImageDecodeController::TracingInfo(), &task); |
454 EXPECT_FALSE(need_unref); | 651 EXPECT_FALSE(need_unref); |
455 EXPECT_FALSE(task); | 652 EXPECT_FALSE(task); |
456 | 653 |
457 // Must hold context lock before calling GetDecodedImageForDraw / | 654 // Must hold context lock before calling GetDecodedImageForDraw / |
458 // DrawWithImageFinished. | 655 // DrawWithImageFinished. |
459 ContextProvider::ScopedContextLock context_lock(context_provider.get()); | 656 ContextProvider::ScopedContextLock context_lock(context_provider.get()); |
460 DecodedDrawImage decoded_draw_image = | 657 DecodedDrawImage decoded_draw_image = |
461 controller.GetDecodedImageForDraw(draw_image); | 658 controller.GetDecodedImageForDraw(draw_image); |
462 EXPECT_TRUE(decoded_draw_image.image()); | 659 EXPECT_TRUE(decoded_draw_image.image()); |
463 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); | 660 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); |
464 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode()); | 661 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode()); |
465 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); | 662 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); |
466 | 663 |
467 controller.DrawWithImageFinished(draw_image, decoded_draw_image); | 664 controller.DrawWithImageFinished(draw_image, decoded_draw_image); |
468 } | 665 } |
469 | 666 |
| 667 TEST(GpuImageDecodeControllerTest, GetDecodedImageForDrawLargerScale) { |
| 668 auto context_provider = TestContextProvider::Create(); |
| 669 context_provider->BindToCurrentThread(); |
| 670 TestGpuImageDecodeController controller(context_provider.get()); |
| 671 bool is_decomposable = true; |
| 672 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 673 |
| 674 sk_sp<SkImage> image = CreateImage(100, 100); |
| 675 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
| 676 quality, |
| 677 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| 678 scoped_refptr<TileTask> task; |
| 679 bool need_unref = controller.GetTaskForImageAndRef( |
| 680 draw_image, ImageDecodeController::TracingInfo(), &task); |
| 681 EXPECT_TRUE(need_unref); |
| 682 EXPECT_TRUE(task); |
| 683 |
| 684 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); |
| 685 TestTileTaskRunner::ProcessTask(task.get()); |
| 686 |
| 687 DrawImage larger_draw_image( |
| 688 image, SkIRect::MakeWH(image->width(), image->height()), quality, |
| 689 CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable)); |
| 690 scoped_refptr<TileTask> larger_task; |
| 691 bool larger_need_unref = controller.GetTaskForImageAndRef( |
| 692 larger_draw_image, ImageDecodeController::TracingInfo(), &larger_task); |
| 693 EXPECT_TRUE(larger_need_unref); |
| 694 EXPECT_TRUE(larger_task); |
| 695 |
| 696 TestTileTaskRunner::ProcessTask(larger_task->dependencies()[0].get()); |
| 697 TestTileTaskRunner::ProcessTask(larger_task.get()); |
| 698 |
| 699 // Must hold context lock before calling GetDecodedImageForDraw / |
| 700 // DrawWithImageFinished. |
| 701 ContextProvider::ScopedContextLock context_lock(context_provider.get()); |
| 702 DecodedDrawImage decoded_draw_image = |
| 703 controller.GetDecodedImageForDraw(draw_image); |
| 704 EXPECT_TRUE(decoded_draw_image.image()); |
| 705 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); |
| 706 EXPECT_FALSE(decoded_draw_image.is_at_raster_decode()); |
| 707 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); |
| 708 |
| 709 DecodedDrawImage larger_decoded_draw_image = |
| 710 controller.GetDecodedImageForDraw(larger_draw_image); |
| 711 EXPECT_TRUE(larger_decoded_draw_image.image()); |
| 712 EXPECT_TRUE(larger_decoded_draw_image.image()->isTextureBacked()); |
| 713 EXPECT_FALSE(larger_decoded_draw_image.is_at_raster_decode()); |
| 714 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); |
| 715 |
| 716 EXPECT_FALSE(decoded_draw_image.image() == larger_decoded_draw_image.image()); |
| 717 |
| 718 controller.DrawWithImageFinished(draw_image, decoded_draw_image); |
| 719 controller.UnrefImage(draw_image); |
| 720 controller.DrawWithImageFinished(larger_draw_image, |
| 721 larger_decoded_draw_image); |
| 722 controller.UnrefImage(larger_draw_image); |
| 723 } |
| 724 |
| 725 TEST(GpuImageDecodeControllerTest, GetDecodedImageForDrawHigherQuality) { |
| 726 auto context_provider = TestContextProvider::Create(); |
| 727 context_provider->BindToCurrentThread(); |
| 728 TestGpuImageDecodeController controller(context_provider.get()); |
| 729 bool is_decomposable = true; |
| 730 SkMatrix matrix = CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable); |
| 731 |
| 732 sk_sp<SkImage> image = CreateImage(100, 100); |
| 733 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
| 734 kLow_SkFilterQuality, matrix); |
| 735 scoped_refptr<TileTask> task; |
| 736 bool need_unref = controller.GetTaskForImageAndRef( |
| 737 draw_image, ImageDecodeController::TracingInfo(), &task); |
| 738 EXPECT_TRUE(need_unref); |
| 739 EXPECT_TRUE(task); |
| 740 |
| 741 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); |
| 742 TestTileTaskRunner::ProcessTask(task.get()); |
| 743 |
| 744 DrawImage higher_quality_draw_image( |
| 745 image, SkIRect::MakeWH(image->width(), image->height()), |
| 746 kHigh_SkFilterQuality, matrix); |
| 747 scoped_refptr<TileTask> hq_task; |
| 748 bool hq_needs_unref = controller.GetTaskForImageAndRef( |
| 749 higher_quality_draw_image, ImageDecodeController::TracingInfo(), |
| 750 &hq_task); |
| 751 EXPECT_TRUE(hq_needs_unref); |
| 752 EXPECT_TRUE(hq_task); |
| 753 |
| 754 TestTileTaskRunner::ProcessTask(hq_task->dependencies()[0].get()); |
| 755 TestTileTaskRunner::ProcessTask(hq_task.get()); |
| 756 |
| 757 // Must hold context lock before calling GetDecodedImageForDraw / |
| 758 // DrawWithImageFinished. |
| 759 ContextProvider::ScopedContextLock context_lock(context_provider.get()); |
| 760 DecodedDrawImage decoded_draw_image = |
| 761 controller.GetDecodedImageForDraw(draw_image); |
| 762 EXPECT_TRUE(decoded_draw_image.image()); |
| 763 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); |
| 764 EXPECT_FALSE(decoded_draw_image.is_at_raster_decode()); |
| 765 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); |
| 766 |
| 767 DecodedDrawImage larger_decoded_draw_image = |
| 768 controller.GetDecodedImageForDraw(higher_quality_draw_image); |
| 769 EXPECT_TRUE(larger_decoded_draw_image.image()); |
| 770 EXPECT_TRUE(larger_decoded_draw_image.image()->isTextureBacked()); |
| 771 EXPECT_FALSE(larger_decoded_draw_image.is_at_raster_decode()); |
| 772 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); |
| 773 |
| 774 EXPECT_FALSE(decoded_draw_image.image() == larger_decoded_draw_image.image()); |
| 775 |
| 776 controller.DrawWithImageFinished(draw_image, decoded_draw_image); |
| 777 controller.UnrefImage(draw_image); |
| 778 controller.DrawWithImageFinished(higher_quality_draw_image, |
| 779 larger_decoded_draw_image); |
| 780 controller.UnrefImage(higher_quality_draw_image); |
| 781 } |
| 782 |
470 TEST(GpuImageDecodeControllerTest, AtRasterUsedDirectlyIfSpaceAllows) { | 783 TEST(GpuImageDecodeControllerTest, AtRasterUsedDirectlyIfSpaceAllows) { |
471 auto context_provider = TestContextProvider::Create(); | 784 auto context_provider = TestContextProvider::Create(); |
472 context_provider->BindToCurrentThread(); | 785 context_provider->BindToCurrentThread(); |
473 TestGpuImageDecodeController controller(context_provider.get()); | 786 TestGpuImageDecodeController controller(context_provider.get()); |
474 bool is_decomposable = true; | 787 bool is_decomposable = true; |
475 SkFilterQuality quality = kHigh_SkFilterQuality; | 788 SkFilterQuality quality = kHigh_SkFilterQuality; |
476 | 789 |
477 controller.SetCachedItemLimitForTesting(0); | 790 controller.SetCachedItemLimitForTesting(0); |
478 controller.SetCachedBytesLimitForTesting(0); | 791 controller.SetCachedBytesLimitForTesting(0); |
479 | 792 |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
552 GetLargeDecodedImageForDrawAtRasterDecodeMultipleTimes) { | 865 GetLargeDecodedImageForDrawAtRasterDecodeMultipleTimes) { |
553 auto context_provider = TestContextProvider::Create(); | 866 auto context_provider = TestContextProvider::Create(); |
554 context_provider->BindToCurrentThread(); | 867 context_provider->BindToCurrentThread(); |
555 TestGpuImageDecodeController controller(context_provider.get()); | 868 TestGpuImageDecodeController controller(context_provider.get()); |
556 bool is_decomposable = true; | 869 bool is_decomposable = true; |
557 SkFilterQuality quality = kHigh_SkFilterQuality; | 870 SkFilterQuality quality = kHigh_SkFilterQuality; |
558 | 871 |
559 sk_sp<SkImage> image = CreateImage(1, 24000); | 872 sk_sp<SkImage> image = CreateImage(1, 24000); |
560 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 873 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
561 quality, | 874 quality, |
562 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | 875 CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); |
563 | 876 |
564 // Must hold context lock before calling GetDecodedImageForDraw / | 877 // Must hold context lock before calling GetDecodedImageForDraw / |
565 // DrawWithImageFinished. | 878 // DrawWithImageFinished. |
566 ContextProvider::ScopedContextLock context_lock(context_provider.get()); | 879 ContextProvider::ScopedContextLock context_lock(context_provider.get()); |
567 DecodedDrawImage decoded_draw_image = | 880 DecodedDrawImage decoded_draw_image = |
568 controller.GetDecodedImageForDraw(draw_image); | 881 controller.GetDecodedImageForDraw(draw_image); |
569 EXPECT_TRUE(decoded_draw_image.image()); | 882 EXPECT_TRUE(decoded_draw_image.image()); |
570 EXPECT_FALSE(decoded_draw_image.image()->isTextureBacked()); | 883 EXPECT_FALSE(decoded_draw_image.image()->isTextureBacked()); |
571 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode()); | 884 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode()); |
572 EXPECT_TRUE(controller.DiscardableIsLockedForTesting(draw_image)); | 885 EXPECT_TRUE(controller.DiscardableIsLockedForTesting(draw_image)); |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
719 } | 1032 } |
720 | 1033 |
721 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); | 1034 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); |
722 TestTileTaskRunner::ProcessTask(task.get()); | 1035 TestTileTaskRunner::ProcessTask(task.get()); |
723 | 1036 |
724 // The image should be in our cache after un-ref. | 1037 // The image should be in our cache after un-ref. |
725 controller.UnrefImage(draw_image); | 1038 controller.UnrefImage(draw_image); |
726 DCHECK_GT(controller.GetBytesUsedForTesting(), 0u); | 1039 DCHECK_GT(controller.GetBytesUsedForTesting(), 0u); |
727 } | 1040 } |
728 | 1041 |
| 1042 TEST(GpuImageDecodeControllerTest, OrphanedImagesFreeOnReachingZeroRefs) { |
| 1043 auto context_provider = TestContextProvider::Create(); |
| 1044 context_provider->BindToCurrentThread(); |
| 1045 TestGpuImageDecodeController controller(context_provider.get()); |
| 1046 bool is_decomposable = true; |
| 1047 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 1048 |
| 1049 // Create a downscaled image. |
| 1050 sk_sp<SkImage> first_image = CreateImage(100, 100); |
| 1051 DrawImage first_draw_image( |
| 1052 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), |
| 1053 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| 1054 scoped_refptr<TileTask> first_task; |
| 1055 bool need_unref = controller.GetTaskForImageAndRef( |
| 1056 first_draw_image, ImageDecodeController::TracingInfo(), &first_task); |
| 1057 EXPECT_TRUE(need_unref); |
| 1058 EXPECT_TRUE(first_task); |
| 1059 |
| 1060 // The budget should account for exactly one image. |
| 1061 EXPECT_EQ(controller.GetBytesUsedForTesting(), |
| 1062 controller.GetDrawImageSizeForTesting(first_draw_image)); |
| 1063 |
| 1064 // Create a larger version of |first_image|, this should immediately free the |
| 1065 // memory used by |first_image| for the smaller scale. |
| 1066 DrawImage second_draw_image( |
| 1067 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), |
| 1068 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); |
| 1069 scoped_refptr<TileTask> second_task; |
| 1070 need_unref = controller.GetTaskForImageAndRef( |
| 1071 second_draw_image, ImageDecodeController::TracingInfo(), &second_task); |
| 1072 EXPECT_TRUE(need_unref); |
| 1073 EXPECT_TRUE(second_task); |
| 1074 EXPECT_TRUE(first_task.get() != second_task.get()); |
| 1075 |
| 1076 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); |
| 1077 TestTileTaskRunner::ProcessTask(second_task.get()); |
| 1078 |
| 1079 controller.UnrefImage(second_draw_image); |
| 1080 |
| 1081 // The budget should account for both images one image. |
| 1082 EXPECT_EQ(controller.GetBytesUsedForTesting(), |
| 1083 controller.GetDrawImageSizeForTesting(second_draw_image) + |
| 1084 controller.GetDrawImageSizeForTesting(first_draw_image)); |
| 1085 |
| 1086 // Unref the first image, it was orphaned, so it should be immediately |
| 1087 // deleted. |
| 1088 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get()); |
| 1089 TestTileTaskRunner::ProcessTask(first_task.get()); |
| 1090 controller.UnrefImage(first_draw_image); |
| 1091 |
| 1092 // The budget should account for exactly one image. |
| 1093 EXPECT_EQ(controller.GetBytesUsedForTesting(), |
| 1094 controller.GetDrawImageSizeForTesting(second_draw_image)); |
| 1095 } |
| 1096 |
| 1097 TEST(GpuImageDecodeControllerTest, OrphanedZeroRefImagesImmediatelyDeleted) { |
| 1098 auto context_provider = TestContextProvider::Create(); |
| 1099 context_provider->BindToCurrentThread(); |
| 1100 TestGpuImageDecodeController controller(context_provider.get()); |
| 1101 bool is_decomposable = true; |
| 1102 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 1103 |
| 1104 // Create a downscaled image. |
| 1105 sk_sp<SkImage> first_image = CreateImage(100, 100); |
| 1106 DrawImage first_draw_image( |
| 1107 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), |
| 1108 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| 1109 scoped_refptr<TileTask> first_task; |
| 1110 bool need_unref = controller.GetTaskForImageAndRef( |
| 1111 first_draw_image, ImageDecodeController::TracingInfo(), &first_task); |
| 1112 EXPECT_TRUE(need_unref); |
| 1113 EXPECT_TRUE(first_task); |
| 1114 |
| 1115 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get()); |
| 1116 TestTileTaskRunner::ProcessTask(first_task.get()); |
| 1117 controller.UnrefImage(first_draw_image); |
| 1118 |
| 1119 // The budget should account for exactly one image. |
| 1120 EXPECT_EQ(controller.GetBytesUsedForTesting(), |
| 1121 controller.GetDrawImageSizeForTesting(first_draw_image)); |
| 1122 |
| 1123 // Create a larger version of |first_image|, this should immediately free the |
| 1124 // memory used by |first_image| for the smaller scale. |
| 1125 DrawImage second_draw_image( |
| 1126 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), |
| 1127 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); |
| 1128 scoped_refptr<TileTask> second_task; |
| 1129 need_unref = controller.GetTaskForImageAndRef( |
| 1130 second_draw_image, ImageDecodeController::TracingInfo(), &second_task); |
| 1131 EXPECT_TRUE(need_unref); |
| 1132 EXPECT_TRUE(second_task); |
| 1133 EXPECT_TRUE(first_task.get() != second_task.get()); |
| 1134 |
| 1135 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); |
| 1136 TestTileTaskRunner::ProcessTask(second_task.get()); |
| 1137 |
| 1138 controller.UnrefImage(second_draw_image); |
| 1139 |
| 1140 // The budget should account for exactly one image. |
| 1141 EXPECT_EQ(controller.GetBytesUsedForTesting(), |
| 1142 controller.GetDrawImageSizeForTesting(second_draw_image)); |
| 1143 } |
| 1144 |
729 } // namespace | 1145 } // namespace |
730 } // namespace cc | 1146 } // namespace cc |
OLD | NEW |