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 762 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
773 | 773 |
774 PaintOpBuffer(); | 774 PaintOpBuffer(); |
775 explicit PaintOpBuffer(const SkRect& cull_rect); | 775 explicit PaintOpBuffer(const SkRect& cull_rect); |
776 ~PaintOpBuffer() override; | 776 ~PaintOpBuffer() override; |
777 | 777 |
778 void Reset(); | 778 void Reset(); |
779 | 779 |
780 void playback(SkCanvas* canvas) const; | 780 void playback(SkCanvas* canvas) const; |
781 void playback(SkCanvas* canvas, SkPicture::AbortCallback* callback) const; | 781 void playback(SkCanvas* canvas, SkPicture::AbortCallback* callback) const; |
782 | 782 |
783 // TODO(enne): These are no longer approximate. Rename these. | 783 // Returns the size of the paint op buffer. That is, the number of ops |
784 int approximateOpCount() const { return op_count_; } | 784 // contained in it. |
785 size_t approximateBytesUsed() const { | 785 size_t size() const { return op_count_; } |
| 786 // Returns the number of bytes used by the paint op buffer. |
| 787 size_t bytes_used() const { |
786 return sizeof(*this) + reserved_ + subrecord_bytes_used_; | 788 return sizeof(*this) + reserved_ + subrecord_bytes_used_; |
787 } | 789 } |
788 int numSlowPaths() const { return num_slow_paths_; } | 790 int numSlowPaths() const { return num_slow_paths_; } |
789 bool HasDiscardableImages() const { return has_discardable_images_; } | 791 bool HasDiscardableImages() const { return has_discardable_images_; } |
790 | 792 |
791 // Resize the PaintOpBuffer to exactly fit the current amount of used space. | 793 // Resize the PaintOpBuffer to exactly fit the current amount of used space. |
792 void ShrinkToFit(); | 794 void ShrinkToFit(); |
793 | 795 |
794 const SkRect& cullRect() const { return cull_rect_; } | 796 const SkRect& cullRect() const { return cull_rect_; } |
795 | 797 |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
866 explicit Iterator(const PaintOpBuffer* buffer) | 868 explicit Iterator(const PaintOpBuffer* buffer) |
867 : buffer_(buffer), ptr_(buffer_->data_.get()) {} | 869 : buffer_(buffer), ptr_(buffer_->data_.get()) {} |
868 | 870 |
869 PaintOp* operator->() const { | 871 PaintOp* operator->() const { |
870 return op_idx_ ? reinterpret_cast<PaintOp*>(ptr_) : buffer_->GetFirstOp(); | 872 return op_idx_ ? reinterpret_cast<PaintOp*>(ptr_) : buffer_->GetFirstOp(); |
871 } | 873 } |
872 PaintOp* operator*() const { return operator->(); } | 874 PaintOp* operator*() const { return operator->(); } |
873 Iterator begin() { return Iterator(buffer_, buffer_->data_.get(), 0); } | 875 Iterator begin() { return Iterator(buffer_, buffer_->data_.get(), 0); } |
874 Iterator end() { | 876 Iterator end() { |
875 return Iterator(buffer_, buffer_->data_.get() + buffer_->used_, | 877 return Iterator(buffer_, buffer_->data_.get() + buffer_->used_, |
876 buffer_->approximateOpCount()); | 878 buffer_->size()); |
877 } | 879 } |
878 bool operator!=(const Iterator& other) { | 880 bool operator!=(const Iterator& other) { |
879 // Not valid to compare iterators on different buffers. | 881 // Not valid to compare iterators on different buffers. |
880 DCHECK_EQ(other.buffer_, buffer_); | 882 DCHECK_EQ(other.buffer_, buffer_); |
881 return other.op_idx_ != op_idx_; | 883 return other.op_idx_ != op_idx_; |
882 } | 884 } |
883 Iterator& operator++() { | 885 Iterator& operator++() { |
884 if (!op_idx_++) | 886 if (!op_idx_++) |
885 return *this; | 887 return *this; |
886 PaintOp* op = **this; | 888 PaintOp* op = **this; |
887 uint32_t type = op->type; | 889 uint32_t type = op->type; |
888 CHECK_LE(type, static_cast<uint32_t>(PaintOpType::LastPaintOpType)); | 890 CHECK_LE(type, static_cast<uint32_t>(PaintOpType::LastPaintOpType)); |
889 ptr_ += op->skip; | 891 ptr_ += op->skip; |
890 return *this; | 892 return *this; |
891 } | 893 } |
892 operator bool() const { return op_idx_ < buffer_->approximateOpCount(); } | 894 operator bool() const { return op_idx_ < buffer_->size(); } |
893 | 895 |
894 int op_idx() const { return op_idx_; } | 896 size_t op_idx() const { return op_idx_; } |
895 | 897 |
896 // Return the next op without advancing the iterator, or nullptr if none. | 898 // Return the next op without advancing the iterator, or nullptr if none. |
897 PaintOp* peek1() const { | 899 PaintOp* peek1() const { |
898 if (op_idx_ + 1 >= buffer_->approximateOpCount()) | 900 if (op_idx_ + 1 >= buffer_->size()) |
899 return nullptr; | 901 return nullptr; |
900 if (!op_idx_) | 902 if (!op_idx_) |
901 return reinterpret_cast<PaintOp*>(ptr_); | 903 return reinterpret_cast<PaintOp*>(ptr_); |
902 return reinterpret_cast<PaintOp*>(ptr_ + (*this)->skip); | 904 return reinterpret_cast<PaintOp*>(ptr_ + (*this)->skip); |
903 } | 905 } |
904 | 906 |
905 // Return the op two ops ahead without advancing the iterator, or nullptr if | 907 // Return the op two ops ahead without advancing the iterator, or nullptr if |
906 // none. | 908 // none. |
907 PaintOp* peek2() const { | 909 PaintOp* peek2() const { |
908 if (op_idx_ + 2 >= buffer_->approximateOpCount()) | 910 if (op_idx_ + 2 >= buffer_->size()) |
909 return nullptr; | 911 return nullptr; |
910 char* next = ptr_ + reinterpret_cast<PaintOp*>(ptr_)->skip; | 912 char* next = ptr_ + reinterpret_cast<PaintOp*>(ptr_)->skip; |
911 PaintOp* next_op = reinterpret_cast<PaintOp*>(next); | 913 PaintOp* next_op = reinterpret_cast<PaintOp*>(next); |
912 if (!op_idx_) | 914 if (!op_idx_) |
913 return next_op; | 915 return next_op; |
914 return reinterpret_cast<PaintOp*>(next + next_op->skip); | 916 return reinterpret_cast<PaintOp*>(next + next_op->skip); |
915 } | 917 } |
916 | 918 |
917 private: | 919 private: |
918 Iterator(const PaintOpBuffer* buffer, char* ptr, int op_idx) | 920 Iterator(const PaintOpBuffer* buffer, char* ptr, size_t op_idx) |
919 : buffer_(buffer), ptr_(ptr), op_idx_(op_idx) {} | 921 : buffer_(buffer), ptr_(ptr), op_idx_(op_idx) {} |
920 | 922 |
921 const PaintOpBuffer* buffer_ = nullptr; | 923 const PaintOpBuffer* buffer_ = nullptr; |
922 char* ptr_ = nullptr; | 924 char* ptr_ = nullptr; |
923 int op_idx_ = 0; | 925 size_t op_idx_ = 0; |
924 }; | 926 }; |
925 | 927 |
926 private: | 928 private: |
927 void ReallocBuffer(size_t new_size); | 929 void ReallocBuffer(size_t new_size); |
928 // Returns the allocated op and the number of bytes to skip in |data_| to get | 930 // Returns the allocated op and the number of bytes to skip in |data_| to get |
929 // to the next op. | 931 // to the next op. |
930 std::pair<void*, size_t> AllocatePaintOp(size_t sizeof_op, size_t bytes); | 932 std::pair<void*, size_t> AllocatePaintOp(size_t sizeof_op, size_t bytes); |
931 | 933 |
932 template <typename T, typename... Args> | 934 template <typename T, typename... Args> |
933 T* push_internal(size_t bytes, Args&&... args) { | 935 T* push_internal(size_t bytes, Args&&... args) { |
(...skipping 20 matching lines...) Expand all Loading... |
954 | 956 |
955 subrecord_bytes_used_ += op->AdditionalBytesUsed(); | 957 subrecord_bytes_used_ += op->AdditionalBytesUsed(); |
956 } | 958 } |
957 | 959 |
958 // As a performance optimization because n=1 is an extremely common case just | 960 // As a performance optimization because n=1 is an extremely common case just |
959 // store the first op in the PaintOpBuffer itself to avoid an extra alloc. | 961 // store the first op in the PaintOpBuffer itself to avoid an extra alloc. |
960 base::AlignedMemory<sizeof(LargestPaintOp), PaintOpAlign> first_op_; | 962 base::AlignedMemory<sizeof(LargestPaintOp), PaintOpAlign> first_op_; |
961 std::unique_ptr<char, base::AlignedFreeDeleter> data_; | 963 std::unique_ptr<char, base::AlignedFreeDeleter> data_; |
962 size_t used_ = 0; | 964 size_t used_ = 0; |
963 size_t reserved_ = 0; | 965 size_t reserved_ = 0; |
964 int op_count_ = 0; | 966 size_t op_count_ = 0; |
965 | 967 |
966 // Record paths for veto-to-msaa for gpu raster. | 968 // Record paths for veto-to-msaa for gpu raster. |
967 int num_slow_paths_ = 0; | 969 int num_slow_paths_ = 0; |
968 // Record additional bytes used by referenced sub-records and display lists. | 970 // Record additional bytes used by referenced sub-records and display lists. |
969 size_t subrecord_bytes_used_ = 0; | 971 size_t subrecord_bytes_used_ = 0; |
970 bool has_discardable_images_ = false; | 972 bool has_discardable_images_ = false; |
971 SkRect cull_rect_; | 973 SkRect cull_rect_; |
972 | 974 |
973 DISALLOW_COPY_AND_ASSIGN(PaintOpBuffer); | 975 DISALLOW_COPY_AND_ASSIGN(PaintOpBuffer); |
974 }; | 976 }; |
975 | 977 |
976 } // namespace cc | 978 } // namespace cc |
977 | 979 |
978 #endif // CC_PAINT_PAINT_OP_BUFFER_H_ | 980 #endif // CC_PAINT_PAINT_OP_BUFFER_H_ |
OLD | NEW |