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