| // Copyright 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CC_BASE_DEVTOOLS_INSTRUMENTATION_H_ |
| #define CC_BASE_DEVTOOLS_INSTRUMENTATION_H_ |
| |
| #include <stdint.h> |
| |
| #include <memory> |
| |
| #include "base/macros.h" |
| #include "base/metrics/histogram_macros.h" |
| #include "base/trace_event/trace_event.h" |
| #include "base/trace_event/traced_value.h" |
| #include "cc/base/base_export.h" |
| |
| namespace cc { |
| namespace devtools_instrumentation { |
| |
| namespace internal { |
| struct CC_BASE_EXPORT CategoryName { |
| // Put these strings into a struct to allow external linkage. |
| static constexpr const char kTimeline[] = |
| TRACE_DISABLED_BY_DEFAULT("devtools.timeline"); |
| static constexpr const char kTimelineFrame[] = |
| TRACE_DISABLED_BY_DEFAULT("devtools.timeline.frame"); |
| }; |
| |
| CC_BASE_EXPORT extern const char kData[]; |
| CC_BASE_EXPORT extern const char kFrameId[]; |
| CC_BASE_EXPORT extern const char kLayerId[]; |
| CC_BASE_EXPORT extern const char kLayerTreeId[]; |
| CC_BASE_EXPORT extern const char kPixelRefId[]; |
| |
| CC_BASE_EXPORT extern const char kImageDecodeTask[]; |
| CC_BASE_EXPORT extern const char kBeginFrame[]; |
| CC_BASE_EXPORT extern const char kNeedsBeginFrameChanged[]; |
| CC_BASE_EXPORT extern const char kActivateLayerTree[]; |
| CC_BASE_EXPORT extern const char kRequestMainThreadFrame[]; |
| CC_BASE_EXPORT extern const char kBeginMainThreadFrame[]; |
| CC_BASE_EXPORT extern const char kDrawFrame[]; |
| CC_BASE_EXPORT extern const char kCompositeLayers[]; |
| } // namespace internal |
| |
| extern const char kPaintSetup[]; |
| CC_BASE_EXPORT extern const char kUpdateLayer[]; |
| |
| class CC_BASE_EXPORT ScopedLayerTask { |
| public: |
| ScopedLayerTask(const char* event_name, int layer_id) |
| : event_name_(event_name) { |
| TRACE_EVENT_BEGIN1(internal::CategoryName::kTimeline, event_name_, |
| internal::kLayerId, layer_id); |
| } |
| ~ScopedLayerTask() { |
| TRACE_EVENT_END0(internal::CategoryName::kTimeline, event_name_); |
| } |
| |
| private: |
| const char* event_name_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ScopedLayerTask); |
| }; |
| |
| class CC_BASE_EXPORT ScopedImageDecodeTask { |
| public: |
| enum DecodeType { kSoftware, kGpu }; |
| enum TaskType { kInRaster, kOutOfRaster }; |
| |
| ScopedImageDecodeTask(const void* image_ptr, |
| DecodeType decode_type, |
| TaskType task_type); |
| ~ScopedImageDecodeTask(); |
| |
| private: |
| const DecodeType decode_type_; |
| const TaskType task_type_; |
| const base::TimeTicks start_time_; |
| DISALLOW_COPY_AND_ASSIGN(ScopedImageDecodeTask); |
| }; |
| |
| class CC_BASE_EXPORT ScopedLayerTreeTask { |
| public: |
| ScopedLayerTreeTask(const char* event_name, |
| int layer_id, |
| int layer_tree_host_id) |
| : event_name_(event_name) { |
| TRACE_EVENT_BEGIN2(internal::CategoryName::kTimeline, event_name_, |
| internal::kLayerId, layer_id, internal::kLayerTreeId, |
| layer_tree_host_id); |
| } |
| ~ScopedLayerTreeTask() { |
| TRACE_EVENT_END0(internal::CategoryName::kTimeline, event_name_); |
| } |
| |
| private: |
| const char* event_name_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ScopedLayerTreeTask); |
| }; |
| |
| struct CC_BASE_EXPORT ScopedCommitTrace { |
| public: |
| explicit ScopedCommitTrace(int layer_tree_host_id) { |
| TRACE_EVENT_BEGIN1(internal::CategoryName::kTimeline, |
| internal::kCompositeLayers, internal::kLayerTreeId, |
| layer_tree_host_id); |
| } |
| ~ScopedCommitTrace() { |
| TRACE_EVENT_END0(internal::CategoryName::kTimeline, |
| internal::kCompositeLayers); |
| } |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(ScopedCommitTrace); |
| }; |
| |
| struct CC_BASE_EXPORT ScopedLayerObjectTracker |
| : public base::trace_event:: |
| TraceScopedTrackableObject<int, internal::CategoryName::kTimeline> { |
| explicit ScopedLayerObjectTracker(int layer_id) |
| : base::trace_event:: |
| TraceScopedTrackableObject<int, internal::CategoryName::kTimeline>( |
| internal::kLayerId, |
| layer_id) {} |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(ScopedLayerObjectTracker); |
| }; |
| |
| inline void CC_BASE_EXPORT DidActivateLayerTree(int layer_tree_host_id, |
| int frame_id) { |
| TRACE_EVENT_INSTANT2(internal::CategoryName::kTimelineFrame, |
| internal::kActivateLayerTree, TRACE_EVENT_SCOPE_THREAD, |
| internal::kLayerTreeId, layer_tree_host_id, |
| internal::kFrameId, frame_id); |
| } |
| |
| inline void CC_BASE_EXPORT DidBeginFrame(int layer_tree_host_id) { |
| TRACE_EVENT_INSTANT1(internal::CategoryName::kTimelineFrame, |
| internal::kBeginFrame, TRACE_EVENT_SCOPE_THREAD, |
| internal::kLayerTreeId, layer_tree_host_id); |
| } |
| |
| inline void CC_BASE_EXPORT DidDrawFrame(int layer_tree_host_id) { |
| TRACE_EVENT_INSTANT1(internal::CategoryName::kTimelineFrame, |
| internal::kDrawFrame, TRACE_EVENT_SCOPE_THREAD, |
| internal::kLayerTreeId, layer_tree_host_id); |
| } |
| |
| inline void CC_BASE_EXPORT DidRequestMainThreadFrame(int layer_tree_host_id) { |
| TRACE_EVENT_INSTANT1( |
| internal::CategoryName::kTimelineFrame, internal::kRequestMainThreadFrame, |
| TRACE_EVENT_SCOPE_THREAD, internal::kLayerTreeId, layer_tree_host_id); |
| } |
| |
| inline std::unique_ptr<base::trace_event::ConvertableToTraceFormat> |
| BeginMainThreadFrameData(int frame_id) { |
| std::unique_ptr<base::trace_event::TracedValue> value( |
| new base::trace_event::TracedValue()); |
| value->SetInteger("frameId", frame_id); |
| return std::move(value); |
| } |
| |
| inline void CC_BASE_EXPORT WillBeginMainThreadFrame(int layer_tree_host_id, |
| int frame_id) { |
| TRACE_EVENT_INSTANT2( |
| internal::CategoryName::kTimelineFrame, internal::kBeginMainThreadFrame, |
| TRACE_EVENT_SCOPE_THREAD, internal::kLayerTreeId, layer_tree_host_id, |
| internal::kData, BeginMainThreadFrameData(frame_id)); |
| } |
| |
| inline std::unique_ptr<base::trace_event::ConvertableToTraceFormat> |
| NeedsBeginFrameData(bool needs_begin_frame) { |
| std::unique_ptr<base::trace_event::TracedValue> value( |
| new base::trace_event::TracedValue()); |
| value->SetInteger("needsBeginFrame", needs_begin_frame); |
| return std::move(value); |
| } |
| |
| inline void CC_BASE_EXPORT NeedsBeginFrameChanged(int layer_tree_host_id, |
| bool new_value) { |
| TRACE_EVENT_INSTANT2( |
| internal::CategoryName::kTimelineFrame, internal::kNeedsBeginFrameChanged, |
| TRACE_EVENT_SCOPE_THREAD, internal::kLayerTreeId, layer_tree_host_id, |
| internal::kData, NeedsBeginFrameData(new_value)); |
| } |
| |
| } // namespace devtools_instrumentation |
| } // namespace cc |
| |
| #endif // CC_BASE_DEVTOOLS_INSTRUMENTATION_H_ |