Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(201)

Side by Side Diff: cc/tiles/gpu_image_decode_controller_unittest.cc

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

Powered by Google App Engine
This is Rietveld 408576698