X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=common%2Ftrace_profiler.cpp;h=2d12698083a5082d0ed13d94f68e59759a19a708;hb=00fa77c21097e9ef28c5091ec9b05691523aa36c;hp=8a3b137bbbe8d94bb32a8dd3b0f943af3b6d1274;hpb=fc4f55a3193269f86c142219f5593dd8b8e9b3c8;p=apitrace diff --git a/common/trace_profiler.cpp b/common/trace_profiler.cpp index 8a3b137..2d12698 100644 --- a/common/trace_profiler.cpp +++ b/common/trace_profiler.cpp @@ -27,7 +27,8 @@ #include #include #include -#include +#include +#include "os_time.hpp" namespace trace { Profiler::Profiler() @@ -54,6 +55,12 @@ void Profiler::setup(bool cpuTimes_, bool gpuTimes_, bool pixelsDrawn_) std::cout << "# call no gpu_start gpu_dura cpu_start cpu_dura pixels program name" << std::endl; } +void Profiler::setBaseTimes(uint64_t gpuStart, uint64_t cpuStart) +{ + baseCpuTime = cpuStart; + baseGpuTime = gpuStart; +} + void Profiler::addCall(unsigned no, const char *name, unsigned program, @@ -61,14 +68,6 @@ void Profiler::addCall(unsigned no, uint64_t gpuStart, uint64_t gpuDuration, uint64_t cpuStart, uint64_t cpuDuration) { - if (baseGpuTime == 0) { - baseGpuTime = gpuStart; - } - - if (baseCpuTime == 0) { - baseCpuTime = cpuStart; - } - if (gpuTimes) { gpuStart -= baseGpuTime; } else { @@ -77,7 +76,9 @@ void Profiler::addCall(unsigned no, } if (cpuTimes) { - cpuStart -= baseCpuTime; + double cpuTimeScale = 1.0E9 / os::timeFrequency; + cpuStart = (cpuStart - baseCpuTime) * cpuTimeScale; + cpuDuration = cpuDuration * cpuTimeScale; } else { cpuStart = 0; cpuDuration = 0; @@ -101,32 +102,27 @@ void Profiler::addCall(unsigned no, void Profiler::addFrameStart(unsigned no, uint64_t gpuStart, uint64_t cpuStart) { - if (baseGpuTime == 0) { - baseGpuTime = gpuStart; - } - - if (baseCpuTime == 0) { - baseCpuTime = cpuStart; - } + lastFrame.no = no; + lastFrame.gpuStart = gpuStart; + lastFrame.cpuStart = cpuStart; if (gpuTimes) { - lastFrame.gpuStart = gpuStart - baseGpuTime; + gpuStart = gpuStart - baseGpuTime; } else { - lastFrame.gpuStart = 0; + gpuStart = 0; } if (cpuTimes) { - lastFrame.cpuStart = cpuStart - baseCpuTime; + double cpuTimeScale = 1.0E9 / os::timeFrequency; + cpuStart = (cpuStart - baseCpuTime) * cpuTimeScale; } else { - lastFrame.cpuStart = 0; + cpuStart = 0; } - lastFrame.no = no; - std::cout << "frame_begin" - << " " << lastFrame.no - << " " << lastFrame.gpuStart - << " " << lastFrame.cpuStart + << " " << no + << " " << gpuStart + << " " << cpuStart << std::endl; } @@ -135,16 +131,17 @@ void Profiler::addFrameEnd(uint64_t gpuEnd, uint64_t cpuEnd) uint64_t gpuDuration, cpuDuration; if (gpuTimes) { - gpuEnd -= baseGpuTime; gpuDuration = gpuEnd - lastFrame.gpuStart; + gpuEnd = gpuEnd - baseGpuTime; } else { gpuEnd = 0; gpuDuration = 0; } if (cpuTimes) { - cpuEnd -= baseCpuTime; - cpuDuration = cpuEnd - lastFrame.cpuStart; + double cpuTimeScale = 1.0E9 / os::timeFrequency; + cpuDuration = (cpuEnd - lastFrame.cpuStart) * cpuTimeScale; + cpuEnd = (cpuEnd - baseCpuTime) * cpuTimeScale; } else { cpuEnd = 0; cpuDuration = 0; @@ -159,33 +156,50 @@ void Profiler::addFrameEnd(uint64_t gpuEnd, uint64_t cpuEnd) << std::endl; } -void Profiler::parseLine(const char* line, Profile* profile) +void Profiler::parseLine(const char* in, Profile* profile) { - char name[64]; + std::stringstream line(in, std::ios_base::in); + std::string type; - if (line[0] == '#' || strlen(line) < 12) + if (in[0] == '#' || strlen(in) < 12) return; - if (strncmp(line, "call ", 5) == 0) { - assert(profile->frames.size()); + line >> type; + if (type.compare("call") == 0) { + assert(profile->frames.size()); Profile::Call call; - sscanf(line, "call %u %li %li %li %li %li %u %s", &call.no, &call.gpuStart, &call.gpuDuration, &call.cpuStart, &call.cpuDuration, &call.pixels, &call.program, name); - call.name = name; + + line >> call.no + >> call.gpuStart + >> call.gpuDuration + >> call.cpuStart + >> call.cpuDuration + >> call.pixels + >> call.program + >> call.name; + profile->frames.back().calls.push_back(call); - } else if (strncmp(line, "frame_begin ", 12) == 0) { + } else if (type.compare("frame_begin") == 0) { Profile::Frame frame; frame.gpuDuration = 0; - frame.gpuDuration = 0; - sscanf(line, "frame_begin %u %li %li", &frame.no, &frame.gpuStart, &frame.cpuStart); + frame.cpuDuration = 0; + + line >> frame.no + >> frame.gpuStart + >> frame.cpuStart; + profile->frames.push_back(frame); - } else if (strncmp(line, "frame_end ", 10) == 0) { + } else if (type.compare("frame_end") == 0) { assert(profile->frames.size()); - Profile::Frame& frame = profile->frames.back(); - unsigned no; - sscanf(line, "frame_end %u %*li %li %*li %li", &no, &frame.gpuDuration, &frame.cpuDuration); - assert(no == frame.no); + int64_t skipi64; + + line >> frame.no + >> skipi64 + >> frame.gpuDuration + >> skipi64 + >> frame.cpuDuration; } } }