X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=common%2Ftrace_profiler.cpp;h=38ad6dd93534671ac4c6b7fe78d46f2b5227d317;hb=27af35ae3464ad0cd891d301c9b821951334e71d;hp=fd684ede7bf16d623b7b54b9f80e67477aaf8bc8;hpb=f91056b5782d48d526f19dacd5a988003fc6f11e;p=apitrace diff --git a/common/trace_profiler.cpp b/common/trace_profiler.cpp index fd684ed..38ad6dd 100644 --- a/common/trace_profiler.cpp +++ b/common/trace_profiler.cpp @@ -25,10 +25,18 @@ #include "trace_profiler.hpp" #include +#include +#include +#include +#include "os_time.hpp" namespace trace { Profiler::Profiler() - : baseTime(0) + : baseGpuTime(0), + baseCpuTime(0), + cpuTimes(false), + gpuTimes(true), + pixelsDrawn(false) { } @@ -36,41 +44,172 @@ Profiler::~Profiler() { } -void Profiler::addCall(unsigned no, const char *name, uint64_t gpu_start, uint64_t gpu_duration) +void Profiler::setup(bool cpuTimes_, bool gpuTimes_, bool pixelsDrawn_) { - if (baseTime == 0) - baseTime = gpu_start; - - std::cout << "call " - << no << " " - << (gpu_start - baseTime) << " " - << gpu_duration << " " - << name << std::endl; + cpuTimes = cpuTimes_; + gpuTimes = gpuTimes_; + pixelsDrawn = pixelsDrawn_; + + std::cout << "# frame_begin no gpu_start cpu_start" << std::endl; + std::cout << "# frame_end no gpu_end gpu_dura cpu_end cpu_dura" << std::endl; + std::cout << "# call no gpu_start gpu_dura cpu_start cpu_dura pixels program name" << std::endl; +} + +void Profiler::addCall(unsigned no, + const char *name, + unsigned program, + uint64_t pixels, + 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 { + gpuStart = 0; + gpuDuration = 0; + } + + if (cpuTimes) { + double cpuTimeScale = 1.0E9 / os::timeFrequency; + cpuStart = (cpuStart - baseCpuTime) * cpuTimeScale; + cpuDuration = cpuDuration * cpuTimeScale; + } else { + cpuStart = 0; + cpuDuration = 0; + } + + if (!pixelsDrawn) { + pixels = 0; + } + + std::cout << "call" + << " " << no + << " " << gpuStart + << " " << gpuDuration + << " " << cpuStart + << " " << cpuDuration + << " " << pixels + << " " << program + << " " << name + << std::endl; } -void Profiler::addFrameStart(unsigned no, uint64_t timestamp) +void Profiler::addFrameStart(unsigned no, uint64_t gpuStart, uint64_t cpuStart) { - if (baseTime == 0) - baseTime = timestamp; + if (baseGpuTime == 0) { + baseGpuTime = gpuStart; + } + if (baseCpuTime == 0) { + baseCpuTime = cpuStart; + } + lastFrame.no = no; - lastFrame.start = timestamp - baseTime; + lastFrame.gpuStart = gpuStart; + lastFrame.cpuStart = cpuStart; - std::cout << "frame begin " - << lastFrame.no << " " - << lastFrame.start << std::endl; + if (gpuTimes) { + gpuStart = gpuStart - baseGpuTime; + } else { + gpuStart = 0; + } + + if (cpuTimes) { + double cpuTimeScale = 1.0E9 / os::timeFrequency; + cpuStart = (cpuStart - baseCpuTime) * cpuTimeScale; + } else { + cpuStart = 0; + } + + std::cout << "frame_begin" + << " " << no + << " " << gpuStart + << " " << cpuStart + << std::endl; } -void Profiler::addFrameEnd(uint64_t timestamp) +void Profiler::addFrameEnd(uint64_t gpuEnd, uint64_t cpuEnd) { - if (baseTime == 0) - baseTime = timestamp; + uint64_t gpuDuration, cpuDuration; + + if (gpuTimes) { + gpuDuration = gpuEnd - lastFrame.gpuStart; + gpuEnd = gpuEnd - baseGpuTime; + } else { + gpuEnd = 0; + gpuDuration = 0; + } + + if (cpuTimes) { + double cpuTimeScale = 1.0E9 / os::timeFrequency; + cpuDuration = (cpuEnd - lastFrame.cpuStart) * cpuTimeScale; + cpuEnd = (cpuEnd - baseCpuTime) * cpuTimeScale; + } else { + cpuEnd = 0; + cpuDuration = 0; + } + + std::cout << "frame_end" + << " " << lastFrame.no + << " " << gpuEnd + << " " << gpuDuration + << " " << cpuEnd + << " " << cpuDuration + << std::endl; +} + +void Profiler::parseLine(const char* in, Profile* profile) +{ + std::stringstream line(in, std::ios_base::in); + std::string type; + + if (in[0] == '#' || strlen(in) < 12) + return; + + line >> type; + + if (type.compare("call") == 0) { + assert(profile->frames.size()); + Profile::Call call; + + 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 (type.compare("frame_begin") == 0) { + Profile::Frame frame; + frame.gpuDuration = 0; + frame.cpuDuration = 0; + + line >> frame.no + >> frame.gpuStart + >> frame.cpuStart; - lastFrame.end = timestamp - baseTime; + profile->frames.push_back(frame); + } else if (type.compare("frame_end") == 0) { + assert(profile->frames.size()); + Profile::Frame& frame = profile->frames.back(); + int64_t skipi64; - std::cout << "frame end " - << lastFrame.no << " " - << lastFrame.end << " " - << (lastFrame.end - lastFrame.start) << std::endl; + line >> frame.no + >> skipi64 + >> frame.gpuDuration + >> skipi64 + >> frame.cpuDuration; + } } }