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