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

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

Issue 1997743002: cc: Implement test task runner for tests. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@remove_schedule_complete
Patch Set: extended to SoftwareImageDecodeControllerTest Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/tiles/gpu_image_decode_controller.h" 5 #include "cc/tiles/gpu_image_decode_controller.h"
6 6
7 #include "cc/playback/draw_image.h" 7 #include "cc/playback/draw_image.h"
8 #include "cc/raster/tile_task.h" 8 #include "cc/test/simple_task_runner.h"
9 #include "cc/test/test_context_provider.h" 9 #include "cc/test/test_context_provider.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 sk_sp<SkImage> CreateImage(int width, int height) { 16 sk_sp<SkImage> CreateImage(int width, int height) {
17 SkBitmap bitmap; 17 SkBitmap bitmap;
18 bitmap.allocPixels(SkImageInfo::MakeN32Premul(width, height)); 18 bitmap.allocPixels(SkImageInfo::MakeN32Premul(width, height));
19 return SkImage::MakeFromBitmap(bitmap); 19 return SkImage::MakeFromBitmap(bitmap);
20 } 20 }
21 21
22 SkMatrix CreateMatrix(const SkSize& scale, bool is_decomposable) { 22 SkMatrix CreateMatrix(const SkSize& scale, bool is_decomposable) {
23 SkMatrix matrix; 23 SkMatrix matrix;
24 matrix.setScale(scale.width(), scale.height()); 24 matrix.setScale(scale.width(), scale.height());
25 25
26 if (!is_decomposable) { 26 if (!is_decomposable) {
27 // Perspective is not decomposable, add it. 27 // Perspective is not decomposable, add it.
28 matrix[SkMatrix::kMPersp0] = 0.1f; 28 matrix[SkMatrix::kMPersp0] = 0.1f;
29 } 29 }
30 30
31 return matrix; 31 return matrix;
32 } 32 }
33 33
34 void ScheduleTask(TileTask* task) {
35 task->state().DidSchedule();
36 }
37
38 // Before running the task it must be scheduled. Call ScheduleTask() before
39 // calling this function.
40 void RunTask(TileTask* task) {
41 task->state().DidStart();
42 task->RunOnWorkerThread();
43 task->state().DidFinish();
44 }
45
46 void CompleteTask(TileTask* task) {
47 DCHECK(task->state().IsFinished() || task->state().IsCanceled());
48 task->OnTaskCompleted();
49 }
50
51 void CancelTask(TileTask* task) {
52 task->state().DidCancel();
53 }
54
55 void ProcessTask(TileTask* task) {
56 ScheduleTask(task);
57 RunTask(task);
58 CompleteTask(task);
59 }
60
61 TEST(GpuImageDecodeControllerTest, GetTaskForImageSameImage) { 34 TEST(GpuImageDecodeControllerTest, GetTaskForImageSameImage) {
62 auto context_provider = TestContextProvider::Create(); 35 auto context_provider = TestContextProvider::Create();
63 context_provider->BindToCurrentThread(); 36 context_provider->BindToCurrentThread();
64 GpuImageDecodeController controller(context_provider.get(), 37 GpuImageDecodeController controller(context_provider.get(),
65 ResourceFormat::RGBA_8888); 38 ResourceFormat::RGBA_8888);
66 sk_sp<SkImage> image = CreateImage(100, 100); 39 sk_sp<SkImage> image = CreateImage(100, 100);
67 bool is_decomposable = true; 40 bool is_decomposable = true;
68 SkFilterQuality quality = kHigh_SkFilterQuality; 41 SkFilterQuality quality = kHigh_SkFilterQuality;
69 42
70 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 43 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
71 quality, 44 quality,
72 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 45 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
73 scoped_refptr<TileTask> task; 46 scoped_refptr<TileTask> task;
74 bool need_unref = controller.GetTaskForImageAndRef( 47 bool need_unref = controller.GetTaskForImageAndRef(
75 draw_image, ImageDecodeController::TracingInfo(), &task); 48 draw_image, ImageDecodeController::TracingInfo(), &task);
76 EXPECT_TRUE(need_unref); 49 EXPECT_TRUE(need_unref);
77 EXPECT_TRUE(task); 50 EXPECT_TRUE(task);
78 51
79 DrawImage another_draw_image( 52 DrawImage another_draw_image(
80 image, SkIRect::MakeWH(image->width(), image->height()), quality, 53 image, SkIRect::MakeWH(image->width(), image->height()), quality,
81 CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable)); 54 CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable));
82 scoped_refptr<TileTask> another_task; 55 scoped_refptr<TileTask> another_task;
83 need_unref = controller.GetTaskForImageAndRef( 56 need_unref = controller.GetTaskForImageAndRef(
84 another_draw_image, ImageDecodeController::TracingInfo(), &another_task); 57 another_draw_image, ImageDecodeController::TracingInfo(), &another_task);
85 EXPECT_TRUE(need_unref); 58 EXPECT_TRUE(need_unref);
86 EXPECT_TRUE(task.get() == another_task.get()); 59 EXPECT_TRUE(task.get() == another_task.get());
87 60
88 ProcessTask(task->dependencies()[0].get()); 61 SimpleTaskRunner::ProcessTask(task->dependencies()[0].get());
89 ProcessTask(task.get()); 62 SimpleTaskRunner::ProcessTask(task.get());
90 63
91 controller.UnrefImage(draw_image); 64 controller.UnrefImage(draw_image);
92 controller.UnrefImage(draw_image); 65 controller.UnrefImage(draw_image);
93 } 66 }
94 67
95 TEST(GpuImageDecodeControllerTest, GetTaskForImageDifferentImage) { 68 TEST(GpuImageDecodeControllerTest, GetTaskForImageDifferentImage) {
96 auto context_provider = TestContextProvider::Create(); 69 auto context_provider = TestContextProvider::Create();
97 context_provider->BindToCurrentThread(); 70 context_provider->BindToCurrentThread();
98 GpuImageDecodeController controller(context_provider.get(), 71 GpuImageDecodeController controller(context_provider.get(),
99 ResourceFormat::RGBA_8888); 72 ResourceFormat::RGBA_8888);
(...skipping 15 matching lines...) Expand all
115 second_image, 88 second_image,
116 SkIRect::MakeWH(second_image->width(), second_image->height()), quality, 89 SkIRect::MakeWH(second_image->width(), second_image->height()), quality,
117 CreateMatrix(SkSize::Make(0.25f, 0.25f), is_decomposable)); 90 CreateMatrix(SkSize::Make(0.25f, 0.25f), is_decomposable));
118 scoped_refptr<TileTask> second_task; 91 scoped_refptr<TileTask> second_task;
119 need_unref = controller.GetTaskForImageAndRef( 92 need_unref = controller.GetTaskForImageAndRef(
120 second_draw_image, ImageDecodeController::TracingInfo(), &second_task); 93 second_draw_image, ImageDecodeController::TracingInfo(), &second_task);
121 EXPECT_TRUE(need_unref); 94 EXPECT_TRUE(need_unref);
122 EXPECT_TRUE(second_task); 95 EXPECT_TRUE(second_task);
123 EXPECT_TRUE(first_task.get() != second_task.get()); 96 EXPECT_TRUE(first_task.get() != second_task.get());
124 97
125 ProcessTask(first_task->dependencies()[0].get()); 98 SimpleTaskRunner::ProcessTask(first_task->dependencies()[0].get());
126 ProcessTask(first_task.get()); 99 SimpleTaskRunner::ProcessTask(first_task.get());
127 ProcessTask(second_task->dependencies()[0].get()); 100 SimpleTaskRunner::ProcessTask(second_task->dependencies()[0].get());
128 ProcessTask(second_task.get()); 101 SimpleTaskRunner::ProcessTask(second_task.get());
129 102
130 controller.UnrefImage(first_draw_image); 103 controller.UnrefImage(first_draw_image);
131 controller.UnrefImage(second_draw_image); 104 controller.UnrefImage(second_draw_image);
132 } 105 }
133 106
134 TEST(GpuImageDecodeControllerTest, GetTaskForImageAlreadyDecodedAndLocked) { 107 TEST(GpuImageDecodeControllerTest, GetTaskForImageAlreadyDecodedAndLocked) {
135 auto context_provider = TestContextProvider::Create(); 108 auto context_provider = TestContextProvider::Create();
136 context_provider->BindToCurrentThread(); 109 context_provider->BindToCurrentThread();
137 GpuImageDecodeController controller(context_provider.get(), 110 GpuImageDecodeController controller(context_provider.get(),
138 ResourceFormat::RGBA_8888); 111 ResourceFormat::RGBA_8888);
139 bool is_decomposable = true; 112 bool is_decomposable = true;
140 SkFilterQuality quality = kHigh_SkFilterQuality; 113 SkFilterQuality quality = kHigh_SkFilterQuality;
141 114
142 sk_sp<SkImage> image = CreateImage(100, 100); 115 sk_sp<SkImage> image = CreateImage(100, 100);
143 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 116 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
144 quality, 117 quality,
145 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 118 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
146 scoped_refptr<TileTask> task; 119 scoped_refptr<TileTask> task;
147 bool need_unref = controller.GetTaskForImageAndRef( 120 bool need_unref = controller.GetTaskForImageAndRef(
148 draw_image, ImageDecodeController::TracingInfo(), &task); 121 draw_image, ImageDecodeController::TracingInfo(), &task);
149 EXPECT_TRUE(need_unref); 122 EXPECT_TRUE(need_unref);
150 EXPECT_TRUE(task); 123 EXPECT_TRUE(task);
151 EXPECT_EQ(task->dependencies().size(), 1u); 124 EXPECT_EQ(task->dependencies().size(), 1u);
152 EXPECT_TRUE(task->dependencies()[0]); 125 EXPECT_TRUE(task->dependencies()[0]);
153 126
154 // Run the decode but don't complete it (this will keep the decode locked). 127 // Run the decode but don't complete it (this will keep the decode locked).
155 ScheduleTask(task->dependencies()[0].get()); 128 SimpleTaskRunner::ScheduleTask(task->dependencies()[0].get());
156 RunTask(task->dependencies()[0].get()); 129 SimpleTaskRunner::RunTask(task->dependencies()[0].get());
157 130
158 // Cancel the upload. 131 // Cancel the upload.
159 CancelTask(task.get()); 132 SimpleTaskRunner::CancelTask(task.get());
160 CompleteTask(task.get()); 133 SimpleTaskRunner::CompleteTask(task.get());
161 134
162 // Get the image again - we should have an upload task, but no dependent 135 // Get the image again - we should have an upload task, but no dependent
163 // decode task, as the decode was already locked. 136 // decode task, as the decode was already locked.
164 scoped_refptr<TileTask> another_task; 137 scoped_refptr<TileTask> another_task;
165 need_unref = controller.GetTaskForImageAndRef( 138 need_unref = controller.GetTaskForImageAndRef(
166 draw_image, ImageDecodeController::TracingInfo(), &another_task); 139 draw_image, ImageDecodeController::TracingInfo(), &another_task);
167 EXPECT_TRUE(need_unref); 140 EXPECT_TRUE(need_unref);
168 EXPECT_TRUE(another_task); 141 EXPECT_TRUE(another_task);
169 EXPECT_EQ(another_task->dependencies().size(), 0u); 142 EXPECT_EQ(another_task->dependencies().size(), 0u);
170 143
171 ProcessTask(another_task.get()); 144 SimpleTaskRunner::ProcessTask(another_task.get());
172 145
173 // Finally, complete the original decode task. 146 // Finally, complete the original decode task.
174 CompleteTask(task->dependencies()[0].get()); 147 SimpleTaskRunner::CompleteTask(task->dependencies()[0].get());
175 148
176 controller.UnrefImage(draw_image); 149 controller.UnrefImage(draw_image);
177 controller.UnrefImage(draw_image); 150 controller.UnrefImage(draw_image);
178 } 151 }
179 152
180 TEST(GpuImageDecodeControllerTest, GetTaskForImageAlreadyDecodedNotLocked) { 153 TEST(GpuImageDecodeControllerTest, GetTaskForImageAlreadyDecodedNotLocked) {
181 auto context_provider = TestContextProvider::Create(); 154 auto context_provider = TestContextProvider::Create();
182 context_provider->BindToCurrentThread(); 155 context_provider->BindToCurrentThread();
183 GpuImageDecodeController controller(context_provider.get(), 156 GpuImageDecodeController controller(context_provider.get(),
184 ResourceFormat::RGBA_8888); 157 ResourceFormat::RGBA_8888);
185 bool is_decomposable = true; 158 bool is_decomposable = true;
186 SkFilterQuality quality = kHigh_SkFilterQuality; 159 SkFilterQuality quality = kHigh_SkFilterQuality;
187 160
188 sk_sp<SkImage> image = CreateImage(100, 100); 161 sk_sp<SkImage> image = CreateImage(100, 100);
189 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 162 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
190 quality, 163 quality,
191 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 164 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
192 scoped_refptr<TileTask> task; 165 scoped_refptr<TileTask> task;
193 bool need_unref = controller.GetTaskForImageAndRef( 166 bool need_unref = controller.GetTaskForImageAndRef(
194 draw_image, ImageDecodeController::TracingInfo(), &task); 167 draw_image, ImageDecodeController::TracingInfo(), &task);
195 EXPECT_TRUE(need_unref); 168 EXPECT_TRUE(need_unref);
196 EXPECT_TRUE(task); 169 EXPECT_TRUE(task);
197 EXPECT_EQ(task->dependencies().size(), 1u); 170 EXPECT_EQ(task->dependencies().size(), 1u);
198 EXPECT_TRUE(task->dependencies()[0]); 171 EXPECT_TRUE(task->dependencies()[0]);
199 172
200 // Run the decode. 173 // Run the decode.
201 ProcessTask(task->dependencies()[0].get()); 174 SimpleTaskRunner::ProcessTask(task->dependencies()[0].get());
202 175
203 // Cancel the upload. 176 // Cancel the upload.
204 CancelTask(task.get()); 177 SimpleTaskRunner::CancelTask(task.get());
205 CompleteTask(task.get()); 178 SimpleTaskRunner::CompleteTask(task.get());
206 179
207 // Unref the image. 180 // Unref the image.
208 controller.UnrefImage(draw_image); 181 controller.UnrefImage(draw_image);
209 182
210 // Get the image again - we should have an upload task and a dependent decode 183 // Get the image again - we should have an upload task and a dependent decode
211 // task - this dependent task will typically just re-lock the image. 184 // task - this dependent task will typically just re-lock the image.
212 scoped_refptr<TileTask> another_task; 185 scoped_refptr<TileTask> another_task;
213 need_unref = controller.GetTaskForImageAndRef( 186 need_unref = controller.GetTaskForImageAndRef(
214 draw_image, ImageDecodeController::TracingInfo(), &another_task); 187 draw_image, ImageDecodeController::TracingInfo(), &another_task);
215 EXPECT_TRUE(need_unref); 188 EXPECT_TRUE(need_unref);
216 EXPECT_TRUE(another_task); 189 EXPECT_TRUE(another_task);
217 EXPECT_EQ(another_task->dependencies().size(), 1u); 190 EXPECT_EQ(another_task->dependencies().size(), 1u);
218 EXPECT_TRUE(task->dependencies()[0]); 191 EXPECT_TRUE(task->dependencies()[0]);
219 192
220 ProcessTask(another_task->dependencies()[0].get()); 193 SimpleTaskRunner::ProcessTask(another_task->dependencies()[0].get());
221 ProcessTask(another_task.get()); 194 SimpleTaskRunner::ProcessTask(another_task.get());
222 195
223 controller.UnrefImage(draw_image); 196 controller.UnrefImage(draw_image);
224 } 197 }
225 198
226 TEST(GpuImageDecodeControllerTest, GetTaskForImageAlreadyUploaded) { 199 TEST(GpuImageDecodeControllerTest, GetTaskForImageAlreadyUploaded) {
227 auto context_provider = TestContextProvider::Create(); 200 auto context_provider = TestContextProvider::Create();
228 context_provider->BindToCurrentThread(); 201 context_provider->BindToCurrentThread();
229 GpuImageDecodeController controller(context_provider.get(), 202 GpuImageDecodeController controller(context_provider.get(),
230 ResourceFormat::RGBA_8888); 203 ResourceFormat::RGBA_8888);
231 bool is_decomposable = true; 204 bool is_decomposable = true;
232 SkFilterQuality quality = kHigh_SkFilterQuality; 205 SkFilterQuality quality = kHigh_SkFilterQuality;
233 206
234 sk_sp<SkImage> image = CreateImage(100, 100); 207 sk_sp<SkImage> image = CreateImage(100, 100);
235 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 208 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
236 quality, 209 quality,
237 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 210 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
238 scoped_refptr<TileTask> task; 211 scoped_refptr<TileTask> task;
239 bool need_unref = controller.GetTaskForImageAndRef( 212 bool need_unref = controller.GetTaskForImageAndRef(
240 draw_image, ImageDecodeController::TracingInfo(), &task); 213 draw_image, ImageDecodeController::TracingInfo(), &task);
241 EXPECT_TRUE(need_unref); 214 EXPECT_TRUE(need_unref);
242 EXPECT_TRUE(task); 215 EXPECT_TRUE(task);
243 EXPECT_EQ(task->dependencies().size(), 1u); 216 EXPECT_EQ(task->dependencies().size(), 1u);
244 EXPECT_TRUE(task->dependencies()[0]); 217 EXPECT_TRUE(task->dependencies()[0]);
245 218
246 ProcessTask(task->dependencies()[0].get()); 219 SimpleTaskRunner::ProcessTask(task->dependencies()[0].get());
247 ScheduleTask(task.get()); 220 SimpleTaskRunner::ScheduleTask(task.get());
248 RunTask(task.get()); 221 SimpleTaskRunner::RunTask(task.get());
249 222
250 scoped_refptr<TileTask> another_task; 223 scoped_refptr<TileTask> another_task;
251 need_unref = controller.GetTaskForImageAndRef( 224 need_unref = controller.GetTaskForImageAndRef(
252 draw_image, ImageDecodeController::TracingInfo(), &another_task); 225 draw_image, ImageDecodeController::TracingInfo(), &another_task);
253 EXPECT_TRUE(need_unref); 226 EXPECT_TRUE(need_unref);
254 EXPECT_FALSE(another_task); 227 EXPECT_FALSE(another_task);
255 228
256 CompleteTask(task.get()); 229 SimpleTaskRunner::CompleteTask(task.get());
257 230
258 controller.UnrefImage(draw_image); 231 controller.UnrefImage(draw_image);
259 controller.UnrefImage(draw_image); 232 controller.UnrefImage(draw_image);
260 } 233 }
261 234
262 TEST(GpuImageDecodeControllerTest, GetTaskForImageCanceledGetsNewTask) { 235 TEST(GpuImageDecodeControllerTest, GetTaskForImageCanceledGetsNewTask) {
263 auto context_provider = TestContextProvider::Create(); 236 auto context_provider = TestContextProvider::Create();
264 context_provider->BindToCurrentThread(); 237 context_provider->BindToCurrentThread();
265 GpuImageDecodeController controller(context_provider.get(), 238 GpuImageDecodeController controller(context_provider.get(),
266 ResourceFormat::RGBA_8888); 239 ResourceFormat::RGBA_8888);
267 bool is_decomposable = true; 240 bool is_decomposable = true;
268 SkFilterQuality quality = kHigh_SkFilterQuality; 241 SkFilterQuality quality = kHigh_SkFilterQuality;
269 242
270 sk_sp<SkImage> image = CreateImage(100, 100); 243 sk_sp<SkImage> image = CreateImage(100, 100);
271 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 244 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
272 quality, 245 quality,
273 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 246 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
274 scoped_refptr<TileTask> task; 247 scoped_refptr<TileTask> task;
275 bool need_unref = controller.GetTaskForImageAndRef( 248 bool need_unref = controller.GetTaskForImageAndRef(
276 draw_image, ImageDecodeController::TracingInfo(), &task); 249 draw_image, ImageDecodeController::TracingInfo(), &task);
277 EXPECT_TRUE(need_unref); 250 EXPECT_TRUE(need_unref);
278 EXPECT_TRUE(task); 251 EXPECT_TRUE(task);
279 252
280 ProcessTask(task->dependencies()[0].get()); 253 SimpleTaskRunner::ProcessTask(task->dependencies()[0].get());
281 254
282 scoped_refptr<TileTask> another_task; 255 scoped_refptr<TileTask> another_task;
283 need_unref = controller.GetTaskForImageAndRef( 256 need_unref = controller.GetTaskForImageAndRef(
284 draw_image, ImageDecodeController::TracingInfo(), &another_task); 257 draw_image, ImageDecodeController::TracingInfo(), &another_task);
285 EXPECT_TRUE(need_unref); 258 EXPECT_TRUE(need_unref);
286 EXPECT_TRUE(another_task.get() == task.get()); 259 EXPECT_TRUE(another_task.get() == task.get());
287 260
288 // Didn't run the task, so cancel it. 261 // Didn't run the task, so cancel it.
289 CancelTask(task.get()); 262 SimpleTaskRunner::CancelTask(task.get());
290 CompleteTask(task.get()); 263 SimpleTaskRunner::CompleteTask(task.get());
291 264
292 // Fully cancel everything (so the raster would unref things). 265 // Fully cancel everything (so the raster would unref things).
293 controller.UnrefImage(draw_image); 266 controller.UnrefImage(draw_image);
294 controller.UnrefImage(draw_image); 267 controller.UnrefImage(draw_image);
295 268
296 // Here a new task is created. 269 // Here a new task is created.
297 scoped_refptr<TileTask> third_task; 270 scoped_refptr<TileTask> third_task;
298 need_unref = controller.GetTaskForImageAndRef( 271 need_unref = controller.GetTaskForImageAndRef(
299 draw_image, ImageDecodeController::TracingInfo(), &third_task); 272 draw_image, ImageDecodeController::TracingInfo(), &third_task);
300 EXPECT_TRUE(need_unref); 273 EXPECT_TRUE(need_unref);
301 EXPECT_TRUE(third_task); 274 EXPECT_TRUE(third_task);
302 EXPECT_FALSE(third_task.get() == task.get()); 275 EXPECT_FALSE(third_task.get() == task.get());
303 276
304 ProcessTask(third_task->dependencies()[0].get()); 277 SimpleTaskRunner::ProcessTask(third_task->dependencies()[0].get());
305 ProcessTask(third_task.get()); 278 SimpleTaskRunner::ProcessTask(third_task.get());
306 279
307 controller.UnrefImage(draw_image); 280 controller.UnrefImage(draw_image);
308 } 281 }
309 282
310 TEST(GpuImageDecodeControllerTest, 283 TEST(GpuImageDecodeControllerTest,
311 GetTaskForImageCanceledWhileReffedGetsNewTask) { 284 GetTaskForImageCanceledWhileReffedGetsNewTask) {
312 auto context_provider = TestContextProvider::Create(); 285 auto context_provider = TestContextProvider::Create();
313 context_provider->BindToCurrentThread(); 286 context_provider->BindToCurrentThread();
314 GpuImageDecodeController controller(context_provider.get(), 287 GpuImageDecodeController controller(context_provider.get(),
315 ResourceFormat::RGBA_8888); 288 ResourceFormat::RGBA_8888);
316 bool is_decomposable = true; 289 bool is_decomposable = true;
317 SkFilterQuality quality = kHigh_SkFilterQuality; 290 SkFilterQuality quality = kHigh_SkFilterQuality;
318 291
319 sk_sp<SkImage> image = CreateImage(100, 100); 292 sk_sp<SkImage> image = CreateImage(100, 100);
320 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 293 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
321 quality, 294 quality,
322 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 295 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
323 scoped_refptr<TileTask> task; 296 scoped_refptr<TileTask> task;
324 bool need_unref = controller.GetTaskForImageAndRef( 297 bool need_unref = controller.GetTaskForImageAndRef(
325 draw_image, ImageDecodeController::TracingInfo(), &task); 298 draw_image, ImageDecodeController::TracingInfo(), &task);
326 EXPECT_TRUE(need_unref); 299 EXPECT_TRUE(need_unref);
327 EXPECT_TRUE(task); 300 EXPECT_TRUE(task);
328 301
329 ProcessTask(task->dependencies()[0].get()); 302 SimpleTaskRunner::ProcessTask(task->dependencies()[0].get());
330 303
331 scoped_refptr<TileTask> another_task; 304 scoped_refptr<TileTask> another_task;
332 need_unref = controller.GetTaskForImageAndRef( 305 need_unref = controller.GetTaskForImageAndRef(
333 draw_image, ImageDecodeController::TracingInfo(), &another_task); 306 draw_image, ImageDecodeController::TracingInfo(), &another_task);
334 EXPECT_TRUE(need_unref); 307 EXPECT_TRUE(need_unref);
335 EXPECT_TRUE(another_task.get() == task.get()); 308 EXPECT_TRUE(another_task.get() == task.get());
336 309
337 // Didn't run the task, so cancel it. 310 // Didn't run the task, so cancel it.
338 CancelTask(task.get()); 311 SimpleTaskRunner::CancelTask(task.get());
339 CompleteTask(task.get()); 312 SimpleTaskRunner::CompleteTask(task.get());
340 313
341 // Note that here, everything is reffed, but a new task is created. This is 314 // Note that here, everything is reffed, but a new task is created. This is
342 // possible with repeated schedule/cancel operations. 315 // possible with repeated schedule/cancel operations.
343 scoped_refptr<TileTask> third_task; 316 scoped_refptr<TileTask> third_task;
344 need_unref = controller.GetTaskForImageAndRef( 317 need_unref = controller.GetTaskForImageAndRef(
345 draw_image, ImageDecodeController::TracingInfo(), &third_task); 318 draw_image, ImageDecodeController::TracingInfo(), &third_task);
346 EXPECT_TRUE(need_unref); 319 EXPECT_TRUE(need_unref);
347 EXPECT_TRUE(third_task); 320 EXPECT_TRUE(third_task);
348 EXPECT_FALSE(third_task.get() == task.get()); 321 EXPECT_FALSE(third_task.get() == task.get());
349 322
350 ProcessTask(third_task->dependencies()[0].get()); 323 SimpleTaskRunner::ProcessTask(third_task->dependencies()[0].get());
351 ProcessTask(third_task.get()); 324 SimpleTaskRunner::ProcessTask(third_task.get());
352 325
353 // 3 Unrefs! 326 // 3 Unrefs!
354 controller.UnrefImage(draw_image); 327 controller.UnrefImage(draw_image);
355 controller.UnrefImage(draw_image); 328 controller.UnrefImage(draw_image);
356 controller.UnrefImage(draw_image); 329 controller.UnrefImage(draw_image);
357 } 330 }
358 331
359 TEST(GpuImageDecodeControllerTest, NoTaskForImageAlreadyFailedDecoding) { 332 TEST(GpuImageDecodeControllerTest, NoTaskForImageAlreadyFailedDecoding) {
360 auto context_provider = TestContextProvider::Create(); 333 auto context_provider = TestContextProvider::Create();
361 context_provider->BindToCurrentThread(); 334 context_provider->BindToCurrentThread();
362 GpuImageDecodeController controller(context_provider.get(), 335 GpuImageDecodeController controller(context_provider.get(),
363 ResourceFormat::RGBA_8888); 336 ResourceFormat::RGBA_8888);
364 bool is_decomposable = true; 337 bool is_decomposable = true;
365 SkFilterQuality quality = kHigh_SkFilterQuality; 338 SkFilterQuality quality = kHigh_SkFilterQuality;
366 339
367 sk_sp<SkImage> image = CreateImage(100, 100); 340 sk_sp<SkImage> image = CreateImage(100, 100);
368 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 341 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
369 quality, 342 quality,
370 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 343 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
371 scoped_refptr<TileTask> task; 344 scoped_refptr<TileTask> task;
372 bool need_unref = controller.GetTaskForImageAndRef( 345 bool need_unref = controller.GetTaskForImageAndRef(
373 draw_image, ImageDecodeController::TracingInfo(), &task); 346 draw_image, ImageDecodeController::TracingInfo(), &task);
374 EXPECT_TRUE(need_unref); 347 EXPECT_TRUE(need_unref);
375 EXPECT_TRUE(task); 348 EXPECT_TRUE(task);
376 349
377 ProcessTask(task->dependencies()[0].get()); 350 SimpleTaskRunner::ProcessTask(task->dependencies()[0].get());
378 // Didn't run the task, so cancel it. 351 // Didn't run the task, so cancel it.
379 CancelTask(task.get()); 352 SimpleTaskRunner::CancelTask(task.get());
380 CompleteTask(task.get()); 353 SimpleTaskRunner::CompleteTask(task.get());
381 354
382 controller.SetImageDecodingFailedForTesting(draw_image); 355 controller.SetImageDecodingFailedForTesting(draw_image);
383 356
384 scoped_refptr<TileTask> another_task; 357 scoped_refptr<TileTask> another_task;
385 need_unref = controller.GetTaskForImageAndRef( 358 need_unref = controller.GetTaskForImageAndRef(
386 draw_image, ImageDecodeController::TracingInfo(), &another_task); 359 draw_image, ImageDecodeController::TracingInfo(), &another_task);
387 EXPECT_FALSE(need_unref); 360 EXPECT_FALSE(need_unref);
388 EXPECT_EQ(another_task.get(), nullptr); 361 EXPECT_EQ(another_task.get(), nullptr);
389 362
390 controller.UnrefImage(draw_image); 363 controller.UnrefImage(draw_image);
(...skipping 10 matching lines...) Expand all
401 sk_sp<SkImage> image = CreateImage(100, 100); 374 sk_sp<SkImage> image = CreateImage(100, 100);
402 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 375 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
403 quality, 376 quality,
404 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 377 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
405 scoped_refptr<TileTask> task; 378 scoped_refptr<TileTask> task;
406 bool need_unref = controller.GetTaskForImageAndRef( 379 bool need_unref = controller.GetTaskForImageAndRef(
407 draw_image, ImageDecodeController::TracingInfo(), &task); 380 draw_image, ImageDecodeController::TracingInfo(), &task);
408 EXPECT_TRUE(need_unref); 381 EXPECT_TRUE(need_unref);
409 EXPECT_TRUE(task); 382 EXPECT_TRUE(task);
410 383
411 ProcessTask(task->dependencies()[0].get()); 384 SimpleTaskRunner::ProcessTask(task->dependencies()[0].get());
412 ProcessTask(task.get()); 385 SimpleTaskRunner::ProcessTask(task.get());
413 386
414 // Must hold context lock before calling GetDecodedImageForDraw / 387 // Must hold context lock before calling GetDecodedImageForDraw /
415 // DrawWithImageFinished. 388 // DrawWithImageFinished.
416 ContextProvider::ScopedContextLock context_lock(context_provider.get()); 389 ContextProvider::ScopedContextLock context_lock(context_provider.get());
417 DecodedDrawImage decoded_draw_image = 390 DecodedDrawImage decoded_draw_image =
418 controller.GetDecodedImageForDraw(draw_image); 391 controller.GetDecodedImageForDraw(draw_image);
419 EXPECT_TRUE(decoded_draw_image.image()); 392 EXPECT_TRUE(decoded_draw_image.image());
420 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); 393 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked());
421 EXPECT_FALSE(decoded_draw_image.is_at_raster_decode()); 394 EXPECT_FALSE(decoded_draw_image.is_at_raster_decode());
422 395
(...skipping 12 matching lines...) Expand all
435 sk_sp<SkImage> image = CreateImage(1, 24000); 408 sk_sp<SkImage> image = CreateImage(1, 24000);
436 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 409 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
437 quality, 410 quality,
438 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 411 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
439 scoped_refptr<TileTask> task; 412 scoped_refptr<TileTask> task;
440 bool need_unref = controller.GetTaskForImageAndRef( 413 bool need_unref = controller.GetTaskForImageAndRef(
441 draw_image, ImageDecodeController::TracingInfo(), &task); 414 draw_image, ImageDecodeController::TracingInfo(), &task);
442 EXPECT_TRUE(need_unref); 415 EXPECT_TRUE(need_unref);
443 EXPECT_TRUE(task); 416 EXPECT_TRUE(task);
444 417
445 ProcessTask(task->dependencies()[0].get()); 418 SimpleTaskRunner::ProcessTask(task->dependencies()[0].get());
446 ProcessTask(task.get()); 419 SimpleTaskRunner::ProcessTask(task.get());
447 420
448 // Must hold context lock before calling GetDecodedImageForDraw / 421 // Must hold context lock before calling GetDecodedImageForDraw /
449 // DrawWithImageFinished. 422 // DrawWithImageFinished.
450 ContextProvider::ScopedContextLock context_lock(context_provider.get()); 423 ContextProvider::ScopedContextLock context_lock(context_provider.get());
451 DecodedDrawImage decoded_draw_image = 424 DecodedDrawImage decoded_draw_image =
452 controller.GetDecodedImageForDraw(draw_image); 425 controller.GetDecodedImageForDraw(draw_image);
453 EXPECT_TRUE(decoded_draw_image.image()); 426 EXPECT_TRUE(decoded_draw_image.image());
454 EXPECT_FALSE(decoded_draw_image.image()->isTextureBacked()); 427 EXPECT_FALSE(decoded_draw_image.image()->isTextureBacked());
455 EXPECT_FALSE(decoded_draw_image.is_at_raster_decode()); 428 EXPECT_FALSE(decoded_draw_image.is_at_raster_decode());
456 429
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
644 image, SkIRect::MakeXYWH(0, 0, image->width(), image->height()), quality, 617 image, SkIRect::MakeXYWH(0, 0, image->width(), image->height()), quality,
645 CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable)); 618 CreateMatrix(SkSize::Make(1.f, 1.f), is_decomposable));
646 619
647 scoped_refptr<TileTask> task; 620 scoped_refptr<TileTask> task;
648 bool need_unref = controller.GetTaskForImageAndRef( 621 bool need_unref = controller.GetTaskForImageAndRef(
649 draw_image, ImageDecodeController::TracingInfo(), &task); 622 draw_image, ImageDecodeController::TracingInfo(), &task);
650 EXPECT_NE(0u, controller.GetBytesUsedForTesting()); 623 EXPECT_NE(0u, controller.GetBytesUsedForTesting());
651 EXPECT_TRUE(task); 624 EXPECT_TRUE(task);
652 EXPECT_TRUE(need_unref); 625 EXPECT_TRUE(need_unref);
653 626
654 CancelTask(task->dependencies()[0].get()); 627 SimpleTaskRunner::CancelTask(task->dependencies()[0].get());
655 CompleteTask(task->dependencies()[0].get()); 628 SimpleTaskRunner::CompleteTask(task->dependencies()[0].get());
656 CancelTask(task.get()); 629 SimpleTaskRunner::CancelTask(task.get());
657 CompleteTask(task.get()); 630 SimpleTaskRunner::CompleteTask(task.get());
658 631
659 controller.UnrefImage(draw_image); 632 controller.UnrefImage(draw_image);
660 EXPECT_EQ(0u, controller.GetBytesUsedForTesting()); 633 EXPECT_EQ(0u, controller.GetBytesUsedForTesting());
661 } 634 }
662 635
663 TEST(GpuImageDecodeControllerTest, ShouldAggressivelyFreeResources) { 636 TEST(GpuImageDecodeControllerTest, ShouldAggressivelyFreeResources) {
664 auto context_provider = TestContextProvider::Create(); 637 auto context_provider = TestContextProvider::Create();
665 context_provider->BindToCurrentThread(); 638 context_provider->BindToCurrentThread();
666 GpuImageDecodeController controller(context_provider.get(), 639 GpuImageDecodeController controller(context_provider.get(),
667 ResourceFormat::RGBA_8888); 640 ResourceFormat::RGBA_8888);
668 bool is_decomposable = true; 641 bool is_decomposable = true;
669 SkFilterQuality quality = kHigh_SkFilterQuality; 642 SkFilterQuality quality = kHigh_SkFilterQuality;
670 643
671 sk_sp<SkImage> image = CreateImage(100, 100); 644 sk_sp<SkImage> image = CreateImage(100, 100);
672 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), 645 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()),
673 quality, 646 quality,
674 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); 647 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable));
675 scoped_refptr<TileTask> task; 648 scoped_refptr<TileTask> task;
676 { 649 {
677 bool need_unref = controller.GetTaskForImageAndRef( 650 bool need_unref = controller.GetTaskForImageAndRef(
678 draw_image, ImageDecodeController::TracingInfo(), &task); 651 draw_image, ImageDecodeController::TracingInfo(), &task);
679 EXPECT_TRUE(need_unref); 652 EXPECT_TRUE(need_unref);
680 EXPECT_TRUE(task); 653 EXPECT_TRUE(task);
681 } 654 }
682 655
683 ProcessTask(task->dependencies()[0].get()); 656 SimpleTaskRunner::ProcessTask(task->dependencies()[0].get());
684 ProcessTask(task.get()); 657 SimpleTaskRunner::ProcessTask(task.get());
685 658
686 controller.UnrefImage(draw_image); 659 controller.UnrefImage(draw_image);
687 660
688 // We should now have data image in our cache. 661 // We should now have data image in our cache.
689 DCHECK_GT(controller.GetBytesUsedForTesting(), 0u); 662 DCHECK_GT(controller.GetBytesUsedForTesting(), 0u);
690 663
691 // Tell our controller to aggressively free resources. 664 // Tell our controller to aggressively free resources.
692 controller.SetShouldAggressivelyFreeResources(true); 665 controller.SetShouldAggressivelyFreeResources(true);
693 DCHECK_EQ(0u, controller.GetBytesUsedForTesting()); 666 DCHECK_EQ(0u, controller.GetBytesUsedForTesting());
694 667
695 // Attempting to upload a new image should result in at-raster decode. 668 // Attempting to upload a new image should result in at-raster decode.
696 { 669 {
697 bool need_unref = controller.GetTaskForImageAndRef( 670 bool need_unref = controller.GetTaskForImageAndRef(
698 draw_image, ImageDecodeController::TracingInfo(), &task); 671 draw_image, ImageDecodeController::TracingInfo(), &task);
699 EXPECT_FALSE(need_unref); 672 EXPECT_FALSE(need_unref);
700 EXPECT_FALSE(task); 673 EXPECT_FALSE(task);
701 } 674 }
702 675
703 // We now tell the controller to not aggressively free resources. Uploads 676 // We now tell the controller to not aggressively free resources. Uploads
704 // should work again. 677 // should work again.
705 controller.SetShouldAggressivelyFreeResources(false); 678 controller.SetShouldAggressivelyFreeResources(false);
706 { 679 {
707 bool need_unref = controller.GetTaskForImageAndRef( 680 bool need_unref = controller.GetTaskForImageAndRef(
708 draw_image, ImageDecodeController::TracingInfo(), &task); 681 draw_image, ImageDecodeController::TracingInfo(), &task);
709 EXPECT_TRUE(need_unref); 682 EXPECT_TRUE(need_unref);
710 EXPECT_TRUE(task); 683 EXPECT_TRUE(task);
711 } 684 }
712 685
713 ProcessTask(task->dependencies()[0].get()); 686 SimpleTaskRunner::ProcessTask(task->dependencies()[0].get());
714 ProcessTask(task.get()); 687 SimpleTaskRunner::ProcessTask(task.get());
715 688
716 // The image should be in our cache after un-ref. 689 // The image should be in our cache after un-ref.
717 controller.UnrefImage(draw_image); 690 controller.UnrefImage(draw_image);
718 DCHECK_GT(controller.GetBytesUsedForTesting(), 0u); 691 DCHECK_GT(controller.GetBytesUsedForTesting(), 0u);
719 } 692 }
720 693
721 } // namespace 694 } // namespace
722 } // namespace cc 695 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698