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

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

Issue 1890903002: cc: Simplify Task and its derived classes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@remove_tile_task_runner
Patch Set: nits Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/tiles/gpu_image_decode_controller.h" 5 #include "cc/tiles/gpu_image_decode_controller.h"
6 6
7 #include "base/memory/discardable_memory_allocator.h" 7 #include "base/memory/discardable_memory_allocator.h"
8 #include "base/memory/ptr_util.h" 8 #include "base/memory/ptr_util.h"
9 #include "base/numerics/safe_math.h" 9 #include "base/numerics/safe_math.h"
10 #include "base/strings/stringprintf.h" 10 #include "base/strings/stringprintf.h"
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
50 params.fMatrix = draw_image.matrix(); 50 params.fMatrix = draw_image.matrix();
51 params.fQuality = draw_image.filter_quality(); 51 params.fQuality = draw_image.filter_quality();
52 52
53 return params; 53 return params;
54 } 54 }
55 55
56 } // namespace 56 } // namespace
57 57
58 // Task which decodes an image and stores the result in discardable memory. 58 // Task which decodes an image and stores the result in discardable memory.
59 // This task does not use GPU resources and can be run on any thread. 59 // This task does not use GPU resources and can be run on any thread.
60 class ImageDecodeTaskImpl : public ImageDecodeTask { 60 class ImageDecodeTaskImpl : public TileTask {
61 public: 61 public:
62 ImageDecodeTaskImpl(GpuImageDecodeController* controller, 62 ImageDecodeTaskImpl(GpuImageDecodeController* controller,
63 const DrawImage& draw_image, 63 const DrawImage& draw_image,
64 uint64_t source_prepare_tiles_id) 64 uint64_t source_prepare_tiles_id)
65 : controller_(controller), 65 : controller_(controller),
66 image_(draw_image), 66 image_(draw_image),
67 image_ref_(skia::SharePtr(draw_image.image())), 67 image_ref_(skia::SharePtr(draw_image.image())),
68 source_prepare_tiles_id_(source_prepare_tiles_id) { 68 source_prepare_tiles_id_(source_prepare_tiles_id) {
69 DCHECK(!SkipImage(draw_image)); 69 DCHECK(!SkipImage(draw_image));
70 } 70 }
(...skipping 19 matching lines...) Expand all
90 DrawImage image_; 90 DrawImage image_;
91 skia::RefPtr<const SkImage> image_ref_; 91 skia::RefPtr<const SkImage> image_ref_;
92 const uint64_t source_prepare_tiles_id_; 92 const uint64_t source_prepare_tiles_id_;
93 93
94 DISALLOW_COPY_AND_ASSIGN(ImageDecodeTaskImpl); 94 DISALLOW_COPY_AND_ASSIGN(ImageDecodeTaskImpl);
95 }; 95 };
96 96
97 // Task which creates an image from decoded data. Typically this involves 97 // Task which creates an image from decoded data. Typically this involves
98 // uploading data to the GPU, which requires this task be run on the non- 98 // uploading data to the GPU, which requires this task be run on the non-
99 // concurrent thread. 99 // concurrent thread.
100 class ImageUploadTaskImpl : public ImageDecodeTask { 100 class ImageUploadTaskImpl : public TileTask {
101 public: 101 public:
102 ImageUploadTaskImpl(GpuImageDecodeController* controller, 102 ImageUploadTaskImpl(GpuImageDecodeController* controller,
103 const DrawImage& draw_image, 103 const DrawImage& draw_image,
104 scoped_refptr<ImageDecodeTask> decode_dependency, 104 scoped_refptr<TileTask> decode_dependency,
105 uint64_t source_prepare_tiles_id) 105 uint64_t source_prepare_tiles_id)
106 : ImageDecodeTask(std::move(decode_dependency)), 106 : controller_(controller),
107 controller_(controller),
108 image_(draw_image), 107 image_(draw_image),
109 image_ref_(skia::SharePtr(draw_image.image())), 108 image_ref_(skia::SharePtr(draw_image.image())),
110 source_prepare_tiles_id_(source_prepare_tiles_id) { 109 source_prepare_tiles_id_(source_prepare_tiles_id) {
111 DCHECK(!SkipImage(draw_image)); 110 DCHECK(!SkipImage(draw_image));
111 dependencies_.push_back(std::move(decode_dependency));
112 } 112 }
113 113
114 // Override from Task: 114 // Override from Task:
115 void RunOnWorkerThread() override { 115 void RunOnWorkerThread() override {
116 TRACE_EVENT2("cc", "ImageUploadTaskImpl::RunOnWorkerThread", "mode", "gpu", 116 TRACE_EVENT2("cc", "ImageUploadTaskImpl::RunOnWorkerThread", "mode", "gpu",
117 "source_prepare_tiles_id", source_prepare_tiles_id_); 117 "source_prepare_tiles_id", source_prepare_tiles_id_);
118 controller_->UploadImage(image_); 118 controller_->UploadImage(image_);
119 } 119 }
120 120
121 void ScheduleOnOriginThread(RasterBufferProvider* provider) override {} 121 void ScheduleOnOriginThread(RasterBufferProvider* provider) override {}
122 void CompleteOnOriginThread(RasterBufferProvider* provider) override { 122 void CompleteOnOriginThread(RasterBufferProvider* provider) override {
123 controller_->UploadTaskCompleted(image_); 123 controller_->UploadTaskCompleted(image_);
124 } 124 }
125 125
126 // Override from ImageDecodeTask: 126 // Override from TileTask:
127 bool SupportsConcurrentExecution() const override { return false; } 127 bool SupportsConcurrentExecution() const override { return false; }
128 128
129 protected: 129 protected:
130 ~ImageUploadTaskImpl() override {} 130 ~ImageUploadTaskImpl() override {}
131 131
132 private: 132 private:
133 GpuImageDecodeController* controller_; 133 GpuImageDecodeController* controller_;
134 DrawImage image_; 134 DrawImage image_;
135 skia::RefPtr<const SkImage> image_ref_; 135 skia::RefPtr<const SkImage> image_ref_;
136 uint64_t source_prepare_tiles_id_; 136 uint64_t source_prepare_tiles_id_;
(...skipping 30 matching lines...) Expand all
167 167
168 GpuImageDecodeController::~GpuImageDecodeController() { 168 GpuImageDecodeController::~GpuImageDecodeController() {
169 // SetShouldAggressivelyFreeResources will zero our limits and free all 169 // SetShouldAggressivelyFreeResources will zero our limits and free all
170 // outstanding image memory. 170 // outstanding image memory.
171 SetShouldAggressivelyFreeResources(true); 171 SetShouldAggressivelyFreeResources(true);
172 } 172 }
173 173
174 bool GpuImageDecodeController::GetTaskForImageAndRef( 174 bool GpuImageDecodeController::GetTaskForImageAndRef(
175 const DrawImage& draw_image, 175 const DrawImage& draw_image,
176 uint64_t prepare_tiles_id, 176 uint64_t prepare_tiles_id,
177 scoped_refptr<ImageDecodeTask>* task) { 177 scoped_refptr<TileTask>* task) {
178 if (SkipImage(draw_image)) { 178 if (SkipImage(draw_image)) {
179 *task = nullptr; 179 *task = nullptr;
180 return false; 180 return false;
181 } 181 }
182 182
183 base::AutoLock lock(lock_); 183 base::AutoLock lock(lock_);
184 const auto image_id = draw_image.image()->uniqueID(); 184 const auto image_id = draw_image.image()->uniqueID();
185 185
186 auto found = image_data_.Get(image_id); 186 auto found = image_data_.Get(image_id);
187 if (found != image_data_.end()) { 187 if (found != image_data_.end()) {
188 ImageData* image_data = found->second.get(); 188 ImageData* image_data = found->second.get();
189 if (image_data->is_at_raster) { 189 if (image_data->is_at_raster) {
190 // Image is at-raster, just return, this usage will be at-raster as well. 190 // Image is at-raster, just return, this usage will be at-raster as well.
191 *task = nullptr; 191 *task = nullptr;
192 return false; 192 return false;
193 } 193 }
194 194
195 if (image_data->upload.image) { 195 if (image_data->upload.image) {
196 // The image is already uploaded, ref and return. 196 // The image is already uploaded, ref and return.
197 RefImage(draw_image); 197 RefImage(draw_image);
198 *task = nullptr; 198 *task = nullptr;
199 return true; 199 return true;
200 } 200 }
201 } 201 }
202 202
203 // We didn't have a pre-uploaded image, so we need an upload task. Try to find 203 // We didn't have a pre-uploaded image, so we need an upload task. Try to find
204 // an existing one. 204 // an existing one.
205 scoped_refptr<ImageDecodeTask>& existing_task = 205 scoped_refptr<TileTask>& existing_task =
206 pending_image_upload_tasks_[image_id]; 206 pending_image_upload_tasks_[image_id];
207 if (existing_task) { 207 if (existing_task) {
208 // We had an existing upload task, ref the image and return the task. 208 // We had an existing upload task, ref the image and return the task.
209 RefImage(draw_image); 209 RefImage(draw_image);
210 *task = existing_task; 210 *task = existing_task;
211 return true; 211 return true;
212 } 212 }
213 213
214 // We will be creating a new upload task. If necessary, create a placeholder 214 // We will be creating a new upload task. If necessary, create a placeholder
215 // ImageData to hold the result. 215 // ImageData to hold the result.
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
380 380
381 // While the upload task is active, we keep a ref on both the image it will be 381 // While the upload task is active, we keep a ref on both the image it will be
382 // populating, as well as the decode it needs to populate it. Release these 382 // populating, as well as the decode it needs to populate it. Release these
383 // refs now. 383 // refs now.
384 UnrefImageDecode(draw_image); 384 UnrefImageDecode(draw_image);
385 UnrefImageInternal(draw_image); 385 UnrefImageInternal(draw_image);
386 } 386 }
387 387
388 // Checks if an existing image decode exists. If not, returns a task to produce 388 // Checks if an existing image decode exists. If not, returns a task to produce
389 // the requested decode. 389 // the requested decode.
390 scoped_refptr<ImageDecodeTask> 390 scoped_refptr<TileTask> GpuImageDecodeController::GetImageDecodeTaskAndRef(
391 GpuImageDecodeController::GetImageDecodeTaskAndRef(const DrawImage& draw_image, 391 const DrawImage& draw_image,
392 uint64_t prepare_tiles_id) { 392 uint64_t prepare_tiles_id) {
393 lock_.AssertAcquired(); 393 lock_.AssertAcquired();
394 394
395 const uint32_t image_id = draw_image.image()->uniqueID(); 395 const uint32_t image_id = draw_image.image()->uniqueID();
396 396
397 // This ref is kept alive while an upload task may need this decode. We 397 // This ref is kept alive while an upload task may need this decode. We
398 // release this ref in UploadTaskCompleted. 398 // release this ref in UploadTaskCompleted.
399 RefImageDecode(draw_image); 399 RefImageDecode(draw_image);
400 400
401 auto found = image_data_.Peek(image_id); 401 auto found = image_data_.Peek(image_id);
402 if (found != image_data_.end() && found->second->decode.is_locked) { 402 if (found != image_data_.end() && found->second->decode.is_locked) {
403 // We should never be creating a decode task for an at raster image. 403 // We should never be creating a decode task for an at raster image.
404 DCHECK(!found->second->is_at_raster); 404 DCHECK(!found->second->is_at_raster);
405 // We should never be creating a decode for an already-uploaded image. 405 // We should never be creating a decode for an already-uploaded image.
406 DCHECK(!found->second->upload.image); 406 DCHECK(!found->second->upload.image);
407 return nullptr; 407 return nullptr;
408 } 408 }
409 409
410 // We didn't have an existing locked image, create a task to lock or decode. 410 // We didn't have an existing locked image, create a task to lock or decode.
411 scoped_refptr<ImageDecodeTask>& existing_task = 411 scoped_refptr<TileTask>& existing_task =
412 pending_image_decode_tasks_[image_id]; 412 pending_image_decode_tasks_[image_id];
413 if (!existing_task) { 413 if (!existing_task) {
414 // Ref image decode and create a decode task. This ref will be released in 414 // Ref image decode and create a decode task. This ref will be released in
415 // DecodeTaskCompleted. 415 // DecodeTaskCompleted.
416 RefImageDecode(draw_image); 416 RefImageDecode(draw_image);
417 existing_task = make_scoped_refptr( 417 existing_task = make_scoped_refptr(
418 new ImageDecodeTaskImpl(this, draw_image, prepare_tiles_id)); 418 new ImageDecodeTaskImpl(this, draw_image, prepare_tiles_id));
419 } 419 }
420 return existing_task; 420 return existing_task;
421 } 421 }
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after
734 } 734 }
735 735
736 SkImageInfo GpuImageDecodeController::CreateImageInfoForDrawImage( 736 SkImageInfo GpuImageDecodeController::CreateImageInfoForDrawImage(
737 const DrawImage& draw_image) const { 737 const DrawImage& draw_image) const {
738 return SkImageInfo::Make( 738 return SkImageInfo::Make(
739 draw_image.image()->width(), draw_image.image()->height(), 739 draw_image.image()->width(), draw_image.image()->height(),
740 ResourceFormatToClosestSkColorType(format_), kPremul_SkAlphaType); 740 ResourceFormatToClosestSkColorType(format_), kPremul_SkAlphaType);
741 } 741 }
742 742
743 } // namespace cc 743 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698