| 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" |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 | 25 |
| 26 if (!is_decomposable) { | 26 if (!is_decomposable) { |
| 27 // Perspective is not decomposable, add it. | 27 // Perspective is not decomposable, add it. |
| 28 matrix[SkMatrix::kMPersp0] = 0.1f; | 28 matrix[SkMatrix::kMPersp0] = 0.1f; |
| 29 } | 29 } |
| 30 | 30 |
| 31 return matrix; | 31 return matrix; |
| 32 } | 32 } |
| 33 | 33 |
| 34 void ScheduleTask(TileTask* task) { | 34 void ScheduleTask(TileTask* task) { |
| 35 task->WillSchedule(); | 35 task->state().DidSchedule(); |
| 36 task->ScheduleOnOriginThread(nullptr); | |
| 37 task->DidSchedule(); | |
| 38 } | 36 } |
| 39 | 37 |
| 38 // Before running the task it must be scheduled. Call ScheduleTask() before |
| 39 // calling this function. |
| 40 void RunTask(TileTask* task) { | 40 void RunTask(TileTask* task) { |
| 41 // TODO(prashant.n): Once ScheduleOnOriginThread() and | |
| 42 // CompleteOnOriginThread() functions are removed, modify this function | |
| 43 // accordingly. (crbug.com/599863) | |
| 44 task->state().DidSchedule(); | |
| 45 task->state().DidStart(); | 41 task->state().DidStart(); |
| 46 task->RunOnWorkerThread(); | 42 task->RunOnWorkerThread(); |
| 47 task->state().DidFinish(); | 43 task->state().DidFinish(); |
| 48 } | 44 } |
| 49 | 45 |
| 50 void CompleteTask(TileTask* task) { | 46 void CompleteTask(TileTask* task) { |
| 51 task->WillComplete(); | 47 DCHECK(task->state().IsFinished() || task->state().IsCanceled()); |
| 52 task->CompleteOnOriginThread(nullptr); | 48 task->OnTaskCompleted(); |
| 53 task->DidComplete(); | 49 } |
| 50 |
| 51 void CancelTask(TileTask* task) { |
| 52 task->state().DidCancel(); |
| 54 } | 53 } |
| 55 | 54 |
| 56 void ProcessTask(TileTask* task) { | 55 void ProcessTask(TileTask* task) { |
| 57 ScheduleTask(task); | 56 ScheduleTask(task); |
| 58 RunTask(task); | 57 RunTask(task); |
| 59 CompleteTask(task); | 58 CompleteTask(task); |
| 60 } | 59 } |
| 61 | 60 |
| 62 TEST(GpuImageDecodeControllerTest, GetTaskForImageSameImage) { | 61 TEST(GpuImageDecodeControllerTest, GetTaskForImageSameImage) { |
| 63 auto context_provider = TestContextProvider::Create(); | 62 auto context_provider = TestContextProvider::Create(); |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 EXPECT_TRUE(need_unref); | 149 EXPECT_TRUE(need_unref); |
| 151 EXPECT_TRUE(task); | 150 EXPECT_TRUE(task); |
| 152 EXPECT_EQ(task->dependencies().size(), 1u); | 151 EXPECT_EQ(task->dependencies().size(), 1u); |
| 153 EXPECT_TRUE(task->dependencies()[0]); | 152 EXPECT_TRUE(task->dependencies()[0]); |
| 154 | 153 |
| 155 // Run the decode but don't complete it (this will keep the decode locked). | 154 // Run the decode but don't complete it (this will keep the decode locked). |
| 156 ScheduleTask(task->dependencies()[0].get()); | 155 ScheduleTask(task->dependencies()[0].get()); |
| 157 RunTask(task->dependencies()[0].get()); | 156 RunTask(task->dependencies()[0].get()); |
| 158 | 157 |
| 159 // Cancel the upload. | 158 // Cancel the upload. |
| 160 ScheduleTask(task.get()); | 159 CancelTask(task.get()); |
| 161 CompleteTask(task.get()); | 160 CompleteTask(task.get()); |
| 162 | 161 |
| 163 // Get the image again - we should have an upload task, but no dependent | 162 // Get the image again - we should have an upload task, but no dependent |
| 164 // decode task, as the decode was already locked. | 163 // decode task, as the decode was already locked. |
| 165 scoped_refptr<TileTask> another_task; | 164 scoped_refptr<TileTask> another_task; |
| 166 need_unref = controller.GetTaskForImageAndRef( | 165 need_unref = controller.GetTaskForImageAndRef( |
| 167 draw_image, ImageDecodeController::TracingInfo(), &another_task); | 166 draw_image, ImageDecodeController::TracingInfo(), &another_task); |
| 168 EXPECT_TRUE(need_unref); | 167 EXPECT_TRUE(need_unref); |
| 169 EXPECT_TRUE(another_task); | 168 EXPECT_TRUE(another_task); |
| 170 EXPECT_EQ(another_task->dependencies().size(), 0u); | 169 EXPECT_EQ(another_task->dependencies().size(), 0u); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 195 draw_image, ImageDecodeController::TracingInfo(), &task); | 194 draw_image, ImageDecodeController::TracingInfo(), &task); |
| 196 EXPECT_TRUE(need_unref); | 195 EXPECT_TRUE(need_unref); |
| 197 EXPECT_TRUE(task); | 196 EXPECT_TRUE(task); |
| 198 EXPECT_EQ(task->dependencies().size(), 1u); | 197 EXPECT_EQ(task->dependencies().size(), 1u); |
| 199 EXPECT_TRUE(task->dependencies()[0]); | 198 EXPECT_TRUE(task->dependencies()[0]); |
| 200 | 199 |
| 201 // Run the decode. | 200 // Run the decode. |
| 202 ProcessTask(task->dependencies()[0].get()); | 201 ProcessTask(task->dependencies()[0].get()); |
| 203 | 202 |
| 204 // Cancel the upload. | 203 // Cancel the upload. |
| 205 ScheduleTask(task.get()); | 204 CancelTask(task.get()); |
| 206 CompleteTask(task.get()); | 205 CompleteTask(task.get()); |
| 207 | 206 |
| 208 // Unref the image. | 207 // Unref the image. |
| 209 controller.UnrefImage(draw_image); | 208 controller.UnrefImage(draw_image); |
| 210 | 209 |
| 211 // Get the image again - we should have an upload task and a dependent decode | 210 // Get the image again - we should have an upload task and a dependent decode |
| 212 // task - this dependent task will typically just re-lock the image. | 211 // task - this dependent task will typically just re-lock the image. |
| 213 scoped_refptr<TileTask> another_task; | 212 scoped_refptr<TileTask> another_task; |
| 214 need_unref = controller.GetTaskForImageAndRef( | 213 need_unref = controller.GetTaskForImageAndRef( |
| 215 draw_image, ImageDecodeController::TracingInfo(), &another_task); | 214 draw_image, ImageDecodeController::TracingInfo(), &another_task); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 272 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 271 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
| 273 quality, | 272 quality, |
| 274 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | 273 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| 275 scoped_refptr<TileTask> task; | 274 scoped_refptr<TileTask> task; |
| 276 bool need_unref = controller.GetTaskForImageAndRef( | 275 bool need_unref = controller.GetTaskForImageAndRef( |
| 277 draw_image, ImageDecodeController::TracingInfo(), &task); | 276 draw_image, ImageDecodeController::TracingInfo(), &task); |
| 278 EXPECT_TRUE(need_unref); | 277 EXPECT_TRUE(need_unref); |
| 279 EXPECT_TRUE(task); | 278 EXPECT_TRUE(task); |
| 280 | 279 |
| 281 ProcessTask(task->dependencies()[0].get()); | 280 ProcessTask(task->dependencies()[0].get()); |
| 282 ScheduleTask(task.get()); | |
| 283 | 281 |
| 284 scoped_refptr<TileTask> another_task; | 282 scoped_refptr<TileTask> another_task; |
| 285 need_unref = controller.GetTaskForImageAndRef( | 283 need_unref = controller.GetTaskForImageAndRef( |
| 286 draw_image, ImageDecodeController::TracingInfo(), &another_task); | 284 draw_image, ImageDecodeController::TracingInfo(), &another_task); |
| 287 EXPECT_TRUE(need_unref); | 285 EXPECT_TRUE(need_unref); |
| 288 EXPECT_TRUE(another_task.get() == task.get()); | 286 EXPECT_TRUE(another_task.get() == task.get()); |
| 289 | 287 |
| 290 // Didn't run the task, complete it (it was canceled). | 288 // Didn't run the task, so cancel it. |
| 289 CancelTask(task.get()); |
| 291 CompleteTask(task.get()); | 290 CompleteTask(task.get()); |
| 292 | 291 |
| 293 // Fully cancel everything (so the raster would unref things). | 292 // Fully cancel everything (so the raster would unref things). |
| 294 controller.UnrefImage(draw_image); | 293 controller.UnrefImage(draw_image); |
| 295 controller.UnrefImage(draw_image); | 294 controller.UnrefImage(draw_image); |
| 296 | 295 |
| 297 // Here a new task is created. | 296 // Here a new task is created. |
| 298 scoped_refptr<TileTask> third_task; | 297 scoped_refptr<TileTask> third_task; |
| 299 need_unref = controller.GetTaskForImageAndRef( | 298 need_unref = controller.GetTaskForImageAndRef( |
| 300 draw_image, ImageDecodeController::TracingInfo(), &third_task); | 299 draw_image, ImageDecodeController::TracingInfo(), &third_task); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 321 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 320 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
| 322 quality, | 321 quality, |
| 323 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | 322 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| 324 scoped_refptr<TileTask> task; | 323 scoped_refptr<TileTask> task; |
| 325 bool need_unref = controller.GetTaskForImageAndRef( | 324 bool need_unref = controller.GetTaskForImageAndRef( |
| 326 draw_image, ImageDecodeController::TracingInfo(), &task); | 325 draw_image, ImageDecodeController::TracingInfo(), &task); |
| 327 EXPECT_TRUE(need_unref); | 326 EXPECT_TRUE(need_unref); |
| 328 EXPECT_TRUE(task); | 327 EXPECT_TRUE(task); |
| 329 | 328 |
| 330 ProcessTask(task->dependencies()[0].get()); | 329 ProcessTask(task->dependencies()[0].get()); |
| 331 ScheduleTask(task.get()); | |
| 332 | 330 |
| 333 scoped_refptr<TileTask> another_task; | 331 scoped_refptr<TileTask> another_task; |
| 334 need_unref = controller.GetTaskForImageAndRef( | 332 need_unref = controller.GetTaskForImageAndRef( |
| 335 draw_image, ImageDecodeController::TracingInfo(), &another_task); | 333 draw_image, ImageDecodeController::TracingInfo(), &another_task); |
| 336 EXPECT_TRUE(need_unref); | 334 EXPECT_TRUE(need_unref); |
| 337 EXPECT_TRUE(another_task.get() == task.get()); | 335 EXPECT_TRUE(another_task.get() == task.get()); |
| 338 | 336 |
| 339 // Didn't run the task, complete it (it was canceled). | 337 // Didn't run the task, so cancel it. |
| 338 CancelTask(task.get()); |
| 340 CompleteTask(task.get()); | 339 CompleteTask(task.get()); |
| 341 | 340 |
| 342 // Note that here, everything is reffed, but a new task is created. This is | 341 // Note that here, everything is reffed, but a new task is created. This is |
| 343 // possible with repeated schedule/cancel operations. | 342 // possible with repeated schedule/cancel operations. |
| 344 scoped_refptr<TileTask> third_task; | 343 scoped_refptr<TileTask> third_task; |
| 345 need_unref = controller.GetTaskForImageAndRef( | 344 need_unref = controller.GetTaskForImageAndRef( |
| 346 draw_image, ImageDecodeController::TracingInfo(), &third_task); | 345 draw_image, ImageDecodeController::TracingInfo(), &third_task); |
| 347 EXPECT_TRUE(need_unref); | 346 EXPECT_TRUE(need_unref); |
| 348 EXPECT_TRUE(third_task); | 347 EXPECT_TRUE(third_task); |
| 349 EXPECT_FALSE(third_task.get() == task.get()); | 348 EXPECT_FALSE(third_task.get() == task.get()); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 369 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 368 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
| 370 quality, | 369 quality, |
| 371 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | 370 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| 372 scoped_refptr<TileTask> task; | 371 scoped_refptr<TileTask> task; |
| 373 bool need_unref = controller.GetTaskForImageAndRef( | 372 bool need_unref = controller.GetTaskForImageAndRef( |
| 374 draw_image, ImageDecodeController::TracingInfo(), &task); | 373 draw_image, ImageDecodeController::TracingInfo(), &task); |
| 375 EXPECT_TRUE(need_unref); | 374 EXPECT_TRUE(need_unref); |
| 376 EXPECT_TRUE(task); | 375 EXPECT_TRUE(task); |
| 377 | 376 |
| 378 ProcessTask(task->dependencies()[0].get()); | 377 ProcessTask(task->dependencies()[0].get()); |
| 379 ScheduleTask(task.get()); | 378 // Didn't run the task, so cancel it. |
| 380 // Didn't run the task, complete it (it was canceled). | 379 CancelTask(task.get()); |
| 381 CompleteTask(task.get()); | 380 CompleteTask(task.get()); |
| 382 | 381 |
| 383 controller.SetImageDecodingFailedForTesting(draw_image); | 382 controller.SetImageDecodingFailedForTesting(draw_image); |
| 384 | 383 |
| 385 scoped_refptr<TileTask> another_task; | 384 scoped_refptr<TileTask> another_task; |
| 386 need_unref = controller.GetTaskForImageAndRef( | 385 need_unref = controller.GetTaskForImageAndRef( |
| 387 draw_image, ImageDecodeController::TracingInfo(), &another_task); | 386 draw_image, ImageDecodeController::TracingInfo(), &another_task); |
| 388 EXPECT_FALSE(need_unref); | 387 EXPECT_FALSE(need_unref); |
| 389 EXPECT_EQ(another_task.get(), nullptr); | 388 EXPECT_EQ(another_task.get(), nullptr); |
| 390 | 389 |
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 645 image, SkIRect::MakeXYWH(0, 0, image->width(), image->height()), quality, | 644 image, SkIRect::MakeXYWH(0, 0, image->width(), image->height()), quality, |
| 646 CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable)); | 645 CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable)); |
| 647 | 646 |
| 648 scoped_refptr<TileTask> task; | 647 scoped_refptr<TileTask> task; |
| 649 bool need_unref = controller.GetTaskForImageAndRef( | 648 bool need_unref = controller.GetTaskForImageAndRef( |
| 650 draw_image, ImageDecodeController::TracingInfo(), &task); | 649 draw_image, ImageDecodeController::TracingInfo(), &task); |
| 651 EXPECT_NE(0u, controller.GetBytesUsedForTesting()); | 650 EXPECT_NE(0u, controller.GetBytesUsedForTesting()); |
| 652 EXPECT_TRUE(task); | 651 EXPECT_TRUE(task); |
| 653 EXPECT_TRUE(need_unref); | 652 EXPECT_TRUE(need_unref); |
| 654 | 653 |
| 655 ScheduleTask(task->dependencies()[0].get()); | 654 CancelTask(task->dependencies()[0].get()); |
| 656 CompleteTask(task->dependencies()[0].get()); | 655 CompleteTask(task->dependencies()[0].get()); |
| 657 ScheduleTask(task.get()); | 656 CancelTask(task.get()); |
| 658 CompleteTask(task.get()); | 657 CompleteTask(task.get()); |
| 659 | 658 |
| 660 controller.UnrefImage(draw_image); | 659 controller.UnrefImage(draw_image); |
| 661 EXPECT_EQ(0u, controller.GetBytesUsedForTesting()); | 660 EXPECT_EQ(0u, controller.GetBytesUsedForTesting()); |
| 662 } | 661 } |
| 663 | 662 |
| 664 TEST(GpuImageDecodeControllerTest, ShouldAggressivelyFreeResources) { | 663 TEST(GpuImageDecodeControllerTest, ShouldAggressivelyFreeResources) { |
| 665 auto context_provider = TestContextProvider::Create(); | 664 auto context_provider = TestContextProvider::Create(); |
| 666 context_provider->BindToCurrentThread(); | 665 context_provider->BindToCurrentThread(); |
| 667 GpuImageDecodeController controller(context_provider.get(), | 666 GpuImageDecodeController controller(context_provider.get(), |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 714 ProcessTask(task->dependencies()[0].get()); | 713 ProcessTask(task->dependencies()[0].get()); |
| 715 ProcessTask(task.get()); | 714 ProcessTask(task.get()); |
| 716 | 715 |
| 717 // The image should be in our cache after un-ref. | 716 // The image should be in our cache after un-ref. |
| 718 controller.UnrefImage(draw_image); | 717 controller.UnrefImage(draw_image); |
| 719 DCHECK_GT(controller.GetBytesUsedForTesting(), 0u); | 718 DCHECK_GT(controller.GetBytesUsedForTesting(), 0u); |
| 720 } | 719 } |
| 721 | 720 |
| 722 } // namespace | 721 } // namespace |
| 723 } // namespace cc | 722 } // namespace cc |
| OLD | NEW |