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

Unified Diff: cc/tiles/software_image_decode_controller.h

Issue 2541183002: cc: Rename ImageDecodeController to ImageDecodeCache. (Closed)
Patch Set: rename: 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
« no previous file with comments | « cc/tiles/software_image_decode_cache_unittest.cc ('k') | cc/tiles/software_image_decode_controller.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/tiles/software_image_decode_controller.h
diff --git a/cc/tiles/software_image_decode_controller.h b/cc/tiles/software_image_decode_controller.h
deleted file mode 100644
index f801ffc21c97665d37e428110295dddf2ab8597e..0000000000000000000000000000000000000000
--- a/cc/tiles/software_image_decode_controller.h
+++ /dev/null
@@ -1,298 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CC_TILES_SOFTWARE_IMAGE_DECODE_CONTROLLER_H_
-#define CC_TILES_SOFTWARE_IMAGE_DECODE_CONTROLLER_H_
-
-#include <stdint.h>
-
-#include <memory>
-#include <unordered_map>
-#include <unordered_set>
-
-#include "base/atomic_sequence_num.h"
-#include "base/containers/mru_cache.h"
-#include "base/hash.h"
-#include "base/memory/discardable_memory_allocator.h"
-#include "base/memory/memory_coordinator_client.h"
-#include "base/memory/ref_counted.h"
-#include "base/numerics/safe_math.h"
-#include "base/threading/thread_checker.h"
-#include "base/trace_event/memory_dump_provider.h"
-#include "cc/base/cc_export.h"
-#include "cc/playback/decoded_draw_image.h"
-#include "cc/playback/draw_image.h"
-#include "cc/resources/resource_format.h"
-#include "cc/tiles/image_decode_controller.h"
-#include "third_party/skia/include/core/SkRefCnt.h"
-#include "ui/gfx/geometry/rect.h"
-
-namespace cc {
-
-// ImageDecodeControllerKey is a class that gets a cache key out of a given draw
-// image. That is, this key uniquely identifies an image in the cache. Note that
-// it's insufficient to use SkImage's unique id, since the same image can appear
-// in the cache multiple times at different scales and filter qualities.
-class CC_EXPORT ImageDecodeControllerKey {
- public:
- static ImageDecodeControllerKey FromDrawImage(const DrawImage& image);
-
- ImageDecodeControllerKey(const ImageDecodeControllerKey& other);
-
- bool operator==(const ImageDecodeControllerKey& other) const {
- // The image_id always has to be the same. However, after that all original
- // decodes are the same, so if we can use the original decode, return true.
- // If not, then we have to compare every field.
- return image_id_ == other.image_id_ &&
- can_use_original_decode_ == other.can_use_original_decode_ &&
- (can_use_original_decode_ ||
- (src_rect_ == other.src_rect_ &&
- target_size_ == other.target_size_ &&
- filter_quality_ == other.filter_quality_));
- }
-
- bool operator!=(const ImageDecodeControllerKey& other) const {
- return !(*this == other);
- }
-
- uint32_t image_id() const { return image_id_; }
- SkFilterQuality filter_quality() const { return filter_quality_; }
- gfx::Rect src_rect() const { return src_rect_; }
- gfx::Size target_size() const { return target_size_; }
-
- bool can_use_original_decode() const { return can_use_original_decode_; }
- bool should_use_subrect() const { return should_use_subrect_; }
- size_t get_hash() const { return hash_; }
-
- // Helper to figure out how much memory the locked image represented by this
- // key would take.
- size_t locked_bytes() const {
- // TODO(vmpstr): Handle formats other than RGBA.
- base::CheckedNumeric<size_t> result = 4;
- result *= target_size_.width();
- result *= target_size_.height();
- return result.ValueOrDefault(std::numeric_limits<size_t>::max());
- }
-
- std::string ToString() const;
-
- private:
- ImageDecodeControllerKey(uint32_t image_id,
- const gfx::Rect& src_rect,
- const gfx::Size& size,
- SkFilterQuality filter_quality,
- bool can_use_original_decode,
- bool should_use_subrect);
-
- uint32_t image_id_;
- gfx::Rect src_rect_;
- gfx::Size target_size_;
- SkFilterQuality filter_quality_;
- bool can_use_original_decode_;
- bool should_use_subrect_;
- size_t hash_;
-};
-
-// Hash function for the above ImageDecodeControllerKey.
-struct ImageDecodeControllerKeyHash {
- size_t operator()(const ImageDecodeControllerKey& key) const {
- return key.get_hash();
- }
-};
-
-class CC_EXPORT SoftwareImageDecodeController
- : public ImageDecodeController,
- public base::trace_event::MemoryDumpProvider,
- public base::MemoryCoordinatorClient {
- public:
- using ImageKey = ImageDecodeControllerKey;
- using ImageKeyHash = ImageDecodeControllerKeyHash;
-
- SoftwareImageDecodeController(ResourceFormat format,
- size_t locked_memory_limit_bytes);
- ~SoftwareImageDecodeController() override;
-
- // ImageDecodeController overrides.
- bool GetTaskForImageAndRef(const DrawImage& image,
- const TracingInfo& tracing_info,
- scoped_refptr<TileTask>* task) override;
- void UnrefImage(const DrawImage& image) override;
- DecodedDrawImage GetDecodedImageForDraw(const DrawImage& image) override;
- void DrawWithImageFinished(const DrawImage& image,
- const DecodedDrawImage& decoded_image) override;
- void ReduceCacheUsage() override;
- // Software doesn't keep outstanding images pinned, so this is a no-op.
- void SetShouldAggressivelyFreeResources(
- bool aggressively_free_resources) override {}
-
- // Decode the given image and store it in the cache. This is only called by an
- // image decode task from a worker thread.
- void DecodeImage(const ImageKey& key, const DrawImage& image);
-
- void RemovePendingTask(const ImageKey& key);
-
- // MemoryDumpProvider overrides.
- bool OnMemoryDump(const base::trace_event::MemoryDumpArgs& args,
- base::trace_event::ProcessMemoryDump* pmd) override;
-
- private:
- // DecodedImage is a convenience storage for discardable memory. It can also
- // construct an image out of SkImageInfo and stored discardable memory.
- class DecodedImage {
- public:
- DecodedImage(const SkImageInfo& info,
- std::unique_ptr<base::DiscardableMemory> memory,
- const SkSize& src_rect_offset,
- uint64_t tracing_id);
- ~DecodedImage();
-
- const sk_sp<SkImage>& image() const {
- DCHECK(locked_);
- return image_;
- }
-
- const SkSize& src_rect_offset() const { return src_rect_offset_; }
-
- bool is_locked() const { return locked_; }
- bool Lock();
- void Unlock();
-
- const base::DiscardableMemory* memory() const { return memory_.get(); }
-
- // An ID which uniquely identifies this DecodedImage within the image decode
- // controller. Used in memory tracing.
- uint64_t tracing_id() const { return tracing_id_; }
- // Mark this image as being used in either a draw or as a source for a
- // scaled image. Either case represents this decode as being valuable and
- // not wasted.
- void mark_used() { usage_stats_.used = true; }
-
- private:
- struct UsageStats {
- // We can only create a decoded image in a locked state, so the initial
- // lock count is 1.
- int lock_count = 1;
- bool used = false;
- bool last_lock_failed = false;
- bool first_lock_wasted = false;
- };
-
- bool locked_;
- SkImageInfo image_info_;
- std::unique_ptr<base::DiscardableMemory> memory_;
- sk_sp<SkImage> image_;
- SkSize src_rect_offset_;
- uint64_t tracing_id_;
- UsageStats usage_stats_;
- };
-
- // MemoryBudget is a convenience class for memory bookkeeping and ensuring
- // that we don't go over the limit when pre-decoding.
- class MemoryBudget {
- public:
- explicit MemoryBudget(size_t limit_bytes);
-
- size_t AvailableMemoryBytes() const;
- void AddUsage(size_t usage);
- void SubtractUsage(size_t usage);
- void ResetUsage();
- size_t total_limit_bytes() const { return limit_bytes_; }
- size_t GetCurrentUsageSafe() const;
-
- private:
- size_t limit_bytes_;
- base::CheckedNumeric<size_t> current_usage_bytes_;
- };
-
- using ImageMRUCache = base::HashingMRUCache<ImageKey,
- std::unique_ptr<DecodedImage>,
- ImageKeyHash>;
-
- // Looks for the key in the cache and returns true if it was found and was
- // successfully locked (or if it was already locked). Note that if this
- // function returns true, then a ref count is increased for the image.
- bool LockDecodedImageIfPossibleAndRef(const ImageKey& key);
-
- // Actually decode the image. Note that this function can (and should) be
- // called with no lock acquired, since it can do a lot of work. Note that it
- // can also return nullptr to indicate the decode failed.
- std::unique_ptr<DecodedImage> DecodeImageInternal(
- const ImageKey& key,
- const DrawImage& draw_image);
-
- // Get the decoded draw image for the given key and draw_image. Note that this
- // function has to be called with no lock acquired, since it will acquire its
- // own locks and might call DecodeImageInternal above. Also note that this
- // function will use the provided key, even if
- // ImageKey::FromDrawImage(draw_image) would return a different key.
- // Note that when used internally, we still require that
- // DrawWithImageFinished() is called afterwards.
- DecodedDrawImage GetDecodedImageForDrawInternal(const ImageKey& key,
- const DrawImage& draw_image);
-
- // GetOriginalImageDecode is called by DecodeImageInternal when the quality
- // does not scale the image. Like DecodeImageInternal, it should be called
- // with no lock acquired and it returns nullptr if the decoding failed.
- std::unique_ptr<DecodedImage> GetOriginalImageDecode(
- sk_sp<const SkImage> image);
-
- // GetSubrectImageDecode is similar to GetOriginalImageDecode in that no scale
- // is performed on the image. However, we extract a subrect (copy it out) and
- // only return this subrect in order to cache a smaller amount of memory. Note
- // that this uses GetOriginalImageDecode to get the initial data, which
- // ensures that we cache an unlocked version of the original image in case we
- // need to extract multiple subrects (as would be the case in an atlas).
- std::unique_ptr<DecodedImage> GetSubrectImageDecode(
- const ImageKey& key,
- sk_sp<const SkImage> image);
-
- // GetScaledImageDecode is called by DecodeImageInternal when the quality
- // requires the image be scaled. Like DecodeImageInternal, it should be
- // called with no lock acquired and it returns nullptr if the decoding or
- // scaling failed.
- std::unique_ptr<DecodedImage> GetScaledImageDecode(
- const ImageKey& key,
- sk_sp<const SkImage> image);
-
- void SanityCheckState(int line, bool lock_acquired);
- void RefImage(const ImageKey& key);
- void RefAtRasterImage(const ImageKey& key);
- void UnrefAtRasterImage(const ImageKey& key);
-
- // Helper function which dumps all images in a specific ImageMRUCache.
- void DumpImageMemoryForCache(const ImageMRUCache& cache,
- const char* cache_name,
- base::trace_event::ProcessMemoryDump* pmd) const;
-
- // Overriden from base::MemoryCoordinatorClient.
- void OnMemoryStateChange(base::MemoryState state) override;
-
- std::unordered_map<ImageKey, scoped_refptr<TileTask>, ImageKeyHash>
- pending_image_tasks_;
-
- // The members below this comment can only be accessed if the lock is held to
- // ensure that they are safe to access on multiple threads.
- base::Lock lock_;
-
- // Decoded images and ref counts (predecode path).
- ImageMRUCache decoded_images_;
- std::unordered_map<ImageKey, int, ImageKeyHash> decoded_images_ref_counts_;
-
- // Decoded image and ref counts (at-raster decode path).
- ImageMRUCache at_raster_decoded_images_;
- std::unordered_map<ImageKey, int, ImageKeyHash>
- at_raster_decoded_images_ref_counts_;
-
- MemoryBudget locked_images_budget_;
-
- ResourceFormat format_;
- size_t max_items_in_cache_;
-
- // Used to uniquely identify DecodedImages for memory traces.
- base::AtomicSequenceNumber next_tracing_id_;
-};
-
-} // namespace cc
-
-#endif // CC_TILES_SOFTWARE_IMAGE_DECODE_CONTROLLER_H_
« no previous file with comments | « cc/tiles/software_image_decode_cache_unittest.cc ('k') | cc/tiles/software_image_decode_controller.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698