| 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/raster/tile_task.h" | 8 #include "cc/raster/tile_task.h" |
| 9 #include "cc/test/test_context_provider.h" | 9 #include "cc/test/test_context_provider.h" |
| 10 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
| 11 #include "third_party/skia/include/core/SkRefCnt.h" | 11 #include "third_party/skia/include/core/SkRefCnt.h" |
| 12 | 12 |
| 13 namespace cc { | 13 namespace cc { |
| 14 namespace { | 14 namespace { |
| 15 | 15 |
| 16 size_t kGpuMemoryLimitBytes = 96 * 1024 * 1024; |
| 17 class TestGpuImageDecodeController : public GpuImageDecodeController { |
| 18 public: |
| 19 explicit TestGpuImageDecodeController(ContextProvider* context) |
| 20 : GpuImageDecodeController(context, |
| 21 ResourceFormat::RGBA_8888, |
| 22 kGpuMemoryLimitBytes) {} |
| 23 }; |
| 24 |
| 16 sk_sp<SkImage> CreateImage(int width, int height) { | 25 sk_sp<SkImage> CreateImage(int width, int height) { |
| 17 SkBitmap bitmap; | 26 SkBitmap bitmap; |
| 18 bitmap.allocPixels(SkImageInfo::MakeN32Premul(width, height)); | 27 bitmap.allocPixels(SkImageInfo::MakeN32Premul(width, height)); |
| 19 return SkImage::MakeFromBitmap(bitmap); | 28 return SkImage::MakeFromBitmap(bitmap); |
| 20 } | 29 } |
| 21 | 30 |
| 22 SkMatrix CreateMatrix(const SkSize& scale, bool is_decomposable) { | 31 SkMatrix CreateMatrix(const SkSize& scale, bool is_decomposable) { |
| 23 SkMatrix matrix; | 32 SkMatrix matrix; |
| 24 matrix.setScale(scale.width(), scale.height()); | 33 matrix.setScale(scale.width(), scale.height()); |
| 25 | 34 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 55 | 64 |
| 56 void ProcessTask(TileTask* task) { | 65 void ProcessTask(TileTask* task) { |
| 57 ScheduleTask(task); | 66 ScheduleTask(task); |
| 58 RunTask(task); | 67 RunTask(task); |
| 59 CompleteTask(task); | 68 CompleteTask(task); |
| 60 } | 69 } |
| 61 | 70 |
| 62 TEST(GpuImageDecodeControllerTest, GetTaskForImageSameImage) { | 71 TEST(GpuImageDecodeControllerTest, GetTaskForImageSameImage) { |
| 63 auto context_provider = TestContextProvider::Create(); | 72 auto context_provider = TestContextProvider::Create(); |
| 64 context_provider->BindToCurrentThread(); | 73 context_provider->BindToCurrentThread(); |
| 65 GpuImageDecodeController controller(context_provider.get(), | 74 TestGpuImageDecodeController controller(context_provider.get()); |
| 66 ResourceFormat::RGBA_8888); | |
| 67 sk_sp<SkImage> image = CreateImage(100, 100); | 75 sk_sp<SkImage> image = CreateImage(100, 100); |
| 68 bool is_decomposable = true; | 76 bool is_decomposable = true; |
| 69 SkFilterQuality quality = kHigh_SkFilterQuality; | 77 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 70 | 78 |
| 71 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 79 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
| 72 quality, | 80 quality, |
| 73 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | 81 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| 74 scoped_refptr<TileTask> task; | 82 scoped_refptr<TileTask> task; |
| 75 bool need_unref = controller.GetTaskForImageAndRef( | 83 bool need_unref = controller.GetTaskForImageAndRef( |
| 76 draw_image, ImageDecodeController::TracingInfo(), &task); | 84 draw_image, ImageDecodeController::TracingInfo(), &task); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 89 ProcessTask(task->dependencies()[0].get()); | 97 ProcessTask(task->dependencies()[0].get()); |
| 90 ProcessTask(task.get()); | 98 ProcessTask(task.get()); |
| 91 | 99 |
| 92 controller.UnrefImage(draw_image); | 100 controller.UnrefImage(draw_image); |
| 93 controller.UnrefImage(draw_image); | 101 controller.UnrefImage(draw_image); |
| 94 } | 102 } |
| 95 | 103 |
| 96 TEST(GpuImageDecodeControllerTest, GetTaskForImageDifferentImage) { | 104 TEST(GpuImageDecodeControllerTest, GetTaskForImageDifferentImage) { |
| 97 auto context_provider = TestContextProvider::Create(); | 105 auto context_provider = TestContextProvider::Create(); |
| 98 context_provider->BindToCurrentThread(); | 106 context_provider->BindToCurrentThread(); |
| 99 GpuImageDecodeController controller(context_provider.get(), | 107 TestGpuImageDecodeController controller(context_provider.get()); |
| 100 ResourceFormat::RGBA_8888); | |
| 101 bool is_decomposable = true; | 108 bool is_decomposable = true; |
| 102 SkFilterQuality quality = kHigh_SkFilterQuality; | 109 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 103 | 110 |
| 104 sk_sp<SkImage> first_image = CreateImage(100, 100); | 111 sk_sp<SkImage> first_image = CreateImage(100, 100); |
| 105 DrawImage first_draw_image( | 112 DrawImage first_draw_image( |
| 106 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), | 113 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), |
| 107 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | 114 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| 108 scoped_refptr<TileTask> first_task; | 115 scoped_refptr<TileTask> first_task; |
| 109 bool need_unref = controller.GetTaskForImageAndRef( | 116 bool need_unref = controller.GetTaskForImageAndRef( |
| 110 first_draw_image, ImageDecodeController::TracingInfo(), &first_task); | 117 first_draw_image, ImageDecodeController::TracingInfo(), &first_task); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 128 ProcessTask(second_task->dependencies()[0].get()); | 135 ProcessTask(second_task->dependencies()[0].get()); |
| 129 ProcessTask(second_task.get()); | 136 ProcessTask(second_task.get()); |
| 130 | 137 |
| 131 controller.UnrefImage(first_draw_image); | 138 controller.UnrefImage(first_draw_image); |
| 132 controller.UnrefImage(second_draw_image); | 139 controller.UnrefImage(second_draw_image); |
| 133 } | 140 } |
| 134 | 141 |
| 135 TEST(GpuImageDecodeControllerTest, GetTaskForImageAlreadyDecodedAndLocked) { | 142 TEST(GpuImageDecodeControllerTest, GetTaskForImageAlreadyDecodedAndLocked) { |
| 136 auto context_provider = TestContextProvider::Create(); | 143 auto context_provider = TestContextProvider::Create(); |
| 137 context_provider->BindToCurrentThread(); | 144 context_provider->BindToCurrentThread(); |
| 138 GpuImageDecodeController controller(context_provider.get(), | 145 TestGpuImageDecodeController controller(context_provider.get()); |
| 139 ResourceFormat::RGBA_8888); | |
| 140 bool is_decomposable = true; | 146 bool is_decomposable = true; |
| 141 SkFilterQuality quality = kHigh_SkFilterQuality; | 147 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 142 | 148 |
| 143 sk_sp<SkImage> image = CreateImage(100, 100); | 149 sk_sp<SkImage> image = CreateImage(100, 100); |
| 144 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 150 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
| 145 quality, | 151 quality, |
| 146 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | 152 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| 147 scoped_refptr<TileTask> task; | 153 scoped_refptr<TileTask> task; |
| 148 bool need_unref = controller.GetTaskForImageAndRef( | 154 bool need_unref = controller.GetTaskForImageAndRef( |
| 149 draw_image, ImageDecodeController::TracingInfo(), &task); | 155 draw_image, ImageDecodeController::TracingInfo(), &task); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 174 // Finally, complete the original decode task. | 180 // Finally, complete the original decode task. |
| 175 CompleteTask(task->dependencies()[0].get()); | 181 CompleteTask(task->dependencies()[0].get()); |
| 176 | 182 |
| 177 controller.UnrefImage(draw_image); | 183 controller.UnrefImage(draw_image); |
| 178 controller.UnrefImage(draw_image); | 184 controller.UnrefImage(draw_image); |
| 179 } | 185 } |
| 180 | 186 |
| 181 TEST(GpuImageDecodeControllerTest, GetTaskForImageAlreadyDecodedNotLocked) { | 187 TEST(GpuImageDecodeControllerTest, GetTaskForImageAlreadyDecodedNotLocked) { |
| 182 auto context_provider = TestContextProvider::Create(); | 188 auto context_provider = TestContextProvider::Create(); |
| 183 context_provider->BindToCurrentThread(); | 189 context_provider->BindToCurrentThread(); |
| 184 GpuImageDecodeController controller(context_provider.get(), | 190 TestGpuImageDecodeController controller(context_provider.get()); |
| 185 ResourceFormat::RGBA_8888); | |
| 186 bool is_decomposable = true; | 191 bool is_decomposable = true; |
| 187 SkFilterQuality quality = kHigh_SkFilterQuality; | 192 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 188 | 193 |
| 189 sk_sp<SkImage> image = CreateImage(100, 100); | 194 sk_sp<SkImage> image = CreateImage(100, 100); |
| 190 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 195 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
| 191 quality, | 196 quality, |
| 192 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | 197 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| 193 scoped_refptr<TileTask> task; | 198 scoped_refptr<TileTask> task; |
| 194 bool need_unref = controller.GetTaskForImageAndRef( | 199 bool need_unref = controller.GetTaskForImageAndRef( |
| 195 draw_image, ImageDecodeController::TracingInfo(), &task); | 200 draw_image, ImageDecodeController::TracingInfo(), &task); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 220 | 225 |
| 221 ProcessTask(another_task->dependencies()[0].get()); | 226 ProcessTask(another_task->dependencies()[0].get()); |
| 222 ProcessTask(another_task.get()); | 227 ProcessTask(another_task.get()); |
| 223 | 228 |
| 224 controller.UnrefImage(draw_image); | 229 controller.UnrefImage(draw_image); |
| 225 } | 230 } |
| 226 | 231 |
| 227 TEST(GpuImageDecodeControllerTest, GetTaskForImageAlreadyUploaded) { | 232 TEST(GpuImageDecodeControllerTest, GetTaskForImageAlreadyUploaded) { |
| 228 auto context_provider = TestContextProvider::Create(); | 233 auto context_provider = TestContextProvider::Create(); |
| 229 context_provider->BindToCurrentThread(); | 234 context_provider->BindToCurrentThread(); |
| 230 GpuImageDecodeController controller(context_provider.get(), | 235 TestGpuImageDecodeController controller(context_provider.get()); |
| 231 ResourceFormat::RGBA_8888); | |
| 232 bool is_decomposable = true; | 236 bool is_decomposable = true; |
| 233 SkFilterQuality quality = kHigh_SkFilterQuality; | 237 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 234 | 238 |
| 235 sk_sp<SkImage> image = CreateImage(100, 100); | 239 sk_sp<SkImage> image = CreateImage(100, 100); |
| 236 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 240 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
| 237 quality, | 241 quality, |
| 238 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | 242 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| 239 scoped_refptr<TileTask> task; | 243 scoped_refptr<TileTask> task; |
| 240 bool need_unref = controller.GetTaskForImageAndRef( | 244 bool need_unref = controller.GetTaskForImageAndRef( |
| 241 draw_image, ImageDecodeController::TracingInfo(), &task); | 245 draw_image, ImageDecodeController::TracingInfo(), &task); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 256 | 260 |
| 257 CompleteTask(task.get()); | 261 CompleteTask(task.get()); |
| 258 | 262 |
| 259 controller.UnrefImage(draw_image); | 263 controller.UnrefImage(draw_image); |
| 260 controller.UnrefImage(draw_image); | 264 controller.UnrefImage(draw_image); |
| 261 } | 265 } |
| 262 | 266 |
| 263 TEST(GpuImageDecodeControllerTest, GetTaskForImageCanceledGetsNewTask) { | 267 TEST(GpuImageDecodeControllerTest, GetTaskForImageCanceledGetsNewTask) { |
| 264 auto context_provider = TestContextProvider::Create(); | 268 auto context_provider = TestContextProvider::Create(); |
| 265 context_provider->BindToCurrentThread(); | 269 context_provider->BindToCurrentThread(); |
| 266 GpuImageDecodeController controller(context_provider.get(), | 270 TestGpuImageDecodeController controller(context_provider.get()); |
| 267 ResourceFormat::RGBA_8888); | |
| 268 bool is_decomposable = true; | 271 bool is_decomposable = true; |
| 269 SkFilterQuality quality = kHigh_SkFilterQuality; | 272 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 270 | 273 |
| 271 sk_sp<SkImage> image = CreateImage(100, 100); | 274 sk_sp<SkImage> image = CreateImage(100, 100); |
| 272 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 275 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
| 273 quality, | 276 quality, |
| 274 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | 277 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| 275 scoped_refptr<TileTask> task; | 278 scoped_refptr<TileTask> task; |
| 276 bool need_unref = controller.GetTaskForImageAndRef( | 279 bool need_unref = controller.GetTaskForImageAndRef( |
| 277 draw_image, ImageDecodeController::TracingInfo(), &task); | 280 draw_image, ImageDecodeController::TracingInfo(), &task); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 305 ProcessTask(third_task->dependencies()[0].get()); | 308 ProcessTask(third_task->dependencies()[0].get()); |
| 306 ProcessTask(third_task.get()); | 309 ProcessTask(third_task.get()); |
| 307 | 310 |
| 308 controller.UnrefImage(draw_image); | 311 controller.UnrefImage(draw_image); |
| 309 } | 312 } |
| 310 | 313 |
| 311 TEST(GpuImageDecodeControllerTest, | 314 TEST(GpuImageDecodeControllerTest, |
| 312 GetTaskForImageCanceledWhileReffedGetsNewTask) { | 315 GetTaskForImageCanceledWhileReffedGetsNewTask) { |
| 313 auto context_provider = TestContextProvider::Create(); | 316 auto context_provider = TestContextProvider::Create(); |
| 314 context_provider->BindToCurrentThread(); | 317 context_provider->BindToCurrentThread(); |
| 315 GpuImageDecodeController controller(context_provider.get(), | 318 TestGpuImageDecodeController controller(context_provider.get()); |
| 316 ResourceFormat::RGBA_8888); | |
| 317 bool is_decomposable = true; | 319 bool is_decomposable = true; |
| 318 SkFilterQuality quality = kHigh_SkFilterQuality; | 320 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 319 | 321 |
| 320 sk_sp<SkImage> image = CreateImage(100, 100); | 322 sk_sp<SkImage> image = CreateImage(100, 100); |
| 321 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 323 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
| 322 quality, | 324 quality, |
| 323 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | 325 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| 324 scoped_refptr<TileTask> task; | 326 scoped_refptr<TileTask> task; |
| 325 bool need_unref = controller.GetTaskForImageAndRef( | 327 bool need_unref = controller.GetTaskForImageAndRef( |
| 326 draw_image, ImageDecodeController::TracingInfo(), &task); | 328 draw_image, ImageDecodeController::TracingInfo(), &task); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 353 | 355 |
| 354 // 3 Unrefs! | 356 // 3 Unrefs! |
| 355 controller.UnrefImage(draw_image); | 357 controller.UnrefImage(draw_image); |
| 356 controller.UnrefImage(draw_image); | 358 controller.UnrefImage(draw_image); |
| 357 controller.UnrefImage(draw_image); | 359 controller.UnrefImage(draw_image); |
| 358 } | 360 } |
| 359 | 361 |
| 360 TEST(GpuImageDecodeControllerTest, NoTaskForImageAlreadyFailedDecoding) { | 362 TEST(GpuImageDecodeControllerTest, NoTaskForImageAlreadyFailedDecoding) { |
| 361 auto context_provider = TestContextProvider::Create(); | 363 auto context_provider = TestContextProvider::Create(); |
| 362 context_provider->BindToCurrentThread(); | 364 context_provider->BindToCurrentThread(); |
| 363 GpuImageDecodeController controller(context_provider.get(), | 365 TestGpuImageDecodeController controller(context_provider.get()); |
| 364 ResourceFormat::RGBA_8888); | |
| 365 bool is_decomposable = true; | 366 bool is_decomposable = true; |
| 366 SkFilterQuality quality = kHigh_SkFilterQuality; | 367 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 367 | 368 |
| 368 sk_sp<SkImage> image = CreateImage(100, 100); | 369 sk_sp<SkImage> image = CreateImage(100, 100); |
| 369 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 370 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
| 370 quality, | 371 quality, |
| 371 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | 372 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| 372 scoped_refptr<TileTask> task; | 373 scoped_refptr<TileTask> task; |
| 373 bool need_unref = controller.GetTaskForImageAndRef( | 374 bool need_unref = controller.GetTaskForImageAndRef( |
| 374 draw_image, ImageDecodeController::TracingInfo(), &task); | 375 draw_image, ImageDecodeController::TracingInfo(), &task); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 387 draw_image, ImageDecodeController::TracingInfo(), &another_task); | 388 draw_image, ImageDecodeController::TracingInfo(), &another_task); |
| 388 EXPECT_FALSE(need_unref); | 389 EXPECT_FALSE(need_unref); |
| 389 EXPECT_EQ(another_task.get(), nullptr); | 390 EXPECT_EQ(another_task.get(), nullptr); |
| 390 | 391 |
| 391 controller.UnrefImage(draw_image); | 392 controller.UnrefImage(draw_image); |
| 392 } | 393 } |
| 393 | 394 |
| 394 TEST(GpuImageDecodeControllerTest, GetDecodedImageForDraw) { | 395 TEST(GpuImageDecodeControllerTest, GetDecodedImageForDraw) { |
| 395 auto context_provider = TestContextProvider::Create(); | 396 auto context_provider = TestContextProvider::Create(); |
| 396 context_provider->BindToCurrentThread(); | 397 context_provider->BindToCurrentThread(); |
| 397 GpuImageDecodeController controller(context_provider.get(), | 398 TestGpuImageDecodeController controller(context_provider.get()); |
| 398 ResourceFormat::RGBA_8888); | |
| 399 bool is_decomposable = true; | 399 bool is_decomposable = true; |
| 400 SkFilterQuality quality = kHigh_SkFilterQuality; | 400 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 401 | 401 |
| 402 sk_sp<SkImage> image = CreateImage(100, 100); | 402 sk_sp<SkImage> image = CreateImage(100, 100); |
| 403 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 403 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
| 404 quality, | 404 quality, |
| 405 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | 405 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| 406 scoped_refptr<TileTask> task; | 406 scoped_refptr<TileTask> task; |
| 407 bool need_unref = controller.GetTaskForImageAndRef( | 407 bool need_unref = controller.GetTaskForImageAndRef( |
| 408 draw_image, ImageDecodeController::TracingInfo(), &task); | 408 draw_image, ImageDecodeController::TracingInfo(), &task); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 422 EXPECT_FALSE(decoded_draw_image.is_at_raster_decode()); | 422 EXPECT_FALSE(decoded_draw_image.is_at_raster_decode()); |
| 423 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); | 423 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); |
| 424 | 424 |
| 425 controller.DrawWithImageFinished(draw_image, decoded_draw_image); | 425 controller.DrawWithImageFinished(draw_image, decoded_draw_image); |
| 426 controller.UnrefImage(draw_image); | 426 controller.UnrefImage(draw_image); |
| 427 } | 427 } |
| 428 | 428 |
| 429 TEST(GpuImageDecodeControllerTest, GetLargeDecodedImageForDraw) { | 429 TEST(GpuImageDecodeControllerTest, GetLargeDecodedImageForDraw) { |
| 430 auto context_provider = TestContextProvider::Create(); | 430 auto context_provider = TestContextProvider::Create(); |
| 431 context_provider->BindToCurrentThread(); | 431 context_provider->BindToCurrentThread(); |
| 432 GpuImageDecodeController controller(context_provider.get(), | 432 TestGpuImageDecodeController controller(context_provider.get()); |
| 433 ResourceFormat::RGBA_8888); | |
| 434 bool is_decomposable = true; | 433 bool is_decomposable = true; |
| 435 SkFilterQuality quality = kHigh_SkFilterQuality; | 434 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 436 | 435 |
| 437 sk_sp<SkImage> image = CreateImage(1, 24000); | 436 sk_sp<SkImage> image = CreateImage(1, 24000); |
| 438 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 437 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
| 439 quality, | 438 quality, |
| 440 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | 439 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| 441 scoped_refptr<TileTask> task; | 440 scoped_refptr<TileTask> task; |
| 442 bool need_unref = controller.GetTaskForImageAndRef( | 441 bool need_unref = controller.GetTaskForImageAndRef( |
| 443 draw_image, ImageDecodeController::TracingInfo(), &task); | 442 draw_image, ImageDecodeController::TracingInfo(), &task); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 458 EXPECT_TRUE(controller.DiscardableIsLockedForTesting(draw_image)); | 457 EXPECT_TRUE(controller.DiscardableIsLockedForTesting(draw_image)); |
| 459 | 458 |
| 460 controller.DrawWithImageFinished(draw_image, decoded_draw_image); | 459 controller.DrawWithImageFinished(draw_image, decoded_draw_image); |
| 461 controller.UnrefImage(draw_image); | 460 controller.UnrefImage(draw_image); |
| 462 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); | 461 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); |
| 463 } | 462 } |
| 464 | 463 |
| 465 TEST(GpuImageDecodeControllerTest, GetDecodedImageForDrawAtRasterDecode) { | 464 TEST(GpuImageDecodeControllerTest, GetDecodedImageForDrawAtRasterDecode) { |
| 466 auto context_provider = TestContextProvider::Create(); | 465 auto context_provider = TestContextProvider::Create(); |
| 467 context_provider->BindToCurrentThread(); | 466 context_provider->BindToCurrentThread(); |
| 468 GpuImageDecodeController controller(context_provider.get(), | 467 TestGpuImageDecodeController controller(context_provider.get()); |
| 469 ResourceFormat::RGBA_8888); | |
| 470 bool is_decomposable = true; | 468 bool is_decomposable = true; |
| 471 SkFilterQuality quality = kHigh_SkFilterQuality; | 469 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 472 | 470 |
| 473 controller.SetCachedItemLimitForTesting(0); | 471 controller.SetCachedItemLimitForTesting(0); |
| 474 controller.SetCachedBytesLimitForTesting(0); | 472 controller.SetCachedBytesLimitForTesting(0); |
| 475 | 473 |
| 476 sk_sp<SkImage> image = CreateImage(100, 100); | 474 sk_sp<SkImage> image = CreateImage(100, 100); |
| 477 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 475 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
| 478 quality, | 476 quality, |
| 479 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | 477 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 493 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); | 491 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); |
| 494 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode()); | 492 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode()); |
| 495 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); | 493 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); |
| 496 | 494 |
| 497 controller.DrawWithImageFinished(draw_image, decoded_draw_image); | 495 controller.DrawWithImageFinished(draw_image, decoded_draw_image); |
| 498 } | 496 } |
| 499 | 497 |
| 500 TEST(GpuImageDecodeControllerTest, AtRasterUsedDirectlyIfSpaceAllows) { | 498 TEST(GpuImageDecodeControllerTest, AtRasterUsedDirectlyIfSpaceAllows) { |
| 501 auto context_provider = TestContextProvider::Create(); | 499 auto context_provider = TestContextProvider::Create(); |
| 502 context_provider->BindToCurrentThread(); | 500 context_provider->BindToCurrentThread(); |
| 503 GpuImageDecodeController controller(context_provider.get(), | 501 TestGpuImageDecodeController controller(context_provider.get()); |
| 504 ResourceFormat::RGBA_8888); | |
| 505 bool is_decomposable = true; | 502 bool is_decomposable = true; |
| 506 SkFilterQuality quality = kHigh_SkFilterQuality; | 503 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 507 | 504 |
| 508 controller.SetCachedItemLimitForTesting(0); | 505 controller.SetCachedItemLimitForTesting(0); |
| 509 controller.SetCachedBytesLimitForTesting(0); | 506 controller.SetCachedBytesLimitForTesting(0); |
| 510 | 507 |
| 511 sk_sp<SkImage> image = CreateImage(100, 100); | 508 sk_sp<SkImage> image = CreateImage(100, 100); |
| 512 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 509 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
| 513 quality, | 510 quality, |
| 514 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | 511 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 541 draw_image, ImageDecodeController::TracingInfo(), &task); | 538 draw_image, ImageDecodeController::TracingInfo(), &task); |
| 542 EXPECT_TRUE(another_task_needs_unref); | 539 EXPECT_TRUE(another_task_needs_unref); |
| 543 EXPECT_FALSE(another_task); | 540 EXPECT_FALSE(another_task); |
| 544 controller.UnrefImage(draw_image); | 541 controller.UnrefImage(draw_image); |
| 545 } | 542 } |
| 546 | 543 |
| 547 TEST(GpuImageDecodeControllerTest, | 544 TEST(GpuImageDecodeControllerTest, |
| 548 GetDecodedImageForDrawAtRasterDecodeMultipleTimes) { | 545 GetDecodedImageForDrawAtRasterDecodeMultipleTimes) { |
| 549 auto context_provider = TestContextProvider::Create(); | 546 auto context_provider = TestContextProvider::Create(); |
| 550 context_provider->BindToCurrentThread(); | 547 context_provider->BindToCurrentThread(); |
| 551 GpuImageDecodeController controller(context_provider.get(), | 548 TestGpuImageDecodeController controller(context_provider.get()); |
| 552 ResourceFormat::RGBA_8888); | |
| 553 bool is_decomposable = true; | 549 bool is_decomposable = true; |
| 554 SkFilterQuality quality = kHigh_SkFilterQuality; | 550 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 555 | 551 |
| 556 controller.SetCachedItemLimitForTesting(0); | 552 controller.SetCachedItemLimitForTesting(0); |
| 557 controller.SetCachedBytesLimitForTesting(0); | 553 controller.SetCachedBytesLimitForTesting(0); |
| 558 | 554 |
| 559 sk_sp<SkImage> image = CreateImage(100, 100); | 555 sk_sp<SkImage> image = CreateImage(100, 100); |
| 560 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 556 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
| 561 quality, | 557 quality, |
| 562 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | 558 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 577 another_decoded_draw_image.image()->uniqueID()); | 573 another_decoded_draw_image.image()->uniqueID()); |
| 578 | 574 |
| 579 controller.DrawWithImageFinished(draw_image, decoded_draw_image); | 575 controller.DrawWithImageFinished(draw_image, decoded_draw_image); |
| 580 controller.DrawWithImageFinished(draw_image, another_decoded_draw_image); | 576 controller.DrawWithImageFinished(draw_image, another_decoded_draw_image); |
| 581 } | 577 } |
| 582 | 578 |
| 583 TEST(GpuImageDecodeControllerTest, | 579 TEST(GpuImageDecodeControllerTest, |
| 584 GetLargeDecodedImageForDrawAtRasterDecodeMultipleTimes) { | 580 GetLargeDecodedImageForDrawAtRasterDecodeMultipleTimes) { |
| 585 auto context_provider = TestContextProvider::Create(); | 581 auto context_provider = TestContextProvider::Create(); |
| 586 context_provider->BindToCurrentThread(); | 582 context_provider->BindToCurrentThread(); |
| 587 GpuImageDecodeController controller(context_provider.get(), | 583 TestGpuImageDecodeController controller(context_provider.get()); |
| 588 ResourceFormat::RGBA_8888); | |
| 589 bool is_decomposable = true; | 584 bool is_decomposable = true; |
| 590 SkFilterQuality quality = kHigh_SkFilterQuality; | 585 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 591 | 586 |
| 592 sk_sp<SkImage> image = CreateImage(1, 24000); | 587 sk_sp<SkImage> image = CreateImage(1, 24000); |
| 593 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 588 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
| 594 quality, | 589 quality, |
| 595 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | 590 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| 596 | 591 |
| 597 // Must hold context lock before calling GetDecodedImageForDraw / | 592 // Must hold context lock before calling GetDecodedImageForDraw / |
| 598 // DrawWithImageFinished. | 593 // DrawWithImageFinished. |
| (...skipping 15 matching lines...) Expand all Loading... |
| 614 EXPECT_TRUE(second_decoded_draw_image.is_at_raster_decode()); | 609 EXPECT_TRUE(second_decoded_draw_image.is_at_raster_decode()); |
| 615 EXPECT_TRUE(controller.DiscardableIsLockedForTesting(draw_image)); | 610 EXPECT_TRUE(controller.DiscardableIsLockedForTesting(draw_image)); |
| 616 | 611 |
| 617 controller.DrawWithImageFinished(draw_image, second_decoded_draw_image); | 612 controller.DrawWithImageFinished(draw_image, second_decoded_draw_image); |
| 618 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); | 613 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); |
| 619 } | 614 } |
| 620 | 615 |
| 621 TEST(GpuImageDecodeControllerTest, ZeroSizedImagesAreSkipped) { | 616 TEST(GpuImageDecodeControllerTest, ZeroSizedImagesAreSkipped) { |
| 622 auto context_provider = TestContextProvider::Create(); | 617 auto context_provider = TestContextProvider::Create(); |
| 623 context_provider->BindToCurrentThread(); | 618 context_provider->BindToCurrentThread(); |
| 624 GpuImageDecodeController controller(context_provider.get(), | 619 TestGpuImageDecodeController controller(context_provider.get()); |
| 625 ResourceFormat::RGBA_8888); | |
| 626 bool is_decomposable = true; | 620 bool is_decomposable = true; |
| 627 SkFilterQuality quality = kHigh_SkFilterQuality; | 621 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 628 | 622 |
| 629 sk_sp<SkImage> image = CreateImage(100, 100); | 623 sk_sp<SkImage> image = CreateImage(100, 100); |
| 630 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 624 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
| 631 quality, | 625 quality, |
| 632 CreateMatrix(SkSize::Make(0.f, 0.f), is_decomposable)); | 626 CreateMatrix(SkSize::Make(0.f, 0.f), is_decomposable)); |
| 633 | 627 |
| 634 scoped_refptr<TileTask> task; | 628 scoped_refptr<TileTask> task; |
| 635 bool need_unref = controller.GetTaskForImageAndRef( | 629 bool need_unref = controller.GetTaskForImageAndRef( |
| 636 draw_image, ImageDecodeController::TracingInfo(), &task); | 630 draw_image, ImageDecodeController::TracingInfo(), &task); |
| 637 EXPECT_FALSE(task); | 631 EXPECT_FALSE(task); |
| 638 EXPECT_FALSE(need_unref); | 632 EXPECT_FALSE(need_unref); |
| 639 | 633 |
| 640 // Must hold context lock before calling GetDecodedImageForDraw / | 634 // Must hold context lock before calling GetDecodedImageForDraw / |
| 641 // DrawWithImageFinished. | 635 // DrawWithImageFinished. |
| 642 ContextProvider::ScopedContextLock context_lock(context_provider.get()); | 636 ContextProvider::ScopedContextLock context_lock(context_provider.get()); |
| 643 DecodedDrawImage decoded_draw_image = | 637 DecodedDrawImage decoded_draw_image = |
| 644 controller.GetDecodedImageForDraw(draw_image); | 638 controller.GetDecodedImageForDraw(draw_image); |
| 645 EXPECT_FALSE(decoded_draw_image.image()); | 639 EXPECT_FALSE(decoded_draw_image.image()); |
| 646 | 640 |
| 647 controller.DrawWithImageFinished(draw_image, decoded_draw_image); | 641 controller.DrawWithImageFinished(draw_image, decoded_draw_image); |
| 648 } | 642 } |
| 649 | 643 |
| 650 TEST(GpuImageDecodeControllerTest, NonOverlappingSrcRectImagesAreSkipped) { | 644 TEST(GpuImageDecodeControllerTest, NonOverlappingSrcRectImagesAreSkipped) { |
| 651 auto context_provider = TestContextProvider::Create(); | 645 auto context_provider = TestContextProvider::Create(); |
| 652 context_provider->BindToCurrentThread(); | 646 context_provider->BindToCurrentThread(); |
| 653 GpuImageDecodeController controller(context_provider.get(), | 647 TestGpuImageDecodeController controller(context_provider.get()); |
| 654 ResourceFormat::RGBA_8888); | |
| 655 bool is_decomposable = true; | 648 bool is_decomposable = true; |
| 656 SkFilterQuality quality = kHigh_SkFilterQuality; | 649 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 657 | 650 |
| 658 sk_sp<SkImage> image = CreateImage(100, 100); | 651 sk_sp<SkImage> image = CreateImage(100, 100); |
| 659 DrawImage draw_image( | 652 DrawImage draw_image( |
| 660 image, SkIRect::MakeXYWH(150, 150, image->width(), image->height()), | 653 image, SkIRect::MakeXYWH(150, 150, image->width(), image->height()), |
| 661 quality, CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable)); | 654 quality, CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable)); |
| 662 | 655 |
| 663 scoped_refptr<TileTask> task; | 656 scoped_refptr<TileTask> task; |
| 664 bool need_unref = controller.GetTaskForImageAndRef( | 657 bool need_unref = controller.GetTaskForImageAndRef( |
| 665 draw_image, ImageDecodeController::TracingInfo(), &task); | 658 draw_image, ImageDecodeController::TracingInfo(), &task); |
| 666 EXPECT_FALSE(task); | 659 EXPECT_FALSE(task); |
| 667 EXPECT_FALSE(need_unref); | 660 EXPECT_FALSE(need_unref); |
| 668 | 661 |
| 669 // Must hold context lock before calling GetDecodedImageForDraw / | 662 // Must hold context lock before calling GetDecodedImageForDraw / |
| 670 // DrawWithImageFinished. | 663 // DrawWithImageFinished. |
| 671 ContextProvider::ScopedContextLock context_lock(context_provider.get()); | 664 ContextProvider::ScopedContextLock context_lock(context_provider.get()); |
| 672 DecodedDrawImage decoded_draw_image = | 665 DecodedDrawImage decoded_draw_image = |
| 673 controller.GetDecodedImageForDraw(draw_image); | 666 controller.GetDecodedImageForDraw(draw_image); |
| 674 EXPECT_FALSE(decoded_draw_image.image()); | 667 EXPECT_FALSE(decoded_draw_image.image()); |
| 675 | 668 |
| 676 controller.DrawWithImageFinished(draw_image, decoded_draw_image); | 669 controller.DrawWithImageFinished(draw_image, decoded_draw_image); |
| 677 } | 670 } |
| 678 | 671 |
| 679 TEST(GpuImageDecodeControllerTest, CanceledTasksDoNotCountAgainstBudget) { | 672 TEST(GpuImageDecodeControllerTest, CanceledTasksDoNotCountAgainstBudget) { |
| 680 auto context_provider = TestContextProvider::Create(); | 673 auto context_provider = TestContextProvider::Create(); |
| 681 context_provider->BindToCurrentThread(); | 674 context_provider->BindToCurrentThread(); |
| 682 GpuImageDecodeController controller(context_provider.get(), | 675 TestGpuImageDecodeController controller(context_provider.get()); |
| 683 ResourceFormat::RGBA_8888); | |
| 684 bool is_decomposable = true; | 676 bool is_decomposable = true; |
| 685 SkFilterQuality quality = kHigh_SkFilterQuality; | 677 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 686 | 678 |
| 687 sk_sp<SkImage> image = CreateImage(100, 100); | 679 sk_sp<SkImage> image = CreateImage(100, 100); |
| 688 DrawImage draw_image( | 680 DrawImage draw_image( |
| 689 image, SkIRect::MakeXYWH(0, 0, image->width(), image->height()), quality, | 681 image, SkIRect::MakeXYWH(0, 0, image->width(), image->height()), quality, |
| 690 CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable)); | 682 CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable)); |
| 691 | 683 |
| 692 scoped_refptr<TileTask> task; | 684 scoped_refptr<TileTask> task; |
| 693 bool need_unref = controller.GetTaskForImageAndRef( | 685 bool need_unref = controller.GetTaskForImageAndRef( |
| 694 draw_image, ImageDecodeController::TracingInfo(), &task); | 686 draw_image, ImageDecodeController::TracingInfo(), &task); |
| 695 EXPECT_NE(0u, controller.GetBytesUsedForTesting()); | 687 EXPECT_NE(0u, controller.GetBytesUsedForTesting()); |
| 696 EXPECT_TRUE(task); | 688 EXPECT_TRUE(task); |
| 697 EXPECT_TRUE(need_unref); | 689 EXPECT_TRUE(need_unref); |
| 698 | 690 |
| 699 ScheduleTask(task->dependencies()[0].get()); | 691 ScheduleTask(task->dependencies()[0].get()); |
| 700 CompleteTask(task->dependencies()[0].get()); | 692 CompleteTask(task->dependencies()[0].get()); |
| 701 ScheduleTask(task.get()); | 693 ScheduleTask(task.get()); |
| 702 CompleteTask(task.get()); | 694 CompleteTask(task.get()); |
| 703 | 695 |
| 704 controller.UnrefImage(draw_image); | 696 controller.UnrefImage(draw_image); |
| 705 EXPECT_EQ(0u, controller.GetBytesUsedForTesting()); | 697 EXPECT_EQ(0u, controller.GetBytesUsedForTesting()); |
| 706 } | 698 } |
| 707 | 699 |
| 708 TEST(GpuImageDecodeControllerTest, ShouldAggressivelyFreeResources) { | 700 TEST(GpuImageDecodeControllerTest, ShouldAggressivelyFreeResources) { |
| 709 auto context_provider = TestContextProvider::Create(); | 701 auto context_provider = TestContextProvider::Create(); |
| 710 context_provider->BindToCurrentThread(); | 702 context_provider->BindToCurrentThread(); |
| 711 GpuImageDecodeController controller(context_provider.get(), | 703 TestGpuImageDecodeController controller(context_provider.get()); |
| 712 ResourceFormat::RGBA_8888); | |
| 713 bool is_decomposable = true; | 704 bool is_decomposable = true; |
| 714 SkFilterQuality quality = kHigh_SkFilterQuality; | 705 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 715 | 706 |
| 716 sk_sp<SkImage> image = CreateImage(100, 100); | 707 sk_sp<SkImage> image = CreateImage(100, 100); |
| 717 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 708 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
| 718 quality, | 709 quality, |
| 719 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | 710 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| 720 scoped_refptr<TileTask> task; | 711 scoped_refptr<TileTask> task; |
| 721 { | 712 { |
| 722 bool need_unref = controller.GetTaskForImageAndRef( | 713 bool need_unref = controller.GetTaskForImageAndRef( |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 758 ProcessTask(task->dependencies()[0].get()); | 749 ProcessTask(task->dependencies()[0].get()); |
| 759 ProcessTask(task.get()); | 750 ProcessTask(task.get()); |
| 760 | 751 |
| 761 // The image should be in our cache after un-ref. | 752 // The image should be in our cache after un-ref. |
| 762 controller.UnrefImage(draw_image); | 753 controller.UnrefImage(draw_image); |
| 763 DCHECK_GT(controller.GetBytesUsedForTesting(), 0u); | 754 DCHECK_GT(controller.GetBytesUsedForTesting(), 0u); |
| 764 } | 755 } |
| 765 | 756 |
| 766 } // namespace | 757 } // namespace |
| 767 } // namespace cc | 758 } // namespace cc |
| OLD | NEW |