| 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(1.5f, 1.5f), is_decomposable)); | 53 CreateMatrix(SkSize::Make(0.5f, 0.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 | |
| 141 TEST(GpuImageDecodeControllerTest, GetTaskForImageDifferentImage) { | 76 TEST(GpuImageDecodeControllerTest, GetTaskForImageDifferentImage) { |
| 142 auto context_provider = TestContextProvider::Create(); | 77 auto context_provider = TestContextProvider::Create(); |
| 143 context_provider->BindToCurrentThread(); | 78 context_provider->BindToCurrentThread(); |
| 144 TestGpuImageDecodeController controller(context_provider.get()); | 79 TestGpuImageDecodeController controller(context_provider.get()); |
| 145 bool is_decomposable = true; | 80 bool is_decomposable = true; |
| 146 SkFilterQuality quality = kHigh_SkFilterQuality; | 81 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 147 | 82 |
| 148 sk_sp<SkImage> first_image = CreateImage(100, 100); | 83 sk_sp<SkImage> first_image = CreateImage(100, 100); |
| 149 DrawImage first_draw_image( | 84 DrawImage first_draw_image( |
| 150 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), | 85 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), |
| (...skipping 18 matching lines...) Expand all Loading... |
| 169 | 104 |
| 170 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get()); | 105 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get()); |
| 171 TestTileTaskRunner::ProcessTask(first_task.get()); | 106 TestTileTaskRunner::ProcessTask(first_task.get()); |
| 172 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); | 107 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); |
| 173 TestTileTaskRunner::ProcessTask(second_task.get()); | 108 TestTileTaskRunner::ProcessTask(second_task.get()); |
| 174 | 109 |
| 175 controller.UnrefImage(first_draw_image); | 110 controller.UnrefImage(first_draw_image); |
| 176 controller.UnrefImage(second_draw_image); | 111 controller.UnrefImage(second_draw_image); |
| 177 } | 112 } |
| 178 | 113 |
| 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 | |
| 311 TEST(GpuImageDecodeControllerTest, GetTaskForImageAlreadyDecodedAndLocked) { | 114 TEST(GpuImageDecodeControllerTest, GetTaskForImageAlreadyDecodedAndLocked) { |
| 312 auto context_provider = TestContextProvider::Create(); | 115 auto context_provider = TestContextProvider::Create(); |
| 313 context_provider->BindToCurrentThread(); | 116 context_provider->BindToCurrentThread(); |
| 314 TestGpuImageDecodeController controller(context_provider.get()); | 117 TestGpuImageDecodeController controller(context_provider.get()); |
| 315 bool is_decomposable = true; | 118 bool is_decomposable = true; |
| 316 SkFilterQuality quality = kHigh_SkFilterQuality; | 119 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 317 | 120 |
| 318 sk_sp<SkImage> image = CreateImage(100, 100); | 121 sk_sp<SkImage> image = CreateImage(100, 100); |
| 319 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 122 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
| 320 quality, | 123 quality, |
| (...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 598 TEST(GpuImageDecodeControllerTest, GetLargeDecodedImageForDraw) { | 401 TEST(GpuImageDecodeControllerTest, GetLargeDecodedImageForDraw) { |
| 599 auto context_provider = TestContextProvider::Create(); | 402 auto context_provider = TestContextProvider::Create(); |
| 600 context_provider->BindToCurrentThread(); | 403 context_provider->BindToCurrentThread(); |
| 601 TestGpuImageDecodeController controller(context_provider.get()); | 404 TestGpuImageDecodeController controller(context_provider.get()); |
| 602 bool is_decomposable = true; | 405 bool is_decomposable = true; |
| 603 SkFilterQuality quality = kHigh_SkFilterQuality; | 406 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 604 | 407 |
| 605 sk_sp<SkImage> image = CreateImage(1, 24000); | 408 sk_sp<SkImage> image = CreateImage(1, 24000); |
| 606 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 409 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
| 607 quality, | 410 quality, |
| 608 CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); | 411 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| 609 scoped_refptr<TileTask> task; | 412 scoped_refptr<TileTask> task; |
| 610 bool need_unref = controller.GetTaskForImageAndRef( | 413 bool need_unref = controller.GetTaskForImageAndRef( |
| 611 draw_image, ImageDecodeController::TracingInfo(), &task); | 414 draw_image, ImageDecodeController::TracingInfo(), &task); |
| 612 EXPECT_TRUE(need_unref); | 415 EXPECT_TRUE(need_unref); |
| 613 EXPECT_TRUE(task); | 416 EXPECT_TRUE(task); |
| 614 | 417 |
| 615 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); | 418 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); |
| 616 TestTileTaskRunner::ProcessTask(task.get()); | 419 TestTileTaskRunner::ProcessTask(task.get()); |
| 617 | 420 |
| 618 // Must hold context lock before calling GetDecodedImageForDraw / | 421 // Must hold context lock before calling GetDecodedImageForDraw / |
| (...skipping 17 matching lines...) Expand all Loading... |
| 636 TestGpuImageDecodeController controller(context_provider.get()); | 439 TestGpuImageDecodeController controller(context_provider.get()); |
| 637 bool is_decomposable = true; | 440 bool is_decomposable = true; |
| 638 SkFilterQuality quality = kHigh_SkFilterQuality; | 441 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 639 | 442 |
| 640 controller.SetCachedItemLimitForTesting(0); | 443 controller.SetCachedItemLimitForTesting(0); |
| 641 controller.SetCachedBytesLimitForTesting(0); | 444 controller.SetCachedBytesLimitForTesting(0); |
| 642 | 445 |
| 643 sk_sp<SkImage> image = CreateImage(100, 100); | 446 sk_sp<SkImage> image = CreateImage(100, 100); |
| 644 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 447 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
| 645 quality, | 448 quality, |
| 646 CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); | 449 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| 647 | 450 |
| 648 scoped_refptr<TileTask> task; | 451 scoped_refptr<TileTask> task; |
| 649 bool need_unref = controller.GetTaskForImageAndRef( | 452 bool need_unref = controller.GetTaskForImageAndRef( |
| 650 draw_image, ImageDecodeController::TracingInfo(), &task); | 453 draw_image, ImageDecodeController::TracingInfo(), &task); |
| 651 EXPECT_FALSE(need_unref); | 454 EXPECT_FALSE(need_unref); |
| 652 EXPECT_FALSE(task); | 455 EXPECT_FALSE(task); |
| 653 | 456 |
| 654 // Must hold context lock before calling GetDecodedImageForDraw / | 457 // Must hold context lock before calling GetDecodedImageForDraw / |
| 655 // DrawWithImageFinished. | 458 // DrawWithImageFinished. |
| 656 ContextProvider::ScopedContextLock context_lock(context_provider.get()); | 459 ContextProvider::ScopedContextLock context_lock(context_provider.get()); |
| 657 DecodedDrawImage decoded_draw_image = | 460 DecodedDrawImage decoded_draw_image = |
| 658 controller.GetDecodedImageForDraw(draw_image); | 461 controller.GetDecodedImageForDraw(draw_image); |
| 659 EXPECT_TRUE(decoded_draw_image.image()); | 462 EXPECT_TRUE(decoded_draw_image.image()); |
| 660 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); | 463 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); |
| 661 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode()); | 464 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode()); |
| 662 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); | 465 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); |
| 663 | 466 |
| 664 controller.DrawWithImageFinished(draw_image, decoded_draw_image); | 467 controller.DrawWithImageFinished(draw_image, decoded_draw_image); |
| 665 } | 468 } |
| 666 | 469 |
| 667 TEST(GpuImageDecodeControllerTest, GetDecodedImageForDrawLargerScale) { | 470 TEST(GpuImageDecodeControllerTest, AtRasterUsedDirectlyIfSpaceAllows) { |
| 668 auto context_provider = TestContextProvider::Create(); | 471 auto context_provider = TestContextProvider::Create(); |
| 669 context_provider->BindToCurrentThread(); | 472 context_provider->BindToCurrentThread(); |
| 670 TestGpuImageDecodeController controller(context_provider.get()); | 473 TestGpuImageDecodeController controller(context_provider.get()); |
| 671 bool is_decomposable = true; | 474 bool is_decomposable = true; |
| 672 SkFilterQuality quality = kHigh_SkFilterQuality; | 475 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 673 | 476 |
| 477 controller.SetCachedItemLimitForTesting(0); |
| 478 controller.SetCachedBytesLimitForTesting(0); |
| 479 |
| 674 sk_sp<SkImage> image = CreateImage(100, 100); | 480 sk_sp<SkImage> image = CreateImage(100, 100); |
| 675 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 481 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
| 676 quality, | 482 quality, |
| 677 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | 483 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| 484 |
| 678 scoped_refptr<TileTask> task; | 485 scoped_refptr<TileTask> task; |
| 679 bool need_unref = controller.GetTaskForImageAndRef( | 486 bool need_unref = controller.GetTaskForImageAndRef( |
| 680 draw_image, ImageDecodeController::TracingInfo(), &task); | 487 draw_image, ImageDecodeController::TracingInfo(), &task); |
| 681 EXPECT_TRUE(need_unref); | 488 EXPECT_FALSE(need_unref); |
| 682 EXPECT_TRUE(task); | 489 EXPECT_FALSE(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 | 490 |
| 699 // Must hold context lock before calling GetDecodedImageForDraw / | 491 // Must hold context lock before calling GetDecodedImageForDraw / |
| 700 // DrawWithImageFinished. | 492 // DrawWithImageFinished. |
| 701 ContextProvider::ScopedContextLock context_lock(context_provider.get()); | 493 ContextProvider::ScopedContextLock context_lock(context_provider.get()); |
| 702 DecodedDrawImage decoded_draw_image = | 494 DecodedDrawImage decoded_draw_image = |
| 703 controller.GetDecodedImageForDraw(draw_image); | 495 controller.GetDecodedImageForDraw(draw_image); |
| 704 EXPECT_TRUE(decoded_draw_image.image()); | 496 EXPECT_TRUE(decoded_draw_image.image()); |
| 705 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); | 497 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); |
| 706 EXPECT_FALSE(decoded_draw_image.is_at_raster_decode()); | 498 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode()); |
| 707 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); | 499 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); |
| 708 | 500 |
| 709 DecodedDrawImage larger_decoded_draw_image = | 501 controller.SetCachedItemLimitForTesting(1000); |
| 710 controller.GetDecodedImageForDraw(larger_draw_image); | 502 controller.SetCachedBytesLimitForTesting(96 * 1024 * 1024); |
| 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 | 503 |
| 716 EXPECT_FALSE(decoded_draw_image.image() == larger_decoded_draw_image.image()); | 504 // Finish our draw after increasing the memory limit, image should be added to |
| 505 // cache. |
| 506 controller.DrawWithImageFinished(draw_image, decoded_draw_image); |
| 717 | 507 |
| 718 controller.DrawWithImageFinished(draw_image, decoded_draw_image); | 508 scoped_refptr<TileTask> another_task; |
| 509 bool another_task_needs_unref = controller.GetTaskForImageAndRef( |
| 510 draw_image, ImageDecodeController::TracingInfo(), &task); |
| 511 EXPECT_TRUE(another_task_needs_unref); |
| 512 EXPECT_FALSE(another_task); |
| 719 controller.UnrefImage(draw_image); | 513 controller.UnrefImage(draw_image); |
| 720 controller.DrawWithImageFinished(larger_draw_image, | |
| 721 larger_decoded_draw_image); | |
| 722 controller.UnrefImage(larger_draw_image); | |
| 723 } | 514 } |
| 724 | 515 |
| 725 TEST(GpuImageDecodeControllerTest, GetDecodedImageForDrawHigherQuality) { | 516 TEST(GpuImageDecodeControllerTest, |
| 517 GetDecodedImageForDrawAtRasterDecodeMultipleTimes) { |
| 726 auto context_provider = TestContextProvider::Create(); | 518 auto context_provider = TestContextProvider::Create(); |
| 727 context_provider->BindToCurrentThread(); | 519 context_provider->BindToCurrentThread(); |
| 728 TestGpuImageDecodeController controller(context_provider.get()); | 520 TestGpuImageDecodeController controller(context_provider.get()); |
| 729 bool is_decomposable = true; | 521 bool is_decomposable = true; |
| 730 SkMatrix matrix = CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable); | 522 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 523 |
| 524 controller.SetCachedItemLimitForTesting(0); |
| 525 controller.SetCachedBytesLimitForTesting(0); |
| 731 | 526 |
| 732 sk_sp<SkImage> image = CreateImage(100, 100); | 527 sk_sp<SkImage> image = CreateImage(100, 100); |
| 733 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 528 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
| 734 kLow_SkFilterQuality, matrix); | 529 quality, |
| 735 scoped_refptr<TileTask> task; | 530 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| 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 | 531 |
| 757 // Must hold context lock before calling GetDecodedImageForDraw / | 532 // Must hold context lock before calling GetDecodedImageForDraw / |
| 758 // DrawWithImageFinished. | 533 // DrawWithImageFinished. |
| 759 ContextProvider::ScopedContextLock context_lock(context_provider.get()); | 534 ContextProvider::ScopedContextLock context_lock(context_provider.get()); |
| 760 DecodedDrawImage decoded_draw_image = | 535 DecodedDrawImage decoded_draw_image = |
| 761 controller.GetDecodedImageForDraw(draw_image); | 536 controller.GetDecodedImageForDraw(draw_image); |
| 762 EXPECT_TRUE(decoded_draw_image.image()); | 537 EXPECT_TRUE(decoded_draw_image.image()); |
| 763 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); | 538 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 | |
| 783 TEST(GpuImageDecodeControllerTest, GetDecodedImageForDrawNegative) { | |
| 784 auto context_provider = TestContextProvider::Create(); | |
| 785 context_provider->BindToCurrentThread(); | |
| 786 TestGpuImageDecodeController controller(context_provider.get()); | |
| 787 bool is_decomposable = true; | |
| 788 SkFilterQuality quality = kHigh_SkFilterQuality; | |
| 789 | |
| 790 sk_sp<SkImage> image = CreateImage(100, 100); | |
| 791 DrawImage draw_image( | |
| 792 image, SkIRect::MakeWH(image->width(), image->height()), quality, | |
| 793 CreateMatrix(SkSize::Make(-0.5f, 0.5f), is_decomposable)); | |
| 794 scoped_refptr<TileTask> task; | |
| 795 bool need_unref = controller.GetTaskForImageAndRef( | |
| 796 draw_image, ImageDecodeController::TracingInfo(), &task); | |
| 797 EXPECT_TRUE(need_unref); | |
| 798 EXPECT_TRUE(task); | |
| 799 | |
| 800 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); | |
| 801 TestTileTaskRunner::ProcessTask(task.get()); | |
| 802 | |
| 803 // Must hold context lock before calling GetDecodedImageForDraw / | |
| 804 // DrawWithImageFinished. | |
| 805 ContextProvider::ScopedContextLock context_lock(context_provider.get()); | |
| 806 DecodedDrawImage decoded_draw_image = | |
| 807 controller.GetDecodedImageForDraw(draw_image); | |
| 808 EXPECT_TRUE(decoded_draw_image.image()); | |
| 809 EXPECT_EQ(decoded_draw_image.image()->width(), 50); | |
| 810 EXPECT_EQ(decoded_draw_image.image()->height(), 50); | |
| 811 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); | |
| 812 EXPECT_FALSE(decoded_draw_image.is_at_raster_decode()); | |
| 813 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); | |
| 814 | |
| 815 controller.DrawWithImageFinished(draw_image, decoded_draw_image); | |
| 816 controller.UnrefImage(draw_image); | |
| 817 } | |
| 818 | |
| 819 TEST(GpuImageDecodeControllerTest, GetLargeScaledDecodedImageForDraw) { | |
| 820 auto context_provider = TestContextProvider::Create(); | |
| 821 context_provider->BindToCurrentThread(); | |
| 822 TestGpuImageDecodeController controller(context_provider.get()); | |
| 823 bool is_decomposable = true; | |
| 824 SkFilterQuality quality = kHigh_SkFilterQuality; | |
| 825 | |
| 826 sk_sp<SkImage> image = CreateImage(1, 48000); | |
| 827 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | |
| 828 quality, | |
| 829 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | |
| 830 scoped_refptr<TileTask> task; | |
| 831 bool need_unref = controller.GetTaskForImageAndRef( | |
| 832 draw_image, ImageDecodeController::TracingInfo(), &task); | |
| 833 EXPECT_TRUE(need_unref); | |
| 834 EXPECT_TRUE(task); | |
| 835 | |
| 836 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); | |
| 837 TestTileTaskRunner::ProcessTask(task.get()); | |
| 838 | |
| 839 // Must hold context lock before calling GetDecodedImageForDraw / | |
| 840 // DrawWithImageFinished. | |
| 841 ContextProvider::ScopedContextLock context_lock(context_provider.get()); | |
| 842 DecodedDrawImage decoded_draw_image = | |
| 843 controller.GetDecodedImageForDraw(draw_image); | |
| 844 EXPECT_TRUE(decoded_draw_image.image()); | |
| 845 // The mip level scale should never go below 0 in any dimension. | |
| 846 EXPECT_EQ(1, decoded_draw_image.image()->width()); | |
| 847 EXPECT_EQ(24000, decoded_draw_image.image()->height()); | |
| 848 EXPECT_FALSE(decoded_draw_image.image()->isTextureBacked()); | |
| 849 EXPECT_FALSE(decoded_draw_image.is_at_raster_decode()); | |
| 850 EXPECT_TRUE(controller.DiscardableIsLockedForTesting(draw_image)); | |
| 851 | |
| 852 controller.DrawWithImageFinished(draw_image, decoded_draw_image); | |
| 853 controller.UnrefImage(draw_image); | |
| 854 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); | |
| 855 } | |
| 856 | |
| 857 TEST(GpuImageDecodeControllerTest, AtRasterUsedDirectlyIfSpaceAllows) { | |
| 858 auto context_provider = TestContextProvider::Create(); | |
| 859 context_provider->BindToCurrentThread(); | |
| 860 TestGpuImageDecodeController controller(context_provider.get()); | |
| 861 bool is_decomposable = true; | |
| 862 SkFilterQuality quality = kHigh_SkFilterQuality; | |
| 863 | |
| 864 controller.SetCachedItemLimitForTesting(0); | |
| 865 controller.SetCachedBytesLimitForTesting(0); | |
| 866 | |
| 867 sk_sp<SkImage> image = CreateImage(100, 100); | |
| 868 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | |
| 869 quality, | |
| 870 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | |
| 871 | |
| 872 scoped_refptr<TileTask> task; | |
| 873 bool need_unref = controller.GetTaskForImageAndRef( | |
| 874 draw_image, ImageDecodeController::TracingInfo(), &task); | |
| 875 EXPECT_FALSE(need_unref); | |
| 876 EXPECT_FALSE(task); | |
| 877 | |
| 878 // Must hold context lock before calling GetDecodedImageForDraw / | |
| 879 // DrawWithImageFinished. | |
| 880 ContextProvider::ScopedContextLock context_lock(context_provider.get()); | |
| 881 DecodedDrawImage decoded_draw_image = | |
| 882 controller.GetDecodedImageForDraw(draw_image); | |
| 883 EXPECT_TRUE(decoded_draw_image.image()); | |
| 884 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); | |
| 885 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode()); | |
| 886 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); | |
| 887 | |
| 888 controller.SetCachedItemLimitForTesting(1000); | |
| 889 controller.SetCachedBytesLimitForTesting(96 * 1024 * 1024); | |
| 890 | |
| 891 // Finish our draw after increasing the memory limit, image should be added to | |
| 892 // cache. | |
| 893 controller.DrawWithImageFinished(draw_image, decoded_draw_image); | |
| 894 | |
| 895 scoped_refptr<TileTask> another_task; | |
| 896 bool another_task_needs_unref = controller.GetTaskForImageAndRef( | |
| 897 draw_image, ImageDecodeController::TracingInfo(), &task); | |
| 898 EXPECT_TRUE(another_task_needs_unref); | |
| 899 EXPECT_FALSE(another_task); | |
| 900 controller.UnrefImage(draw_image); | |
| 901 } | |
| 902 | |
| 903 TEST(GpuImageDecodeControllerTest, | |
| 904 GetDecodedImageForDrawAtRasterDecodeMultipleTimes) { | |
| 905 auto context_provider = TestContextProvider::Create(); | |
| 906 context_provider->BindToCurrentThread(); | |
| 907 TestGpuImageDecodeController controller(context_provider.get()); | |
| 908 bool is_decomposable = true; | |
| 909 SkFilterQuality quality = kHigh_SkFilterQuality; | |
| 910 | |
| 911 controller.SetCachedItemLimitForTesting(0); | |
| 912 controller.SetCachedBytesLimitForTesting(0); | |
| 913 | |
| 914 sk_sp<SkImage> image = CreateImage(100, 100); | |
| 915 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | |
| 916 quality, | |
| 917 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | |
| 918 | |
| 919 // Must hold context lock before calling GetDecodedImageForDraw / | |
| 920 // DrawWithImageFinished. | |
| 921 ContextProvider::ScopedContextLock context_lock(context_provider.get()); | |
| 922 DecodedDrawImage decoded_draw_image = | |
| 923 controller.GetDecodedImageForDraw(draw_image); | |
| 924 EXPECT_TRUE(decoded_draw_image.image()); | |
| 925 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); | |
| 926 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode()); | 539 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode()); |
| 927 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); | 540 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); |
| 928 | 541 |
| 929 DecodedDrawImage another_decoded_draw_image = | 542 DecodedDrawImage another_decoded_draw_image = |
| 930 controller.GetDecodedImageForDraw(draw_image); | 543 controller.GetDecodedImageForDraw(draw_image); |
| 931 EXPECT_EQ(decoded_draw_image.image()->uniqueID(), | 544 EXPECT_EQ(decoded_draw_image.image()->uniqueID(), |
| 932 another_decoded_draw_image.image()->uniqueID()); | 545 another_decoded_draw_image.image()->uniqueID()); |
| 933 | 546 |
| 934 controller.DrawWithImageFinished(draw_image, decoded_draw_image); | 547 controller.DrawWithImageFinished(draw_image, decoded_draw_image); |
| 935 controller.DrawWithImageFinished(draw_image, another_decoded_draw_image); | 548 controller.DrawWithImageFinished(draw_image, another_decoded_draw_image); |
| 936 } | 549 } |
| 937 | 550 |
| 938 TEST(GpuImageDecodeControllerTest, | 551 TEST(GpuImageDecodeControllerTest, |
| 939 GetLargeDecodedImageForDrawAtRasterDecodeMultipleTimes) { | 552 GetLargeDecodedImageForDrawAtRasterDecodeMultipleTimes) { |
| 940 auto context_provider = TestContextProvider::Create(); | 553 auto context_provider = TestContextProvider::Create(); |
| 941 context_provider->BindToCurrentThread(); | 554 context_provider->BindToCurrentThread(); |
| 942 TestGpuImageDecodeController controller(context_provider.get()); | 555 TestGpuImageDecodeController controller(context_provider.get()); |
| 943 bool is_decomposable = true; | 556 bool is_decomposable = true; |
| 944 SkFilterQuality quality = kHigh_SkFilterQuality; | 557 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 945 | 558 |
| 946 sk_sp<SkImage> image = CreateImage(1, 24000); | 559 sk_sp<SkImage> image = CreateImage(1, 24000); |
| 947 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 560 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
| 948 quality, | 561 quality, |
| 949 CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); | 562 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| 950 | 563 |
| 951 // Must hold context lock before calling GetDecodedImageForDraw / | 564 // Must hold context lock before calling GetDecodedImageForDraw / |
| 952 // DrawWithImageFinished. | 565 // DrawWithImageFinished. |
| 953 ContextProvider::ScopedContextLock context_lock(context_provider.get()); | 566 ContextProvider::ScopedContextLock context_lock(context_provider.get()); |
| 954 DecodedDrawImage decoded_draw_image = | 567 DecodedDrawImage decoded_draw_image = |
| 955 controller.GetDecodedImageForDraw(draw_image); | 568 controller.GetDecodedImageForDraw(draw_image); |
| 956 EXPECT_TRUE(decoded_draw_image.image()); | 569 EXPECT_TRUE(decoded_draw_image.image()); |
| 957 EXPECT_FALSE(decoded_draw_image.image()->isTextureBacked()); | 570 EXPECT_FALSE(decoded_draw_image.image()->isTextureBacked()); |
| 958 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode()); | 571 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode()); |
| 959 EXPECT_TRUE(controller.DiscardableIsLockedForTesting(draw_image)); | 572 EXPECT_TRUE(controller.DiscardableIsLockedForTesting(draw_image)); |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1106 } | 719 } |
| 1107 | 720 |
| 1108 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); | 721 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); |
| 1109 TestTileTaskRunner::ProcessTask(task.get()); | 722 TestTileTaskRunner::ProcessTask(task.get()); |
| 1110 | 723 |
| 1111 // The image should be in our cache after un-ref. | 724 // The image should be in our cache after un-ref. |
| 1112 controller.UnrefImage(draw_image); | 725 controller.UnrefImage(draw_image); |
| 1113 DCHECK_GT(controller.GetBytesUsedForTesting(), 0u); | 726 DCHECK_GT(controller.GetBytesUsedForTesting(), 0u); |
| 1114 } | 727 } |
| 1115 | 728 |
| 1116 TEST(GpuImageDecodeControllerTest, OrphanedImagesFreeOnReachingZeroRefs) { | |
| 1117 auto context_provider = TestContextProvider::Create(); | |
| 1118 context_provider->BindToCurrentThread(); | |
| 1119 TestGpuImageDecodeController controller(context_provider.get()); | |
| 1120 bool is_decomposable = true; | |
| 1121 SkFilterQuality quality = kHigh_SkFilterQuality; | |
| 1122 | |
| 1123 // Create a downscaled image. | |
| 1124 sk_sp<SkImage> first_image = CreateImage(100, 100); | |
| 1125 DrawImage first_draw_image( | |
| 1126 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), | |
| 1127 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | |
| 1128 scoped_refptr<TileTask> first_task; | |
| 1129 bool need_unref = controller.GetTaskForImageAndRef( | |
| 1130 first_draw_image, ImageDecodeController::TracingInfo(), &first_task); | |
| 1131 EXPECT_TRUE(need_unref); | |
| 1132 EXPECT_TRUE(first_task); | |
| 1133 | |
| 1134 // The budget should account for exactly one image. | |
| 1135 EXPECT_EQ(controller.GetBytesUsedForTesting(), | |
| 1136 controller.GetDrawImageSizeForTesting(first_draw_image)); | |
| 1137 | |
| 1138 // Create a larger version of |first_image|, this should immediately free the | |
| 1139 // memory used by |first_image| for the smaller scale. | |
| 1140 DrawImage second_draw_image( | |
| 1141 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), | |
| 1142 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); | |
| 1143 scoped_refptr<TileTask> second_task; | |
| 1144 need_unref = controller.GetTaskForImageAndRef( | |
| 1145 second_draw_image, ImageDecodeController::TracingInfo(), &second_task); | |
| 1146 EXPECT_TRUE(need_unref); | |
| 1147 EXPECT_TRUE(second_task); | |
| 1148 EXPECT_TRUE(first_task.get() != second_task.get()); | |
| 1149 | |
| 1150 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); | |
| 1151 TestTileTaskRunner::ProcessTask(second_task.get()); | |
| 1152 | |
| 1153 controller.UnrefImage(second_draw_image); | |
| 1154 | |
| 1155 // The budget should account for both images one image. | |
| 1156 EXPECT_EQ(controller.GetBytesUsedForTesting(), | |
| 1157 controller.GetDrawImageSizeForTesting(second_draw_image) + | |
| 1158 controller.GetDrawImageSizeForTesting(first_draw_image)); | |
| 1159 | |
| 1160 // Unref the first image, it was orphaned, so it should be immediately | |
| 1161 // deleted. | |
| 1162 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get()); | |
| 1163 TestTileTaskRunner::ProcessTask(first_task.get()); | |
| 1164 controller.UnrefImage(first_draw_image); | |
| 1165 | |
| 1166 // The budget should account for exactly one image. | |
| 1167 EXPECT_EQ(controller.GetBytesUsedForTesting(), | |
| 1168 controller.GetDrawImageSizeForTesting(second_draw_image)); | |
| 1169 } | |
| 1170 | |
| 1171 TEST(GpuImageDecodeControllerTest, OrphanedZeroRefImagesImmediatelyDeleted) { | |
| 1172 auto context_provider = TestContextProvider::Create(); | |
| 1173 context_provider->BindToCurrentThread(); | |
| 1174 TestGpuImageDecodeController controller(context_provider.get()); | |
| 1175 bool is_decomposable = true; | |
| 1176 SkFilterQuality quality = kHigh_SkFilterQuality; | |
| 1177 | |
| 1178 // Create a downscaled image. | |
| 1179 sk_sp<SkImage> first_image = CreateImage(100, 100); | |
| 1180 DrawImage first_draw_image( | |
| 1181 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), | |
| 1182 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | |
| 1183 scoped_refptr<TileTask> first_task; | |
| 1184 bool need_unref = controller.GetTaskForImageAndRef( | |
| 1185 first_draw_image, ImageDecodeController::TracingInfo(), &first_task); | |
| 1186 EXPECT_TRUE(need_unref); | |
| 1187 EXPECT_TRUE(first_task); | |
| 1188 | |
| 1189 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get()); | |
| 1190 TestTileTaskRunner::ProcessTask(first_task.get()); | |
| 1191 controller.UnrefImage(first_draw_image); | |
| 1192 | |
| 1193 // The budget should account for exactly one image. | |
| 1194 EXPECT_EQ(controller.GetBytesUsedForTesting(), | |
| 1195 controller.GetDrawImageSizeForTesting(first_draw_image)); | |
| 1196 | |
| 1197 // Create a larger version of |first_image|, this should immediately free the | |
| 1198 // memory used by |first_image| for the smaller scale. | |
| 1199 DrawImage second_draw_image( | |
| 1200 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), | |
| 1201 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); | |
| 1202 scoped_refptr<TileTask> second_task; | |
| 1203 need_unref = controller.GetTaskForImageAndRef( | |
| 1204 second_draw_image, ImageDecodeController::TracingInfo(), &second_task); | |
| 1205 EXPECT_TRUE(need_unref); | |
| 1206 EXPECT_TRUE(second_task); | |
| 1207 EXPECT_TRUE(first_task.get() != second_task.get()); | |
| 1208 | |
| 1209 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); | |
| 1210 TestTileTaskRunner::ProcessTask(second_task.get()); | |
| 1211 | |
| 1212 controller.UnrefImage(second_draw_image); | |
| 1213 | |
| 1214 // The budget should account for exactly one image. | |
| 1215 EXPECT_EQ(controller.GetBytesUsedForTesting(), | |
| 1216 controller.GetDrawImageSizeForTesting(second_draw_image)); | |
| 1217 } | |
| 1218 | |
| 1219 TEST(GpuImageDecodeControllerTest, QualityCappedAtMedium) { | |
| 1220 auto context_provider = TestContextProvider::Create(); | |
| 1221 context_provider->BindToCurrentThread(); | |
| 1222 TestGpuImageDecodeController controller(context_provider.get()); | |
| 1223 sk_sp<SkImage> image = CreateImage(100, 100); | |
| 1224 bool is_decomposable = true; | |
| 1225 SkMatrix matrix = CreateMatrix(SkSize::Make(0.4f, 0.4f), is_decomposable); | |
| 1226 | |
| 1227 // Create an image with kLow_FilterQuality. | |
| 1228 DrawImage low_draw_image(image, | |
| 1229 SkIRect::MakeWH(image->width(), image->height()), | |
| 1230 kLow_SkFilterQuality, matrix); | |
| 1231 scoped_refptr<TileTask> low_task; | |
| 1232 bool need_unref = controller.GetTaskForImageAndRef( | |
| 1233 low_draw_image, ImageDecodeController::TracingInfo(), &low_task); | |
| 1234 EXPECT_TRUE(need_unref); | |
| 1235 EXPECT_TRUE(low_task); | |
| 1236 | |
| 1237 // Get the same image at kMedium_FilterQuality. We can't re-use low, so we | |
| 1238 // should get a new task/ref. | |
| 1239 DrawImage medium_draw_image(image, | |
| 1240 SkIRect::MakeWH(image->width(), image->height()), | |
| 1241 kMedium_SkFilterQuality, matrix); | |
| 1242 scoped_refptr<TileTask> medium_task; | |
| 1243 need_unref = controller.GetTaskForImageAndRef( | |
| 1244 medium_draw_image, ImageDecodeController::TracingInfo(), &medium_task); | |
| 1245 EXPECT_TRUE(need_unref); | |
| 1246 EXPECT_TRUE(medium_task.get()); | |
| 1247 EXPECT_FALSE(low_task.get() == medium_task.get()); | |
| 1248 | |
| 1249 // Get the same image at kHigh_FilterQuality. We should re-use medium. | |
| 1250 DrawImage large_draw_image(image, | |
| 1251 SkIRect::MakeWH(image->width(), image->height()), | |
| 1252 kHigh_SkFilterQuality, matrix); | |
| 1253 scoped_refptr<TileTask> large_task; | |
| 1254 need_unref = controller.GetTaskForImageAndRef( | |
| 1255 large_draw_image, ImageDecodeController::TracingInfo(), &large_task); | |
| 1256 EXPECT_TRUE(need_unref); | |
| 1257 EXPECT_TRUE(medium_task.get() == large_task.get()); | |
| 1258 | |
| 1259 TestTileTaskRunner::ProcessTask(low_task->dependencies()[0].get()); | |
| 1260 TestTileTaskRunner::ProcessTask(low_task.get()); | |
| 1261 TestTileTaskRunner::ProcessTask(medium_task->dependencies()[0].get()); | |
| 1262 TestTileTaskRunner::ProcessTask(medium_task.get()); | |
| 1263 | |
| 1264 controller.UnrefImage(low_draw_image); | |
| 1265 controller.UnrefImage(medium_draw_image); | |
| 1266 controller.UnrefImage(large_draw_image); | |
| 1267 } | |
| 1268 | |
| 1269 } // namespace | 729 } // namespace |
| 1270 } // namespace cc | 730 } // namespace cc |
| OLD | NEW |