de-Sk tools/trace Kept it on SkDebugfTracer, which seemed to parse as "SkDebugf, Tracer". Change-Id: I3e43fe101798ca5ffe14324e3c29f2dd41a6bd0f Reviewed-on: https://skia-review.googlesource.com/c/skia/+/202317 Commit-Queue: Mike Klein <mtklein@google.com> Reviewed-by: Brian Osman <brianosman@google.com>
diff --git a/BUILD.gn b/BUILD.gn index 5590366..f37d44a 100644 --- a/BUILD.gn +++ b/BUILD.gn
@@ -1582,12 +1582,12 @@ "tools/random_parse_path.cpp", "tools/timer/AnimTimer.h", "tools/timer/Timer.cpp", - "tools/trace/SkChromeTracingTracer.cpp", - "tools/trace/SkChromeTracingTracer.h", + "tools/trace/ChromeTracingTracer.cpp", + "tools/trace/ChromeTracingTracer.h", "tools/trace/SkDebugfTracer.cpp", "tools/trace/SkDebugfTracer.h", - "tools/trace/SkEventTracingPriv.cpp", - "tools/trace/SkEventTracingPriv.h", + "tools/trace/EventTracingPriv.cpp", + "tools/trace/EventTracingPriv.h", ] libs = [] if (is_ios) {
diff --git a/bench/nanobench.cpp b/bench/nanobench.cpp index ebfb50b..82ce79b 100644 --- a/bench/nanobench.cpp +++ b/bench/nanobench.cpp
@@ -18,6 +18,7 @@ #include "CommonFlagsConfig.h" #include "CommonFlagsGpu.h" #include "CrashHandler.h" +#include "EventTracingPriv.h" #include "GMBench.h" #include "ProcStats.h" #include "RecordingBench.h" @@ -33,7 +34,6 @@ #include "SkColorSpacePriv.h" #include "SkData.h" #include "SkDebugfTracer.h" -#include "SkEventTracingPriv.h" #include "SkGraphics.h" #include "SkJSONWriter.h" #include "SkLeanWindows.h"
diff --git a/dm/DM.cpp b/dm/DM.cpp index 8ca0de9..7df4e13 100644 --- a/dm/DM.cpp +++ b/dm/DM.cpp
@@ -5,16 +5,17 @@ * found in the LICENSE file. */ +#include "ChromeTracingTracer.h" #include "CommonFlags.h" #include "CommonFlagsConfig.h" #include "CommonFlagsGpu.h" #include "DMJsonWriter.h" #include "DMSrcSink.h" +#include "EventTracingPriv.h" #include "ProcStats.h" #include "Resources.h" #include "SkBBHFactory.h" #include "SkChecksum.h" -#include "SkChromeTracingTracer.h" #include "SkCodec.h" #include "SkColorPriv.h" #include "SkColorSpace.h" @@ -22,7 +23,6 @@ #include "SkData.h" #include "SkDebugfTracer.h" #include "SkDocument.h" -#include "SkEventTracingPriv.h" #include "SkFontMgr.h" #include "SkFontMgrPriv.h" #include "SkGraphics.h"
diff --git a/tools/trace/SkChromeTracingTracer.cpp b/tools/trace/ChromeTracingTracer.cpp similarity index 65% rename from tools/trace/SkChromeTracingTracer.cpp rename to tools/trace/ChromeTracingTracer.cpp index f1f201f..a6e84e4 100644 --- a/tools/trace/SkChromeTracingTracer.cpp +++ b/tools/trace/ChromeTracingTracer.cpp
@@ -5,13 +5,13 @@ * found in the LICENSE file. */ -#include "SkChromeTracingTracer.h" +#include "ChromeTracingTracer.h" #include "SkJSONWriter.h" -#include "SkThreadID.h" -#include "SkTraceEvent.h" #include "SkOSFile.h" #include "SkOSPath.h" #include "SkStream.h" +#include "SkThreadID.h" +#include "SkTraceEvent.h" #include <chrono> @@ -22,53 +22,47 @@ * {TraceEvent} {TraceEventArgs} {Inline Payload} */ struct TraceEventArg { - uint8_t fArgType; + uint8_t fArgType; const char* fArgName; - uint64_t fArgValue; + uint64_t fArgValue; }; // These fields are ordered to minimize size due to alignment. Argument types could be packed // better, but very few events have many arguments, so the net loss is pretty small. struct TraceEvent { - char fPhase; - uint8_t fNumArgs; + char fPhase; + uint8_t fNumArgs; uint32_t fSize; const char* fName; // TODO: Merge fID and fClockEnd (never used together) - uint64_t fID; - uint64_t fClockBegin; - uint64_t fClockEnd; + uint64_t fID; + uint64_t fClockBegin; + uint64_t fClockEnd; SkThreadID fThreadID; TraceEvent* next() { return reinterpret_cast<TraceEvent*>(reinterpret_cast<char*>(this) + fSize); } - TraceEventArg* args() { - return reinterpret_cast<TraceEventArg*>(this + 1); - } - char* stringTable() { - return reinterpret_cast<char*>(this->args() + fNumArgs); - } + TraceEventArg* args() { return reinterpret_cast<TraceEventArg*>(this + 1); } + char* stringTable() { return reinterpret_cast<char*>(this->args() + fNumArgs); } }; -} +} // namespace -SkChromeTracingTracer::SkChromeTracingTracer(const char* filename) : fFilename(filename) { +ChromeTracingTracer::ChromeTracingTracer(const char* filename) : fFilename(filename) { this->createBlock(); } -SkChromeTracingTracer::~SkChromeTracingTracer() { - this->flush(); -} +ChromeTracingTracer::~ChromeTracingTracer() { this->flush(); } -void SkChromeTracingTracer::createBlock() { - fCurBlock.fBlock = BlockPtr(new uint8_t[kBlockSize]); +void ChromeTracingTracer::createBlock() { + fCurBlock.fBlock = BlockPtr(new uint8_t[kBlockSize]); fCurBlock.fEventsInBlock = 0; - fCurBlockUsed = 0; + fCurBlockUsed = 0; } -SkEventTracer::Handle SkChromeTracingTracer::appendEvent(const void* data, size_t size) { +SkEventTracer::Handle ChromeTracingTracer::appendEvent(const void* data, size_t size) { SkASSERT(size > 0 && size <= kBlockSize); SkAutoMutexAcquire lock(fMutex); @@ -83,15 +77,15 @@ return handle; } -SkEventTracer::Handle SkChromeTracingTracer::addTraceEvent(char phase, - const uint8_t* categoryEnabledFlag, - const char* name, - uint64_t id, - int numArgs, - const char** argNames, - const uint8_t* argTypes, - const uint64_t* argValues, - uint8_t flags) { +SkEventTracer::Handle ChromeTracingTracer::addTraceEvent(char phase, + const uint8_t* categoryEnabledFlag, + const char* name, + uint64_t id, + int numArgs, + const char** argNames, + const uint8_t* argTypes, + const uint64_t* argValues, + uint8_t flags) { // TODO: Respect flags (or assert). INSTANT events encode scope in flags, should be stored // using "s" key in JSON. COPY flag should be supported or rejected. @@ -108,27 +102,27 @@ size = SkAlign8(size); SkSTArray<128, uint8_t, true> storage; - uint8_t* storagePtr = storage.push_back_n(size); + uint8_t* storagePtr = storage.push_back_n(size); - TraceEvent* traceEvent = reinterpret_cast<TraceEvent*>(storagePtr); - traceEvent->fPhase = phase; - traceEvent->fNumArgs = numArgs; - traceEvent->fSize = size; - traceEvent->fName = name; - traceEvent->fID = id; + TraceEvent* traceEvent = reinterpret_cast<TraceEvent*>(storagePtr); + traceEvent->fPhase = phase; + traceEvent->fNumArgs = numArgs; + traceEvent->fSize = size; + traceEvent->fName = name; + traceEvent->fID = id; traceEvent->fClockBegin = std::chrono::steady_clock::now().time_since_epoch().count(); - traceEvent->fClockEnd = 0; - traceEvent->fThreadID = SkGetThreadID(); + traceEvent->fClockEnd = 0; + traceEvent->fThreadID = SkGetThreadID(); - TraceEventArg* traceEventArgs = traceEvent->args(); - char* stringTableBase = traceEvent->stringTable(); - char* stringTable = stringTableBase; + TraceEventArg* traceEventArgs = traceEvent->args(); + char* stringTableBase = traceEvent->stringTable(); + char* stringTable = stringTableBase; for (int i = 0; i < numArgs; ++i) { traceEventArgs[i].fArgName = argNames[i]; traceEventArgs[i].fArgType = argTypes[i]; if (TRACE_VALUE_TYPE_COPY_STRING == argTypes[i]) { // Just write an offset into the arguments array - traceEventArgs[i].fArgValue = stringTable - stringTableBase; + traceEventArgs[i].fArgValue = stringTable - stringTableBase; // Copy string into our buffer (and advance) skia::tracing_internals::TraceValueUnion value; @@ -145,45 +139,33 @@ return this->appendEvent(storagePtr, size); } -void SkChromeTracingTracer::updateTraceEventDuration(const uint8_t* categoryEnabledFlag, - const char* name, - SkEventTracer::Handle handle) { +void ChromeTracingTracer::updateTraceEventDuration(const uint8_t* categoryEnabledFlag, + const char* name, + SkEventTracer::Handle handle) { // We could probably get away with not locking here, but let's be totally safe. SkAutoMutexAcquire lock(fMutex); - TraceEvent* traceEvent = reinterpret_cast<TraceEvent*>(handle); - traceEvent->fClockEnd = std::chrono::steady_clock::now().time_since_epoch().count(); + TraceEvent* traceEvent = reinterpret_cast<TraceEvent*>(handle); + traceEvent->fClockEnd = std::chrono::steady_clock::now().time_since_epoch().count(); } -static void trace_value_to_json(SkJSONWriter* writer, uint64_t argValue, uint8_t argType, - const char* stringTableBase) { +static void trace_value_to_json(SkJSONWriter* writer, + uint64_t argValue, + uint8_t argType, + const char* stringTableBase) { skia::tracing_internals::TraceValueUnion value; value.as_uint = argValue; switch (argType) { - case TRACE_VALUE_TYPE_BOOL: - writer->appendBool(value.as_bool); - break; - case TRACE_VALUE_TYPE_UINT: - writer->appendU64(value.as_uint); - break; - case TRACE_VALUE_TYPE_INT: - writer->appendS64(value.as_int); - break; - case TRACE_VALUE_TYPE_DOUBLE: - writer->appendDouble(value.as_double); - break; - case TRACE_VALUE_TYPE_POINTER: - writer->appendPointer(value.as_pointer); - break; - case TRACE_VALUE_TYPE_STRING: - writer->appendString(value.as_string); - break; + case TRACE_VALUE_TYPE_BOOL: writer->appendBool(value.as_bool); break; + case TRACE_VALUE_TYPE_UINT: writer->appendU64(value.as_uint); break; + case TRACE_VALUE_TYPE_INT: writer->appendS64(value.as_int); break; + case TRACE_VALUE_TYPE_DOUBLE: writer->appendDouble(value.as_double); break; + case TRACE_VALUE_TYPE_POINTER: writer->appendPointer(value.as_pointer); break; + case TRACE_VALUE_TYPE_STRING: writer->appendString(value.as_string); break; case TRACE_VALUE_TYPE_COPY_STRING: writer->appendString(stringTableBase + value.as_uint); break; - default: - writer->appendString("<unknown type>"); - break; + default: writer->appendString("<unknown type>"); break; } } @@ -202,15 +184,16 @@ return shortID; } - uint64_t fClockOffset; + uint64_t fClockOffset; SkTHashMap<uint64_t, const char*> fBaseTypeResolver; - int fNextThreadID; - SkTHashMap<SkThreadID, int> fShortThreadIDMap; + int fNextThreadID; + SkTHashMap<SkThreadID, int> fShortThreadIDMap; }; -} +} // namespace -static void trace_event_to_json(SkJSONWriter* writer, TraceEvent* traceEvent, +static void trace_event_to_json(SkJSONWriter* writer, + TraceEvent* traceEvent, TraceEventSerializationState* serializationState) { // We track the original (creation time) "name" of each currently live object, so we can // automatically insert "base_name" fields in object snapshot events. @@ -225,7 +208,7 @@ writer->beginObject(); - char phaseString[2] = { traceEvent->fPhase, 0 }; + char phaseString[2] = {traceEvent->fPhase, 0}; writer->appendString("ph", phaseString); writer->appendString("name", traceEvent->fName); if (0 != traceEvent->fID) { @@ -235,8 +218,8 @@ // Offset timestamps to reduce JSON length, then convert nanoseconds to microseconds // (standard time unit for tracing JSON files). - uint64_t relativeTimestamp = static_cast<int64_t>(traceEvent->fClockBegin - - serializationState->fClockOffset); + uint64_t relativeTimestamp = + static_cast<int64_t>(traceEvent->fClockBegin - serializationState->fClockOffset); writer->appendDoubleDigits("ts", static_cast<double>(relativeTimestamp) * 1E-3, 3); if (0 != traceEvent->fClockEnd) { double dur = static_cast<double>(traceEvent->fClockEnd - traceEvent->fClockBegin) * 1E-3; @@ -250,11 +233,11 @@ if (traceEvent->fNumArgs) { writer->beginObject("args"); - const char* stringTable = traceEvent->stringTable(); - bool addedSnapshot = false; + const char* stringTable = traceEvent->stringTable(); + bool addedSnapshot = false; if (TRACE_EVENT_PHASE_SNAPSHOT_OBJECT == traceEvent->fPhase && - baseTypeResolver->find(traceEvent->fID) && - 0 != strcmp(*baseTypeResolver->find(traceEvent->fID), traceEvent->fName)) { + baseTypeResolver->find(traceEvent->fID) && + 0 != strcmp(*baseTypeResolver->find(traceEvent->fID), traceEvent->fName)) { // Special handling for snapshots where the name differs from creation. writer->beginObject("snapshot"); writer->appendString("base_type", *baseTypeResolver->find(traceEvent->fID)); @@ -286,7 +269,7 @@ writer->endObject(); } -void SkChromeTracingTracer::flush() { +void ChromeTracingTracer::flush() { SkAutoMutexAcquire lock(fMutex); SkString dirname = SkOSPath::Dirname(fFilename.c_str()); @@ -297,7 +280,7 @@ } SkFILEWStream fileStream(fFilename.c_str()); - SkJSONWriter writer(&fileStream, SkJSONWriter::Mode::kFast); + SkJSONWriter writer(&fileStream, SkJSONWriter::Mode::kFast); writer.beginArray(); uint64_t clockOffset = 0; @@ -309,7 +292,8 @@ TraceEventSerializationState serializationState(clockOffset); - auto event_block_to_json = [](SkJSONWriter* writer, const TraceEventBlock& block, + auto event_block_to_json = [](SkJSONWriter* writer, + const TraceEventBlock& block, TraceEventSerializationState* serializationState) { TraceEvent* traceEvent = reinterpret_cast<TraceEvent*>(block.fBlock.get()); for (int i = 0; i < block.fEventsInBlock; ++i) {
diff --git a/tools/trace/ChromeTracingTracer.h b/tools/trace/ChromeTracingTracer.h new file mode 100644 index 0000000..266409d --- /dev/null +++ b/tools/trace/ChromeTracingTracer.h
@@ -0,0 +1,79 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef ChromeTracingTracer_DEFINED +#define ChromeTracingTracer_DEFINED + +#include "EventTracingPriv.h" +#include "SkEventTracer.h" +#include "SkSpinlock.h" +#include "SkString.h" +#include "SkTHash.h" + +class SkJSONWriter; + +/** + * A SkEventTracer implementation that logs events to JSON for viewing with chrome://tracing. + */ +class ChromeTracingTracer : public SkEventTracer { +public: + ChromeTracingTracer(const char* filename); + ~ChromeTracingTracer() override; + + SkEventTracer::Handle addTraceEvent(char phase, + const uint8_t* categoryEnabledFlag, + const char* name, + uint64_t id, + int numArgs, + const char** argNames, + const uint8_t* argTypes, + const uint64_t* argValues, + uint8_t flags) override; + + void updateTraceEventDuration(const uint8_t* categoryEnabledFlag, + const char* name, + SkEventTracer::Handle handle) override; + + const uint8_t* getCategoryGroupEnabled(const char* name) override { + return fCategories.getCategoryGroupEnabled(name); + } + + const char* getCategoryGroupName(const uint8_t* categoryEnabledFlag) override { + return fCategories.getCategoryGroupName(categoryEnabledFlag); + } + +private: + void flush(); + + enum { + // Events are variable size, but most commonly 48 bytes, assuming 64-bit pointers and + // reasonable packing. This is a first guess at a number that balances memory usage vs. + // time overhead of allocating blocks. + kBlockSize = 512 * 1024, + }; + + typedef std::unique_ptr<uint8_t[]> BlockPtr; + struct TraceEventBlock { + BlockPtr fBlock; + int fEventsInBlock; + }; + + void createBlock(); + + Handle appendEvent(const void* data, size_t size); + + SkString fFilename; + SkSpinlock fMutex; + SkEventTracingCategories fCategories; + + TraceEventBlock fCurBlock; + size_t fCurBlockUsed; + + SkTArray<TraceEventBlock> fBlocks; +}; + +#endif
diff --git a/tools/trace/SkEventTracingPriv.cpp b/tools/trace/EventTracingPriv.cpp similarity index 93% rename from tools/trace/SkEventTracingPriv.cpp rename to tools/trace/EventTracingPriv.cpp index 8452ad9..7c79f12 100644 --- a/tools/trace/SkEventTracingPriv.cpp +++ b/tools/trace/EventTracingPriv.cpp
@@ -5,16 +5,17 @@ * found in the LICENSE file. */ -#include "SkEventTracingPriv.h" +#include "EventTracingPriv.h" +#include "ChromeTracingTracer.h" #include "CommandLineFlags.h" #include "SkATrace.h" -#include "SkChromeTracingTracer.h" #include "SkDebugfTracer.h" #include "SkEventTracer.h" #include "SkTraceEvent.h" -DEFINE_string(trace, "", +DEFINE_string(trace, + "", "Log trace events in one of several modes:\n" " debugf : Show events using SkDebugf\n" " atrace : Send events to Android ATrace\n" @@ -22,7 +23,8 @@ " trace events to specified file as JSON, for viewing\n" " with chrome://tracing"); -DEFINE_string(traceMatch, "", +DEFINE_string(traceMatch, + "", "Filter which categories are traced.\n" "Uses same format as --match\n"); @@ -40,7 +42,7 @@ } else if (0 == strcmp(traceFlag, "debugf")) { eventTracer = new SkDebugfTracer(); } else { - eventTracer = new SkChromeTracingTracer(traceFlag); + eventTracer = new ChromeTracingTracer(traceFlag); } SkAssertResult(SkEventTracer::SetInstance(eventTracer));
diff --git a/tools/trace/SkEventTracingPriv.h b/tools/trace/EventTracingPriv.h similarity index 78% rename from tools/trace/SkEventTracingPriv.h rename to tools/trace/EventTracingPriv.h index fb7b2f3..6485dc9 100644 --- a/tools/trace/SkEventTracingPriv.h +++ b/tools/trace/EventTracingPriv.h
@@ -5,8 +5,8 @@ * found in the LICENSE file. */ -#ifndef SkEventTracingPriv_DEFINED -#define SkEventTracingPriv_DEFINED +#ifndef EventTracingPriv_DEFINED +#define EventTracingPriv_DEFINED #include "SkMutex.h" @@ -23,20 +23,20 @@ public: SkEventTracingCategories() : fNumCategories(0) {} - uint8_t* getCategoryGroupEnabled(const char* name); + uint8_t* getCategoryGroupEnabled(const char* name); const char* getCategoryGroupName(const uint8_t* categoryEnabledFlag); private: enum { kMaxCategories = 256 }; struct CategoryState { - uint8_t fEnabled; + uint8_t fEnabled; const char* fName; }; CategoryState fCategories[kMaxCategories]; - int fNumCategories; - SkMutex fMutex; + int fNumCategories; + SkMutex fMutex; }; #endif
diff --git a/tools/trace/SkChromeTracingTracer.h b/tools/trace/SkChromeTracingTracer.h deleted file mode 100644 index a9e0966..0000000 --- a/tools/trace/SkChromeTracingTracer.h +++ /dev/null
@@ -1,79 +0,0 @@ -/* - * Copyright 2017 Google Inc. - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -#ifndef SkChromeTracingTracer_DEFINED -#define SkChromeTracingTracer_DEFINED - -#include "SkEventTracer.h" -#include "SkEventTracingPriv.h" -#include "SkSpinlock.h" -#include "SkString.h" -#include "SkTHash.h" - -class SkJSONWriter; - -/** - * A SkEventTracer implementation that logs events to JSON for viewing with chrome://tracing. - */ -class SkChromeTracingTracer : public SkEventTracer { -public: - SkChromeTracingTracer(const char* filename); - ~SkChromeTracingTracer() override; - - SkEventTracer::Handle addTraceEvent(char phase, - const uint8_t* categoryEnabledFlag, - const char* name, - uint64_t id, - int numArgs, - const char** argNames, - const uint8_t* argTypes, - const uint64_t* argValues, - uint8_t flags) override; - - void updateTraceEventDuration(const uint8_t* categoryEnabledFlag, - const char* name, - SkEventTracer::Handle handle) override; - - const uint8_t* getCategoryGroupEnabled(const char* name) override { - return fCategories.getCategoryGroupEnabled(name); - } - - const char* getCategoryGroupName(const uint8_t* categoryEnabledFlag) override { - return fCategories.getCategoryGroupName(categoryEnabledFlag); - } - -private: - void flush(); - - enum { - // Events are variable size, but most commonly 48 bytes, assuming 64-bit pointers and - // reasonable packing. This is a first guess at a number that balances memory usage vs. - // time overhead of allocating blocks. - kBlockSize = 512 * 1024, - }; - - typedef std::unique_ptr<uint8_t[]> BlockPtr; - struct TraceEventBlock { - BlockPtr fBlock; - int fEventsInBlock; - }; - - void createBlock(); - - Handle appendEvent(const void* data, size_t size); - - SkString fFilename; - SkSpinlock fMutex; - SkEventTracingCategories fCategories; - - TraceEventBlock fCurBlock; - size_t fCurBlockUsed; - - SkTArray<TraceEventBlock> fBlocks; -}; - -#endif
diff --git a/tools/trace/SkDebugfTracer.h b/tools/trace/SkDebugfTracer.h index ca049d7..9d8753f 100644 --- a/tools/trace/SkDebugfTracer.h +++ b/tools/trace/SkDebugfTracer.h
@@ -8,8 +8,8 @@ #ifndef SkDebugfTracer_DEFINED #define SkDebugfTracer_DEFINED +#include "EventTracingPriv.h" #include "SkEventTracer.h" -#include "SkEventTracingPriv.h" #include "SkString.h" /**
diff --git a/tools/viewer/Viewer.cpp b/tools/viewer/Viewer.cpp index e3c6124..68eaee9 100644 --- a/tools/viewer/Viewer.cpp +++ b/tools/viewer/Viewer.cpp
@@ -10,6 +10,7 @@ #include "CommandLineFlags.h" #include "CommonFlags.h" #include "CommonFlagsGpu.h" +#include "EventTracingPriv.h" #include "GMSlide.h" #include "GrContext.h" #include "GrContextPriv.h" @@ -20,7 +21,6 @@ #include "SampleSlide.h" #include "SkCanvas.h" #include "SkColorSpacePriv.h" -#include "SkEventTracingPriv.h" #include "SkFontMgrPriv.h" #include "SkGraphics.h" #include "SkImagePriv.h"