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

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

Issue 2101403006: Revert of Add display-resolution caching to GPU IDC (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@drt
Patch Set: Fix test expectations to prevent revert from impacting LayoutTests 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
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(1.5f, 1.5f), is_decomposable)); 53 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
54 scoped_refptr<TileTask> task; 54 scoped_refptr<TileTask> task;
55 bool need_unref = controller.GetTaskForImageAndRef( 55 bool need_unref = controller.GetTaskForImageAndRef(
56 draw_image, ImageDecodeController::TracingInfo(), &task); 56 draw_image, ImageDecodeController::TracingInfo(), &task);
57 EXPECT_TRUE(need_unref); 57 EXPECT_TRUE(need_unref);
58 EXPECT_TRUE(task); 58 EXPECT_TRUE(task);
59 59
60 DrawImage another_draw_image( 60 DrawImage another_draw_image(
61 image, SkIRect::MakeWH(image->width(), image->height()), quality, 61 image, SkIRect::MakeWH(image->width(), image->height()), quality,
62 CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable)); 62 CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable));
63 scoped_refptr<TileTask> another_task; 63 scoped_refptr<TileTask> another_task;
64 need_unref = controller.GetTaskForImageAndRef( 64 need_unref = controller.GetTaskForImageAndRef(
65 another_draw_image, ImageDecodeController::TracingInfo(), &another_task); 65 another_draw_image, ImageDecodeController::TracingInfo(), &another_task);
66 EXPECT_TRUE(need_unref); 66 EXPECT_TRUE(need_unref);
67 EXPECT_TRUE(task.get() == another_task.get()); 67 EXPECT_TRUE(task.get() == another_task.get());
68 68
69 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); 69 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get());
70 TestTileTaskRunner::ProcessTask(task.get()); 70 TestTileTaskRunner::ProcessTask(task.get());
71 71
72 controller.UnrefImage(draw_image); 72 controller.UnrefImage(draw_image);
73 controller.UnrefImage(draw_image); 73 controller.UnrefImage(draw_image);
74 } 74 }
75 75
76 TEST(GpuImageDecodeControllerTest, GetTaskForImageSmallerScale) {
77 auto context_provider = TestContextProvider::Create();
78 context_provider->BindToCurrentThread();
79 TestGpuImageDecodeController controller(context_provider.get());
80 sk_sp<SkImage> image = CreateImage(100, 100);
81 bool is_decomposable = true;
82 SkFilterQuality quality = kHigh_SkFilterQuality;
83
84 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
85 quality,
86 CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable));
87 scoped_refptr<TileTask> task;
88 bool need_unref = controller.GetTaskForImageAndRef(
89 draw_image, ImageDecodeController::TracingInfo(), &task);
90 EXPECT_TRUE(need_unref);
91 EXPECT_TRUE(task);
92
93 DrawImage another_draw_image(
94 image, SkIRect::MakeWH(image->width(), image->height()), quality,
95 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
96 scoped_refptr<TileTask> another_task;
97 need_unref = controller.GetTaskForImageAndRef(
98 another_draw_image, ImageDecodeController::TracingInfo(), &another_task);
99 EXPECT_TRUE(need_unref);
100 EXPECT_TRUE(task.get() == another_task.get());
101
102 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get());
103 TestTileTaskRunner::ProcessTask(task.get());
104
105 controller.UnrefImage(draw_image);
106 controller.UnrefImage(another_draw_image);
107 }
108
109 TEST(GpuImageDecodeControllerTest, GetTaskForImageLowerQuality) {
110 auto context_provider = TestContextProvider::Create();
111 context_provider->BindToCurrentThread();
112 TestGpuImageDecodeController controller(context_provider.get());
113 sk_sp<SkImage> image = CreateImage(100, 100);
114 bool is_decomposable = true;
115 SkMatrix matrix = CreateMatrix(SkSize::Make(0.4f, 0.4f), is_decomposable);
116
117 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
118 kHigh_SkFilterQuality, matrix);
119 scoped_refptr<TileTask> task;
120 bool need_unref = controller.GetTaskForImageAndRef(
121 draw_image, ImageDecodeController::TracingInfo(), &task);
122 EXPECT_TRUE(need_unref);
123 EXPECT_TRUE(task);
124
125 DrawImage another_draw_image(image,
126 SkIRect::MakeWH(image->width(), image->height()),
127 kLow_SkFilterQuality, matrix);
128 scoped_refptr<TileTask> another_task;
129 need_unref = controller.GetTaskForImageAndRef(
130 another_draw_image, ImageDecodeController::TracingInfo(), &another_task);
131 EXPECT_TRUE(need_unref);
132 EXPECT_TRUE(task.get() == another_task.get());
133
134 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get());
135 TestTileTaskRunner::ProcessTask(task.get());
136
137 controller.UnrefImage(draw_image);
138 controller.UnrefImage(another_draw_image);
139 }
140
141 TEST(GpuImageDecodeControllerTest, GetTaskForImageDifferentImage) { 76 TEST(GpuImageDecodeControllerTest, GetTaskForImageDifferentImage) {
142 auto context_provider = TestContextProvider::Create(); 77 auto context_provider = TestContextProvider::Create();
143 context_provider->BindToCurrentThread(); 78 context_provider->BindToCurrentThread();
144 TestGpuImageDecodeController controller(context_provider.get()); 79 TestGpuImageDecodeController controller(context_provider.get());
145 bool is_decomposable = true; 80 bool is_decomposable = true;
146 SkFilterQuality quality = kHigh_SkFilterQuality; 81 SkFilterQuality quality = kHigh_SkFilterQuality;
147 82
148 sk_sp<SkImage> first_image = CreateImage(100, 100); 83 sk_sp<SkImage> first_image = CreateImage(100, 100);
149 DrawImage first_draw_image( 84 DrawImage first_draw_image(
150 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), 85 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()),
(...skipping 18 matching lines...) Expand all
169 104
170 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get()); 105 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get());
171 TestTileTaskRunner::ProcessTask(first_task.get()); 106 TestTileTaskRunner::ProcessTask(first_task.get());
172 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); 107 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get());
173 TestTileTaskRunner::ProcessTask(second_task.get()); 108 TestTileTaskRunner::ProcessTask(second_task.get());
174 109
175 controller.UnrefImage(first_draw_image); 110 controller.UnrefImage(first_draw_image);
176 controller.UnrefImage(second_draw_image); 111 controller.UnrefImage(second_draw_image);
177 } 112 }
178 113
179 TEST(GpuImageDecodeControllerTest, GetTaskForImageLargerScale) {
180 auto context_provider = TestContextProvider::Create();
181 context_provider->BindToCurrentThread();
182 TestGpuImageDecodeController controller(context_provider.get());
183 bool is_decomposable = true;
184 SkFilterQuality quality = kHigh_SkFilterQuality;
185
186 sk_sp<SkImage> first_image = CreateImage(100, 100);
187 DrawImage first_draw_image(
188 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()),
189 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
190 scoped_refptr<TileTask> first_task;
191 bool need_unref = controller.GetTaskForImageAndRef(
192 first_draw_image, ImageDecodeController::TracingInfo(), &first_task);
193 EXPECT_TRUE(need_unref);
194 EXPECT_TRUE(first_task);
195
196 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get());
197 TestTileTaskRunner::ProcessTask(first_task.get());
198
199 controller.UnrefImage(first_draw_image);
200
201 DrawImage second_draw_image(
202 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()),
203 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable));
204 scoped_refptr<TileTask> second_task;
205 need_unref = controller.GetTaskForImageAndRef(
206 second_draw_image, ImageDecodeController::TracingInfo(), &second_task);
207 EXPECT_TRUE(need_unref);
208 EXPECT_TRUE(second_task);
209 EXPECT_TRUE(first_task.get() != second_task.get());
210
211 DrawImage third_draw_image(
212 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()),
213 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
214 scoped_refptr<TileTask> third_task;
215 need_unref = controller.GetTaskForImageAndRef(
216 third_draw_image, ImageDecodeController::TracingInfo(), &third_task);
217 EXPECT_TRUE(need_unref);
218 EXPECT_TRUE(third_task.get() == second_task.get());
219
220 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get());
221 TestTileTaskRunner::ProcessTask(second_task.get());
222
223 controller.UnrefImage(second_draw_image);
224 controller.UnrefImage(third_draw_image);
225 }
226
227 TEST(GpuImageDecodeControllerTest, GetTaskForImageLargerScaleNoReuse) {
228 auto context_provider = TestContextProvider::Create();
229 context_provider->BindToCurrentThread();
230 TestGpuImageDecodeController controller(context_provider.get());
231 bool is_decomposable = true;
232 SkFilterQuality quality = kHigh_SkFilterQuality;
233
234 sk_sp<SkImage> first_image = CreateImage(100, 100);
235 DrawImage first_draw_image(
236 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()),
237 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
238 scoped_refptr<TileTask> first_task;
239 bool need_unref = controller.GetTaskForImageAndRef(
240 first_draw_image, ImageDecodeController::TracingInfo(), &first_task);
241 EXPECT_TRUE(need_unref);
242 EXPECT_TRUE(first_task);
243
244 DrawImage second_draw_image(
245 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()),
246 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable));
247 scoped_refptr<TileTask> second_task;
248 need_unref = controller.GetTaskForImageAndRef(
249 second_draw_image, ImageDecodeController::TracingInfo(), &second_task);
250 EXPECT_TRUE(need_unref);
251 EXPECT_TRUE(second_task);
252 EXPECT_TRUE(first_task.get() != second_task.get());
253
254 DrawImage third_draw_image(
255 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()),
256 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
257 scoped_refptr<TileTask> third_task;
258 need_unref = controller.GetTaskForImageAndRef(
259 third_draw_image, ImageDecodeController::TracingInfo(), &third_task);
260 EXPECT_TRUE(need_unref);
261 EXPECT_TRUE(third_task.get() == first_task.get());
262
263 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get());
264 TestTileTaskRunner::ProcessTask(first_task.get());
265 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get());
266 TestTileTaskRunner::ProcessTask(second_task.get());
267
268 controller.UnrefImage(first_draw_image);
269 controller.UnrefImage(second_draw_image);
270 controller.UnrefImage(third_draw_image);
271 }
272
273 TEST(GpuImageDecodeControllerTest, GetTaskForImageHigherQuality) {
274 auto context_provider = TestContextProvider::Create();
275 context_provider->BindToCurrentThread();
276 TestGpuImageDecodeController controller(context_provider.get());
277 bool is_decomposable = true;
278 SkMatrix matrix = CreateMatrix(SkSize::Make(0.4f, 0.4f), is_decomposable);
279
280 sk_sp<SkImage> first_image = CreateImage(100, 100);
281 DrawImage first_draw_image(
282 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()),
283 kLow_SkFilterQuality, matrix);
284 scoped_refptr<TileTask> first_task;
285 bool need_unref = controller.GetTaskForImageAndRef(
286 first_draw_image, ImageDecodeController::TracingInfo(), &first_task);
287 EXPECT_TRUE(need_unref);
288 EXPECT_TRUE(first_task);
289
290 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get());
291 TestTileTaskRunner::ProcessTask(first_task.get());
292
293 controller.UnrefImage(first_draw_image);
294
295 DrawImage second_draw_image(
296 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()),
297 kHigh_SkFilterQuality, matrix);
298 scoped_refptr<TileTask> second_task;
299 need_unref = controller.GetTaskForImageAndRef(
300 second_draw_image, ImageDecodeController::TracingInfo(), &second_task);
301 EXPECT_TRUE(need_unref);
302 EXPECT_TRUE(second_task);
303 EXPECT_TRUE(first_task.get() != second_task.get());
304
305 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get());
306 TestTileTaskRunner::ProcessTask(second_task.get());
307
308 controller.UnrefImage(second_draw_image);
309 }
310
311 TEST(GpuImageDecodeControllerTest, GetTaskForImageAlreadyDecodedAndLocked) { 114 TEST(GpuImageDecodeControllerTest, GetTaskForImageAlreadyDecodedAndLocked) {
312 auto context_provider = TestContextProvider::Create(); 115 auto context_provider = TestContextProvider::Create();
313 context_provider->BindToCurrentThread(); 116 context_provider->BindToCurrentThread();
314 TestGpuImageDecodeController controller(context_provider.get()); 117 TestGpuImageDecodeController controller(context_provider.get());
315 bool is_decomposable = true; 118 bool is_decomposable = true;
316 SkFilterQuality quality = kHigh_SkFilterQuality; 119 SkFilterQuality quality = kHigh_SkFilterQuality;
317 120
318 sk_sp<SkImage> image = CreateImage(100, 100); 121 sk_sp<SkImage> image = CreateImage(100, 100);
319 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 122 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
320 quality, 123 quality,
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after
598 TEST(GpuImageDecodeControllerTest, GetLargeDecodedImageForDraw) { 401 TEST(GpuImageDecodeControllerTest, GetLargeDecodedImageForDraw) {
599 auto context_provider = TestContextProvider::Create(); 402 auto context_provider = TestContextProvider::Create();
600 context_provider->BindToCurrentThread(); 403 context_provider->BindToCurrentThread();
601 TestGpuImageDecodeController controller(context_provider.get()); 404 TestGpuImageDecodeController controller(context_provider.get());
602 bool is_decomposable = true; 405 bool is_decomposable = true;
603 SkFilterQuality quality = kHigh_SkFilterQuality; 406 SkFilterQuality quality = kHigh_SkFilterQuality;
604 407
605 sk_sp<SkImage> image = CreateImage(1, 24000); 408 sk_sp<SkImage> image = CreateImage(1, 24000);
606 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 409 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
607 quality, 410 quality,
608 CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); 411 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
609 scoped_refptr<TileTask> task; 412 scoped_refptr<TileTask> task;
610 bool need_unref = controller.GetTaskForImageAndRef( 413 bool need_unref = controller.GetTaskForImageAndRef(
611 draw_image, ImageDecodeController::TracingInfo(), &task); 414 draw_image, ImageDecodeController::TracingInfo(), &task);
612 EXPECT_TRUE(need_unref); 415 EXPECT_TRUE(need_unref);
613 EXPECT_TRUE(task); 416 EXPECT_TRUE(task);
614 417
615 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); 418 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get());
616 TestTileTaskRunner::ProcessTask(task.get()); 419 TestTileTaskRunner::ProcessTask(task.get());
617 420
618 // Must hold context lock before calling GetDecodedImageForDraw / 421 // Must hold context lock before calling GetDecodedImageForDraw /
(...skipping 17 matching lines...) Expand all
636 TestGpuImageDecodeController controller(context_provider.get()); 439 TestGpuImageDecodeController controller(context_provider.get());
637 bool is_decomposable = true; 440 bool is_decomposable = true;
638 SkFilterQuality quality = kHigh_SkFilterQuality; 441 SkFilterQuality quality = kHigh_SkFilterQuality;
639 442
640 controller.SetCachedItemLimitForTesting(0); 443 controller.SetCachedItemLimitForTesting(0);
641 controller.SetCachedBytesLimitForTesting(0); 444 controller.SetCachedBytesLimitForTesting(0);
642 445
643 sk_sp<SkImage> image = CreateImage(100, 100); 446 sk_sp<SkImage> image = CreateImage(100, 100);
644 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 447 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
645 quality, 448 quality,
646 CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); 449 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
647 450
648 scoped_refptr<TileTask> task; 451 scoped_refptr<TileTask> task;
649 bool need_unref = controller.GetTaskForImageAndRef( 452 bool need_unref = controller.GetTaskForImageAndRef(
650 draw_image, ImageDecodeController::TracingInfo(), &task); 453 draw_image, ImageDecodeController::TracingInfo(), &task);
651 EXPECT_FALSE(need_unref); 454 EXPECT_FALSE(need_unref);
652 EXPECT_FALSE(task); 455 EXPECT_FALSE(task);
653 456
654 // Must hold context lock before calling GetDecodedImageForDraw / 457 // Must hold context lock before calling GetDecodedImageForDraw /
655 // DrawWithImageFinished. 458 // DrawWithImageFinished.
656 ContextProvider::ScopedContextLock context_lock(context_provider.get()); 459 ContextProvider::ScopedContextLock context_lock(context_provider.get());
657 DecodedDrawImage decoded_draw_image = 460 DecodedDrawImage decoded_draw_image =
658 controller.GetDecodedImageForDraw(draw_image); 461 controller.GetDecodedImageForDraw(draw_image);
659 EXPECT_TRUE(decoded_draw_image.image()); 462 EXPECT_TRUE(decoded_draw_image.image());
660 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); 463 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked());
661 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode()); 464 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode());
662 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); 465 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image));
663 466
664 controller.DrawWithImageFinished(draw_image, decoded_draw_image); 467 controller.DrawWithImageFinished(draw_image, decoded_draw_image);
665 } 468 }
666 469
667 TEST(GpuImageDecodeControllerTest, GetDecodedImageForDrawLargerScale) {
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, AtRasterUsedDirectlyIfSpaceAllows) { 470 TEST(GpuImageDecodeControllerTest, AtRasterUsedDirectlyIfSpaceAllows) {
820 auto context_provider = TestContextProvider::Create(); 471 auto context_provider = TestContextProvider::Create();
821 context_provider->BindToCurrentThread(); 472 context_provider->BindToCurrentThread();
822 TestGpuImageDecodeController controller(context_provider.get()); 473 TestGpuImageDecodeController controller(context_provider.get());
823 bool is_decomposable = true; 474 bool is_decomposable = true;
824 SkFilterQuality quality = kHigh_SkFilterQuality; 475 SkFilterQuality quality = kHigh_SkFilterQuality;
825 476
826 controller.SetCachedItemLimitForTesting(0); 477 controller.SetCachedItemLimitForTesting(0);
827 controller.SetCachedBytesLimitForTesting(0); 478 controller.SetCachedBytesLimitForTesting(0);
828 479
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
901 GetLargeDecodedImageForDrawAtRasterDecodeMultipleTimes) { 552 GetLargeDecodedImageForDrawAtRasterDecodeMultipleTimes) {
902 auto context_provider = TestContextProvider::Create(); 553 auto context_provider = TestContextProvider::Create();
903 context_provider->BindToCurrentThread(); 554 context_provider->BindToCurrentThread();
904 TestGpuImageDecodeController controller(context_provider.get()); 555 TestGpuImageDecodeController controller(context_provider.get());
905 bool is_decomposable = true; 556 bool is_decomposable = true;
906 SkFilterQuality quality = kHigh_SkFilterQuality; 557 SkFilterQuality quality = kHigh_SkFilterQuality;
907 558
908 sk_sp<SkImage> image = CreateImage(1, 24000); 559 sk_sp<SkImage> image = CreateImage(1, 24000);
909 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 560 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
910 quality, 561 quality,
911 CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); 562 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
912 563
913 // Must hold context lock before calling GetDecodedImageForDraw / 564 // Must hold context lock before calling GetDecodedImageForDraw /
914 // DrawWithImageFinished. 565 // DrawWithImageFinished.
915 ContextProvider::ScopedContextLock context_lock(context_provider.get()); 566 ContextProvider::ScopedContextLock context_lock(context_provider.get());
916 DecodedDrawImage decoded_draw_image = 567 DecodedDrawImage decoded_draw_image =
917 controller.GetDecodedImageForDraw(draw_image); 568 controller.GetDecodedImageForDraw(draw_image);
918 EXPECT_TRUE(decoded_draw_image.image()); 569 EXPECT_TRUE(decoded_draw_image.image());
919 EXPECT_FALSE(decoded_draw_image.image()->isTextureBacked()); 570 EXPECT_FALSE(decoded_draw_image.image()->isTextureBacked());
920 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode()); 571 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode());
921 EXPECT_TRUE(controller.DiscardableIsLockedForTesting(draw_image)); 572 EXPECT_TRUE(controller.DiscardableIsLockedForTesting(draw_image));
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
1068 } 719 }
1069 720
1070 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); 721 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get());
1071 TestTileTaskRunner::ProcessTask(task.get()); 722 TestTileTaskRunner::ProcessTask(task.get());
1072 723
1073 // The image should be in our cache after un-ref. 724 // The image should be in our cache after un-ref.
1074 controller.UnrefImage(draw_image); 725 controller.UnrefImage(draw_image);
1075 DCHECK_GT(controller.GetBytesUsedForTesting(), 0u); 726 DCHECK_GT(controller.GetBytesUsedForTesting(), 0u);
1076 } 727 }
1077 728
1078 TEST(GpuImageDecodeControllerTest, OrphanedImagesFreeOnReachingZeroRefs) {
1079 auto context_provider = TestContextProvider::Create();
1080 context_provider->BindToCurrentThread();
1081 TestGpuImageDecodeController controller(context_provider.get());
1082 bool is_decomposable = true;
1083 SkFilterQuality quality = kHigh_SkFilterQuality;
1084
1085 // Create a downscaled image.
1086 sk_sp<SkImage> first_image = CreateImage(100, 100);
1087 DrawImage first_draw_image(
1088 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()),
1089 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
1090 scoped_refptr<TileTask> first_task;
1091 bool need_unref = controller.GetTaskForImageAndRef(
1092 first_draw_image, ImageDecodeController::TracingInfo(), &first_task);
1093 EXPECT_TRUE(need_unref);
1094 EXPECT_TRUE(first_task);
1095
1096 // The budget should account for exactly one image.
1097 EXPECT_EQ(controller.GetBytesUsedForTesting(),
1098 controller.GetDrawImageSizeForTesting(first_draw_image));
1099
1100 // Create a larger version of |first_image|, this should immediately free the
1101 // memory used by |first_image| for the smaller scale.
1102 DrawImage second_draw_image(
1103 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()),
1104 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable));
1105 scoped_refptr<TileTask> second_task;
1106 need_unref = controller.GetTaskForImageAndRef(
1107 second_draw_image, ImageDecodeController::TracingInfo(), &second_task);
1108 EXPECT_TRUE(need_unref);
1109 EXPECT_TRUE(second_task);
1110 EXPECT_TRUE(first_task.get() != second_task.get());
1111
1112 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get());
1113 TestTileTaskRunner::ProcessTask(second_task.get());
1114
1115 controller.UnrefImage(second_draw_image);
1116
1117 // The budget should account for both images one image.
1118 EXPECT_EQ(controller.GetBytesUsedForTesting(),
1119 controller.GetDrawImageSizeForTesting(second_draw_image) +
1120 controller.GetDrawImageSizeForTesting(first_draw_image));
1121
1122 // Unref the first image, it was orphaned, so it should be immediately
1123 // deleted.
1124 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get());
1125 TestTileTaskRunner::ProcessTask(first_task.get());
1126 controller.UnrefImage(first_draw_image);
1127
1128 // The budget should account for exactly one image.
1129 EXPECT_EQ(controller.GetBytesUsedForTesting(),
1130 controller.GetDrawImageSizeForTesting(second_draw_image));
1131 }
1132
1133 TEST(GpuImageDecodeControllerTest, OrphanedZeroRefImagesImmediatelyDeleted) {
1134 auto context_provider = TestContextProvider::Create();
1135 context_provider->BindToCurrentThread();
1136 TestGpuImageDecodeController controller(context_provider.get());
1137 bool is_decomposable = true;
1138 SkFilterQuality quality = kHigh_SkFilterQuality;
1139
1140 // Create a downscaled image.
1141 sk_sp<SkImage> first_image = CreateImage(100, 100);
1142 DrawImage first_draw_image(
1143 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()),
1144 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
1145 scoped_refptr<TileTask> first_task;
1146 bool need_unref = controller.GetTaskForImageAndRef(
1147 first_draw_image, ImageDecodeController::TracingInfo(), &first_task);
1148 EXPECT_TRUE(need_unref);
1149 EXPECT_TRUE(first_task);
1150
1151 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get());
1152 TestTileTaskRunner::ProcessTask(first_task.get());
1153 controller.UnrefImage(first_draw_image);
1154
1155 // The budget should account for exactly one image.
1156 EXPECT_EQ(controller.GetBytesUsedForTesting(),
1157 controller.GetDrawImageSizeForTesting(first_draw_image));
1158
1159 // Create a larger version of |first_image|, this should immediately free the
1160 // memory used by |first_image| for the smaller scale.
1161 DrawImage second_draw_image(
1162 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()),
1163 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable));
1164 scoped_refptr<TileTask> second_task;
1165 need_unref = controller.GetTaskForImageAndRef(
1166 second_draw_image, ImageDecodeController::TracingInfo(), &second_task);
1167 EXPECT_TRUE(need_unref);
1168 EXPECT_TRUE(second_task);
1169 EXPECT_TRUE(first_task.get() != second_task.get());
1170
1171 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get());
1172 TestTileTaskRunner::ProcessTask(second_task.get());
1173
1174 controller.UnrefImage(second_draw_image);
1175
1176 // The budget should account for exactly one image.
1177 EXPECT_EQ(controller.GetBytesUsedForTesting(),
1178 controller.GetDrawImageSizeForTesting(second_draw_image));
1179 }
1180
1181 TEST(GpuImageDecodeControllerTest, QualityCappedAtMedium) {
1182 auto context_provider = TestContextProvider::Create();
1183 context_provider->BindToCurrentThread();
1184 TestGpuImageDecodeController controller(context_provider.get());
1185 sk_sp<SkImage> image = CreateImage(100, 100);
1186 bool is_decomposable = true;
1187 SkMatrix matrix = CreateMatrix(SkSize::Make(0.4f, 0.4f), is_decomposable);
1188
1189 // Create an image with kLow_FilterQuality.
1190 DrawImage low_draw_image(image,
1191 SkIRect::MakeWH(image->width(), image->height()),
1192 kLow_SkFilterQuality, matrix);
1193 scoped_refptr<TileTask> low_task;
1194 bool need_unref = controller.GetTaskForImageAndRef(
1195 low_draw_image, ImageDecodeController::TracingInfo(), &low_task);
1196 EXPECT_TRUE(need_unref);
1197 EXPECT_TRUE(low_task);
1198
1199 // Get the same image at kMedium_FilterQuality. We can't re-use low, so we
1200 // should get a new task/ref.
1201 DrawImage medium_draw_image(image,
1202 SkIRect::MakeWH(image->width(), image->height()),
1203 kMedium_SkFilterQuality, matrix);
1204 scoped_refptr<TileTask> medium_task;
1205 need_unref = controller.GetTaskForImageAndRef(
1206 medium_draw_image, ImageDecodeController::TracingInfo(), &medium_task);
1207 EXPECT_TRUE(need_unref);
1208 EXPECT_TRUE(medium_task.get());
1209 EXPECT_FALSE(low_task.get() == medium_task.get());
1210
1211 // Get the same image at kHigh_FilterQuality. We should re-use medium.
1212 DrawImage large_draw_image(image,
1213 SkIRect::MakeWH(image->width(), image->height()),
1214 kHigh_SkFilterQuality, matrix);
1215 scoped_refptr<TileTask> large_task;
1216 need_unref = controller.GetTaskForImageAndRef(
1217 large_draw_image, ImageDecodeController::TracingInfo(), &large_task);
1218 EXPECT_TRUE(need_unref);
1219 EXPECT_TRUE(medium_task.get() == large_task.get());
1220
1221 TestTileTaskRunner::ProcessTask(low_task->dependencies()[0].get());
1222 TestTileTaskRunner::ProcessTask(low_task.get());
1223 TestTileTaskRunner::ProcessTask(medium_task->dependencies()[0].get());
1224 TestTileTaskRunner::ProcessTask(medium_task.get());
1225
1226 controller.UnrefImage(low_draw_image);
1227 controller.UnrefImage(medium_draw_image);
1228 controller.UnrefImage(large_draw_image);
1229 }
1230
1231 } // namespace 729 } // namespace
1232 } // namespace cc 730 } // namespace cc
OLDNEW
« no previous file with comments | « cc/tiles/gpu_image_decode_controller.cc ('k') | third_party/WebKit/LayoutTests/TestExpectations » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698