| OLD | NEW |
| 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 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 85 // pointer. | 85 // pointer. |
| 86 void Raster(SkCanvas* canvas, const SkMatrix& original_ctm) const; | 86 void Raster(SkCanvas* canvas, const SkMatrix& original_ctm) const; |
| 87 bool IsDrawOp() const; | 87 bool IsDrawOp() const; |
| 88 | 88 |
| 89 // Only valid for draw ops. | 89 // Only valid for draw ops. |
| 90 void RasterWithAlpha(SkCanvas* canvas, uint8_t alpha) const; | 90 void RasterWithAlpha(SkCanvas* canvas, uint8_t alpha) const; |
| 91 | 91 |
| 92 int CountSlowPaths() const { return 0; } | 92 int CountSlowPaths() const { return 0; } |
| 93 int CountSlowPathsFromFlags() const { return 0; } | 93 int CountSlowPathsFromFlags() const { return 0; } |
| 94 | 94 |
| 95 bool HasDiscardableImages() const { return false; } |
| 96 bool HasDiscardableImagesFromFlags() const { return false; } |
| 97 |
| 95 // Returns the number of bytes used by this op in referenced sub records | 98 // Returns the number of bytes used by this op in referenced sub records |
| 96 // and display lists. This doesn't count other objects like paths or blobs. | 99 // and display lists. This doesn't count other objects like paths or blobs. |
| 97 size_t AdditionalBytesUsed() const { return 0; } | 100 size_t AdditionalBytesUsed() const { return 0; } |
| 98 | 101 |
| 99 static constexpr bool kIsDrawOp = false; | 102 static constexpr bool kIsDrawOp = false; |
| 100 static constexpr bool kHasPaintFlags = false; | 103 static constexpr bool kHasPaintFlags = false; |
| 101 static SkRect kUnsetRect; | 104 static SkRect kUnsetRect; |
| 102 }; | 105 }; |
| 103 | 106 |
| 104 struct CC_PAINT_EXPORT PaintOpWithFlags : PaintOp { | 107 struct CC_PAINT_EXPORT PaintOpWithFlags : PaintOp { |
| 105 static constexpr bool kHasPaintFlags = true; | 108 static constexpr bool kHasPaintFlags = true; |
| 106 | 109 |
| 107 explicit PaintOpWithFlags(const PaintFlags& flags) : flags(flags) {} | 110 explicit PaintOpWithFlags(const PaintFlags& flags) : flags(flags) {} |
| 108 | 111 |
| 109 int CountSlowPathsFromFlags() const { return flags.getPathEffect() ? 1 : 0; } | 112 int CountSlowPathsFromFlags() const { return flags.getPathEffect() ? 1 : 0; } |
| 113 bool HasDiscardableImagesFromFlags() const { |
| 114 if (!IsDrawOp()) |
| 115 return false; |
| 116 |
| 117 SkShader* shader = flags.getShader(); |
| 118 SkImage* image = shader ? shader->isAImage(nullptr, nullptr) : nullptr; |
| 119 return image && image->isLazyGenerated(); |
| 120 } |
| 110 | 121 |
| 111 // Subclasses should provide a static RasterWithFlags() method which is called | 122 // Subclasses should provide a static RasterWithFlags() method which is called |
| 112 // from the Raster() method. The RasterWithFlags() should use the PaintFlags | 123 // from the Raster() method. The RasterWithFlags() should use the PaintFlags |
| 113 // passed to it, instead of the |flags| member directly, as some callers may | 124 // passed to it, instead of the |flags| member directly, as some callers may |
| 114 // provide a modified PaintFlags. The RasterWithFlags() method is static with | 125 // provide a modified PaintFlags. The RasterWithFlags() method is static with |
| 115 // a const PaintOpWithFlags* parameter so that it can be used as a function | 126 // a const PaintOpWithFlags* parameter so that it can be used as a function |
| 116 // pointer. | 127 // pointer. |
| 117 PaintFlags flags; | 128 PaintFlags flags; |
| 118 }; | 129 }; |
| 119 | 130 |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 357 // Windows wants to generate these when types are exported, so | 368 // Windows wants to generate these when types are exported, so |
| 358 // provide them here explicitly so that DisplayItemList doesn't have | 369 // provide them here explicitly so that DisplayItemList doesn't have |
| 359 // to be defined in this header. | 370 // to be defined in this header. |
| 360 DrawDisplayItemListOp(const DrawDisplayItemListOp& op); | 371 DrawDisplayItemListOp(const DrawDisplayItemListOp& op); |
| 361 DrawDisplayItemListOp& operator=(const DrawDisplayItemListOp& op); | 372 DrawDisplayItemListOp& operator=(const DrawDisplayItemListOp& op); |
| 362 ~DrawDisplayItemListOp(); | 373 ~DrawDisplayItemListOp(); |
| 363 static void Raster(const PaintOp* op, | 374 static void Raster(const PaintOp* op, |
| 364 SkCanvas* canvas, | 375 SkCanvas* canvas, |
| 365 const SkMatrix& original_ctm); | 376 const SkMatrix& original_ctm); |
| 366 size_t AdditionalBytesUsed() const; | 377 size_t AdditionalBytesUsed() const; |
| 378 bool HasDiscardableImages() const; |
| 367 // TODO(enne): DisplayItemList should know number of slow paths. | 379 // TODO(enne): DisplayItemList should know number of slow paths. |
| 368 | 380 |
| 369 scoped_refptr<DisplayItemList> list; | 381 scoped_refptr<DisplayItemList> list; |
| 370 }; | 382 }; |
| 371 | 383 |
| 372 struct CC_PAINT_EXPORT DrawDRRectOp final : PaintOpWithFlags { | 384 struct CC_PAINT_EXPORT DrawDRRectOp final : PaintOpWithFlags { |
| 373 static constexpr PaintOpType kType = PaintOpType::DrawDRRect; | 385 static constexpr PaintOpType kType = PaintOpType::DrawDRRect; |
| 374 static constexpr bool kIsDrawOp = true; | 386 static constexpr bool kIsDrawOp = true; |
| 375 DrawDRRectOp(const SkRRect& outer, | 387 DrawDRRectOp(const SkRRect& outer, |
| 376 const SkRRect& inner, | 388 const SkRRect& inner, |
| (...skipping 25 matching lines...) Expand all Loading... |
| 402 static void Raster(const PaintOp* op, | 414 static void Raster(const PaintOp* op, |
| 403 SkCanvas* canvas, | 415 SkCanvas* canvas, |
| 404 const SkMatrix& original_ctm) { | 416 const SkMatrix& original_ctm) { |
| 405 auto* flags_op = static_cast<const PaintOpWithFlags*>(op); | 417 auto* flags_op = static_cast<const PaintOpWithFlags*>(op); |
| 406 RasterWithFlags(flags_op, &flags_op->flags, canvas, original_ctm); | 418 RasterWithFlags(flags_op, &flags_op->flags, canvas, original_ctm); |
| 407 } | 419 } |
| 408 static void RasterWithFlags(const PaintOpWithFlags* op, | 420 static void RasterWithFlags(const PaintOpWithFlags* op, |
| 409 const PaintFlags* flags, | 421 const PaintFlags* flags, |
| 410 SkCanvas* canvas, | 422 SkCanvas* canvas, |
| 411 const SkMatrix& original_ctm); | 423 const SkMatrix& original_ctm); |
| 424 bool HasDiscardableImages() const; |
| 412 | 425 |
| 413 PaintImage image; | 426 PaintImage image; |
| 414 SkScalar left; | 427 SkScalar left; |
| 415 SkScalar top; | 428 SkScalar top; |
| 416 }; | 429 }; |
| 417 | 430 |
| 418 struct CC_PAINT_EXPORT DrawImageRectOp final : PaintOpWithFlags { | 431 struct CC_PAINT_EXPORT DrawImageRectOp final : PaintOpWithFlags { |
| 419 static constexpr PaintOpType kType = PaintOpType::DrawImageRect; | 432 static constexpr PaintOpType kType = PaintOpType::DrawImageRect; |
| 420 static constexpr bool kIsDrawOp = true; | 433 static constexpr bool kIsDrawOp = true; |
| 421 DrawImageRectOp(const PaintImage& image, | 434 DrawImageRectOp(const PaintImage& image, |
| 422 const SkRect& src, | 435 const SkRect& src, |
| 423 const SkRect& dst, | 436 const SkRect& dst, |
| 424 const PaintFlags* flags, | 437 const PaintFlags* flags, |
| 425 PaintCanvas::SrcRectConstraint constraint); | 438 PaintCanvas::SrcRectConstraint constraint); |
| 426 ~DrawImageRectOp(); | 439 ~DrawImageRectOp(); |
| 427 static void Raster(const PaintOp* op, | 440 static void Raster(const PaintOp* op, |
| 428 SkCanvas* canvas, | 441 SkCanvas* canvas, |
| 429 const SkMatrix& original_ctm) { | 442 const SkMatrix& original_ctm) { |
| 430 auto* flags_op = static_cast<const PaintOpWithFlags*>(op); | 443 auto* flags_op = static_cast<const PaintOpWithFlags*>(op); |
| 431 RasterWithFlags(flags_op, &flags_op->flags, canvas, original_ctm); | 444 RasterWithFlags(flags_op, &flags_op->flags, canvas, original_ctm); |
| 432 } | 445 } |
| 433 static void RasterWithFlags(const PaintOpWithFlags* op, | 446 static void RasterWithFlags(const PaintOpWithFlags* op, |
| 434 const PaintFlags* flags, | 447 const PaintFlags* flags, |
| 435 SkCanvas* canvas, | 448 SkCanvas* canvas, |
| 436 const SkMatrix& original_ctm); | 449 const SkMatrix& original_ctm); |
| 450 bool HasDiscardableImages() const; |
| 437 | 451 |
| 438 PaintImage image; | 452 PaintImage image; |
| 439 SkRect src; | 453 SkRect src; |
| 440 SkRect dst; | 454 SkRect dst; |
| 441 PaintCanvas::SrcRectConstraint constraint; | 455 PaintCanvas::SrcRectConstraint constraint; |
| 442 }; | 456 }; |
| 443 | 457 |
| 444 struct CC_PAINT_EXPORT DrawIRectOp final : PaintOpWithFlags { | 458 struct CC_PAINT_EXPORT DrawIRectOp final : PaintOpWithFlags { |
| 445 static constexpr PaintOpType kType = PaintOpType::DrawIRect; | 459 static constexpr PaintOpType kType = PaintOpType::DrawIRect; |
| 446 static constexpr bool kIsDrawOp = true; | 460 static constexpr bool kIsDrawOp = true; |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 551 | 565 |
| 552 struct CC_PAINT_EXPORT DrawRecordOp final : PaintOp { | 566 struct CC_PAINT_EXPORT DrawRecordOp final : PaintOp { |
| 553 static constexpr PaintOpType kType = PaintOpType::DrawRecord; | 567 static constexpr PaintOpType kType = PaintOpType::DrawRecord; |
| 554 static constexpr bool kIsDrawOp = true; | 568 static constexpr bool kIsDrawOp = true; |
| 555 explicit DrawRecordOp(sk_sp<const PaintRecord> record); | 569 explicit DrawRecordOp(sk_sp<const PaintRecord> record); |
| 556 ~DrawRecordOp(); | 570 ~DrawRecordOp(); |
| 557 static void Raster(const PaintOp* op, | 571 static void Raster(const PaintOp* op, |
| 558 SkCanvas* canvas, | 572 SkCanvas* canvas, |
| 559 const SkMatrix& original_ctm); | 573 const SkMatrix& original_ctm); |
| 560 size_t AdditionalBytesUsed() const; | 574 size_t AdditionalBytesUsed() const; |
| 575 bool HasDiscardableImages() const; |
| 561 | 576 |
| 562 sk_sp<const PaintRecord> record; | 577 sk_sp<const PaintRecord> record; |
| 563 }; | 578 }; |
| 564 | 579 |
| 565 struct CC_PAINT_EXPORT DrawRectOp final : PaintOpWithFlags { | 580 struct CC_PAINT_EXPORT DrawRectOp final : PaintOpWithFlags { |
| 566 static constexpr PaintOpType kType = PaintOpType::DrawRect; | 581 static constexpr PaintOpType kType = PaintOpType::DrawRect; |
| 567 static constexpr bool kIsDrawOp = true; | 582 static constexpr bool kIsDrawOp = true; |
| 568 DrawRectOp(const SkRect& rect, const PaintFlags& flags) | 583 DrawRectOp(const SkRect& rect, const PaintFlags& flags) |
| 569 : PaintOpWithFlags(flags), rect(rect) {} | 584 : PaintOpWithFlags(flags), rect(rect) {} |
| 570 static void Raster(const PaintOp* op, | 585 static void Raster(const PaintOp* op, |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 764 | 779 |
| 765 void playback(SkCanvas* canvas) const; | 780 void playback(SkCanvas* canvas) const; |
| 766 void playback(SkCanvas* canvas, SkPicture::AbortCallback* callback) const; | 781 void playback(SkCanvas* canvas, SkPicture::AbortCallback* callback) const; |
| 767 | 782 |
| 768 // TODO(enne): These are no longer approximate. Rename these. | 783 // TODO(enne): These are no longer approximate. Rename these. |
| 769 int approximateOpCount() const { return op_count_; } | 784 int approximateOpCount() const { return op_count_; } |
| 770 size_t approximateBytesUsed() const { | 785 size_t approximateBytesUsed() const { |
| 771 return sizeof(*this) + reserved_ + subrecord_bytes_used_; | 786 return sizeof(*this) + reserved_ + subrecord_bytes_used_; |
| 772 } | 787 } |
| 773 int numSlowPaths() const { return num_slow_paths_; } | 788 int numSlowPaths() const { return num_slow_paths_; } |
| 789 bool HasDiscardableImages() const { return has_discardable_images_; } |
| 774 | 790 |
| 775 // Resize the PaintOpBuffer to exactly fit the current amount of used space. | 791 // Resize the PaintOpBuffer to exactly fit the current amount of used space. |
| 776 void ShrinkToFit(); | 792 void ShrinkToFit(); |
| 777 | 793 |
| 778 const SkRect& cullRect() const { return cull_rect_; } | 794 const SkRect& cullRect() const { return cull_rect_; } |
| 779 | 795 |
| 780 PaintOp* GetFirstOp() const { | 796 PaintOp* GetFirstOp() const { |
| 781 return const_cast<PaintOp*>(first_op_.data_as<PaintOp>()); | 797 return const_cast<PaintOp*>(first_op_.data_as<PaintOp>()); |
| 782 } | 798 } |
| 783 | 799 |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 926 op->skip = skip; | 942 op->skip = skip; |
| 927 AnalyzeAddedOp(op); | 943 AnalyzeAddedOp(op); |
| 928 return op; | 944 return op; |
| 929 } | 945 } |
| 930 | 946 |
| 931 template <typename T> | 947 template <typename T> |
| 932 void AnalyzeAddedOp(const T* op) { | 948 void AnalyzeAddedOp(const T* op) { |
| 933 num_slow_paths_ += op->CountSlowPathsFromFlags(); | 949 num_slow_paths_ += op->CountSlowPathsFromFlags(); |
| 934 num_slow_paths_ += op->CountSlowPaths(); | 950 num_slow_paths_ += op->CountSlowPaths(); |
| 935 | 951 |
| 952 has_discardable_images_ |= op->HasDiscardableImages(); |
| 953 has_discardable_images_ |= op->HasDiscardableImagesFromFlags(); |
| 954 |
| 936 subrecord_bytes_used_ += op->AdditionalBytesUsed(); | 955 subrecord_bytes_used_ += op->AdditionalBytesUsed(); |
| 937 } | 956 } |
| 938 | 957 |
| 939 // As a performance optimization because n=1 is an extremely common case just | 958 // As a performance optimization because n=1 is an extremely common case just |
| 940 // store the first op in the PaintOpBuffer itself to avoid an extra alloc. | 959 // store the first op in the PaintOpBuffer itself to avoid an extra alloc. |
| 941 base::AlignedMemory<sizeof(LargestPaintOp), PaintOpAlign> first_op_; | 960 base::AlignedMemory<sizeof(LargestPaintOp), PaintOpAlign> first_op_; |
| 942 std::unique_ptr<char, base::AlignedFreeDeleter> data_; | 961 std::unique_ptr<char, base::AlignedFreeDeleter> data_; |
| 943 size_t used_ = 0; | 962 size_t used_ = 0; |
| 944 size_t reserved_ = 0; | 963 size_t reserved_ = 0; |
| 945 int op_count_ = 0; | 964 int op_count_ = 0; |
| 946 | 965 |
| 947 // Record paths for veto-to-msaa for gpu raster. | 966 // Record paths for veto-to-msaa for gpu raster. |
| 948 int num_slow_paths_ = 0; | 967 int num_slow_paths_ = 0; |
| 949 // Record additional bytes used by referenced sub-records and display lists. | 968 // Record additional bytes used by referenced sub-records and display lists. |
| 950 size_t subrecord_bytes_used_ = 0; | 969 size_t subrecord_bytes_used_ = 0; |
| 970 bool has_discardable_images_ = false; |
| 951 SkRect cull_rect_; | 971 SkRect cull_rect_; |
| 952 | 972 |
| 953 DISALLOW_COPY_AND_ASSIGN(PaintOpBuffer); | 973 DISALLOW_COPY_AND_ASSIGN(PaintOpBuffer); |
| 954 }; | 974 }; |
| 955 | 975 |
| 956 } // namespace cc | 976 } // namespace cc |
| 957 | 977 |
| 958 #endif // CC_PAINT_PAINT_OP_BUFFER_H_ | 978 #endif // CC_PAINT_PAINT_OP_BUFFER_H_ |
| OLD | NEW |