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