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

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

Issue 2797583002: cc: Add color space to image decode caches (Closed)
Patch Set: Remove dead code Created 3 years, 8 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_cache.cc ('k') | cc/tiles/image_controller.cc » ('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_cache.h" 5 #include "cc/tiles/gpu_image_decode_cache.h"
6 6
7 #include "cc/paint/draw_image.h" 7 #include "cc/paint/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"
11 #include "third_party/skia/include/core/SkRefCnt.h" 11 #include "third_party/skia/include/core/SkRefCnt.h"
12 12
13 namespace cc { 13 namespace cc {
14 namespace { 14 namespace {
15 15
16 gfx::ColorSpace DefaultColorSpace() {
17 return gfx::ColorSpace::CreateSRGB();
18 }
19
16 size_t kGpuMemoryLimitBytes = 96 * 1024 * 1024; 20 size_t kGpuMemoryLimitBytes = 96 * 1024 * 1024;
17 class TestGpuImageDecodeCache : public GpuImageDecodeCache { 21 class TestGpuImageDecodeCache : public GpuImageDecodeCache {
18 public: 22 public:
19 explicit TestGpuImageDecodeCache(ContextProvider* context) 23 explicit TestGpuImageDecodeCache(ContextProvider* context)
20 : GpuImageDecodeCache(context, 24 : GpuImageDecodeCache(context,
21 ResourceFormat::RGBA_8888, 25 ResourceFormat::RGBA_8888,
22 kGpuMemoryLimitBytes, 26 kGpuMemoryLimitBytes,
23 kGpuMemoryLimitBytes) {} 27 kGpuMemoryLimitBytes) {}
24 }; 28 };
25 29
26 sk_sp<SkImage> CreateImage(int width, int height) { 30 sk_sp<SkImage> CreateImage(int width, int height) {
27 SkBitmap bitmap; 31 SkBitmap bitmap;
28 bitmap.allocPixels(SkImageInfo::MakeN32Premul(width, height)); 32 gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB();
33 bitmap.allocPixels(
34 SkImageInfo::MakeN32Premul(width, height, color_space.ToSkColorSpace()));
29 return SkImage::MakeFromBitmap(bitmap); 35 return SkImage::MakeFromBitmap(bitmap);
30 } 36 }
31 37
32 SkMatrix CreateMatrix(const SkSize& scale, bool is_decomposable) { 38 SkMatrix CreateMatrix(const SkSize& scale, bool is_decomposable) {
33 SkMatrix matrix; 39 SkMatrix matrix;
34 matrix.setScale(scale.width(), scale.height()); 40 matrix.setScale(scale.width(), scale.height());
35 41
36 if (!is_decomposable) { 42 if (!is_decomposable) {
37 // Perspective is not decomposable, add it. 43 // Perspective is not decomposable, add it.
38 matrix[SkMatrix::kMPersp0] = 0.1f; 44 matrix[SkMatrix::kMPersp0] = 0.1f;
39 } 45 }
40 46
41 return matrix; 47 return matrix;
42 } 48 }
43 49
44 TEST(GpuImageDecodeCacheTest, GetTaskForImageSameImage) { 50 TEST(GpuImageDecodeCacheTest, GetTaskForImageSameImage) {
45 auto context_provider = TestContextProvider::Create(); 51 auto context_provider = TestContextProvider::Create();
46 context_provider->BindToCurrentThread(); 52 context_provider->BindToCurrentThread();
47 TestGpuImageDecodeCache cache(context_provider.get()); 53 TestGpuImageDecodeCache cache(context_provider.get());
48 sk_sp<SkImage> image = CreateImage(100, 100); 54 sk_sp<SkImage> image = CreateImage(100, 100);
49 bool is_decomposable = true; 55 bool is_decomposable = true;
50 SkFilterQuality quality = kHigh_SkFilterQuality; 56 SkFilterQuality quality = kHigh_SkFilterQuality;
51 57
52 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 58 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
53 quality, 59 quality,
54 CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable)); 60 CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable),
61 DefaultColorSpace());
55 scoped_refptr<TileTask> task; 62 scoped_refptr<TileTask> task;
56 bool need_unref = cache.GetTaskForImageAndRef( 63 bool need_unref = cache.GetTaskForImageAndRef(
57 draw_image, ImageDecodeCache::TracingInfo(), &task); 64 draw_image, ImageDecodeCache::TracingInfo(), &task);
58 EXPECT_TRUE(need_unref); 65 EXPECT_TRUE(need_unref);
59 EXPECT_TRUE(task); 66 EXPECT_TRUE(task);
60 67
61 DrawImage another_draw_image( 68 DrawImage another_draw_image(
62 image, SkIRect::MakeWH(image->width(), image->height()), quality, 69 image, SkIRect::MakeWH(image->width(), image->height()), quality,
63 CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable)); 70 CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable),
71 DefaultColorSpace());
64 scoped_refptr<TileTask> another_task; 72 scoped_refptr<TileTask> another_task;
65 need_unref = cache.GetTaskForImageAndRef( 73 need_unref = cache.GetTaskForImageAndRef(
66 another_draw_image, ImageDecodeCache::TracingInfo(), &another_task); 74 another_draw_image, ImageDecodeCache::TracingInfo(), &another_task);
67 EXPECT_TRUE(need_unref); 75 EXPECT_TRUE(need_unref);
68 EXPECT_TRUE(task.get() == another_task.get()); 76 EXPECT_TRUE(task.get() == another_task.get());
69 77
70 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); 78 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get());
71 TestTileTaskRunner::ProcessTask(task.get()); 79 TestTileTaskRunner::ProcessTask(task.get());
72 80
73 cache.UnrefImage(draw_image); 81 cache.UnrefImage(draw_image);
74 cache.UnrefImage(draw_image); 82 cache.UnrefImage(draw_image);
75 } 83 }
76 84
77 TEST(GpuImageDecodeCacheTest, GetTaskForImageSmallerScale) { 85 TEST(GpuImageDecodeCacheTest, GetTaskForImageSmallerScale) {
78 auto context_provider = TestContextProvider::Create(); 86 auto context_provider = TestContextProvider::Create();
79 context_provider->BindToCurrentThread(); 87 context_provider->BindToCurrentThread();
80 TestGpuImageDecodeCache cache(context_provider.get()); 88 TestGpuImageDecodeCache cache(context_provider.get());
81 sk_sp<SkImage> image = CreateImage(100, 100); 89 sk_sp<SkImage> image = CreateImage(100, 100);
82 bool is_decomposable = true; 90 bool is_decomposable = true;
83 SkFilterQuality quality = kHigh_SkFilterQuality; 91 SkFilterQuality quality = kHigh_SkFilterQuality;
84 92
85 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 93 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
86 quality, 94 quality,
87 CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable)); 95 CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable),
96 DefaultColorSpace());
88 scoped_refptr<TileTask> task; 97 scoped_refptr<TileTask> task;
89 bool need_unref = cache.GetTaskForImageAndRef( 98 bool need_unref = cache.GetTaskForImageAndRef(
90 draw_image, ImageDecodeCache::TracingInfo(), &task); 99 draw_image, ImageDecodeCache::TracingInfo(), &task);
91 EXPECT_TRUE(need_unref); 100 EXPECT_TRUE(need_unref);
92 EXPECT_TRUE(task); 101 EXPECT_TRUE(task);
93 102
94 DrawImage another_draw_image( 103 DrawImage another_draw_image(
95 image, SkIRect::MakeWH(image->width(), image->height()), quality, 104 image, SkIRect::MakeWH(image->width(), image->height()), quality,
96 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 105 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable),
106 DefaultColorSpace());
97 scoped_refptr<TileTask> another_task; 107 scoped_refptr<TileTask> another_task;
98 need_unref = cache.GetTaskForImageAndRef( 108 need_unref = cache.GetTaskForImageAndRef(
99 another_draw_image, ImageDecodeCache::TracingInfo(), &another_task); 109 another_draw_image, ImageDecodeCache::TracingInfo(), &another_task);
100 EXPECT_TRUE(need_unref); 110 EXPECT_TRUE(need_unref);
101 EXPECT_TRUE(task.get() == another_task.get()); 111 EXPECT_TRUE(task.get() == another_task.get());
102 112
103 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); 113 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get());
104 TestTileTaskRunner::ProcessTask(task.get()); 114 TestTileTaskRunner::ProcessTask(task.get());
105 115
106 cache.UnrefImage(draw_image); 116 cache.UnrefImage(draw_image);
107 cache.UnrefImage(another_draw_image); 117 cache.UnrefImage(another_draw_image);
108 } 118 }
109 119
110 TEST(GpuImageDecodeCacheTest, GetTaskForImageLowerQuality) { 120 TEST(GpuImageDecodeCacheTest, GetTaskForImageLowerQuality) {
111 auto context_provider = TestContextProvider::Create(); 121 auto context_provider = TestContextProvider::Create();
112 context_provider->BindToCurrentThread(); 122 context_provider->BindToCurrentThread();
113 TestGpuImageDecodeCache cache(context_provider.get()); 123 TestGpuImageDecodeCache cache(context_provider.get());
114 sk_sp<SkImage> image = CreateImage(100, 100); 124 sk_sp<SkImage> image = CreateImage(100, 100);
115 bool is_decomposable = true; 125 bool is_decomposable = true;
116 SkMatrix matrix = CreateMatrix(SkSize::Make(0.4f, 0.4f), is_decomposable); 126 SkMatrix matrix = CreateMatrix(SkSize::Make(0.4f, 0.4f), is_decomposable);
117 127
118 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 128 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
119 kHigh_SkFilterQuality, matrix); 129 kHigh_SkFilterQuality, matrix, DefaultColorSpace());
120 scoped_refptr<TileTask> task; 130 scoped_refptr<TileTask> task;
121 bool need_unref = cache.GetTaskForImageAndRef( 131 bool need_unref = cache.GetTaskForImageAndRef(
122 draw_image, ImageDecodeCache::TracingInfo(), &task); 132 draw_image, ImageDecodeCache::TracingInfo(), &task);
123 EXPECT_TRUE(need_unref); 133 EXPECT_TRUE(need_unref);
124 EXPECT_TRUE(task); 134 EXPECT_TRUE(task);
125 135
126 DrawImage another_draw_image(image, 136 DrawImage another_draw_image(
127 SkIRect::MakeWH(image->width(), image->height()), 137 image, SkIRect::MakeWH(image->width(), image->height()),
128 kLow_SkFilterQuality, matrix); 138 kLow_SkFilterQuality, matrix, DefaultColorSpace());
129 scoped_refptr<TileTask> another_task; 139 scoped_refptr<TileTask> another_task;
130 need_unref = cache.GetTaskForImageAndRef( 140 need_unref = cache.GetTaskForImageAndRef(
131 another_draw_image, ImageDecodeCache::TracingInfo(), &another_task); 141 another_draw_image, ImageDecodeCache::TracingInfo(), &another_task);
132 EXPECT_TRUE(need_unref); 142 EXPECT_TRUE(need_unref);
133 EXPECT_TRUE(task.get() == another_task.get()); 143 EXPECT_TRUE(task.get() == another_task.get());
134 144
135 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); 145 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get());
136 TestTileTaskRunner::ProcessTask(task.get()); 146 TestTileTaskRunner::ProcessTask(task.get());
137 147
138 cache.UnrefImage(draw_image); 148 cache.UnrefImage(draw_image);
139 cache.UnrefImage(another_draw_image); 149 cache.UnrefImage(another_draw_image);
140 } 150 }
141 151
142 TEST(GpuImageDecodeCacheTest, GetTaskForImageDifferentImage) { 152 TEST(GpuImageDecodeCacheTest, GetTaskForImageDifferentImage) {
143 auto context_provider = TestContextProvider::Create(); 153 auto context_provider = TestContextProvider::Create();
144 context_provider->BindToCurrentThread(); 154 context_provider->BindToCurrentThread();
145 TestGpuImageDecodeCache cache(context_provider.get()); 155 TestGpuImageDecodeCache cache(context_provider.get());
146 bool is_decomposable = true; 156 bool is_decomposable = true;
147 SkFilterQuality quality = kHigh_SkFilterQuality; 157 SkFilterQuality quality = kHigh_SkFilterQuality;
148 158
149 sk_sp<SkImage> first_image = CreateImage(100, 100); 159 sk_sp<SkImage> first_image = CreateImage(100, 100);
150 DrawImage first_draw_image( 160 DrawImage first_draw_image(
151 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), 161 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()),
152 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 162 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable),
163 DefaultColorSpace());
153 scoped_refptr<TileTask> first_task; 164 scoped_refptr<TileTask> first_task;
154 bool need_unref = cache.GetTaskForImageAndRef( 165 bool need_unref = cache.GetTaskForImageAndRef(
155 first_draw_image, ImageDecodeCache::TracingInfo(), &first_task); 166 first_draw_image, ImageDecodeCache::TracingInfo(), &first_task);
156 EXPECT_TRUE(need_unref); 167 EXPECT_TRUE(need_unref);
157 EXPECT_TRUE(first_task); 168 EXPECT_TRUE(first_task);
158 169
159 sk_sp<SkImage> second_image = CreateImage(100, 100); 170 sk_sp<SkImage> second_image = CreateImage(100, 100);
160 DrawImage second_draw_image( 171 DrawImage second_draw_image(
161 second_image, 172 second_image,
162 SkIRect::MakeWH(second_image->width(), second_image->height()), quality, 173 SkIRect::MakeWH(second_image->width(), second_image->height()), quality,
163 CreateMatrix(SkSize::Make(0.25f, 0.25f), is_decomposable)); 174 CreateMatrix(SkSize::Make(0.25f, 0.25f), is_decomposable),
175 DefaultColorSpace());
164 scoped_refptr<TileTask> second_task; 176 scoped_refptr<TileTask> second_task;
165 need_unref = cache.GetTaskForImageAndRef( 177 need_unref = cache.GetTaskForImageAndRef(
166 second_draw_image, ImageDecodeCache::TracingInfo(), &second_task); 178 second_draw_image, ImageDecodeCache::TracingInfo(), &second_task);
167 EXPECT_TRUE(need_unref); 179 EXPECT_TRUE(need_unref);
168 EXPECT_TRUE(second_task); 180 EXPECT_TRUE(second_task);
169 EXPECT_TRUE(first_task.get() != second_task.get()); 181 EXPECT_TRUE(first_task.get() != second_task.get());
170 182
171 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get()); 183 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get());
172 TestTileTaskRunner::ProcessTask(first_task.get()); 184 TestTileTaskRunner::ProcessTask(first_task.get());
173 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); 185 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get());
174 TestTileTaskRunner::ProcessTask(second_task.get()); 186 TestTileTaskRunner::ProcessTask(second_task.get());
175 187
176 cache.UnrefImage(first_draw_image); 188 cache.UnrefImage(first_draw_image);
177 cache.UnrefImage(second_draw_image); 189 cache.UnrefImage(second_draw_image);
178 } 190 }
179 191
180 TEST(GpuImageDecodeCacheTest, GetTaskForImageLargerScale) { 192 TEST(GpuImageDecodeCacheTest, GetTaskForImageLargerScale) {
181 auto context_provider = TestContextProvider::Create(); 193 auto context_provider = TestContextProvider::Create();
182 context_provider->BindToCurrentThread(); 194 context_provider->BindToCurrentThread();
183 TestGpuImageDecodeCache cache(context_provider.get()); 195 TestGpuImageDecodeCache cache(context_provider.get());
184 bool is_decomposable = true; 196 bool is_decomposable = true;
185 SkFilterQuality quality = kHigh_SkFilterQuality; 197 SkFilterQuality quality = kHigh_SkFilterQuality;
186 198
187 sk_sp<SkImage> first_image = CreateImage(100, 100); 199 sk_sp<SkImage> first_image = CreateImage(100, 100);
188 DrawImage first_draw_image( 200 DrawImage first_draw_image(
189 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), 201 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()),
190 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 202 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable),
203 DefaultColorSpace());
191 scoped_refptr<TileTask> first_task; 204 scoped_refptr<TileTask> first_task;
192 bool need_unref = cache.GetTaskForImageAndRef( 205 bool need_unref = cache.GetTaskForImageAndRef(
193 first_draw_image, ImageDecodeCache::TracingInfo(), &first_task); 206 first_draw_image, ImageDecodeCache::TracingInfo(), &first_task);
194 EXPECT_TRUE(need_unref); 207 EXPECT_TRUE(need_unref);
195 EXPECT_TRUE(first_task); 208 EXPECT_TRUE(first_task);
196 209
197 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get()); 210 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get());
198 TestTileTaskRunner::ProcessTask(first_task.get()); 211 TestTileTaskRunner::ProcessTask(first_task.get());
199 212
200 cache.UnrefImage(first_draw_image); 213 cache.UnrefImage(first_draw_image);
201 214
202 DrawImage second_draw_image( 215 DrawImage second_draw_image(
203 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), 216 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()),
204 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); 217 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable),
218 DefaultColorSpace());
205 scoped_refptr<TileTask> second_task; 219 scoped_refptr<TileTask> second_task;
206 need_unref = cache.GetTaskForImageAndRef( 220 need_unref = cache.GetTaskForImageAndRef(
207 second_draw_image, ImageDecodeCache::TracingInfo(), &second_task); 221 second_draw_image, ImageDecodeCache::TracingInfo(), &second_task);
208 EXPECT_TRUE(need_unref); 222 EXPECT_TRUE(need_unref);
209 EXPECT_TRUE(second_task); 223 EXPECT_TRUE(second_task);
210 EXPECT_TRUE(first_task.get() != second_task.get()); 224 EXPECT_TRUE(first_task.get() != second_task.get());
211 225
212 DrawImage third_draw_image( 226 DrawImage third_draw_image(
213 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), 227 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()),
214 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 228 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable),
229 DefaultColorSpace());
215 scoped_refptr<TileTask> third_task; 230 scoped_refptr<TileTask> third_task;
216 need_unref = cache.GetTaskForImageAndRef( 231 need_unref = cache.GetTaskForImageAndRef(
217 third_draw_image, ImageDecodeCache::TracingInfo(), &third_task); 232 third_draw_image, ImageDecodeCache::TracingInfo(), &third_task);
218 EXPECT_TRUE(need_unref); 233 EXPECT_TRUE(need_unref);
219 EXPECT_TRUE(third_task.get() == second_task.get()); 234 EXPECT_TRUE(third_task.get() == second_task.get());
220 235
221 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); 236 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get());
222 TestTileTaskRunner::ProcessTask(second_task.get()); 237 TestTileTaskRunner::ProcessTask(second_task.get());
223 238
224 cache.UnrefImage(second_draw_image); 239 cache.UnrefImage(second_draw_image);
225 cache.UnrefImage(third_draw_image); 240 cache.UnrefImage(third_draw_image);
226 } 241 }
227 242
228 TEST(GpuImageDecodeCacheTest, GetTaskForImageLargerScaleNoReuse) { 243 TEST(GpuImageDecodeCacheTest, GetTaskForImageLargerScaleNoReuse) {
229 auto context_provider = TestContextProvider::Create(); 244 auto context_provider = TestContextProvider::Create();
230 context_provider->BindToCurrentThread(); 245 context_provider->BindToCurrentThread();
231 TestGpuImageDecodeCache cache(context_provider.get()); 246 TestGpuImageDecodeCache cache(context_provider.get());
232 bool is_decomposable = true; 247 bool is_decomposable = true;
233 SkFilterQuality quality = kHigh_SkFilterQuality; 248 SkFilterQuality quality = kHigh_SkFilterQuality;
234 249
235 sk_sp<SkImage> first_image = CreateImage(100, 100); 250 sk_sp<SkImage> first_image = CreateImage(100, 100);
236 DrawImage first_draw_image( 251 DrawImage first_draw_image(
237 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), 252 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()),
238 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 253 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable),
254 DefaultColorSpace());
239 scoped_refptr<TileTask> first_task; 255 scoped_refptr<TileTask> first_task;
240 bool need_unref = cache.GetTaskForImageAndRef( 256 bool need_unref = cache.GetTaskForImageAndRef(
241 first_draw_image, ImageDecodeCache::TracingInfo(), &first_task); 257 first_draw_image, ImageDecodeCache::TracingInfo(), &first_task);
242 EXPECT_TRUE(need_unref); 258 EXPECT_TRUE(need_unref);
243 EXPECT_TRUE(first_task); 259 EXPECT_TRUE(first_task);
244 260
245 DrawImage second_draw_image( 261 DrawImage second_draw_image(
246 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), 262 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()),
247 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); 263 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable),
264 DefaultColorSpace());
248 scoped_refptr<TileTask> second_task; 265 scoped_refptr<TileTask> second_task;
249 need_unref = cache.GetTaskForImageAndRef( 266 need_unref = cache.GetTaskForImageAndRef(
250 second_draw_image, ImageDecodeCache::TracingInfo(), &second_task); 267 second_draw_image, ImageDecodeCache::TracingInfo(), &second_task);
251 EXPECT_TRUE(need_unref); 268 EXPECT_TRUE(need_unref);
252 EXPECT_TRUE(second_task); 269 EXPECT_TRUE(second_task);
253 EXPECT_TRUE(first_task.get() != second_task.get()); 270 EXPECT_TRUE(first_task.get() != second_task.get());
254 271
255 DrawImage third_draw_image( 272 DrawImage third_draw_image(
256 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), 273 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()),
257 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 274 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable),
275 DefaultColorSpace());
258 scoped_refptr<TileTask> third_task; 276 scoped_refptr<TileTask> third_task;
259 need_unref = cache.GetTaskForImageAndRef( 277 need_unref = cache.GetTaskForImageAndRef(
260 third_draw_image, ImageDecodeCache::TracingInfo(), &third_task); 278 third_draw_image, ImageDecodeCache::TracingInfo(), &third_task);
261 EXPECT_TRUE(need_unref); 279 EXPECT_TRUE(need_unref);
262 EXPECT_TRUE(third_task.get() == first_task.get()); 280 EXPECT_TRUE(third_task.get() == first_task.get());
263 281
264 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get()); 282 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get());
265 TestTileTaskRunner::ProcessTask(first_task.get()); 283 TestTileTaskRunner::ProcessTask(first_task.get());
266 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); 284 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get());
267 TestTileTaskRunner::ProcessTask(second_task.get()); 285 TestTileTaskRunner::ProcessTask(second_task.get());
268 286
269 cache.UnrefImage(first_draw_image); 287 cache.UnrefImage(first_draw_image);
270 cache.UnrefImage(second_draw_image); 288 cache.UnrefImage(second_draw_image);
271 cache.UnrefImage(third_draw_image); 289 cache.UnrefImage(third_draw_image);
272 } 290 }
273 291
274 TEST(GpuImageDecodeCacheTest, GetTaskForImageHigherQuality) { 292 TEST(GpuImageDecodeCacheTest, GetTaskForImageHigherQuality) {
275 auto context_provider = TestContextProvider::Create(); 293 auto context_provider = TestContextProvider::Create();
276 context_provider->BindToCurrentThread(); 294 context_provider->BindToCurrentThread();
277 TestGpuImageDecodeCache cache(context_provider.get()); 295 TestGpuImageDecodeCache cache(context_provider.get());
278 bool is_decomposable = true; 296 bool is_decomposable = true;
279 SkMatrix matrix = CreateMatrix(SkSize::Make(0.4f, 0.4f), is_decomposable); 297 SkMatrix matrix = CreateMatrix(SkSize::Make(0.4f, 0.4f), is_decomposable);
280 298
281 sk_sp<SkImage> first_image = CreateImage(100, 100); 299 sk_sp<SkImage> first_image = CreateImage(100, 100);
282 DrawImage first_draw_image( 300 DrawImage first_draw_image(
283 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), 301 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()),
284 kLow_SkFilterQuality, matrix); 302 kLow_SkFilterQuality, matrix, DefaultColorSpace());
285 scoped_refptr<TileTask> first_task; 303 scoped_refptr<TileTask> first_task;
286 bool need_unref = cache.GetTaskForImageAndRef( 304 bool need_unref = cache.GetTaskForImageAndRef(
287 first_draw_image, ImageDecodeCache::TracingInfo(), &first_task); 305 first_draw_image, ImageDecodeCache::TracingInfo(), &first_task);
288 EXPECT_TRUE(need_unref); 306 EXPECT_TRUE(need_unref);
289 EXPECT_TRUE(first_task); 307 EXPECT_TRUE(first_task);
290 308
291 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get()); 309 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get());
292 TestTileTaskRunner::ProcessTask(first_task.get()); 310 TestTileTaskRunner::ProcessTask(first_task.get());
293 311
294 cache.UnrefImage(first_draw_image); 312 cache.UnrefImage(first_draw_image);
295 313
296 DrawImage second_draw_image( 314 DrawImage second_draw_image(
297 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), 315 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()),
298 kHigh_SkFilterQuality, matrix); 316 kHigh_SkFilterQuality, matrix, DefaultColorSpace());
299 scoped_refptr<TileTask> second_task; 317 scoped_refptr<TileTask> second_task;
300 need_unref = cache.GetTaskForImageAndRef( 318 need_unref = cache.GetTaskForImageAndRef(
301 second_draw_image, ImageDecodeCache::TracingInfo(), &second_task); 319 second_draw_image, ImageDecodeCache::TracingInfo(), &second_task);
302 EXPECT_TRUE(need_unref); 320 EXPECT_TRUE(need_unref);
303 EXPECT_TRUE(second_task); 321 EXPECT_TRUE(second_task);
304 EXPECT_TRUE(first_task.get() != second_task.get()); 322 EXPECT_TRUE(first_task.get() != second_task.get());
305 323
306 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); 324 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get());
307 TestTileTaskRunner::ProcessTask(second_task.get()); 325 TestTileTaskRunner::ProcessTask(second_task.get());
308 326
309 cache.UnrefImage(second_draw_image); 327 cache.UnrefImage(second_draw_image);
310 } 328 }
311 329
312 TEST(GpuImageDecodeCacheTest, GetTaskForImageAlreadyDecodedAndLocked) { 330 TEST(GpuImageDecodeCacheTest, GetTaskForImageAlreadyDecodedAndLocked) {
313 auto context_provider = TestContextProvider::Create(); 331 auto context_provider = TestContextProvider::Create();
314 context_provider->BindToCurrentThread(); 332 context_provider->BindToCurrentThread();
315 TestGpuImageDecodeCache cache(context_provider.get()); 333 TestGpuImageDecodeCache cache(context_provider.get());
316 bool is_decomposable = true; 334 bool is_decomposable = true;
317 SkFilterQuality quality = kHigh_SkFilterQuality; 335 SkFilterQuality quality = kHigh_SkFilterQuality;
318 336
319 sk_sp<SkImage> image = CreateImage(100, 100); 337 sk_sp<SkImage> image = CreateImage(100, 100);
320 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 338 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
321 quality, 339 quality,
322 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 340 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable),
341 DefaultColorSpace());
323 scoped_refptr<TileTask> task; 342 scoped_refptr<TileTask> task;
324 bool need_unref = cache.GetTaskForImageAndRef( 343 bool need_unref = cache.GetTaskForImageAndRef(
325 draw_image, ImageDecodeCache::TracingInfo(), &task); 344 draw_image, ImageDecodeCache::TracingInfo(), &task);
326 EXPECT_TRUE(need_unref); 345 EXPECT_TRUE(need_unref);
327 EXPECT_TRUE(task); 346 EXPECT_TRUE(task);
328 EXPECT_EQ(task->dependencies().size(), 1u); 347 EXPECT_EQ(task->dependencies().size(), 1u);
329 EXPECT_TRUE(task->dependencies()[0]); 348 EXPECT_TRUE(task->dependencies()[0]);
330 349
331 // Run the decode but don't complete it (this will keep the decode locked). 350 // Run the decode but don't complete it (this will keep the decode locked).
332 TestTileTaskRunner::ScheduleTask(task->dependencies()[0].get()); 351 TestTileTaskRunner::ScheduleTask(task->dependencies()[0].get());
(...skipping 24 matching lines...) Expand all
357 TEST(GpuImageDecodeCacheTest, GetTaskForImageAlreadyDecodedNotLocked) { 376 TEST(GpuImageDecodeCacheTest, GetTaskForImageAlreadyDecodedNotLocked) {
358 auto context_provider = TestContextProvider::Create(); 377 auto context_provider = TestContextProvider::Create();
359 context_provider->BindToCurrentThread(); 378 context_provider->BindToCurrentThread();
360 TestGpuImageDecodeCache cache(context_provider.get()); 379 TestGpuImageDecodeCache cache(context_provider.get());
361 bool is_decomposable = true; 380 bool is_decomposable = true;
362 SkFilterQuality quality = kHigh_SkFilterQuality; 381 SkFilterQuality quality = kHigh_SkFilterQuality;
363 382
364 sk_sp<SkImage> image = CreateImage(100, 100); 383 sk_sp<SkImage> image = CreateImage(100, 100);
365 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 384 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
366 quality, 385 quality,
367 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 386 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable),
387 DefaultColorSpace());
368 scoped_refptr<TileTask> task; 388 scoped_refptr<TileTask> task;
369 bool need_unref = cache.GetTaskForImageAndRef( 389 bool need_unref = cache.GetTaskForImageAndRef(
370 draw_image, ImageDecodeCache::TracingInfo(), &task); 390 draw_image, ImageDecodeCache::TracingInfo(), &task);
371 EXPECT_TRUE(need_unref); 391 EXPECT_TRUE(need_unref);
372 EXPECT_TRUE(task); 392 EXPECT_TRUE(task);
373 EXPECT_EQ(task->dependencies().size(), 1u); 393 EXPECT_EQ(task->dependencies().size(), 1u);
374 EXPECT_TRUE(task->dependencies()[0]); 394 EXPECT_TRUE(task->dependencies()[0]);
375 395
376 // Run the decode. 396 // Run the decode.
377 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); 397 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get());
(...skipping 24 matching lines...) Expand all
402 TEST(GpuImageDecodeCacheTest, GetTaskForImageAlreadyUploaded) { 422 TEST(GpuImageDecodeCacheTest, GetTaskForImageAlreadyUploaded) {
403 auto context_provider = TestContextProvider::Create(); 423 auto context_provider = TestContextProvider::Create();
404 context_provider->BindToCurrentThread(); 424 context_provider->BindToCurrentThread();
405 TestGpuImageDecodeCache cache(context_provider.get()); 425 TestGpuImageDecodeCache cache(context_provider.get());
406 bool is_decomposable = true; 426 bool is_decomposable = true;
407 SkFilterQuality quality = kHigh_SkFilterQuality; 427 SkFilterQuality quality = kHigh_SkFilterQuality;
408 428
409 sk_sp<SkImage> image = CreateImage(100, 100); 429 sk_sp<SkImage> image = CreateImage(100, 100);
410 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 430 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
411 quality, 431 quality,
412 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 432 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable),
433 DefaultColorSpace());
413 scoped_refptr<TileTask> task; 434 scoped_refptr<TileTask> task;
414 bool need_unref = cache.GetTaskForImageAndRef( 435 bool need_unref = cache.GetTaskForImageAndRef(
415 draw_image, ImageDecodeCache::TracingInfo(), &task); 436 draw_image, ImageDecodeCache::TracingInfo(), &task);
416 EXPECT_TRUE(need_unref); 437 EXPECT_TRUE(need_unref);
417 EXPECT_TRUE(task); 438 EXPECT_TRUE(task);
418 EXPECT_EQ(task->dependencies().size(), 1u); 439 EXPECT_EQ(task->dependencies().size(), 1u);
419 EXPECT_TRUE(task->dependencies()[0]); 440 EXPECT_TRUE(task->dependencies()[0]);
420 441
421 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); 442 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get());
422 TestTileTaskRunner::ScheduleTask(task.get()); 443 TestTileTaskRunner::ScheduleTask(task.get());
(...skipping 14 matching lines...) Expand all
437 TEST(GpuImageDecodeCacheTest, GetTaskForImageCanceledGetsNewTask) { 458 TEST(GpuImageDecodeCacheTest, GetTaskForImageCanceledGetsNewTask) {
438 auto context_provider = TestContextProvider::Create(); 459 auto context_provider = TestContextProvider::Create();
439 context_provider->BindToCurrentThread(); 460 context_provider->BindToCurrentThread();
440 TestGpuImageDecodeCache cache(context_provider.get()); 461 TestGpuImageDecodeCache cache(context_provider.get());
441 bool is_decomposable = true; 462 bool is_decomposable = true;
442 SkFilterQuality quality = kHigh_SkFilterQuality; 463 SkFilterQuality quality = kHigh_SkFilterQuality;
443 464
444 sk_sp<SkImage> image = CreateImage(100, 100); 465 sk_sp<SkImage> image = CreateImage(100, 100);
445 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 466 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
446 quality, 467 quality,
447 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 468 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable),
469 DefaultColorSpace());
448 scoped_refptr<TileTask> task; 470 scoped_refptr<TileTask> task;
449 bool need_unref = cache.GetTaskForImageAndRef( 471 bool need_unref = cache.GetTaskForImageAndRef(
450 draw_image, ImageDecodeCache::TracingInfo(), &task); 472 draw_image, ImageDecodeCache::TracingInfo(), &task);
451 EXPECT_TRUE(need_unref); 473 EXPECT_TRUE(need_unref);
452 EXPECT_TRUE(task); 474 EXPECT_TRUE(task);
453 475
454 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); 476 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get());
455 477
456 scoped_refptr<TileTask> another_task; 478 scoped_refptr<TileTask> another_task;
457 need_unref = cache.GetTaskForImageAndRef( 479 need_unref = cache.GetTaskForImageAndRef(
(...skipping 26 matching lines...) Expand all
484 TEST(GpuImageDecodeCacheTest, GetTaskForImageCanceledWhileReffedGetsNewTask) { 506 TEST(GpuImageDecodeCacheTest, GetTaskForImageCanceledWhileReffedGetsNewTask) {
485 auto context_provider = TestContextProvider::Create(); 507 auto context_provider = TestContextProvider::Create();
486 context_provider->BindToCurrentThread(); 508 context_provider->BindToCurrentThread();
487 TestGpuImageDecodeCache cache(context_provider.get()); 509 TestGpuImageDecodeCache cache(context_provider.get());
488 bool is_decomposable = true; 510 bool is_decomposable = true;
489 SkFilterQuality quality = kHigh_SkFilterQuality; 511 SkFilterQuality quality = kHigh_SkFilterQuality;
490 512
491 sk_sp<SkImage> image = CreateImage(100, 100); 513 sk_sp<SkImage> image = CreateImage(100, 100);
492 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 514 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
493 quality, 515 quality,
494 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 516 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable),
517 DefaultColorSpace());
495 scoped_refptr<TileTask> task; 518 scoped_refptr<TileTask> task;
496 bool need_unref = cache.GetTaskForImageAndRef( 519 bool need_unref = cache.GetTaskForImageAndRef(
497 draw_image, ImageDecodeCache::TracingInfo(), &task); 520 draw_image, ImageDecodeCache::TracingInfo(), &task);
498 EXPECT_TRUE(need_unref); 521 EXPECT_TRUE(need_unref);
499 EXPECT_TRUE(task); 522 EXPECT_TRUE(task);
500 523
501 ASSERT_GT(task->dependencies().size(), 0u); 524 ASSERT_GT(task->dependencies().size(), 0u);
502 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); 525 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get());
503 526
504 scoped_refptr<TileTask> another_task; 527 scoped_refptr<TileTask> another_task;
(...skipping 30 matching lines...) Expand all
535 TEST(GpuImageDecodeCacheTest, NoTaskForImageAlreadyFailedDecoding) { 558 TEST(GpuImageDecodeCacheTest, NoTaskForImageAlreadyFailedDecoding) {
536 auto context_provider = TestContextProvider::Create(); 559 auto context_provider = TestContextProvider::Create();
537 context_provider->BindToCurrentThread(); 560 context_provider->BindToCurrentThread();
538 TestGpuImageDecodeCache cache(context_provider.get()); 561 TestGpuImageDecodeCache cache(context_provider.get());
539 bool is_decomposable = true; 562 bool is_decomposable = true;
540 SkFilterQuality quality = kHigh_SkFilterQuality; 563 SkFilterQuality quality = kHigh_SkFilterQuality;
541 564
542 sk_sp<SkImage> image = CreateImage(100, 100); 565 sk_sp<SkImage> image = CreateImage(100, 100);
543 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 566 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
544 quality, 567 quality,
545 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 568 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable),
569 DefaultColorSpace());
546 scoped_refptr<TileTask> task; 570 scoped_refptr<TileTask> task;
547 bool need_unref = cache.GetTaskForImageAndRef( 571 bool need_unref = cache.GetTaskForImageAndRef(
548 draw_image, ImageDecodeCache::TracingInfo(), &task); 572 draw_image, ImageDecodeCache::TracingInfo(), &task);
549 EXPECT_TRUE(need_unref); 573 EXPECT_TRUE(need_unref);
550 EXPECT_TRUE(task); 574 EXPECT_TRUE(task);
551 575
552 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); 576 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get());
553 // Didn't run the task, so cancel it. 577 // Didn't run the task, so cancel it.
554 TestTileTaskRunner::CancelTask(task.get()); 578 TestTileTaskRunner::CancelTask(task.get());
555 TestTileTaskRunner::CompleteTask(task.get()); 579 TestTileTaskRunner::CompleteTask(task.get());
(...skipping 12 matching lines...) Expand all
568 TEST(GpuImageDecodeCacheTest, GetDecodedImageForDraw) { 592 TEST(GpuImageDecodeCacheTest, GetDecodedImageForDraw) {
569 auto context_provider = TestContextProvider::Create(); 593 auto context_provider = TestContextProvider::Create();
570 context_provider->BindToCurrentThread(); 594 context_provider->BindToCurrentThread();
571 TestGpuImageDecodeCache cache(context_provider.get()); 595 TestGpuImageDecodeCache cache(context_provider.get());
572 bool is_decomposable = true; 596 bool is_decomposable = true;
573 SkFilterQuality quality = kHigh_SkFilterQuality; 597 SkFilterQuality quality = kHigh_SkFilterQuality;
574 598
575 sk_sp<SkImage> image = CreateImage(100, 100); 599 sk_sp<SkImage> image = CreateImage(100, 100);
576 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 600 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
577 quality, 601 quality,
578 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 602 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable),
603 DefaultColorSpace());
579 scoped_refptr<TileTask> task; 604 scoped_refptr<TileTask> task;
580 bool need_unref = cache.GetTaskForImageAndRef( 605 bool need_unref = cache.GetTaskForImageAndRef(
581 draw_image, ImageDecodeCache::TracingInfo(), &task); 606 draw_image, ImageDecodeCache::TracingInfo(), &task);
582 EXPECT_TRUE(need_unref); 607 EXPECT_TRUE(need_unref);
583 EXPECT_TRUE(task); 608 EXPECT_TRUE(task);
584 609
585 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); 610 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get());
586 TestTileTaskRunner::ProcessTask(task.get()); 611 TestTileTaskRunner::ProcessTask(task.get());
587 612
588 // Must hold context lock before calling GetDecodedImageForDraw / 613 // Must hold context lock before calling GetDecodedImageForDraw /
(...skipping 13 matching lines...) Expand all
602 TEST(GpuImageDecodeCacheTest, GetLargeDecodedImageForDraw) { 627 TEST(GpuImageDecodeCacheTest, GetLargeDecodedImageForDraw) {
603 auto context_provider = TestContextProvider::Create(); 628 auto context_provider = TestContextProvider::Create();
604 context_provider->BindToCurrentThread(); 629 context_provider->BindToCurrentThread();
605 TestGpuImageDecodeCache cache(context_provider.get()); 630 TestGpuImageDecodeCache cache(context_provider.get());
606 bool is_decomposable = true; 631 bool is_decomposable = true;
607 SkFilterQuality quality = kHigh_SkFilterQuality; 632 SkFilterQuality quality = kHigh_SkFilterQuality;
608 633
609 sk_sp<SkImage> image = CreateImage(1, 24000); 634 sk_sp<SkImage> image = CreateImage(1, 24000);
610 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 635 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
611 quality, 636 quality,
612 CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); 637 CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable),
638 DefaultColorSpace());
613 scoped_refptr<TileTask> task; 639 scoped_refptr<TileTask> task;
614 bool need_unref = cache.GetTaskForImageAndRef( 640 bool need_unref = cache.GetTaskForImageAndRef(
615 draw_image, ImageDecodeCache::TracingInfo(), &task); 641 draw_image, ImageDecodeCache::TracingInfo(), &task);
616 EXPECT_TRUE(need_unref); 642 EXPECT_TRUE(need_unref);
617 EXPECT_TRUE(task); 643 EXPECT_TRUE(task);
618 644
619 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); 645 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get());
620 TestTileTaskRunner::ProcessTask(task.get()); 646 TestTileTaskRunner::ProcessTask(task.get());
621 647
622 // Must hold context lock before calling GetDecodedImageForDraw / 648 // Must hold context lock before calling GetDecodedImageForDraw /
(...skipping 16 matching lines...) Expand all
639 context_provider->BindToCurrentThread(); 665 context_provider->BindToCurrentThread();
640 TestGpuImageDecodeCache cache(context_provider.get()); 666 TestGpuImageDecodeCache cache(context_provider.get());
641 bool is_decomposable = true; 667 bool is_decomposable = true;
642 SkFilterQuality quality = kHigh_SkFilterQuality; 668 SkFilterQuality quality = kHigh_SkFilterQuality;
643 669
644 cache.SetAllByteLimitsForTesting(0); 670 cache.SetAllByteLimitsForTesting(0);
645 671
646 sk_sp<SkImage> image = CreateImage(100, 100); 672 sk_sp<SkImage> image = CreateImage(100, 100);
647 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 673 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
648 quality, 674 quality,
649 CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); 675 CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable),
676 DefaultColorSpace());
650 677
651 scoped_refptr<TileTask> task; 678 scoped_refptr<TileTask> task;
652 bool need_unref = cache.GetTaskForImageAndRef( 679 bool need_unref = cache.GetTaskForImageAndRef(
653 draw_image, ImageDecodeCache::TracingInfo(), &task); 680 draw_image, ImageDecodeCache::TracingInfo(), &task);
654 EXPECT_FALSE(need_unref); 681 EXPECT_FALSE(need_unref);
655 EXPECT_FALSE(task); 682 EXPECT_FALSE(task);
656 683
657 // Must hold context lock before calling GetDecodedImageForDraw / 684 // Must hold context lock before calling GetDecodedImageForDraw /
658 // DrawWithImageFinished. 685 // DrawWithImageFinished.
659 ContextProvider::ScopedContextLock context_lock(context_provider.get()); 686 ContextProvider::ScopedContextLock context_lock(context_provider.get());
(...skipping 10 matching lines...) Expand all
670 TEST(GpuImageDecodeCacheTest, GetDecodedImageForDrawLargerScale) { 697 TEST(GpuImageDecodeCacheTest, GetDecodedImageForDrawLargerScale) {
671 auto context_provider = TestContextProvider::Create(); 698 auto context_provider = TestContextProvider::Create();
672 context_provider->BindToCurrentThread(); 699 context_provider->BindToCurrentThread();
673 TestGpuImageDecodeCache cache(context_provider.get()); 700 TestGpuImageDecodeCache cache(context_provider.get());
674 bool is_decomposable = true; 701 bool is_decomposable = true;
675 SkFilterQuality quality = kHigh_SkFilterQuality; 702 SkFilterQuality quality = kHigh_SkFilterQuality;
676 703
677 sk_sp<SkImage> image = CreateImage(100, 100); 704 sk_sp<SkImage> image = CreateImage(100, 100);
678 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 705 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
679 quality, 706 quality,
680 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 707 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable),
708 DefaultColorSpace());
681 scoped_refptr<TileTask> task; 709 scoped_refptr<TileTask> task;
682 bool need_unref = cache.GetTaskForImageAndRef( 710 bool need_unref = cache.GetTaskForImageAndRef(
683 draw_image, ImageDecodeCache::TracingInfo(), &task); 711 draw_image, ImageDecodeCache::TracingInfo(), &task);
684 EXPECT_TRUE(need_unref); 712 EXPECT_TRUE(need_unref);
685 EXPECT_TRUE(task); 713 EXPECT_TRUE(task);
686 714
687 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); 715 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get());
688 TestTileTaskRunner::ProcessTask(task.get()); 716 TestTileTaskRunner::ProcessTask(task.get());
689 717
690 DrawImage larger_draw_image( 718 DrawImage larger_draw_image(
691 image, SkIRect::MakeWH(image->width(), image->height()), quality, 719 image, SkIRect::MakeWH(image->width(), image->height()), quality,
692 CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable)); 720 CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable),
721 DefaultColorSpace());
693 scoped_refptr<TileTask> larger_task; 722 scoped_refptr<TileTask> larger_task;
694 bool larger_need_unref = cache.GetTaskForImageAndRef( 723 bool larger_need_unref = cache.GetTaskForImageAndRef(
695 larger_draw_image, ImageDecodeCache::TracingInfo(), &larger_task); 724 larger_draw_image, ImageDecodeCache::TracingInfo(), &larger_task);
696 EXPECT_TRUE(larger_need_unref); 725 EXPECT_TRUE(larger_need_unref);
697 EXPECT_TRUE(larger_task); 726 EXPECT_TRUE(larger_task);
698 727
699 TestTileTaskRunner::ProcessTask(larger_task->dependencies()[0].get()); 728 TestTileTaskRunner::ProcessTask(larger_task->dependencies()[0].get());
700 TestTileTaskRunner::ProcessTask(larger_task.get()); 729 TestTileTaskRunner::ProcessTask(larger_task.get());
701 730
702 // Must hold context lock before calling GetDecodedImageForDraw / 731 // Must hold context lock before calling GetDecodedImageForDraw /
(...skipping 23 matching lines...) Expand all
726 755
727 TEST(GpuImageDecodeCacheTest, GetDecodedImageForDrawHigherQuality) { 756 TEST(GpuImageDecodeCacheTest, GetDecodedImageForDrawHigherQuality) {
728 auto context_provider = TestContextProvider::Create(); 757 auto context_provider = TestContextProvider::Create();
729 context_provider->BindToCurrentThread(); 758 context_provider->BindToCurrentThread();
730 TestGpuImageDecodeCache cache(context_provider.get()); 759 TestGpuImageDecodeCache cache(context_provider.get());
731 bool is_decomposable = true; 760 bool is_decomposable = true;
732 SkMatrix matrix = CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable); 761 SkMatrix matrix = CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable);
733 762
734 sk_sp<SkImage> image = CreateImage(100, 100); 763 sk_sp<SkImage> image = CreateImage(100, 100);
735 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 764 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
736 kLow_SkFilterQuality, matrix); 765 kLow_SkFilterQuality, matrix, DefaultColorSpace());
737 scoped_refptr<TileTask> task; 766 scoped_refptr<TileTask> task;
738 bool need_unref = cache.GetTaskForImageAndRef( 767 bool need_unref = cache.GetTaskForImageAndRef(
739 draw_image, ImageDecodeCache::TracingInfo(), &task); 768 draw_image, ImageDecodeCache::TracingInfo(), &task);
740 EXPECT_TRUE(need_unref); 769 EXPECT_TRUE(need_unref);
741 EXPECT_TRUE(task); 770 EXPECT_TRUE(task);
742 771
743 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); 772 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get());
744 TestTileTaskRunner::ProcessTask(task.get()); 773 TestTileTaskRunner::ProcessTask(task.get());
745 774
746 DrawImage higher_quality_draw_image( 775 DrawImage higher_quality_draw_image(
747 image, SkIRect::MakeWH(image->width(), image->height()), 776 image, SkIRect::MakeWH(image->width(), image->height()),
748 kHigh_SkFilterQuality, matrix); 777 kHigh_SkFilterQuality, matrix, DefaultColorSpace());
749 scoped_refptr<TileTask> hq_task; 778 scoped_refptr<TileTask> hq_task;
750 bool hq_needs_unref = cache.GetTaskForImageAndRef( 779 bool hq_needs_unref = cache.GetTaskForImageAndRef(
751 higher_quality_draw_image, ImageDecodeCache::TracingInfo(), &hq_task); 780 higher_quality_draw_image, ImageDecodeCache::TracingInfo(), &hq_task);
752 EXPECT_TRUE(hq_needs_unref); 781 EXPECT_TRUE(hq_needs_unref);
753 EXPECT_TRUE(hq_task); 782 EXPECT_TRUE(hq_task);
754 783
755 TestTileTaskRunner::ProcessTask(hq_task->dependencies()[0].get()); 784 TestTileTaskRunner::ProcessTask(hq_task->dependencies()[0].get());
756 TestTileTaskRunner::ProcessTask(hq_task.get()); 785 TestTileTaskRunner::ProcessTask(hq_task.get());
757 786
758 // Must hold context lock before calling GetDecodedImageForDraw / 787 // Must hold context lock before calling GetDecodedImageForDraw /
(...skipping 23 matching lines...) Expand all
782 } 811 }
783 812
784 TEST(GpuImageDecodeCacheTest, GetDecodedImageForDrawNegative) { 813 TEST(GpuImageDecodeCacheTest, GetDecodedImageForDrawNegative) {
785 auto context_provider = TestContextProvider::Create(); 814 auto context_provider = TestContextProvider::Create();
786 context_provider->BindToCurrentThread(); 815 context_provider->BindToCurrentThread();
787 TestGpuImageDecodeCache cache(context_provider.get()); 816 TestGpuImageDecodeCache cache(context_provider.get());
788 bool is_decomposable = true; 817 bool is_decomposable = true;
789 SkFilterQuality quality = kHigh_SkFilterQuality; 818 SkFilterQuality quality = kHigh_SkFilterQuality;
790 819
791 sk_sp<SkImage> image = CreateImage(100, 100); 820 sk_sp<SkImage> image = CreateImage(100, 100);
792 DrawImage draw_image( 821 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
793 image, SkIRect::MakeWH(image->width(), image->height()), quality, 822 quality,
794 CreateMatrix(SkSize::Make(-0.5f, 0.5f), is_decomposable)); 823 CreateMatrix(SkSize::Make(-0.5f, 0.5f), is_decomposable),
824 DefaultColorSpace());
795 scoped_refptr<TileTask> task; 825 scoped_refptr<TileTask> task;
796 bool need_unref = cache.GetTaskForImageAndRef( 826 bool need_unref = cache.GetTaskForImageAndRef(
797 draw_image, ImageDecodeCache::TracingInfo(), &task); 827 draw_image, ImageDecodeCache::TracingInfo(), &task);
798 EXPECT_TRUE(need_unref); 828 EXPECT_TRUE(need_unref);
799 EXPECT_TRUE(task); 829 EXPECT_TRUE(task);
800 830
801 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); 831 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get());
802 TestTileTaskRunner::ProcessTask(task.get()); 832 TestTileTaskRunner::ProcessTask(task.get());
803 833
804 // Must hold context lock before calling GetDecodedImageForDraw / 834 // Must hold context lock before calling GetDecodedImageForDraw /
(...skipping 15 matching lines...) Expand all
820 TEST(GpuImageDecodeCacheTest, GetLargeScaledDecodedImageForDraw) { 850 TEST(GpuImageDecodeCacheTest, GetLargeScaledDecodedImageForDraw) {
821 auto context_provider = TestContextProvider::Create(); 851 auto context_provider = TestContextProvider::Create();
822 context_provider->BindToCurrentThread(); 852 context_provider->BindToCurrentThread();
823 TestGpuImageDecodeCache cache(context_provider.get()); 853 TestGpuImageDecodeCache cache(context_provider.get());
824 bool is_decomposable = true; 854 bool is_decomposable = true;
825 SkFilterQuality quality = kHigh_SkFilterQuality; 855 SkFilterQuality quality = kHigh_SkFilterQuality;
826 856
827 sk_sp<SkImage> image = CreateImage(1, 48000); 857 sk_sp<SkImage> image = CreateImage(1, 48000);
828 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 858 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
829 quality, 859 quality,
830 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 860 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable),
861 DefaultColorSpace());
831 scoped_refptr<TileTask> task; 862 scoped_refptr<TileTask> task;
832 bool need_unref = cache.GetTaskForImageAndRef( 863 bool need_unref = cache.GetTaskForImageAndRef(
833 draw_image, ImageDecodeCache::TracingInfo(), &task); 864 draw_image, ImageDecodeCache::TracingInfo(), &task);
834 EXPECT_TRUE(need_unref); 865 EXPECT_TRUE(need_unref);
835 EXPECT_TRUE(task); 866 EXPECT_TRUE(task);
836 867
837 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); 868 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get());
838 TestTileTaskRunner::ProcessTask(task.get()); 869 TestTileTaskRunner::ProcessTask(task.get());
839 870
840 // Must hold context lock before calling GetDecodedImageForDraw / 871 // Must hold context lock before calling GetDecodedImageForDraw /
(...skipping 19 matching lines...) Expand all
860 context_provider->BindToCurrentThread(); 891 context_provider->BindToCurrentThread();
861 TestGpuImageDecodeCache cache(context_provider.get()); 892 TestGpuImageDecodeCache cache(context_provider.get());
862 bool is_decomposable = true; 893 bool is_decomposable = true;
863 SkFilterQuality quality = kHigh_SkFilterQuality; 894 SkFilterQuality quality = kHigh_SkFilterQuality;
864 895
865 cache.SetAllByteLimitsForTesting(0); 896 cache.SetAllByteLimitsForTesting(0);
866 897
867 sk_sp<SkImage> image = CreateImage(100, 100); 898 sk_sp<SkImage> image = CreateImage(100, 100);
868 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 899 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
869 quality, 900 quality,
870 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 901 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable),
902 DefaultColorSpace());
871 903
872 scoped_refptr<TileTask> task; 904 scoped_refptr<TileTask> task;
873 bool need_unref = cache.GetTaskForImageAndRef( 905 bool need_unref = cache.GetTaskForImageAndRef(
874 draw_image, ImageDecodeCache::TracingInfo(), &task); 906 draw_image, ImageDecodeCache::TracingInfo(), &task);
875 EXPECT_FALSE(need_unref); 907 EXPECT_FALSE(need_unref);
876 EXPECT_FALSE(task); 908 EXPECT_FALSE(task);
877 909
878 // Must hold context lock before calling GetDecodedImageForDraw / 910 // Must hold context lock before calling GetDecodedImageForDraw /
879 // DrawWithImageFinished. 911 // DrawWithImageFinished.
880 ContextProvider::ScopedContextLock context_lock(context_provider.get()); 912 ContextProvider::ScopedContextLock context_lock(context_provider.get());
(...skipping 24 matching lines...) Expand all
905 context_provider->BindToCurrentThread(); 937 context_provider->BindToCurrentThread();
906 TestGpuImageDecodeCache cache(context_provider.get()); 938 TestGpuImageDecodeCache cache(context_provider.get());
907 bool is_decomposable = true; 939 bool is_decomposable = true;
908 SkFilterQuality quality = kHigh_SkFilterQuality; 940 SkFilterQuality quality = kHigh_SkFilterQuality;
909 941
910 cache.SetAllByteLimitsForTesting(0); 942 cache.SetAllByteLimitsForTesting(0);
911 943
912 sk_sp<SkImage> image = CreateImage(100, 100); 944 sk_sp<SkImage> image = CreateImage(100, 100);
913 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 945 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
914 quality, 946 quality,
915 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 947 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable),
948 DefaultColorSpace());
916 949
917 // Must hold context lock before calling GetDecodedImageForDraw / 950 // Must hold context lock before calling GetDecodedImageForDraw /
918 // DrawWithImageFinished. 951 // DrawWithImageFinished.
919 ContextProvider::ScopedContextLock context_lock(context_provider.get()); 952 ContextProvider::ScopedContextLock context_lock(context_provider.get());
920 DecodedDrawImage decoded_draw_image = 953 DecodedDrawImage decoded_draw_image =
921 cache.GetDecodedImageForDraw(draw_image); 954 cache.GetDecodedImageForDraw(draw_image);
922 EXPECT_TRUE(decoded_draw_image.image()); 955 EXPECT_TRUE(decoded_draw_image.image());
923 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); 956 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked());
924 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode()); 957 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode());
925 EXPECT_FALSE(cache.DiscardableIsLockedForTesting(draw_image)); 958 EXPECT_FALSE(cache.DiscardableIsLockedForTesting(draw_image));
(...skipping 11 matching lines...) Expand all
937 GetLargeDecodedImageForDrawAtRasterDecodeMultipleTimes) { 970 GetLargeDecodedImageForDrawAtRasterDecodeMultipleTimes) {
938 auto context_provider = TestContextProvider::Create(); 971 auto context_provider = TestContextProvider::Create();
939 context_provider->BindToCurrentThread(); 972 context_provider->BindToCurrentThread();
940 TestGpuImageDecodeCache cache(context_provider.get()); 973 TestGpuImageDecodeCache cache(context_provider.get());
941 bool is_decomposable = true; 974 bool is_decomposable = true;
942 SkFilterQuality quality = kHigh_SkFilterQuality; 975 SkFilterQuality quality = kHigh_SkFilterQuality;
943 976
944 sk_sp<SkImage> image = CreateImage(1, 24000); 977 sk_sp<SkImage> image = CreateImage(1, 24000);
945 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 978 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
946 quality, 979 quality,
947 CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); 980 CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable),
981 DefaultColorSpace());
948 982
949 // Must hold context lock before calling GetDecodedImageForDraw / 983 // Must hold context lock before calling GetDecodedImageForDraw /
950 // DrawWithImageFinished. 984 // DrawWithImageFinished.
951 ContextProvider::ScopedContextLock context_lock(context_provider.get()); 985 ContextProvider::ScopedContextLock context_lock(context_provider.get());
952 DecodedDrawImage decoded_draw_image = 986 DecodedDrawImage decoded_draw_image =
953 cache.GetDecodedImageForDraw(draw_image); 987 cache.GetDecodedImageForDraw(draw_image);
954 EXPECT_TRUE(decoded_draw_image.image()); 988 EXPECT_TRUE(decoded_draw_image.image());
955 EXPECT_FALSE(decoded_draw_image.image()->isTextureBacked()); 989 EXPECT_FALSE(decoded_draw_image.image()->isTextureBacked());
956 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode()); 990 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode());
957 EXPECT_TRUE(cache.DiscardableIsLockedForTesting(draw_image)); 991 EXPECT_TRUE(cache.DiscardableIsLockedForTesting(draw_image));
(...skipping 15 matching lines...) Expand all
973 TEST(GpuImageDecodeCacheTest, ZeroSizedImagesAreSkipped) { 1007 TEST(GpuImageDecodeCacheTest, ZeroSizedImagesAreSkipped) {
974 auto context_provider = TestContextProvider::Create(); 1008 auto context_provider = TestContextProvider::Create();
975 context_provider->BindToCurrentThread(); 1009 context_provider->BindToCurrentThread();
976 TestGpuImageDecodeCache cache(context_provider.get()); 1010 TestGpuImageDecodeCache cache(context_provider.get());
977 bool is_decomposable = true; 1011 bool is_decomposable = true;
978 SkFilterQuality quality = kHigh_SkFilterQuality; 1012 SkFilterQuality quality = kHigh_SkFilterQuality;
979 1013
980 sk_sp<SkImage> image = CreateImage(100, 100); 1014 sk_sp<SkImage> image = CreateImage(100, 100);
981 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 1015 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
982 quality, 1016 quality,
983 CreateMatrix(SkSize::Make(0.f, 0.f), is_decomposable)); 1017 CreateMatrix(SkSize::Make(0.f, 0.f), is_decomposable),
1018 DefaultColorSpace());
984 1019
985 scoped_refptr<TileTask> task; 1020 scoped_refptr<TileTask> task;
986 bool need_unref = cache.GetTaskForImageAndRef( 1021 bool need_unref = cache.GetTaskForImageAndRef(
987 draw_image, ImageDecodeCache::TracingInfo(), &task); 1022 draw_image, ImageDecodeCache::TracingInfo(), &task);
988 EXPECT_FALSE(task); 1023 EXPECT_FALSE(task);
989 EXPECT_FALSE(need_unref); 1024 EXPECT_FALSE(need_unref);
990 1025
991 // Must hold context lock before calling GetDecodedImageForDraw / 1026 // Must hold context lock before calling GetDecodedImageForDraw /
992 // DrawWithImageFinished. 1027 // DrawWithImageFinished.
993 ContextProvider::ScopedContextLock context_lock(context_provider.get()); 1028 ContextProvider::ScopedContextLock context_lock(context_provider.get());
994 DecodedDrawImage decoded_draw_image = 1029 DecodedDrawImage decoded_draw_image =
995 cache.GetDecodedImageForDraw(draw_image); 1030 cache.GetDecodedImageForDraw(draw_image);
996 EXPECT_FALSE(decoded_draw_image.image()); 1031 EXPECT_FALSE(decoded_draw_image.image());
997 1032
998 cache.DrawWithImageFinished(draw_image, decoded_draw_image); 1033 cache.DrawWithImageFinished(draw_image, decoded_draw_image);
999 } 1034 }
1000 1035
1001 TEST(GpuImageDecodeCacheTest, NonOverlappingSrcRectImagesAreSkipped) { 1036 TEST(GpuImageDecodeCacheTest, NonOverlappingSrcRectImagesAreSkipped) {
1002 auto context_provider = TestContextProvider::Create(); 1037 auto context_provider = TestContextProvider::Create();
1003 context_provider->BindToCurrentThread(); 1038 context_provider->BindToCurrentThread();
1004 TestGpuImageDecodeCache cache(context_provider.get()); 1039 TestGpuImageDecodeCache cache(context_provider.get());
1005 bool is_decomposable = true; 1040 bool is_decomposable = true;
1006 SkFilterQuality quality = kHigh_SkFilterQuality; 1041 SkFilterQuality quality = kHigh_SkFilterQuality;
1007 1042
1008 sk_sp<SkImage> image = CreateImage(100, 100); 1043 sk_sp<SkImage> image = CreateImage(100, 100);
1009 DrawImage draw_image( 1044 DrawImage draw_image(
1010 image, SkIRect::MakeXYWH(150, 150, image->width(), image->height()), 1045 image, SkIRect::MakeXYWH(150, 150, image->width(), image->height()),
1011 quality, CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable)); 1046 quality, CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable),
1047 DefaultColorSpace());
1012 1048
1013 scoped_refptr<TileTask> task; 1049 scoped_refptr<TileTask> task;
1014 bool need_unref = cache.GetTaskForImageAndRef( 1050 bool need_unref = cache.GetTaskForImageAndRef(
1015 draw_image, ImageDecodeCache::TracingInfo(), &task); 1051 draw_image, ImageDecodeCache::TracingInfo(), &task);
1016 EXPECT_FALSE(task); 1052 EXPECT_FALSE(task);
1017 EXPECT_FALSE(need_unref); 1053 EXPECT_FALSE(need_unref);
1018 1054
1019 // Must hold context lock before calling GetDecodedImageForDraw / 1055 // Must hold context lock before calling GetDecodedImageForDraw /
1020 // DrawWithImageFinished. 1056 // DrawWithImageFinished.
1021 ContextProvider::ScopedContextLock context_lock(context_provider.get()); 1057 ContextProvider::ScopedContextLock context_lock(context_provider.get());
1022 DecodedDrawImage decoded_draw_image = 1058 DecodedDrawImage decoded_draw_image =
1023 cache.GetDecodedImageForDraw(draw_image); 1059 cache.GetDecodedImageForDraw(draw_image);
1024 EXPECT_FALSE(decoded_draw_image.image()); 1060 EXPECT_FALSE(decoded_draw_image.image());
1025 1061
1026 cache.DrawWithImageFinished(draw_image, decoded_draw_image); 1062 cache.DrawWithImageFinished(draw_image, decoded_draw_image);
1027 } 1063 }
1028 1064
1029 TEST(GpuImageDecodeCacheTest, CanceledTasksDoNotCountAgainstBudget) { 1065 TEST(GpuImageDecodeCacheTest, CanceledTasksDoNotCountAgainstBudget) {
1030 auto context_provider = TestContextProvider::Create(); 1066 auto context_provider = TestContextProvider::Create();
1031 context_provider->BindToCurrentThread(); 1067 context_provider->BindToCurrentThread();
1032 TestGpuImageDecodeCache cache(context_provider.get()); 1068 TestGpuImageDecodeCache cache(context_provider.get());
1033 bool is_decomposable = true; 1069 bool is_decomposable = true;
1034 SkFilterQuality quality = kHigh_SkFilterQuality; 1070 SkFilterQuality quality = kHigh_SkFilterQuality;
1035 1071
1036 sk_sp<SkImage> image = CreateImage(100, 100); 1072 sk_sp<SkImage> image = CreateImage(100, 100);
1037 DrawImage draw_image( 1073 DrawImage draw_image(
1038 image, SkIRect::MakeXYWH(0, 0, image->width(), image->height()), quality, 1074 image, SkIRect::MakeXYWH(0, 0, image->width(), image->height()), quality,
1039 CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable)); 1075 CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable),
1076 DefaultColorSpace());
1040 1077
1041 scoped_refptr<TileTask> task; 1078 scoped_refptr<TileTask> task;
1042 bool need_unref = cache.GetTaskForImageAndRef( 1079 bool need_unref = cache.GetTaskForImageAndRef(
1043 draw_image, ImageDecodeCache::TracingInfo(), &task); 1080 draw_image, ImageDecodeCache::TracingInfo(), &task);
1044 EXPECT_NE(0u, cache.GetBytesUsedForTesting()); 1081 EXPECT_NE(0u, cache.GetBytesUsedForTesting());
1045 EXPECT_TRUE(task); 1082 EXPECT_TRUE(task);
1046 EXPECT_TRUE(need_unref); 1083 EXPECT_TRUE(need_unref);
1047 1084
1048 TestTileTaskRunner::CancelTask(task->dependencies()[0].get()); 1085 TestTileTaskRunner::CancelTask(task->dependencies()[0].get());
1049 TestTileTaskRunner::CompleteTask(task->dependencies()[0].get()); 1086 TestTileTaskRunner::CompleteTask(task->dependencies()[0].get());
1050 TestTileTaskRunner::CancelTask(task.get()); 1087 TestTileTaskRunner::CancelTask(task.get());
1051 TestTileTaskRunner::CompleteTask(task.get()); 1088 TestTileTaskRunner::CompleteTask(task.get());
1052 1089
1053 cache.UnrefImage(draw_image); 1090 cache.UnrefImage(draw_image);
1054 EXPECT_EQ(0u, cache.GetBytesUsedForTesting()); 1091 EXPECT_EQ(0u, cache.GetBytesUsedForTesting());
1055 } 1092 }
1056 1093
1057 TEST(GpuImageDecodeCacheTest, ShouldAggressivelyFreeResources) { 1094 TEST(GpuImageDecodeCacheTest, ShouldAggressivelyFreeResources) {
1058 auto context_provider = TestContextProvider::Create(); 1095 auto context_provider = TestContextProvider::Create();
1059 context_provider->BindToCurrentThread(); 1096 context_provider->BindToCurrentThread();
1060 TestGpuImageDecodeCache cache(context_provider.get()); 1097 TestGpuImageDecodeCache cache(context_provider.get());
1061 bool is_decomposable = true; 1098 bool is_decomposable = true;
1062 SkFilterQuality quality = kHigh_SkFilterQuality; 1099 SkFilterQuality quality = kHigh_SkFilterQuality;
1063 1100
1064 sk_sp<SkImage> image = CreateImage(100, 100); 1101 sk_sp<SkImage> image = CreateImage(100, 100);
1065 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 1102 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
1066 quality, 1103 quality,
1067 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 1104 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable),
1105 DefaultColorSpace());
1068 scoped_refptr<TileTask> task; 1106 scoped_refptr<TileTask> task;
1069 { 1107 {
1070 bool need_unref = cache.GetTaskForImageAndRef( 1108 bool need_unref = cache.GetTaskForImageAndRef(
1071 draw_image, ImageDecodeCache::TracingInfo(), &task); 1109 draw_image, ImageDecodeCache::TracingInfo(), &task);
1072 EXPECT_TRUE(need_unref); 1110 EXPECT_TRUE(need_unref);
1073 EXPECT_TRUE(task); 1111 EXPECT_TRUE(task);
1074 } 1112 }
1075 1113
1076 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); 1114 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get());
1077 TestTileTaskRunner::ProcessTask(task.get()); 1115 TestTileTaskRunner::ProcessTask(task.get());
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1121 auto context_provider = TestContextProvider::Create(); 1159 auto context_provider = TestContextProvider::Create();
1122 context_provider->BindToCurrentThread(); 1160 context_provider->BindToCurrentThread();
1123 TestGpuImageDecodeCache cache(context_provider.get()); 1161 TestGpuImageDecodeCache cache(context_provider.get());
1124 bool is_decomposable = true; 1162 bool is_decomposable = true;
1125 SkFilterQuality quality = kHigh_SkFilterQuality; 1163 SkFilterQuality quality = kHigh_SkFilterQuality;
1126 1164
1127 // Create a downscaled image. 1165 // Create a downscaled image.
1128 sk_sp<SkImage> first_image = CreateImage(100, 100); 1166 sk_sp<SkImage> first_image = CreateImage(100, 100);
1129 DrawImage first_draw_image( 1167 DrawImage first_draw_image(
1130 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), 1168 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()),
1131 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 1169 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable),
1170 DefaultColorSpace());
1132 scoped_refptr<TileTask> first_task; 1171 scoped_refptr<TileTask> first_task;
1133 bool need_unref = cache.GetTaskForImageAndRef( 1172 bool need_unref = cache.GetTaskForImageAndRef(
1134 first_draw_image, ImageDecodeCache::TracingInfo(), &first_task); 1173 first_draw_image, ImageDecodeCache::TracingInfo(), &first_task);
1135 EXPECT_TRUE(need_unref); 1174 EXPECT_TRUE(need_unref);
1136 EXPECT_TRUE(first_task); 1175 EXPECT_TRUE(first_task);
1137 1176
1138 // The budget should account for exactly one image. 1177 // The budget should account for exactly one image.
1139 EXPECT_EQ(cache.GetBytesUsedForTesting(), 1178 EXPECT_EQ(cache.GetBytesUsedForTesting(),
1140 cache.GetDrawImageSizeForTesting(first_draw_image)); 1179 cache.GetDrawImageSizeForTesting(first_draw_image));
1141 1180
1142 // Create a larger version of |first_image|, this should immediately free the 1181 // Create a larger version of |first_image|, this should immediately free the
1143 // memory used by |first_image| for the smaller scale. 1182 // memory used by |first_image| for the smaller scale.
1144 DrawImage second_draw_image( 1183 DrawImage second_draw_image(
1145 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), 1184 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()),
1146 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); 1185 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable),
1186 DefaultColorSpace());
1147 scoped_refptr<TileTask> second_task; 1187 scoped_refptr<TileTask> second_task;
1148 need_unref = cache.GetTaskForImageAndRef( 1188 need_unref = cache.GetTaskForImageAndRef(
1149 second_draw_image, ImageDecodeCache::TracingInfo(), &second_task); 1189 second_draw_image, ImageDecodeCache::TracingInfo(), &second_task);
1150 EXPECT_TRUE(need_unref); 1190 EXPECT_TRUE(need_unref);
1151 EXPECT_TRUE(second_task); 1191 EXPECT_TRUE(second_task);
1152 EXPECT_TRUE(first_task.get() != second_task.get()); 1192 EXPECT_TRUE(first_task.get() != second_task.get());
1153 1193
1154 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); 1194 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get());
1155 TestTileTaskRunner::ProcessTask(second_task.get()); 1195 TestTileTaskRunner::ProcessTask(second_task.get());
1156 1196
(...skipping 19 matching lines...) Expand all
1176 auto context_provider = TestContextProvider::Create(); 1216 auto context_provider = TestContextProvider::Create();
1177 context_provider->BindToCurrentThread(); 1217 context_provider->BindToCurrentThread();
1178 TestGpuImageDecodeCache cache(context_provider.get()); 1218 TestGpuImageDecodeCache cache(context_provider.get());
1179 bool is_decomposable = true; 1219 bool is_decomposable = true;
1180 SkFilterQuality quality = kHigh_SkFilterQuality; 1220 SkFilterQuality quality = kHigh_SkFilterQuality;
1181 1221
1182 // Create a downscaled image. 1222 // Create a downscaled image.
1183 sk_sp<SkImage> first_image = CreateImage(100, 100); 1223 sk_sp<SkImage> first_image = CreateImage(100, 100);
1184 DrawImage first_draw_image( 1224 DrawImage first_draw_image(
1185 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), 1225 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()),
1186 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 1226 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable),
1227 DefaultColorSpace());
1187 scoped_refptr<TileTask> first_task; 1228 scoped_refptr<TileTask> first_task;
1188 bool need_unref = cache.GetTaskForImageAndRef( 1229 bool need_unref = cache.GetTaskForImageAndRef(
1189 first_draw_image, ImageDecodeCache::TracingInfo(), &first_task); 1230 first_draw_image, ImageDecodeCache::TracingInfo(), &first_task);
1190 EXPECT_TRUE(need_unref); 1231 EXPECT_TRUE(need_unref);
1191 EXPECT_TRUE(first_task); 1232 EXPECT_TRUE(first_task);
1192 1233
1193 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get()); 1234 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get());
1194 TestTileTaskRunner::ProcessTask(first_task.get()); 1235 TestTileTaskRunner::ProcessTask(first_task.get());
1195 cache.UnrefImage(first_draw_image); 1236 cache.UnrefImage(first_draw_image);
1196 1237
1197 // The budget should account for exactly one image. 1238 // The budget should account for exactly one image.
1198 EXPECT_EQ(cache.GetBytesUsedForTesting(), 1239 EXPECT_EQ(cache.GetBytesUsedForTesting(),
1199 cache.GetDrawImageSizeForTesting(first_draw_image)); 1240 cache.GetDrawImageSizeForTesting(first_draw_image));
1200 1241
1201 // Create a larger version of |first_image|, this should immediately free the 1242 // Create a larger version of |first_image|, this should immediately free the
1202 // memory used by |first_image| for the smaller scale. 1243 // memory used by |first_image| for the smaller scale.
1203 DrawImage second_draw_image( 1244 DrawImage second_draw_image(
1204 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), 1245 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()),
1205 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); 1246 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable),
1247 DefaultColorSpace());
1206 scoped_refptr<TileTask> second_task; 1248 scoped_refptr<TileTask> second_task;
1207 need_unref = cache.GetTaskForImageAndRef( 1249 need_unref = cache.GetTaskForImageAndRef(
1208 second_draw_image, ImageDecodeCache::TracingInfo(), &second_task); 1250 second_draw_image, ImageDecodeCache::TracingInfo(), &second_task);
1209 EXPECT_TRUE(need_unref); 1251 EXPECT_TRUE(need_unref);
1210 EXPECT_TRUE(second_task); 1252 EXPECT_TRUE(second_task);
1211 EXPECT_TRUE(first_task.get() != second_task.get()); 1253 EXPECT_TRUE(first_task.get() != second_task.get());
1212 1254
1213 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); 1255 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get());
1214 TestTileTaskRunner::ProcessTask(second_task.get()); 1256 TestTileTaskRunner::ProcessTask(second_task.get());
1215 1257
1216 cache.UnrefImage(second_draw_image); 1258 cache.UnrefImage(second_draw_image);
1217 1259
1218 // The budget should account for exactly one image. 1260 // The budget should account for exactly one image.
1219 EXPECT_EQ(cache.GetBytesUsedForTesting(), 1261 EXPECT_EQ(cache.GetBytesUsedForTesting(),
1220 cache.GetDrawImageSizeForTesting(second_draw_image)); 1262 cache.GetDrawImageSizeForTesting(second_draw_image));
1221 } 1263 }
1222 1264
1223 TEST(GpuImageDecodeCacheTest, QualityCappedAtMedium) { 1265 TEST(GpuImageDecodeCacheTest, QualityCappedAtMedium) {
1224 auto context_provider = TestContextProvider::Create(); 1266 auto context_provider = TestContextProvider::Create();
1225 context_provider->BindToCurrentThread(); 1267 context_provider->BindToCurrentThread();
1226 TestGpuImageDecodeCache cache(context_provider.get()); 1268 TestGpuImageDecodeCache cache(context_provider.get());
1227 sk_sp<SkImage> image = CreateImage(100, 100); 1269 sk_sp<SkImage> image = CreateImage(100, 100);
1228 bool is_decomposable = true; 1270 bool is_decomposable = true;
1229 SkMatrix matrix = CreateMatrix(SkSize::Make(0.4f, 0.4f), is_decomposable); 1271 SkMatrix matrix = CreateMatrix(SkSize::Make(0.4f, 0.4f), is_decomposable);
1230 1272
1231 // Create an image with kLow_FilterQuality. 1273 // Create an image with kLow_FilterQuality.
1232 DrawImage low_draw_image(image, 1274 DrawImage low_draw_image(image,
1233 SkIRect::MakeWH(image->width(), image->height()), 1275 SkIRect::MakeWH(image->width(), image->height()),
1234 kLow_SkFilterQuality, matrix); 1276 kLow_SkFilterQuality, matrix, DefaultColorSpace());
1235 scoped_refptr<TileTask> low_task; 1277 scoped_refptr<TileTask> low_task;
1236 bool need_unref = cache.GetTaskForImageAndRef( 1278 bool need_unref = cache.GetTaskForImageAndRef(
1237 low_draw_image, ImageDecodeCache::TracingInfo(), &low_task); 1279 low_draw_image, ImageDecodeCache::TracingInfo(), &low_task);
1238 EXPECT_TRUE(need_unref); 1280 EXPECT_TRUE(need_unref);
1239 EXPECT_TRUE(low_task); 1281 EXPECT_TRUE(low_task);
1240 1282
1241 // Get the same image at kMedium_FilterQuality. We can't re-use low, so we 1283 // Get the same image at kMedium_FilterQuality. We can't re-use low, so we
1242 // should get a new task/ref. 1284 // should get a new task/ref.
1243 DrawImage medium_draw_image(image, 1285 DrawImage medium_draw_image(
1244 SkIRect::MakeWH(image->width(), image->height()), 1286 image, SkIRect::MakeWH(image->width(), image->height()),
1245 kMedium_SkFilterQuality, matrix); 1287 kMedium_SkFilterQuality, matrix, DefaultColorSpace());
1246 scoped_refptr<TileTask> medium_task; 1288 scoped_refptr<TileTask> medium_task;
1247 need_unref = cache.GetTaskForImageAndRef( 1289 need_unref = cache.GetTaskForImageAndRef(
1248 medium_draw_image, ImageDecodeCache::TracingInfo(), &medium_task); 1290 medium_draw_image, ImageDecodeCache::TracingInfo(), &medium_task);
1249 EXPECT_TRUE(need_unref); 1291 EXPECT_TRUE(need_unref);
1250 EXPECT_TRUE(medium_task.get()); 1292 EXPECT_TRUE(medium_task.get());
1251 EXPECT_FALSE(low_task.get() == medium_task.get()); 1293 EXPECT_FALSE(low_task.get() == medium_task.get());
1252 1294
1253 // Get the same image at kHigh_FilterQuality. We should re-use medium. 1295 // Get the same image at kHigh_FilterQuality. We should re-use medium.
1254 DrawImage large_draw_image(image, 1296 DrawImage large_draw_image(
1255 SkIRect::MakeWH(image->width(), image->height()), 1297 image, SkIRect::MakeWH(image->width(), image->height()),
1256 kHigh_SkFilterQuality, matrix); 1298 kHigh_SkFilterQuality, matrix, DefaultColorSpace());
1257 scoped_refptr<TileTask> large_task; 1299 scoped_refptr<TileTask> large_task;
1258 need_unref = cache.GetTaskForImageAndRef( 1300 need_unref = cache.GetTaskForImageAndRef(
1259 large_draw_image, ImageDecodeCache::TracingInfo(), &large_task); 1301 large_draw_image, ImageDecodeCache::TracingInfo(), &large_task);
1260 EXPECT_TRUE(need_unref); 1302 EXPECT_TRUE(need_unref);
1261 EXPECT_TRUE(medium_task.get() == large_task.get()); 1303 EXPECT_TRUE(medium_task.get() == large_task.get());
1262 1304
1263 TestTileTaskRunner::ProcessTask(low_task->dependencies()[0].get()); 1305 TestTileTaskRunner::ProcessTask(low_task->dependencies()[0].get());
1264 TestTileTaskRunner::ProcessTask(low_task.get()); 1306 TestTileTaskRunner::ProcessTask(low_task.get());
1265 TestTileTaskRunner::ProcessTask(medium_task->dependencies()[0].get()); 1307 TestTileTaskRunner::ProcessTask(medium_task->dependencies()[0].get());
1266 TestTileTaskRunner::ProcessTask(medium_task.get()); 1308 TestTileTaskRunner::ProcessTask(medium_task.get());
1267 1309
1268 cache.UnrefImage(low_draw_image); 1310 cache.UnrefImage(low_draw_image);
1269 cache.UnrefImage(medium_draw_image); 1311 cache.UnrefImage(medium_draw_image);
1270 cache.UnrefImage(large_draw_image); 1312 cache.UnrefImage(large_draw_image);
1271 } 1313 }
1272 1314
1273 // Ensure that switching to a mipped version of an image after the initial 1315 // Ensure that switching to a mipped version of an image after the initial
1274 // cache entry creation doesn't cause a buffer overflow/crash. 1316 // cache entry creation doesn't cause a buffer overflow/crash.
1275 TEST(GpuImageDecodeCacheTest, GetDecodedImageForDrawMipUsageChange) { 1317 TEST(GpuImageDecodeCacheTest, GetDecodedImageForDrawMipUsageChange) {
1276 auto context_provider = TestContextProvider::Create(); 1318 auto context_provider = TestContextProvider::Create();
1277 context_provider->BindToCurrentThread(); 1319 context_provider->BindToCurrentThread();
1278 TestGpuImageDecodeCache cache(context_provider.get()); 1320 TestGpuImageDecodeCache cache(context_provider.get());
1279 bool is_decomposable = true; 1321 bool is_decomposable = true;
1280 SkFilterQuality quality = kHigh_SkFilterQuality; 1322 SkFilterQuality quality = kHigh_SkFilterQuality;
1281 1323
1282 // Create an image decode task and cache entry that does not need mips. 1324 // Create an image decode task and cache entry that does not need mips.
1283 sk_sp<SkImage> image = CreateImage(4000, 4000); 1325 sk_sp<SkImage> image = CreateImage(4000, 4000);
1284 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 1326 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
1285 quality, 1327 quality,
1286 CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); 1328 CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable),
1329 DefaultColorSpace());
1287 scoped_refptr<TileTask> task; 1330 scoped_refptr<TileTask> task;
1288 bool need_unref = cache.GetTaskForImageAndRef( 1331 bool need_unref = cache.GetTaskForImageAndRef(
1289 draw_image, ImageDecodeCache::TracingInfo(), &task); 1332 draw_image, ImageDecodeCache::TracingInfo(), &task);
1290 EXPECT_TRUE(need_unref); 1333 EXPECT_TRUE(need_unref);
1291 EXPECT_TRUE(task); 1334 EXPECT_TRUE(task);
1292 1335
1293 // Cancel the task without ever using it. 1336 // Cancel the task without ever using it.
1294 TestTileTaskRunner::CancelTask(task->dependencies()[0].get()); 1337 TestTileTaskRunner::CancelTask(task->dependencies()[0].get());
1295 TestTileTaskRunner::CompleteTask(task->dependencies()[0].get()); 1338 TestTileTaskRunner::CompleteTask(task->dependencies()[0].get());
1296 TestTileTaskRunner::CancelTask(task.get()); 1339 TestTileTaskRunner::CancelTask(task.get());
1297 TestTileTaskRunner::CompleteTask(task.get()); 1340 TestTileTaskRunner::CompleteTask(task.get());
1298 1341
1299 cache.UnrefImage(draw_image); 1342 cache.UnrefImage(draw_image);
1300 1343
1301 // Must hold context lock before calling GetDecodedImageForDraw / 1344 // Must hold context lock before calling GetDecodedImageForDraw /
1302 // DrawWithImageFinished. 1345 // DrawWithImageFinished.
1303 ContextProvider::ScopedContextLock context_lock(context_provider.get()); 1346 ContextProvider::ScopedContextLock context_lock(context_provider.get());
1304 1347
1305 // Do an at-raster decode of the above image that *does* require mips. 1348 // Do an at-raster decode of the above image that *does* require mips.
1306 DrawImage draw_image_mips( 1349 DrawImage draw_image_mips(
1307 image, SkIRect::MakeWH(image->width(), image->height()), quality, 1350 image, SkIRect::MakeWH(image->width(), image->height()), quality,
1308 CreateMatrix(SkSize::Make(0.6f, 0.6f), is_decomposable)); 1351 CreateMatrix(SkSize::Make(0.6f, 0.6f), is_decomposable),
1352 DefaultColorSpace());
1309 DecodedDrawImage decoded_draw_image = 1353 DecodedDrawImage decoded_draw_image =
1310 cache.GetDecodedImageForDraw(draw_image_mips); 1354 cache.GetDecodedImageForDraw(draw_image_mips);
1311 cache.DrawWithImageFinished(draw_image_mips, decoded_draw_image); 1355 cache.DrawWithImageFinished(draw_image_mips, decoded_draw_image);
1312 } 1356 }
1313 1357
1314 TEST(GpuImageDecodeCacheTest, MemoryStateSuspended) { 1358 TEST(GpuImageDecodeCacheTest, MemoryStateSuspended) {
1315 auto context_provider = TestContextProvider::Create(); 1359 auto context_provider = TestContextProvider::Create();
1316 context_provider->BindToCurrentThread(); 1360 context_provider->BindToCurrentThread();
1317 TestGpuImageDecodeCache cache(context_provider.get()); 1361 TestGpuImageDecodeCache cache(context_provider.get());
1318 1362
1319 // First Insert an image into our cache. 1363 // First Insert an image into our cache.
1320 sk_sp<SkImage> image = CreateImage(1, 1); 1364 sk_sp<SkImage> image = CreateImage(1, 1);
1321 bool is_decomposable = true; 1365 bool is_decomposable = true;
1322 SkMatrix matrix = CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable); 1366 SkMatrix matrix = CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable);
1323 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 1367 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
1324 kLow_SkFilterQuality, matrix); 1368 kLow_SkFilterQuality, matrix, DefaultColorSpace());
1325 scoped_refptr<TileTask> task; 1369 scoped_refptr<TileTask> task;
1326 bool need_unref = cache.GetTaskForImageAndRef( 1370 bool need_unref = cache.GetTaskForImageAndRef(
1327 draw_image, ImageDecodeCache::TracingInfo(), &task); 1371 draw_image, ImageDecodeCache::TracingInfo(), &task);
1328 EXPECT_TRUE(need_unref); 1372 EXPECT_TRUE(need_unref);
1329 EXPECT_TRUE(task); 1373 EXPECT_TRUE(task);
1330 1374
1331 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); 1375 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get());
1332 TestTileTaskRunner::ProcessTask(task.get()); 1376 TestTileTaskRunner::ProcessTask(task.get());
1333 cache.UnrefImage(draw_image); 1377 cache.UnrefImage(draw_image);
1334 1378
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
1383 1427
1384 TEST(GpuImageDecodeCacheTest, OutOfRasterDecodeTask) { 1428 TEST(GpuImageDecodeCacheTest, OutOfRasterDecodeTask) {
1385 auto context_provider = TestContextProvider::Create(); 1429 auto context_provider = TestContextProvider::Create();
1386 context_provider->BindToCurrentThread(); 1430 context_provider->BindToCurrentThread();
1387 TestGpuImageDecodeCache cache(context_provider.get()); 1431 TestGpuImageDecodeCache cache(context_provider.get());
1388 1432
1389 sk_sp<SkImage> image = CreateImage(1, 1); 1433 sk_sp<SkImage> image = CreateImage(1, 1);
1390 bool is_decomposable = true; 1434 bool is_decomposable = true;
1391 SkMatrix matrix = CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable); 1435 SkMatrix matrix = CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable);
1392 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 1436 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
1393 kLow_SkFilterQuality, matrix); 1437 kLow_SkFilterQuality, matrix, DefaultColorSpace());
1394 1438
1395 scoped_refptr<TileTask> task; 1439 scoped_refptr<TileTask> task;
1396 bool need_unref = 1440 bool need_unref =
1397 cache.GetOutOfRasterDecodeTaskForImageAndRef(draw_image, &task); 1441 cache.GetOutOfRasterDecodeTaskForImageAndRef(draw_image, &task);
1398 EXPECT_TRUE(need_unref); 1442 EXPECT_TRUE(need_unref);
1399 EXPECT_TRUE(task); 1443 EXPECT_TRUE(task);
1400 EXPECT_TRUE(cache.IsInInUseCacheForTesting(draw_image)); 1444 EXPECT_TRUE(cache.IsInInUseCacheForTesting(draw_image));
1401 1445
1402 // Run the decode task. 1446 // Run the decode task.
1403 TestTileTaskRunner::ProcessTask(task.get()); 1447 TestTileTaskRunner::ProcessTask(task.get());
(...skipping 10 matching lines...) Expand all
1414 GpuImageDecodeCache cache(context_provider.get(), ResourceFormat::RGBA_8888, 1458 GpuImageDecodeCache cache(context_provider.get(), ResourceFormat::RGBA_8888,
1415 kGpuMemoryLimitBytes, 0); 1459 kGpuMemoryLimitBytes, 0);
1416 bool is_decomposable = true; 1460 bool is_decomposable = true;
1417 SkFilterQuality quality = kHigh_SkFilterQuality; 1461 SkFilterQuality quality = kHigh_SkFilterQuality;
1418 1462
1419 // Add an image to the cache. Due to normal working set, this should produce 1463 // Add an image to the cache. Due to normal working set, this should produce
1420 // a task and a ref. 1464 // a task and a ref.
1421 sk_sp<SkImage> image = CreateImage(100, 100); 1465 sk_sp<SkImage> image = CreateImage(100, 100);
1422 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 1466 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
1423 quality, 1467 quality,
1424 CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); 1468 CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable),
1469 DefaultColorSpace());
1425 scoped_refptr<TileTask> task; 1470 scoped_refptr<TileTask> task;
1426 bool need_unref = cache.GetTaskForImageAndRef( 1471 bool need_unref = cache.GetTaskForImageAndRef(
1427 draw_image, ImageDecodeCache::TracingInfo(), &task); 1472 draw_image, ImageDecodeCache::TracingInfo(), &task);
1428 EXPECT_TRUE(need_unref); 1473 EXPECT_TRUE(need_unref);
1429 EXPECT_TRUE(task); 1474 EXPECT_TRUE(task);
1430 EXPECT_EQ(task->dependencies().size(), 1u); 1475 EXPECT_EQ(task->dependencies().size(), 1u);
1431 EXPECT_TRUE(task->dependencies()[0]); 1476 EXPECT_TRUE(task->dependencies()[0]);
1432 1477
1433 // Run the task. 1478 // Run the task.
1434 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); 1479 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get());
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1468 auto context_provider = TestContextProvider::Create(); 1513 auto context_provider = TestContextProvider::Create();
1469 context_provider->BindToCurrentThread(); 1514 context_provider->BindToCurrentThread();
1470 GpuImageDecodeCache cache(context_provider.get(), ResourceFormat::RGBA_8888, 1515 GpuImageDecodeCache cache(context_provider.get(), ResourceFormat::RGBA_8888,
1471 kGpuMemoryLimitBytes, cache_size); 1516 kGpuMemoryLimitBytes, cache_size);
1472 bool is_decomposable = true; 1517 bool is_decomposable = true;
1473 SkFilterQuality quality = kHigh_SkFilterQuality; 1518 SkFilterQuality quality = kHigh_SkFilterQuality;
1474 1519
1475 sk_sp<SkImage> image = CreateImage(100, 100); 1520 sk_sp<SkImage> image = CreateImage(100, 100);
1476 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 1521 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
1477 quality, 1522 quality,
1478 CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); 1523 CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable),
1524 DefaultColorSpace());
1479 1525
1480 sk_sp<SkImage> image2 = CreateImage(100, 100); 1526 sk_sp<SkImage> image2 = CreateImage(100, 100);
1481 DrawImage draw_image2( 1527 DrawImage draw_image2(
1482 image2, SkIRect::MakeWH(image2->width(), image2->height()), quality, 1528 image2, SkIRect::MakeWH(image2->width(), image2->height()), quality,
1483 CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); 1529 CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable),
1530 DefaultColorSpace());
1484 1531
1485 // Add an image to the cache and un-ref it. 1532 // Add an image to the cache and un-ref it.
1486 { 1533 {
1487 scoped_refptr<TileTask> task; 1534 scoped_refptr<TileTask> task;
1488 bool need_unref = cache.GetTaskForImageAndRef( 1535 bool need_unref = cache.GetTaskForImageAndRef(
1489 draw_image, ImageDecodeCache::TracingInfo(), &task); 1536 draw_image, ImageDecodeCache::TracingInfo(), &task);
1490 EXPECT_TRUE(need_unref); 1537 EXPECT_TRUE(need_unref);
1491 EXPECT_TRUE(task); 1538 EXPECT_TRUE(task);
1492 EXPECT_EQ(task->dependencies().size(), 1u); 1539 EXPECT_EQ(task->dependencies().size(), 1u);
1493 EXPECT_TRUE(task->dependencies()[0]); 1540 EXPECT_TRUE(task->dependencies()[0]);
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1556 auto context_provider = TestContextProvider::Create(); 1603 auto context_provider = TestContextProvider::Create();
1557 context_provider->BindToCurrentThread(); 1604 context_provider->BindToCurrentThread();
1558 TestGpuImageDecodeCache cache(context_provider.get()); 1605 TestGpuImageDecodeCache cache(context_provider.get());
1559 bool is_decomposable = true; 1606 bool is_decomposable = true;
1560 SkFilterQuality quality = kHigh_SkFilterQuality; 1607 SkFilterQuality quality = kHigh_SkFilterQuality;
1561 1608
1562 for (int i = 0; i < 10; ++i) { 1609 for (int i = 0; i < 10; ++i) {
1563 sk_sp<SkImage> image = CreateImage(100, 100); 1610 sk_sp<SkImage> image = CreateImage(100, 100);
1564 DrawImage draw_image( 1611 DrawImage draw_image(
1565 image, SkIRect::MakeWH(image->width(), image->height()), quality, 1612 image, SkIRect::MakeWH(image->width(), image->height()), quality,
1566 CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); 1613 CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable),
1614 DefaultColorSpace());
1567 scoped_refptr<TileTask> task; 1615 scoped_refptr<TileTask> task;
1568 bool need_unref = cache.GetTaskForImageAndRef( 1616 bool need_unref = cache.GetTaskForImageAndRef(
1569 draw_image, ImageDecodeCache::TracingInfo(), &task); 1617 draw_image, ImageDecodeCache::TracingInfo(), &task);
1570 EXPECT_TRUE(need_unref); 1618 EXPECT_TRUE(need_unref);
1571 EXPECT_TRUE(task); 1619 EXPECT_TRUE(task);
1572 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); 1620 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get());
1573 TestTileTaskRunner::ProcessTask(task.get()); 1621 TestTileTaskRunner::ProcessTask(task.get());
1574 cache.UnrefImage(draw_image); 1622 cache.UnrefImage(draw_image);
1575 } 1623 }
1576 1624
1577 // We should now have data image in our cache. 1625 // We should now have data image in our cache.
1578 EXPECT_GT(cache.GetBytesUsedForTesting(), 0u); 1626 EXPECT_GT(cache.GetBytesUsedForTesting(), 0u);
1579 EXPECT_EQ(cache.GetNumCacheEntriesForTesting(), 10u); 1627 EXPECT_EQ(cache.GetNumCacheEntriesForTesting(), 10u);
1580 1628
1581 // Tell our cache to clear resources. 1629 // Tell our cache to clear resources.
1582 cache.ClearCache(); 1630 cache.ClearCache();
1583 1631
1584 // We should now have nothing in our cache. 1632 // We should now have nothing in our cache.
1585 EXPECT_EQ(cache.GetBytesUsedForTesting(), 0u); 1633 EXPECT_EQ(cache.GetBytesUsedForTesting(), 0u);
1586 EXPECT_EQ(cache.GetNumCacheEntriesForTesting(), 0u); 1634 EXPECT_EQ(cache.GetNumCacheEntriesForTesting(), 0u);
1587 } 1635 }
1588 1636
1637 TEST(GpuImageDecodeCacheTest, GetTaskForImageDifferentColorSpace) {
1638 auto context_provider = TestContextProvider::Create();
1639 context_provider->BindToCurrentThread();
1640 TestGpuImageDecodeCache cache(context_provider.get());
1641 bool is_decomposable = true;
1642 SkFilterQuality quality = kHigh_SkFilterQuality;
1643
1644 gfx::ColorSpace color_space_a = gfx::ColorSpace::CreateSRGB();
1645 gfx::ColorSpace color_space_b = gfx::ColorSpace::CreateXYZD50();
1646
1647 sk_sp<SkImage> first_image = CreateImage(100, 100);
1648 DrawImage first_draw_image(
1649 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()),
1650 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable),
1651 color_space_a);
1652 scoped_refptr<TileTask> first_task;
1653 bool need_unref = cache.GetTaskForImageAndRef(
1654 first_draw_image, ImageDecodeCache::TracingInfo(), &first_task);
1655 EXPECT_TRUE(need_unref);
1656 EXPECT_TRUE(first_task);
1657
1658 DrawImage second_draw_image(
1659 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()),
1660 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable),
1661 color_space_b);
1662 scoped_refptr<TileTask> second_task;
1663 need_unref = cache.GetTaskForImageAndRef(
1664 second_draw_image, ImageDecodeCache::TracingInfo(), &second_task);
1665 EXPECT_TRUE(need_unref);
1666 EXPECT_TRUE(second_task);
1667 EXPECT_TRUE(first_task.get() != second_task.get());
1668
1669 DrawImage third_draw_image(
1670 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()),
1671 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable),
1672 color_space_a);
1673 scoped_refptr<TileTask> third_task;
1674 need_unref = cache.GetTaskForImageAndRef(
1675 third_draw_image, ImageDecodeCache::TracingInfo(), &third_task);
1676 EXPECT_TRUE(need_unref);
1677 EXPECT_TRUE(third_task.get() == first_task.get());
1678
1679 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get());
1680 TestTileTaskRunner::ProcessTask(first_task.get());
1681 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get());
1682 TestTileTaskRunner::ProcessTask(second_task.get());
1683
1684 cache.UnrefImage(first_draw_image);
1685 cache.UnrefImage(second_draw_image);
1686 cache.UnrefImage(third_draw_image);
1687 }
1688
1589 } // namespace 1689 } // namespace
1590 } // namespace cc 1690 } // namespace cc
OLDNEW
« no previous file with comments | « cc/tiles/gpu_image_decode_cache.cc ('k') | cc/tiles/image_controller.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698