| // 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_ |