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

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

Issue 2107883003: Revert of Add display-resolution caching to GPU IDC (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@drt
Patch Set: 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(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) { 470 TEST(GpuImageDecodeControllerTest, AtRasterUsedDirectlyIfSpaceAllows) {
668 auto context_provider = TestContextProvider::Create(); 471 auto context_provider = TestContextProvider::Create();
669 context_provider->BindToCurrentThread(); 472 context_provider->BindToCurrentThread();
670 TestGpuImageDecodeController controller(context_provider.get()); 473 TestGpuImageDecodeController controller(context_provider.get());
671 bool is_decomposable = true; 474 bool is_decomposable = true;
672 SkFilterQuality quality = kHigh_SkFilterQuality; 475 SkFilterQuality quality = kHigh_SkFilterQuality;
673 476
477 controller.SetCachedItemLimitForTesting(0);
478 controller.SetCachedBytesLimitForTesting(0);
479
674 sk_sp<SkImage> image = CreateImage(100, 100); 480 sk_sp<SkImage> image = CreateImage(100, 100);
675 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 481 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
676 quality, 482 quality,
677 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 483 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
484
678 scoped_refptr<TileTask> task; 485 scoped_refptr<TileTask> task;
679 bool need_unref = controller.GetTaskForImageAndRef( 486 bool need_unref = controller.GetTaskForImageAndRef(
680 draw_image, ImageDecodeController::TracingInfo(), &task); 487 draw_image, ImageDecodeController::TracingInfo(), &task);
681 EXPECT_TRUE(need_unref); 488 EXPECT_FALSE(need_unref);
682 EXPECT_TRUE(task); 489 EXPECT_FALSE(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 490
699 // Must hold context lock before calling GetDecodedImageForDraw / 491 // Must hold context lock before calling GetDecodedImageForDraw /
700 // DrawWithImageFinished. 492 // DrawWithImageFinished.
701 ContextProvider::ScopedContextLock context_lock(context_provider.get()); 493 ContextProvider::ScopedContextLock context_lock(context_provider.get());
702 DecodedDrawImage decoded_draw_image = 494 DecodedDrawImage decoded_draw_image =
703 controller.GetDecodedImageForDraw(draw_image); 495 controller.GetDecodedImageForDraw(draw_image);
704 EXPECT_TRUE(decoded_draw_image.image()); 496 EXPECT_TRUE(decoded_draw_image.image());
705 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); 497 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked());
706 EXPECT_FALSE(decoded_draw_image.is_at_raster_decode()); 498 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode());
707 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); 499 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image));
708 500
709 DecodedDrawImage larger_decoded_draw_image = 501 controller.SetCachedItemLimitForTesting(1000);
710 controller.GetDecodedImageForDraw(larger_draw_image); 502 controller.SetCachedBytesLimitForTesting(96 * 1024 * 1024);
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 503
716 EXPECT_FALSE(decoded_draw_image.image() == larger_decoded_draw_image.image()); 504 // Finish our draw after increasing the memory limit, image should be added to
505 // cache.
506 controller.DrawWithImageFinished(draw_image, decoded_draw_image);
717 507
718 controller.DrawWithImageFinished(draw_image, decoded_draw_image); 508 scoped_refptr<TileTask> another_task;
509 bool another_task_needs_unref = controller.GetTaskForImageAndRef(
510 draw_image, ImageDecodeController::TracingInfo(), &task);
511 EXPECT_TRUE(another_task_needs_unref);
512 EXPECT_FALSE(another_task);
719 controller.UnrefImage(draw_image); 513 controller.UnrefImage(draw_image);
720 controller.DrawWithImageFinished(larger_draw_image,
721 larger_decoded_draw_image);
722 controller.UnrefImage(larger_draw_image);
723 } 514 }
724 515
725 TEST(GpuImageDecodeControllerTest, GetDecodedImageForDrawHigherQuality) { 516 TEST(GpuImageDecodeControllerTest,
517 GetDecodedImageForDrawAtRasterDecodeMultipleTimes) {
726 auto context_provider = TestContextProvider::Create(); 518 auto context_provider = TestContextProvider::Create();
727 context_provider->BindToCurrentThread(); 519 context_provider->BindToCurrentThread();
728 TestGpuImageDecodeController controller(context_provider.get()); 520 TestGpuImageDecodeController controller(context_provider.get());
729 bool is_decomposable = true; 521 bool is_decomposable = true;
730 SkMatrix matrix = CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable); 522 SkFilterQuality quality = kHigh_SkFilterQuality;
523
524 controller.SetCachedItemLimitForTesting(0);
525 controller.SetCachedBytesLimitForTesting(0);
731 526
732 sk_sp<SkImage> image = CreateImage(100, 100); 527 sk_sp<SkImage> image = CreateImage(100, 100);
733 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 528 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
734 kLow_SkFilterQuality, matrix); 529 quality,
735 scoped_refptr<TileTask> task; 530 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
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 531
757 // Must hold context lock before calling GetDecodedImageForDraw / 532 // Must hold context lock before calling GetDecodedImageForDraw /
758 // DrawWithImageFinished. 533 // DrawWithImageFinished.
759 ContextProvider::ScopedContextLock context_lock(context_provider.get()); 534 ContextProvider::ScopedContextLock context_lock(context_provider.get());
760 DecodedDrawImage decoded_draw_image = 535 DecodedDrawImage decoded_draw_image =
761 controller.GetDecodedImageForDraw(draw_image); 536 controller.GetDecodedImageForDraw(draw_image);
762 EXPECT_TRUE(decoded_draw_image.image()); 537 EXPECT_TRUE(decoded_draw_image.image());
763 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); 538 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
857 TEST(GpuImageDecodeControllerTest, AtRasterUsedDirectlyIfSpaceAllows) {
858 auto context_provider = TestContextProvider::Create();
859 context_provider->BindToCurrentThread();
860 TestGpuImageDecodeController controller(context_provider.get());
861 bool is_decomposable = true;
862 SkFilterQuality quality = kHigh_SkFilterQuality;
863
864 controller.SetCachedItemLimitForTesting(0);
865 controller.SetCachedBytesLimitForTesting(0);
866
867 sk_sp<SkImage> image = CreateImage(100, 100);
868 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
869 quality,
870 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
871
872 scoped_refptr<TileTask> task;
873 bool need_unref = controller.GetTaskForImageAndRef(
874 draw_image, ImageDecodeController::TracingInfo(), &task);
875 EXPECT_FALSE(need_unref);
876 EXPECT_FALSE(task);
877
878 // Must hold context lock before calling GetDecodedImageForDraw /
879 // DrawWithImageFinished.
880 ContextProvider::ScopedContextLock context_lock(context_provider.get());
881 DecodedDrawImage decoded_draw_image =
882 controller.GetDecodedImageForDraw(draw_image);
883 EXPECT_TRUE(decoded_draw_image.image());
884 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked());
885 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode());
886 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image));
887
888 controller.SetCachedItemLimitForTesting(1000);
889 controller.SetCachedBytesLimitForTesting(96 * 1024 * 1024);
890
891 // Finish our draw after increasing the memory limit, image should be added to
892 // cache.
893 controller.DrawWithImageFinished(draw_image, decoded_draw_image);
894
895 scoped_refptr<TileTask> another_task;
896 bool another_task_needs_unref = controller.GetTaskForImageAndRef(
897 draw_image, ImageDecodeController::TracingInfo(), &task);
898 EXPECT_TRUE(another_task_needs_unref);
899 EXPECT_FALSE(another_task);
900 controller.UnrefImage(draw_image);
901 }
902
903 TEST(GpuImageDecodeControllerTest,
904 GetDecodedImageForDrawAtRasterDecodeMultipleTimes) {
905 auto context_provider = TestContextProvider::Create();
906 context_provider->BindToCurrentThread();
907 TestGpuImageDecodeController controller(context_provider.get());
908 bool is_decomposable = true;
909 SkFilterQuality quality = kHigh_SkFilterQuality;
910
911 controller.SetCachedItemLimitForTesting(0);
912 controller.SetCachedBytesLimitForTesting(0);
913
914 sk_sp<SkImage> image = CreateImage(100, 100);
915 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
916 quality,
917 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
918
919 // Must hold context lock before calling GetDecodedImageForDraw /
920 // DrawWithImageFinished.
921 ContextProvider::ScopedContextLock context_lock(context_provider.get());
922 DecodedDrawImage decoded_draw_image =
923 controller.GetDecodedImageForDraw(draw_image);
924 EXPECT_TRUE(decoded_draw_image.image());
925 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked());
926 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode()); 539 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode());
927 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); 540 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image));
928 541
929 DecodedDrawImage another_decoded_draw_image = 542 DecodedDrawImage another_decoded_draw_image =
930 controller.GetDecodedImageForDraw(draw_image); 543 controller.GetDecodedImageForDraw(draw_image);
931 EXPECT_EQ(decoded_draw_image.image()->uniqueID(), 544 EXPECT_EQ(decoded_draw_image.image()->uniqueID(),
932 another_decoded_draw_image.image()->uniqueID()); 545 another_decoded_draw_image.image()->uniqueID());
933 546
934 controller.DrawWithImageFinished(draw_image, decoded_draw_image); 547 controller.DrawWithImageFinished(draw_image, decoded_draw_image);
935 controller.DrawWithImageFinished(draw_image, another_decoded_draw_image); 548 controller.DrawWithImageFinished(draw_image, another_decoded_draw_image);
936 } 549 }
937 550
938 TEST(GpuImageDecodeControllerTest, 551 TEST(GpuImageDecodeControllerTest,
939 GetLargeDecodedImageForDrawAtRasterDecodeMultipleTimes) { 552 GetLargeDecodedImageForDrawAtRasterDecodeMultipleTimes) {
940 auto context_provider = TestContextProvider::Create(); 553 auto context_provider = TestContextProvider::Create();
941 context_provider->BindToCurrentThread(); 554 context_provider->BindToCurrentThread();
942 TestGpuImageDecodeController controller(context_provider.get()); 555 TestGpuImageDecodeController controller(context_provider.get());
943 bool is_decomposable = true; 556 bool is_decomposable = true;
944 SkFilterQuality quality = kHigh_SkFilterQuality; 557 SkFilterQuality quality = kHigh_SkFilterQuality;
945 558
946 sk_sp<SkImage> image = CreateImage(1, 24000); 559 sk_sp<SkImage> image = CreateImage(1, 24000);
947 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 560 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
948 quality, 561 quality,
949 CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); 562 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
950 563
951 // Must hold context lock before calling GetDecodedImageForDraw / 564 // Must hold context lock before calling GetDecodedImageForDraw /
952 // DrawWithImageFinished. 565 // DrawWithImageFinished.
953 ContextProvider::ScopedContextLock context_lock(context_provider.get()); 566 ContextProvider::ScopedContextLock context_lock(context_provider.get());
954 DecodedDrawImage decoded_draw_image = 567 DecodedDrawImage decoded_draw_image =
955 controller.GetDecodedImageForDraw(draw_image); 568 controller.GetDecodedImageForDraw(draw_image);
956 EXPECT_TRUE(decoded_draw_image.image()); 569 EXPECT_TRUE(decoded_draw_image.image());
957 EXPECT_FALSE(decoded_draw_image.image()->isTextureBacked()); 570 EXPECT_FALSE(decoded_draw_image.image()->isTextureBacked());
958 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode()); 571 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode());
959 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
1106 } 719 }
1107 720
1108 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); 721 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get());
1109 TestTileTaskRunner::ProcessTask(task.get()); 722 TestTileTaskRunner::ProcessTask(task.get());
1110 723
1111 // The image should be in our cache after un-ref. 724 // The image should be in our cache after un-ref.
1112 controller.UnrefImage(draw_image); 725 controller.UnrefImage(draw_image);
1113 DCHECK_GT(controller.GetBytesUsedForTesting(), 0u); 726 DCHECK_GT(controller.GetBytesUsedForTesting(), 0u);
1114 } 727 }
1115 728
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
1269 } // namespace 729 } // namespace
1270 } // namespace cc 730 } // 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