1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2017 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkDebugfTracer.h"
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTraceEvent.h"
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSkEventTracer::Handle SkDebugfTracer::addTraceEvent(char phase,
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                    const uint8_t* categoryEnabledFlag,
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                    const char* name,
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                    uint64_t id,
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                    int numArgs,
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                    const char** argNames,
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                    const uint8_t* argTypes,
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                    const uint64_t* argValues,
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                                    uint8_t flags) {
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkString args;
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    for (int i = 0; i < numArgs; ++i) {
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (i > 0) {
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            args.append(", ");
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        } else {
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            args.append(" ");
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        skia::tracing_internals::TraceValueUnion value;
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        value.as_uint = argValues[i];
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        switch (argTypes[i]) {
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            case TRACE_VALUE_TYPE_BOOL:
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                args.appendf("%s=%s", argNames[i], value.as_bool ? "true" : "false");
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                break;
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            case TRACE_VALUE_TYPE_UINT:
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                args.appendf("%s=%u", argNames[i], static_cast<uint32_t>(argValues[i]));
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                break;
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            case TRACE_VALUE_TYPE_INT:
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                args.appendf("%s=%d", argNames[i], static_cast<int32_t>(argValues[i]));
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                break;
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            case TRACE_VALUE_TYPE_DOUBLE:
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                args.appendf("%s=%g", argNames[i], value.as_double);
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                break;
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            case TRACE_VALUE_TYPE_POINTER:
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                args.appendf("%s=0x%p", argNames[i], value.as_pointer);
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                break;
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            case TRACE_VALUE_TYPE_STRING:
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            case TRACE_VALUE_TYPE_COPY_STRING: {
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                static constexpr size_t kMaxLen = 20;
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                SkString string(value.as_string);
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                size_t truncAt = string.size();
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                size_t newLineAt = SkStrFind(string.c_str(), "\n");
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                if (newLineAt > 0) {
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    truncAt = newLineAt;
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                }
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                truncAt = SkTMin(truncAt, kMaxLen);
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                if (truncAt < string.size()) {
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    string.resize(truncAt);
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    string.append("...");
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                }
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                args.appendf("%s=\"%s\"", argNames[i], string.c_str());
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                break;
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            default:
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                args.appendf("%s=<unknown type>", argNames[i]);
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                break;
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool open = (phase == TRACE_EVENT_PHASE_COMPLETE);
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (open) {
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const char* category = this->getCategoryGroupName(categoryEnabledFlag);
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkDebugf("[% 2d]%s <%s> %s%s #%d {\n", fIndent.size(), fIndent.c_str(), category, name,
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                 args.c_str(), fCnt);
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fIndent.append(" ");
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    } else {
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkDebugf("%s%s #%d\n", name, args.c_str(), fCnt);
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ++fCnt;
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return 0;
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid SkDebugfTracer::updateTraceEventDuration(const uint8_t* categoryEnabledFlag,
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                              const char* name,
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                              SkEventTracer::Handle handle) {
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    fIndent.resize(fIndent.size() - 1);
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkDebugf("[% 2d]%s } %s\n", fIndent.size(), fIndent.c_str(), name);
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
86