OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |