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

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

Powered by Google App Engine
This is Rietveld 408576698