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

Side by Side Diff: cc/tiles/gpu_image_decode_cache.h

Issue 2780843002: Split image decode cache limits into "working set" vs "cache" limits (Closed)
Patch Set: comments Created 3 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
« no previous file with comments | « cc/test/fake_tile_manager.cc ('k') | cc/tiles/gpu_image_decode_cache.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 #ifndef CC_TILES_GPU_IMAGE_DECODE_CACHE_H_ 5 #ifndef CC_TILES_GPU_IMAGE_DECODE_CACHE_H_
6 #define CC_TILES_GPU_IMAGE_DECODE_CACHE_H_ 6 #define CC_TILES_GPU_IMAGE_DECODE_CACHE_H_
7 7
8 #include <memory> 8 #include <memory>
9 #include <unordered_map> 9 #include <unordered_map>
10 #include <vector> 10 #include <vector>
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
96 // 96 //
97 class CC_EXPORT GpuImageDecodeCache 97 class CC_EXPORT GpuImageDecodeCache
98 : public ImageDecodeCache, 98 : public ImageDecodeCache,
99 public base::trace_event::MemoryDumpProvider, 99 public base::trace_event::MemoryDumpProvider,
100 public base::MemoryCoordinatorClient { 100 public base::MemoryCoordinatorClient {
101 public: 101 public:
102 enum class DecodeTaskType { PART_OF_UPLOAD_TASK, STAND_ALONE_DECODE_TASK }; 102 enum class DecodeTaskType { PART_OF_UPLOAD_TASK, STAND_ALONE_DECODE_TASK };
103 103
104 explicit GpuImageDecodeCache(ContextProvider* context, 104 explicit GpuImageDecodeCache(ContextProvider* context,
105 ResourceFormat decode_format, 105 ResourceFormat decode_format,
106 size_t max_gpu_image_bytes); 106 size_t max_working_set_bytes,
107 size_t max_cache_bytes);
107 ~GpuImageDecodeCache() override; 108 ~GpuImageDecodeCache() override;
108 109
109 // ImageDecodeCache overrides. 110 // ImageDecodeCache overrides.
110 111
111 // Finds the existing uploaded image for the provided DrawImage. Creates an 112 // Finds the existing uploaded image for the provided DrawImage. Creates an
112 // upload task to upload the image if an exsiting image does not exist. 113 // upload task to upload the image if an exsiting image does not exist.
113 bool GetTaskForImageAndRef(const DrawImage& image, 114 bool GetTaskForImageAndRef(const DrawImage& image,
114 const TracingInfo& tracing_info, 115 const TracingInfo& tracing_info,
115 scoped_refptr<TileTask>* task) override; 116 scoped_refptr<TileTask>* task) override;
116 bool GetOutOfRasterDecodeTaskForImageAndRef( 117 bool GetOutOfRasterDecodeTaskForImageAndRef(
(...skipping 18 matching lines...) Expand all
135 // Called by Decode / Upload tasks. 136 // Called by Decode / Upload tasks.
136 void DecodeImage(const DrawImage& image); 137 void DecodeImage(const DrawImage& image);
137 void UploadImage(const DrawImage& image); 138 void UploadImage(const DrawImage& image);
138 139
139 // Called by Decode / Upload tasks when tasks are finished. 140 // Called by Decode / Upload tasks when tasks are finished.
140 void OnImageDecodeTaskCompleted(const DrawImage& image, 141 void OnImageDecodeTaskCompleted(const DrawImage& image,
141 DecodeTaskType task_type); 142 DecodeTaskType task_type);
142 void OnImageUploadTaskCompleted(const DrawImage& image); 143 void OnImageUploadTaskCompleted(const DrawImage& image);
143 144
144 // For testing only. 145 // For testing only.
145 void SetCachedBytesLimitForTesting(size_t limit) { 146 void SetAllByteLimitsForTesting(size_t limit) {
146 cached_bytes_limit_ = limit; 147 cached_bytes_limit_ = limit;
148 max_working_set_bytes_ = limit;
147 } 149 }
148 size_t GetBytesUsedForTesting() const { return bytes_used_; } 150 size_t GetBytesUsedForTesting() const { return bytes_used_; }
149 size_t GetNumCacheEntriesForTesting() const { 151 size_t GetNumCacheEntriesForTesting() const {
150 return persistent_cache_.size(); 152 return persistent_cache_.size();
151 } 153 }
152 size_t GetDrawImageSizeForTesting(const DrawImage& image); 154 size_t GetDrawImageSizeForTesting(const DrawImage& image);
153 void SetImageDecodingFailedForTesting(const DrawImage& image); 155 void SetImageDecodingFailedForTesting(const DrawImage& image);
154 bool DiscardableIsLockedForTesting(const DrawImage& image); 156 bool DiscardableIsLockedForTesting(const DrawImage& image);
155 bool IsInInUseCacheForTesting(const DrawImage& image) const; 157 bool IsInInUseCacheForTesting(const DrawImage& image) const;
156 158
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
285 287
286 void RefImageDecode(const DrawImage& draw_image); 288 void RefImageDecode(const DrawImage& draw_image);
287 void UnrefImageDecode(const DrawImage& draw_image); 289 void UnrefImageDecode(const DrawImage& draw_image);
288 void RefImage(const DrawImage& draw_image); 290 void RefImage(const DrawImage& draw_image);
289 void UnrefImageInternal(const DrawImage& draw_image); 291 void UnrefImageInternal(const DrawImage& draw_image);
290 292
291 // Called any time the ownership of an object changed. This includes changes 293 // Called any time the ownership of an object changed. This includes changes
292 // to ref-count or to orphaned status. 294 // to ref-count or to orphaned status.
293 void OwnershipChanged(const DrawImage& draw_image, ImageData* image_data); 295 void OwnershipChanged(const DrawImage& draw_image, ImageData* image_data);
294 296
295 // Ensures that the cache can hold an element of |required_size|, freeing 297 // Ensures that the working set can hold an element of |required_size|,
296 // unreferenced cache entries if necessary to make room. 298 // freeing unreferenced cache entries to make room.
297 bool EnsureCapacity(size_t required_size); 299 bool EnsureCapacity(size_t required_size);
298 bool CanFitSize(size_t size) const; 300 bool CanFitInWorkingSet(size_t size) const;
301 bool CanFitInCache(size_t size) const;
299 bool ExceedsPreferredCount() const; 302 bool ExceedsPreferredCount() const;
300 303
301 void DecodeImageIfNecessary(const DrawImage& draw_image, 304 void DecodeImageIfNecessary(const DrawImage& draw_image,
302 ImageData* image_data); 305 ImageData* image_data);
303 306
304 scoped_refptr<GpuImageDecodeCache::ImageData> CreateImageData( 307 scoped_refptr<GpuImageDecodeCache::ImageData> CreateImageData(
305 const DrawImage& image); 308 const DrawImage& image);
306 SkImageInfo CreateImageInfoForDrawImage(const DrawImage& draw_image, 309 SkImageInfo CreateImageInfoForDrawImage(const DrawImage& draw_image,
307 int upload_scale_mip_level) const; 310 int upload_scale_mip_level) const;
308 311
(...skipping 21 matching lines...) Expand all
330 // |persistent_cache_| represents the long-lived cache, keeping a certain 333 // |persistent_cache_| represents the long-lived cache, keeping a certain
331 // budget of ImageDatas alive even when their ref count reaches zero. 334 // budget of ImageDatas alive even when their ref count reaches zero.
332 using PersistentCache = base::MRUCache<uint32_t, scoped_refptr<ImageData>>; 335 using PersistentCache = base::MRUCache<uint32_t, scoped_refptr<ImageData>>;
333 PersistentCache persistent_cache_; 336 PersistentCache persistent_cache_;
334 337
335 // |in_use_cache_| represents the in-use (short-lived) cache. Entries are 338 // |in_use_cache_| represents the in-use (short-lived) cache. Entries are
336 // cleaned up as soon as their ref count reaches zero. 339 // cleaned up as soon as their ref count reaches zero.
337 using InUseCache = std::unordered_map<InUseCacheKey, InUseCacheEntry>; 340 using InUseCache = std::unordered_map<InUseCacheKey, InUseCacheEntry>;
338 InUseCache in_use_cache_; 341 InUseCache in_use_cache_;
339 342
340 const size_t normal_max_gpu_image_bytes_; 343 size_t max_working_set_bytes_;
341 size_t cached_bytes_limit_ = normal_max_gpu_image_bytes_; 344 const size_t normal_max_cache_bytes_;
345 size_t cached_bytes_limit_ = normal_max_cache_bytes_;
342 size_t bytes_used_ = 0; 346 size_t bytes_used_ = 0;
343 base::MemoryState memory_state_ = base::MemoryState::NORMAL; 347 base::MemoryState memory_state_ = base::MemoryState::NORMAL;
344 348
345 // We can't release GPU backed SkImages without holding the context lock, 349 // We can't release GPU backed SkImages without holding the context lock,
346 // so we add them to this list and defer deletion until the next time the lock 350 // so we add them to this list and defer deletion until the next time the lock
347 // is held. 351 // is held.
348 std::vector<sk_sp<SkImage>> images_pending_deletion_; 352 std::vector<sk_sp<SkImage>> images_pending_deletion_;
349 }; 353 };
350 354
351 } // namespace cc 355 } // namespace cc
352 356
353 #endif // CC_TILES_GPU_IMAGE_DECODE_CACHE_H_ 357 #endif // CC_TILES_GPU_IMAGE_DECODE_CACHE_H_
OLDNEW
« no previous file with comments | « cc/test/fake_tile_manager.cc ('k') | cc/tiles/gpu_image_decode_cache.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698