1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CC_DEBUG_FRAME_VIEWER_INSTRUMENTATION_H_
6#define CC_DEBUG_FRAME_VIEWER_INSTRUMENTATION_H_
7
8#include "base/debug/trace_event.h"
9#include "cc/resources/tile.h"
10
11namespace cc {
12namespace frame_viewer_instrumentation {
13namespace internal {
14
15const char kCategory[] = "cc";
16const char kTileData[] = "tileData";
17const char kLayerId[] = "layerId";
18const char kTileId[] = "tileId";
19const char kTileResolution[] = "tileResolution";
20const char kSourceFrameNumber[] = "sourceFrameNumber";
21const char kRasterMode[] = "rasterMode";
22
23const char kAnalyzeTask[] = "AnalyzeTask";
24const char kRasterTask[] = "RasterTask";
25
26scoped_refptr<base::debug::ConvertableToTraceFormat> TileDataAsValue(
27    const void* tile_id,
28    TileResolution tile_resolution,
29    int source_frame_number,
30    int layer_id) {
31  scoped_refptr<base::debug::TracedValue> res(new base::debug::TracedValue());
32  TracedValue::SetIDRef(tile_id, res.get(), internal::kTileId);
33  res->SetString(internal::kTileResolution,
34                 TileResolutionToString(tile_resolution));
35  res->SetInteger(internal::kSourceFrameNumber, source_frame_number);
36  res->SetInteger(internal::kLayerId, layer_id);
37  return res;
38}
39
40}  // namespace internal
41
42class ScopedAnalyzeTask {
43 public:
44  ScopedAnalyzeTask(const void* tile_id,
45                    TileResolution tile_resolution,
46                    int source_frame_number,
47                    int layer_id) {
48    TRACE_EVENT_BEGIN1(
49        internal::kCategory,
50        internal::kAnalyzeTask,
51        internal::kTileData,
52        internal::TileDataAsValue(
53            tile_id, tile_resolution, source_frame_number, layer_id));
54  }
55  ~ScopedAnalyzeTask() {
56    TRACE_EVENT_END0(internal::kCategory, internal::kAnalyzeTask);
57  }
58
59 private:
60  DISALLOW_COPY_AND_ASSIGN(ScopedAnalyzeTask);
61};
62
63class ScopedRasterTask {
64 public:
65  ScopedRasterTask(const void* tile_id,
66                   TileResolution tile_resolution,
67                   int source_frame_number,
68                   int layer_id,
69                   RasterMode raster_mode) {
70    TRACE_EVENT_BEGIN2(
71        internal::kCategory,
72        internal::kRasterTask,
73        internal::kTileData,
74        internal::TileDataAsValue(
75            tile_id, tile_resolution, source_frame_number, layer_id),
76        internal::kRasterMode,
77        RasterModeToString(raster_mode));
78  }
79  ~ScopedRasterTask() {
80    TRACE_EVENT_END0(internal::kCategory, internal::kRasterTask);
81  }
82
83 private:
84  DISALLOW_COPY_AND_ASSIGN(ScopedRasterTask);
85};
86
87}  // namespace frame_viewer_instrumentation
88}  // namespace cc
89
90#endif  // CC_DEBUG_FRAME_VIEWER_INSTRUMENTATION_H_
91