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

Unified Diff: cc/tiles/image_controller.h

Issue 2537683002: cc: Add image decode queue functionality to image manager. (Closed)
Patch Set: update Created 4 years 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 side-by-side diff with in-line comments
Download patch
Index: cc/tiles/image_controller.h
diff --git a/cc/tiles/image_controller.h b/cc/tiles/image_controller.h
index d64282f8e9040c09d0deee671c90e529fa5cb3b8..8a53edc89bee589750f08fa9a847b831ba5c32e0 100644
--- a/cc/tiles/image_controller.h
+++ b/cc/tiles/image_controller.h
@@ -5,11 +5,15 @@
#ifndef CC_TILES_IMAGE_CONTROLLER_H_
#define CC_TILES_IMAGE_CONTROLLER_H_
+#include <set>
#include <vector>
#include "base/macros.h"
#include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
+#include "base/threading/simple_thread.h"
#include "cc/base/cc_export.h"
+#include "cc/base/unique_notifier.h"
#include "cc/playback/draw_image.h"
#include "cc/raster/tile_task.h"
#include "cc/tiles/image_decode_cache.h"
@@ -18,7 +22,11 @@ namespace cc {
class CC_EXPORT ImageController {
public:
- ImageController();
+ using ImageDecodeRequestId = uint64_t;
+ using ImageDecodedCallback = base::Callback<void(ImageDecodeRequestId)>;
+ explicit ImageController(
+ base::SequencedTaskRunner* origin_task_runner,
+ scoped_refptr<base::SequencedTaskRunner> worker_task_runner);
~ImageController();
void SetImageDecodeCache(ImageDecodeCache* cache);
@@ -32,10 +40,58 @@ class CC_EXPORT ImageController {
std::vector<DrawImage> predecode_images,
const ImageDecodeCache::TracingInfo& tracing_info);
+ ImageDecodeRequestId QueueImageDecode(sk_sp<const SkImage> image,
+ const ImageDecodedCallback& callback);
+ void NotifyFrameFinished();
+
private:
+ struct ImageDecodeRequest {
+ ImageDecodeRequest();
+ ImageDecodeRequest(ImageDecodeRequestId id,
+ const DrawImage& draw_image,
+ const ImageDecodedCallback& callback,
+ scoped_refptr<TileTask> task,
+ bool need_unref);
+ ImageDecodeRequest(ImageDecodeRequest&& other);
+ ImageDecodeRequest(const ImageDecodeRequest& other);
+ ~ImageDecodeRequest();
+
+ ImageDecodeRequest& operator=(ImageDecodeRequest&& other);
+ ImageDecodeRequest& operator=(const ImageDecodeRequest& other);
+
+ ImageDecodeRequestId id;
+ DrawImage draw_image;
+ ImageDecodedCallback callback;
+ scoped_refptr<TileTask> task;
+ bool need_unref;
+ };
+
+ void ResumeWorkerTasks();
+ void StopWorkerTasks();
+
+ // Called from the worker thread.
+ void ProcessNextImageDecodeOnWorkerThread();
+
+ void ImageDecodeCompleted(ImageDecodeRequestId id);
+
ImageDecodeCache* cache_ = nullptr;
std::vector<DrawImage> predecode_locked_images_;
+ static ImageDecodeRequestId s_next_image_decode_queue_id_;
+ std::map<ImageDecodeRequestId, ImageDecodeRequest> image_decode_queue_;
+ std::map<ImageDecodeRequestId, ImageDecodeRequest>
+ requests_needing_completion_;
+ std::vector<std::pair<DrawImage, int>> requested_locked_images_;
+
+ base::SequencedTaskRunner* origin_task_runner_ = nullptr;
+ base::Lock lock_;
ericrk 2017/01/04 07:48:31 nit: can you indicate which variables can be acces
vmpstr 2017/01/06 01:19:03 Done.
+
+ scoped_refptr<base::SequencedTaskRunner> worker_task_runner_;
+
+ bool abort_tasks_ = false;
+
+ base::WeakPtrFactory<ImageController> weak_ptr_factory_;
+
DISALLOW_COPY_AND_ASSIGN(ImageController);
};

Powered by Google App Engine
This is Rietveld 408576698