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

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

Issue 2797583002: cc: Add color space to image decode caches (Closed)
Patch Set: Review feedback, except the sk_sp bit... 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
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 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 void ReportUsageStats() const; 225 void ReportUsageStats() const;
226 226
227 // May be null if image not yet uploaded / prepared. 227 // May be null if image not yet uploaded / prepared.
228 sk_sp<SkImage> image_; 228 sk_sp<SkImage> image_;
229 UsageStats usage_stats_; 229 UsageStats usage_stats_;
230 }; 230 };
231 231
232 struct ImageData : public base::RefCounted<ImageData> { 232 struct ImageData : public base::RefCounted<ImageData> {
233 ImageData(DecodedDataMode mode, 233 ImageData(DecodedDataMode mode,
234 size_t size, 234 size_t size,
235 const gfx::ColorSpace& target_color_space,
235 const SkImage::DeferredTextureImageUsageParams& upload_params); 236 const SkImage::DeferredTextureImageUsageParams& upload_params);
236 237
237 const DecodedDataMode mode; 238 const DecodedDataMode mode;
238 const size_t size; 239 const size_t size;
240 gfx::ColorSpace target_color_space;
239 bool is_at_raster = false; 241 bool is_at_raster = false;
240 SkImage::DeferredTextureImageUsageParams upload_params; 242 SkImage::DeferredTextureImageUsageParams upload_params;
241 243
242 // If true, this image is no longer in our |persistent_cache_| and will be 244 // If true, this image is no longer in our |persistent_cache_| and will be
243 // deleted as soon as its ref count reaches zero. 245 // deleted as soon as its ref count reaches zero.
244 bool is_orphaned = false; 246 bool is_orphaned = false;
245 247
246 DecodedImageData decode; 248 DecodedImageData decode;
247 UploadedImageData upload; 249 UploadedImageData upload;
248 250
249 private: 251 private:
250 friend class base::RefCounted<ImageData>; 252 friend class base::RefCounted<ImageData>;
251 ~ImageData(); 253 ~ImageData();
252 }; 254 };
253 255
254 // A ref-count and ImageData, used to associate the ImageData with a specific 256 // A ref-count and ImageData, used to associate the ImageData with a specific
255 // DrawImage in the |in_use_cache_|. 257 // DrawImage in the |in_use_cache_|.
256 struct InUseCacheEntry { 258 struct InUseCacheEntry {
257 explicit InUseCacheEntry(scoped_refptr<ImageData> image_data); 259 explicit InUseCacheEntry(scoped_refptr<ImageData> image_data);
258 InUseCacheEntry(const InUseCacheEntry& other); 260 InUseCacheEntry(const InUseCacheEntry& other);
259 InUseCacheEntry(InUseCacheEntry&& other); 261 InUseCacheEntry(InUseCacheEntry&& other);
260 ~InUseCacheEntry(); 262 ~InUseCacheEntry();
261 263
262 uint32_t ref_count = 0; 264 uint32_t ref_count = 0;
263 scoped_refptr<ImageData> image_data; 265 scoped_refptr<ImageData> image_data;
264 }; 266 };
265 267
266 // Uniquely identifies (without collisions) a specific DrawImage for use in 268 // Uniquely identifies (without collisions) a specific DrawImage for use in
267 // the |in_use_cache_|. 269 // the |in_use_cache_|.
268 using InUseCacheKey = uint64_t; 270 struct InUseCacheKeyHash;
271 struct InUseCacheKey {
272 static InUseCacheKey FromDrawImage(const DrawImage& draw_image);
273 bool operator==(const InUseCacheKey& other) const;
274
275 private:
276 friend struct GpuImageDecodeCache::InUseCacheKeyHash;
277 explicit InUseCacheKey(const DrawImage& draw_image);
278
279 uint32_t image_id;
280 int mip_level;
281 SkFilterQuality filter_quality;
282 gfx::ColorSpace target_color_space;
283 };
284 struct InUseCacheKeyHash {
285 size_t operator()(const InUseCacheKey&) const;
286 };
287 InUseCacheKey FromDrawImage(const DrawImage& draw_image);
269 288
270 // All private functions should only be called while holding |lock_|. Some 289 // All private functions should only be called while holding |lock_|. Some
271 // functions also require the |context_| lock. These are indicated by 290 // functions also require the |context_| lock. These are indicated by
272 // additional comments. 291 // additional comments.
273 292
274 // Similar to GetTaskForImageAndRef, but gets the dependent decode task 293 // Similar to GetTaskForImageAndRef, but gets the dependent decode task
275 // rather than the upload task, if necessary. 294 // rather than the upload task, if necessary.
276 scoped_refptr<TileTask> GetImageDecodeTaskAndRef( 295 scoped_refptr<TileTask> GetImageDecodeTaskAndRef(
277 const DrawImage& image, 296 const DrawImage& image,
278 const TracingInfo& tracing_info, 297 const TracingInfo& tracing_info,
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
330 // All members below this point must only be accessed while holding |lock_|. 349 // All members below this point must only be accessed while holding |lock_|.
331 base::Lock lock_; 350 base::Lock lock_;
332 351
333 // |persistent_cache_| represents the long-lived cache, keeping a certain 352 // |persistent_cache_| represents the long-lived cache, keeping a certain
334 // budget of ImageDatas alive even when their ref count reaches zero. 353 // budget of ImageDatas alive even when their ref count reaches zero.
335 using PersistentCache = base::MRUCache<uint32_t, scoped_refptr<ImageData>>; 354 using PersistentCache = base::MRUCache<uint32_t, scoped_refptr<ImageData>>;
336 PersistentCache persistent_cache_; 355 PersistentCache persistent_cache_;
337 356
338 // |in_use_cache_| represents the in-use (short-lived) cache. Entries are 357 // |in_use_cache_| represents the in-use (short-lived) cache. Entries are
339 // cleaned up as soon as their ref count reaches zero. 358 // cleaned up as soon as their ref count reaches zero.
340 using InUseCache = std::unordered_map<InUseCacheKey, InUseCacheEntry>; 359 using InUseCache =
360 std::unordered_map<InUseCacheKey, InUseCacheEntry, InUseCacheKeyHash>;
341 InUseCache in_use_cache_; 361 InUseCache in_use_cache_;
342 362
343 size_t max_working_set_bytes_; 363 size_t max_working_set_bytes_;
344 const size_t normal_max_cache_bytes_; 364 const size_t normal_max_cache_bytes_;
345 size_t cached_bytes_limit_ = normal_max_cache_bytes_; 365 size_t cached_bytes_limit_ = normal_max_cache_bytes_;
346 size_t bytes_used_ = 0; 366 size_t bytes_used_ = 0;
347 base::MemoryState memory_state_ = base::MemoryState::NORMAL; 367 base::MemoryState memory_state_ = base::MemoryState::NORMAL;
348 368
349 // We can't release GPU backed SkImages without holding the context lock, 369 // We can't release GPU backed SkImages without holding the context lock,
350 // so we add them to this list and defer deletion until the next time the lock 370 // so we add them to this list and defer deletion until the next time the lock
351 // is held. 371 // is held.
352 std::vector<sk_sp<SkImage>> images_pending_deletion_; 372 std::vector<sk_sp<SkImage>> images_pending_deletion_;
353 }; 373 };
354 374
355 } // namespace cc 375 } // namespace cc
356 376
357 #endif // CC_TILES_GPU_IMAGE_DECODE_CACHE_H_ 377 #endif // CC_TILES_GPU_IMAGE_DECODE_CACHE_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698