| // 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_DEBUG_DEVTOOLS_INSTRUMENTATION_H_ |
| #define CC_DEBUG_DEVTOOLS_INSTRUMENTATION_H_ |
| |
| #include <stdint.h> |
| |
| #include <memory> |
| |
| #include "base/macros.h" |
| #include "base/trace_event/trace_event.h" |
| #include "base/trace_event/trace_event_argument.h" |
| |
| namespace cc { |
| namespace devtools_instrumentation { |
| |
| namespace internal { |
| const char kCategory[] = TRACE_DISABLED_BY_DEFAULT("devtools.timeline"); |
| const char kCategoryFrame[] = |
| TRACE_DISABLED_BY_DEFAULT("devtools.timeline.frame"); |
| const char kData[] = "data"; |
| const char kFrameId[] = "frameId"; |
| const char kLayerId[] = "layerId"; |
| const char kLayerTreeId[] = "layerTreeId"; |
| const char kPixelRefId[] = "pixelRefId"; |
| |
| const char kImageDecodeTask[] = "ImageDecodeTask"; |
| const char kBeginFrame[] = "BeginFrame"; |
| const char kNeedsBeginFrameChanged[] = "NeedsBeginFrameChanged"; |
| const char kActivateLayerTree[] = "ActivateLayerTree"; |
| const char kRequestMainThreadFrame[] = "RequestMainThreadFrame"; |
| const char kBeginMainThreadFrame[] = "BeginMainThreadFrame"; |
| const char kDrawFrame[] = "DrawFrame"; |
| const char kCompositeLayers[] = "CompositeLayers"; |
| } // namespace internal |
| |
| const char kPaintSetup[] = "PaintSetup"; |
| const char kUpdateLayer[] = "UpdateLayer"; |
| |
| class ScopedLayerTask { |
| public: |
| ScopedLayerTask(const char* event_name, int layer_id) |
| : event_name_(event_name) { |
| TRACE_EVENT_BEGIN1(internal::kCategory, event_name_, |
| internal::kLayerId, layer_id); |
| } |
| ~ScopedLayerTask() { |
| TRACE_EVENT_END0(internal::kCategory, event_name_); |
| } |
| private: |
| const char* event_name_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ScopedLayerTask); |
| }; |
| |
| class ScopedImageDecodeTask { |
| public: |
| explicit ScopedImageDecodeTask(const void* imagePtr) { |
| TRACE_EVENT_BEGIN1(internal::kCategory, internal::kImageDecodeTask, |
| internal::kPixelRefId, |
| reinterpret_cast<uint64_t>(imagePtr)); |
| } |
| ~ScopedImageDecodeTask() { |
| TRACE_EVENT_END0(internal::kCategory, internal::kImageDecodeTask); |
| } |
| private: |
| DISALLOW_COPY_AND_ASSIGN(ScopedImageDecodeTask); |
| }; |
| |
| class ScopedLayerTreeTask { |
| public: |
| ScopedLayerTreeTask(const char* event_name, |
| int layer_id, |
| int layer_tree_host_id) |
| : event_name_(event_name) { |
| TRACE_EVENT_BEGIN2(internal::kCategory, event_name_, |
| internal::kLayerId, layer_id, |
| internal::kLayerTreeId, layer_tree_host_id); |
| } |
| ~ScopedLayerTreeTask() { |
| TRACE_EVENT_END0(internal::kCategory, event_name_); |
| } |
| private: |
| const char* event_name_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ScopedLayerTreeTask); |
| }; |
| |
| struct ScopedCommitTrace { |
| public: |
| explicit ScopedCommitTrace(int layer_tree_host_id) { |
| TRACE_EVENT_BEGIN1(internal::kCategory, internal::kCompositeLayers, |
| internal::kLayerTreeId, layer_tree_host_id); |
| } |
| ~ScopedCommitTrace() { |
| TRACE_EVENT_END0(internal::kCategory, internal::kCompositeLayers); |
| } |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(ScopedCommitTrace); |
| }; |
| |
| struct ScopedLayerObjectTracker |
| : public base::trace_event::TraceScopedTrackableObject<int> { |
| explicit ScopedLayerObjectTracker(int layer_id) |
| : base::trace_event::TraceScopedTrackableObject<int>( |
| internal::kCategory, |
| internal::kLayerId, |
| layer_id) { |
| } |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(ScopedLayerObjectTracker); |
| }; |
| |
| inline void DidActivateLayerTree(int layer_tree_host_id, int frame_id) { |
| TRACE_EVENT_INSTANT2(internal::kCategoryFrame, |
| internal::kActivateLayerTree, |
| TRACE_EVENT_SCOPE_THREAD, |
| internal::kLayerTreeId, |
| layer_tree_host_id, |
| internal::kFrameId, |
| frame_id); |
| } |
| |
| inline void DidBeginFrame(int layer_tree_host_id) { |
| TRACE_EVENT_INSTANT1(internal::kCategoryFrame, |
| internal::kBeginFrame, |
| TRACE_EVENT_SCOPE_THREAD, |
| internal::kLayerTreeId, |
| layer_tree_host_id); |
| } |
| |
| inline void DidDrawFrame(int layer_tree_host_id) { |
| TRACE_EVENT_INSTANT1(internal::kCategoryFrame, |
| internal::kDrawFrame, |
| TRACE_EVENT_SCOPE_THREAD, |
| internal::kLayerTreeId, |
| layer_tree_host_id); |
| } |
| |
| inline void DidRequestMainThreadFrame(int layer_tree_host_id) { |
| TRACE_EVENT_INSTANT1(internal::kCategoryFrame, |
| 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 WillBeginMainThreadFrame(int layer_tree_host_id, int frame_id) { |
| TRACE_EVENT_INSTANT2( |
| internal::kCategoryFrame, 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 NeedsBeginFrameChanged(int layer_tree_host_id, bool new_value) { |
| TRACE_EVENT_INSTANT2( |
| internal::kCategoryFrame, internal::kNeedsBeginFrameChanged, |
| TRACE_EVENT_SCOPE_THREAD, internal::kLayerTreeId, layer_tree_host_id, |
| internal::kData, NeedsBeginFrameData(new_value)); |
| } |
| |
| } // namespace devtools_instrumentation |
| } // namespace cc |
| |
| #endif // CC_DEBUG_DEVTOOLS_INSTRUMENTATION_H_ |