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_controller.h" | 5 #include "cc/tiles/gpu_image_decode_controller.h" |
6 | 6 |
7 #include "cc/playback/draw_image.h" | 7 #include "cc/playback/draw_image.h" |
8 #include "cc/raster/tile_task.h" | 8 #include "cc/raster/tile_task.h" |
9 #include "cc/test/test_context_provider.h" | 9 #include "cc/test/test_context_provider.h" |
10 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 | 123 |
124 ProcessTask(first_task->dependencies()[0].get()); | 124 ProcessTask(first_task->dependencies()[0].get()); |
125 ProcessTask(first_task.get()); | 125 ProcessTask(first_task.get()); |
126 ProcessTask(second_task->dependencies()[0].get()); | 126 ProcessTask(second_task->dependencies()[0].get()); |
127 ProcessTask(second_task.get()); | 127 ProcessTask(second_task.get()); |
128 | 128 |
129 controller.UnrefImage(first_draw_image); | 129 controller.UnrefImage(first_draw_image); |
130 controller.UnrefImage(second_draw_image); | 130 controller.UnrefImage(second_draw_image); |
131 } | 131 } |
132 | 132 |
133 TEST(GpuImageDecodeControllerTest, GetTaskForImageAlreadyDecoded) { | 133 TEST(GpuImageDecodeControllerTest, GetTaskForImageAlreadyDecodedAndLocked) { |
134 auto context_provider = TestContextProvider::Create(); | 134 auto context_provider = TestContextProvider::Create(); |
135 context_provider->BindToCurrentThread(); | 135 context_provider->BindToCurrentThread(); |
136 GpuImageDecodeController controller(context_provider.get(), | 136 GpuImageDecodeController controller(context_provider.get(), |
| 137 ResourceFormat::RGBA_8888); |
| 138 bool is_decomposable = true; |
| 139 uint64_t prepare_tiles_id = 1; |
| 140 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 141 |
| 142 sk_sp<SkImage> image = CreateImage(100, 100); |
| 143 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
| 144 quality, |
| 145 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| 146 scoped_refptr<TileTask> task; |
| 147 bool need_unref = |
| 148 controller.GetTaskForImageAndRef(draw_image, prepare_tiles_id, &task); |
| 149 EXPECT_TRUE(need_unref); |
| 150 EXPECT_TRUE(task); |
| 151 EXPECT_EQ(task->dependencies().size(), 1u); |
| 152 EXPECT_TRUE(task->dependencies()[0]); |
| 153 |
| 154 // Run the decode but don't complete it (this will keep the decode locked). |
| 155 ScheduleTask(task->dependencies()[0].get()); |
| 156 RunTask(task->dependencies()[0].get()); |
| 157 |
| 158 // Cancel the upload. |
| 159 ScheduleTask(task.get()); |
| 160 CompleteTask(task.get()); |
| 161 |
| 162 // Get the image again - we should have an upload task, but no dependent |
| 163 // decode task, as the decode was already locked. |
| 164 scoped_refptr<TileTask> another_task; |
| 165 need_unref = controller.GetTaskForImageAndRef(draw_image, prepare_tiles_id, |
| 166 &another_task); |
| 167 EXPECT_TRUE(need_unref); |
| 168 EXPECT_TRUE(another_task); |
| 169 EXPECT_EQ(another_task->dependencies().size(), 0u); |
| 170 |
| 171 ProcessTask(another_task.get()); |
| 172 |
| 173 // Finally, complete the original decode task. |
| 174 CompleteTask(task->dependencies()[0].get()); |
| 175 |
| 176 controller.UnrefImage(draw_image); |
| 177 controller.UnrefImage(draw_image); |
| 178 } |
| 179 |
| 180 TEST(GpuImageDecodeControllerTest, GetTaskForImageAlreadyDecodedNotLocked) { |
| 181 auto context_provider = TestContextProvider::Create(); |
| 182 context_provider->BindToCurrentThread(); |
| 183 GpuImageDecodeController controller(context_provider.get(), |
| 184 ResourceFormat::RGBA_8888); |
| 185 bool is_decomposable = true; |
| 186 uint64_t prepare_tiles_id = 1; |
| 187 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 188 |
| 189 sk_sp<SkImage> image = CreateImage(100, 100); |
| 190 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
| 191 quality, |
| 192 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| 193 scoped_refptr<TileTask> task; |
| 194 bool need_unref = |
| 195 controller.GetTaskForImageAndRef(draw_image, prepare_tiles_id, &task); |
| 196 EXPECT_TRUE(need_unref); |
| 197 EXPECT_TRUE(task); |
| 198 EXPECT_EQ(task->dependencies().size(), 1u); |
| 199 EXPECT_TRUE(task->dependencies()[0]); |
| 200 |
| 201 // Run the decode. |
| 202 ProcessTask(task->dependencies()[0].get()); |
| 203 |
| 204 // Cancel the upload. |
| 205 ScheduleTask(task.get()); |
| 206 CompleteTask(task.get()); |
| 207 |
| 208 // Unref the image. |
| 209 controller.UnrefImage(draw_image); |
| 210 |
| 211 // Get the image again - we should have an upload task and a dependent decode |
| 212 // task - this dependent task will typically just re-lock the image. |
| 213 scoped_refptr<TileTask> another_task; |
| 214 need_unref = controller.GetTaskForImageAndRef(draw_image, prepare_tiles_id, |
| 215 &another_task); |
| 216 EXPECT_TRUE(need_unref); |
| 217 EXPECT_TRUE(another_task); |
| 218 EXPECT_EQ(another_task->dependencies().size(), 1u); |
| 219 EXPECT_TRUE(task->dependencies()[0]); |
| 220 |
| 221 ProcessTask(another_task->dependencies()[0].get()); |
| 222 ProcessTask(another_task.get()); |
| 223 |
| 224 controller.UnrefImage(draw_image); |
| 225 } |
| 226 |
| 227 TEST(GpuImageDecodeControllerTest, GetTaskForImageAlreadyUploaded) { |
| 228 auto context_provider = TestContextProvider::Create(); |
| 229 context_provider->BindToCurrentThread(); |
| 230 GpuImageDecodeController controller(context_provider.get(), |
137 ResourceFormat::RGBA_8888); | 231 ResourceFormat::RGBA_8888); |
138 bool is_decomposable = true; | 232 bool is_decomposable = true; |
139 uint64_t prepare_tiles_id = 1; | 233 uint64_t prepare_tiles_id = 1; |
140 SkFilterQuality quality = kHigh_SkFilterQuality; | 234 SkFilterQuality quality = kHigh_SkFilterQuality; |
141 | 235 |
142 sk_sp<SkImage> image = CreateImage(100, 100); | 236 sk_sp<SkImage> image = CreateImage(100, 100); |
143 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 237 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
144 quality, | 238 quality, |
145 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | 239 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
146 scoped_refptr<TileTask> task; | 240 scoped_refptr<TileTask> task; |
(...skipping 450 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
597 ProcessTask(task->dependencies()[0].get()); | 691 ProcessTask(task->dependencies()[0].get()); |
598 ProcessTask(task.get()); | 692 ProcessTask(task.get()); |
599 | 693 |
600 // The image should be in our cache after un-ref. | 694 // The image should be in our cache after un-ref. |
601 controller.UnrefImage(draw_image); | 695 controller.UnrefImage(draw_image); |
602 DCHECK_GT(controller.GetBytesUsedForTesting(), 0u); | 696 DCHECK_GT(controller.GetBytesUsedForTesting(), 0u); |
603 } | 697 } |
604 | 698 |
605 } // namespace | 699 } // namespace |
606 } // namespace cc | 700 } // namespace cc |
OLD | NEW |