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

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: combine with crrev.com/2103353002 Created 4 years, 5 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
« no previous file with comments | « cc/tiles/gpu_image_decode_controller.cc ('k') | cc/tiles/mipmap_util.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
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
470 TEST(GpuImageDecodeControllerTest, AtRasterUsedDirectlyIfSpaceAllows) { 857 TEST(GpuImageDecodeControllerTest, AtRasterUsedDirectlyIfSpaceAllows) {
471 auto context_provider = TestContextProvider::Create(); 858 auto context_provider = TestContextProvider::Create();
472 context_provider->BindToCurrentThread(); 859 context_provider->BindToCurrentThread();
473 TestGpuImageDecodeController controller(context_provider.get()); 860 TestGpuImageDecodeController controller(context_provider.get());
474 bool is_decomposable = true; 861 bool is_decomposable = true;
475 SkFilterQuality quality = kHigh_SkFilterQuality; 862 SkFilterQuality quality = kHigh_SkFilterQuality;
476 863
477 controller.SetCachedItemLimitForTesting(0); 864 controller.SetCachedItemLimitForTesting(0);
478 controller.SetCachedBytesLimitForTesting(0); 865 controller.SetCachedBytesLimitForTesting(0);
479 866
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
552 GetLargeDecodedImageForDrawAtRasterDecodeMultipleTimes) { 939 GetLargeDecodedImageForDrawAtRasterDecodeMultipleTimes) {
553 auto context_provider = TestContextProvider::Create(); 940 auto context_provider = TestContextProvider::Create();
554 context_provider->BindToCurrentThread(); 941 context_provider->BindToCurrentThread();
555 TestGpuImageDecodeController controller(context_provider.get()); 942 TestGpuImageDecodeController controller(context_provider.get());
556 bool is_decomposable = true; 943 bool is_decomposable = true;
557 SkFilterQuality quality = kHigh_SkFilterQuality; 944 SkFilterQuality quality = kHigh_SkFilterQuality;
558 945
559 sk_sp<SkImage> image = CreateImage(1, 24000); 946 sk_sp<SkImage> image = CreateImage(1, 24000);
560 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 947 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
561 quality, 948 quality,
562 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 949 CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable));
563 950
564 // Must hold context lock before calling GetDecodedImageForDraw / 951 // Must hold context lock before calling GetDecodedImageForDraw /
565 // DrawWithImageFinished. 952 // DrawWithImageFinished.
566 ContextProvider::ScopedContextLock context_lock(context_provider.get()); 953 ContextProvider::ScopedContextLock context_lock(context_provider.get());
567 DecodedDrawImage decoded_draw_image = 954 DecodedDrawImage decoded_draw_image =
568 controller.GetDecodedImageForDraw(draw_image); 955 controller.GetDecodedImageForDraw(draw_image);
569 EXPECT_TRUE(decoded_draw_image.image()); 956 EXPECT_TRUE(decoded_draw_image.image());
570 EXPECT_FALSE(decoded_draw_image.image()->isTextureBacked()); 957 EXPECT_FALSE(decoded_draw_image.image()->isTextureBacked());
571 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode()); 958 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode());
572 EXPECT_TRUE(controller.DiscardableIsLockedForTesting(draw_image)); 959 EXPECT_TRUE(controller.DiscardableIsLockedForTesting(draw_image));
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
719 } 1106 }
720 1107
721 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); 1108 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get());
722 TestTileTaskRunner::ProcessTask(task.get()); 1109 TestTileTaskRunner::ProcessTask(task.get());
723 1110
724 // The image should be in our cache after un-ref. 1111 // The image should be in our cache after un-ref.
725 controller.UnrefImage(draw_image); 1112 controller.UnrefImage(draw_image);
726 DCHECK_GT(controller.GetBytesUsedForTesting(), 0u); 1113 DCHECK_GT(controller.GetBytesUsedForTesting(), 0u);
727 } 1114 }
728 1115
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
729 } // namespace 1269 } // namespace
730 } // namespace cc 1270 } // namespace cc
OLDNEW
« no previous file with comments | « cc/tiles/gpu_image_decode_controller.cc ('k') | cc/tiles/mipmap_util.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698