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

Side by Side Diff: cc/paint/paint_op_buffer.h

Issue 2830243002: cc: Don't perform image analysis if the DisplayItemList has no images. (Closed)
Patch Set: confirmed weird matrix. Created 3 years, 7 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 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 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_PAINT_PAINT_OP_BUFFER_H_ 5 #ifndef CC_PAINT_PAINT_OP_BUFFER_H_
6 #define CC_PAINT_PAINT_OP_BUFFER_H_ 6 #define CC_PAINT_PAINT_OP_BUFFER_H_
7 7
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 81
82 void Raster(SkCanvas* canvas, const SkMatrix& original_ctm) const; 82 void Raster(SkCanvas* canvas, const SkMatrix& original_ctm) const;
83 bool IsDrawOp() const; 83 bool IsDrawOp() const;
84 84
85 // Only valid for draw ops. 85 // Only valid for draw ops.
86 void RasterWithAlpha(SkCanvas* canvas, uint8_t alpha) const; 86 void RasterWithAlpha(SkCanvas* canvas, uint8_t alpha) const;
87 87
88 int CountSlowPaths() const { return 0; } 88 int CountSlowPaths() const { return 0; }
89 int CountSlowPathsFromFlags() const { return 0; } 89 int CountSlowPathsFromFlags() const { return 0; }
90 90
91 bool HasDiscardableImages() const { return false; }
92 bool HasDiscardableImagesFromFlags() const { return false; }
93
91 // Returns the number of bytes used by this op in referenced sub records 94 // Returns the number of bytes used by this op in referenced sub records
92 // and display lists. This doesn't count other objects like paths or blobs. 95 // and display lists. This doesn't count other objects like paths or blobs.
93 size_t AdditionalBytesUsed() const { return 0; } 96 size_t AdditionalBytesUsed() const { return 0; }
94 97
95 static constexpr bool kIsDrawOp = false; 98 static constexpr bool kIsDrawOp = false;
96 static constexpr bool kHasPaintFlags = false; 99 static constexpr bool kHasPaintFlags = false;
97 static SkRect kUnsetRect; 100 static SkRect kUnsetRect;
98 }; 101 };
99 102
100 struct CC_PAINT_EXPORT PaintOpWithFlags : PaintOp { 103 struct CC_PAINT_EXPORT PaintOpWithFlags : PaintOp {
101 static constexpr bool kHasPaintFlags = true; 104 static constexpr bool kHasPaintFlags = true;
102 105
103 explicit PaintOpWithFlags(const PaintFlags& flags) : flags(flags) {} 106 explicit PaintOpWithFlags(const PaintFlags& flags) : flags(flags) {}
104 107
105 int CountSlowPathsFromFlags() const { return flags.getPathEffect() ? 1 : 0; } 108 int CountSlowPathsFromFlags() const { return flags.getPathEffect() ? 1 : 0; }
109 bool HasDiscardableImagesFromFlags() const {
110 if (!IsDrawOp())
111 return false;
112
113 SkShader* shader = flags.getShader();
114 SkImage* image = shader ? shader->isAImage(nullptr, nullptr) : nullptr;
115 return image && image->isLazyGenerated();
116 }
106 117
107 PaintFlags flags; 118 PaintFlags flags;
108 }; 119 };
109 120
110 struct CC_PAINT_EXPORT PaintOpWithData : PaintOpWithFlags { 121 struct CC_PAINT_EXPORT PaintOpWithData : PaintOpWithFlags {
111 // Having data is just a helper for ops that have a varying amount of data and 122 // Having data is just a helper for ops that have a varying amount of data and
112 // want a way to store that inline. This is for ops that pass in a 123 // want a way to store that inline. This is for ops that pass in a
113 // void* and a length. The void* data is assumed to not have any alignment 124 // void* and a length. The void* data is assumed to not have any alignment
114 // requirements. 125 // requirements.
115 PaintOpWithData(const PaintFlags& flags, size_t bytes) 126 PaintOpWithData(const PaintFlags& flags, size_t bytes)
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
333 // Windows wants to generate these when types are exported, so 344 // Windows wants to generate these when types are exported, so
334 // provide them here explicitly so that DisplayItemList doesn't have 345 // provide them here explicitly so that DisplayItemList doesn't have
335 // to be defined in this header. 346 // to be defined in this header.
336 DrawDisplayItemListOp(const DrawDisplayItemListOp& op); 347 DrawDisplayItemListOp(const DrawDisplayItemListOp& op);
337 DrawDisplayItemListOp& operator=(const DrawDisplayItemListOp& op); 348 DrawDisplayItemListOp& operator=(const DrawDisplayItemListOp& op);
338 ~DrawDisplayItemListOp(); 349 ~DrawDisplayItemListOp();
339 static void Raster(const PaintOp* op, 350 static void Raster(const PaintOp* op,
340 SkCanvas* canvas, 351 SkCanvas* canvas,
341 const SkMatrix& original_ctm); 352 const SkMatrix& original_ctm);
342 size_t AdditionalBytesUsed() const; 353 size_t AdditionalBytesUsed() const;
354 bool HasDiscardableImages() const;
343 // TODO(enne): DisplayItemList should know number of slow paths. 355 // TODO(enne): DisplayItemList should know number of slow paths.
344 356
345 scoped_refptr<DisplayItemList> list; 357 scoped_refptr<DisplayItemList> list;
346 }; 358 };
347 359
348 struct CC_PAINT_EXPORT DrawDRRectOp final : PaintOpWithFlags { 360 struct CC_PAINT_EXPORT DrawDRRectOp final : PaintOpWithFlags {
349 static constexpr PaintOpType kType = PaintOpType::DrawDRRect; 361 static constexpr PaintOpType kType = PaintOpType::DrawDRRect;
350 static constexpr bool kIsDrawOp = true; 362 static constexpr bool kIsDrawOp = true;
351 DrawDRRectOp(const SkRRect& outer, 363 DrawDRRectOp(const SkRRect& outer,
352 const SkRRect& inner, 364 const SkRRect& inner,
(...skipping 11 matching lines...) Expand all
364 static constexpr PaintOpType kType = PaintOpType::DrawImage; 376 static constexpr PaintOpType kType = PaintOpType::DrawImage;
365 static constexpr bool kIsDrawOp = true; 377 static constexpr bool kIsDrawOp = true;
366 DrawImageOp(const PaintImage& image, 378 DrawImageOp(const PaintImage& image,
367 SkScalar left, 379 SkScalar left,
368 SkScalar top, 380 SkScalar top,
369 const PaintFlags* flags); 381 const PaintFlags* flags);
370 ~DrawImageOp(); 382 ~DrawImageOp();
371 static void Raster(const PaintOp* op, 383 static void Raster(const PaintOp* op,
372 SkCanvas* canvas, 384 SkCanvas* canvas,
373 const SkMatrix& original_ctm); 385 const SkMatrix& original_ctm);
386 bool HasDiscardableImages() const;
374 387
375 PaintImage image; 388 PaintImage image;
376 SkScalar left; 389 SkScalar left;
377 SkScalar top; 390 SkScalar top;
378 }; 391 };
379 392
380 struct CC_PAINT_EXPORT DrawImageRectOp final : PaintOpWithFlags { 393 struct CC_PAINT_EXPORT DrawImageRectOp final : PaintOpWithFlags {
381 static constexpr PaintOpType kType = PaintOpType::DrawImageRect; 394 static constexpr PaintOpType kType = PaintOpType::DrawImageRect;
382 static constexpr bool kIsDrawOp = true; 395 static constexpr bool kIsDrawOp = true;
383 DrawImageRectOp(const PaintImage& image, 396 DrawImageRectOp(const PaintImage& image,
384 const SkRect& src, 397 const SkRect& src,
385 const SkRect& dst, 398 const SkRect& dst,
386 const PaintFlags* flags, 399 const PaintFlags* flags,
387 PaintCanvas::SrcRectConstraint constraint); 400 PaintCanvas::SrcRectConstraint constraint);
388 ~DrawImageRectOp(); 401 ~DrawImageRectOp();
389 static void Raster(const PaintOp* op, 402 static void Raster(const PaintOp* op,
390 SkCanvas* canvas, 403 SkCanvas* canvas,
391 const SkMatrix& original_ctm); 404 const SkMatrix& original_ctm);
405 bool HasDiscardableImages() const;
392 406
393 PaintImage image; 407 PaintImage image;
394 SkRect src; 408 SkRect src;
395 SkRect dst; 409 SkRect dst;
396 PaintCanvas::SrcRectConstraint constraint; 410 PaintCanvas::SrcRectConstraint constraint;
397 }; 411 };
398 412
399 struct CC_PAINT_EXPORT DrawIRectOp final : PaintOpWithFlags { 413 struct CC_PAINT_EXPORT DrawIRectOp final : PaintOpWithFlags {
400 static constexpr PaintOpType kType = PaintOpType::DrawIRect; 414 static constexpr PaintOpType kType = PaintOpType::DrawIRect;
401 static constexpr bool kIsDrawOp = true; 415 static constexpr bool kIsDrawOp = true;
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
469 483
470 struct CC_PAINT_EXPORT DrawRecordOp final : PaintOp { 484 struct CC_PAINT_EXPORT DrawRecordOp final : PaintOp {
471 static constexpr PaintOpType kType = PaintOpType::DrawRecord; 485 static constexpr PaintOpType kType = PaintOpType::DrawRecord;
472 static constexpr bool kIsDrawOp = true; 486 static constexpr bool kIsDrawOp = true;
473 explicit DrawRecordOp(sk_sp<const PaintRecord> record); 487 explicit DrawRecordOp(sk_sp<const PaintRecord> record);
474 ~DrawRecordOp(); 488 ~DrawRecordOp();
475 static void Raster(const PaintOp* op, 489 static void Raster(const PaintOp* op,
476 SkCanvas* canvas, 490 SkCanvas* canvas,
477 const SkMatrix& original_ctm); 491 const SkMatrix& original_ctm);
478 size_t AdditionalBytesUsed() const; 492 size_t AdditionalBytesUsed() const;
493 bool HasDiscardableImages() const;
479 494
480 sk_sp<const PaintRecord> record; 495 sk_sp<const PaintRecord> record;
481 }; 496 };
482 497
483 struct CC_PAINT_EXPORT DrawRectOp final : PaintOpWithFlags { 498 struct CC_PAINT_EXPORT DrawRectOp final : PaintOpWithFlags {
484 static constexpr PaintOpType kType = PaintOpType::DrawRect; 499 static constexpr PaintOpType kType = PaintOpType::DrawRect;
485 static constexpr bool kIsDrawOp = true; 500 static constexpr bool kIsDrawOp = true;
486 DrawRectOp(const SkRect& rect, const PaintFlags& flags) 501 DrawRectOp(const SkRect& rect, const PaintFlags& flags)
487 : PaintOpWithFlags(flags), rect(rect) {} 502 : PaintOpWithFlags(flags), rect(rect) {}
488 static void Raster(const PaintOp* op, 503 static void Raster(const PaintOp* op,
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
647 662
648 void playback(SkCanvas* canvas) const; 663 void playback(SkCanvas* canvas) const;
649 void playback(SkCanvas* canvas, SkPicture::AbortCallback* callback) const; 664 void playback(SkCanvas* canvas, SkPicture::AbortCallback* callback) const;
650 665
651 // TODO(enne): These are no longer approximate. Rename these. 666 // TODO(enne): These are no longer approximate. Rename these.
652 int approximateOpCount() const { return op_count_; } 667 int approximateOpCount() const { return op_count_; }
653 size_t approximateBytesUsed() const { 668 size_t approximateBytesUsed() const {
654 return sizeof(*this) + reserved_ + subrecord_bytes_used_; 669 return sizeof(*this) + reserved_ + subrecord_bytes_used_;
655 } 670 }
656 int numSlowPaths() const { return num_slow_paths_; } 671 int numSlowPaths() const { return num_slow_paths_; }
672 bool HasDiscardableImages() const { return has_discardable_images_; }
657 673
658 // Resize the PaintOpBuffer to exactly fit the current amount of used space. 674 // Resize the PaintOpBuffer to exactly fit the current amount of used space.
659 void ShrinkToFit(); 675 void ShrinkToFit();
660 676
661 const SkRect& cullRect() const { return cull_rect_; } 677 const SkRect& cullRect() const { return cull_rect_; }
662 678
663 PaintOp* GetFirstOp() const { 679 PaintOp* GetFirstOp() const {
664 return const_cast<PaintOp*>(first_op_.data_as<PaintOp>()); 680 return const_cast<PaintOp*>(first_op_.data_as<PaintOp>());
665 } 681 }
666 682
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
809 op->skip = skip; 825 op->skip = skip;
810 AnalyzeAddedOp(op); 826 AnalyzeAddedOp(op);
811 return op; 827 return op;
812 } 828 }
813 829
814 template <typename T> 830 template <typename T>
815 void AnalyzeAddedOp(const T* op) { 831 void AnalyzeAddedOp(const T* op) {
816 num_slow_paths_ += op->CountSlowPathsFromFlags(); 832 num_slow_paths_ += op->CountSlowPathsFromFlags();
817 num_slow_paths_ += op->CountSlowPaths(); 833 num_slow_paths_ += op->CountSlowPaths();
818 834
835 has_discardable_images_ |= op->HasDiscardableImages();
836 has_discardable_images_ |= op->HasDiscardableImagesFromFlags();
837
819 subrecord_bytes_used_ += op->AdditionalBytesUsed(); 838 subrecord_bytes_used_ += op->AdditionalBytesUsed();
820 } 839 }
821 840
822 // As a performance optimization because n=1 is an extremely common case just 841 // As a performance optimization because n=1 is an extremely common case just
823 // store the first op in the PaintOpBuffer itself to avoid an extra alloc. 842 // store the first op in the PaintOpBuffer itself to avoid an extra alloc.
824 base::AlignedMemory<sizeof(LargestPaintOp), PaintOpAlign> first_op_; 843 base::AlignedMemory<sizeof(LargestPaintOp), PaintOpAlign> first_op_;
825 std::unique_ptr<char, base::AlignedFreeDeleter> data_; 844 std::unique_ptr<char, base::AlignedFreeDeleter> data_;
826 size_t used_ = 0; 845 size_t used_ = 0;
827 size_t reserved_ = 0; 846 size_t reserved_ = 0;
828 int op_count_ = 0; 847 int op_count_ = 0;
829 848
830 // Record paths for veto-to-msaa for gpu raster. 849 // Record paths for veto-to-msaa for gpu raster.
831 int num_slow_paths_ = 0; 850 int num_slow_paths_ = 0;
832 // Record additional bytes used by referenced sub-records and display lists. 851 // Record additional bytes used by referenced sub-records and display lists.
833 size_t subrecord_bytes_used_ = 0; 852 size_t subrecord_bytes_used_ = 0;
853 bool has_discardable_images_ = false;
834 SkRect cull_rect_; 854 SkRect cull_rect_;
835 855
836 DISALLOW_COPY_AND_ASSIGN(PaintOpBuffer); 856 DISALLOW_COPY_AND_ASSIGN(PaintOpBuffer);
837 }; 857 };
838 858
839 } // namespace cc 859 } // namespace cc
840 860
841 #endif // CC_PAINT_PAINT_OP_BUFFER_H_ 861 #endif // CC_PAINT_PAINT_OP_BUFFER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698