X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=common%2Ftrace_profiler.cpp;h=642ba6e88325560e235dd1d9cab0bc2aa6e023d2;hb=56ad11c7849c7e6ca0ad66558cb1a99c58d4cd3d;hp=fd684ede7bf16d623b7b54b9f80e67477aaf8bc8;hpb=f91056b5782d48d526f19dacd5a988003fc6f11e;p=apitrace diff --git a/common/trace_profiler.cpp b/common/trace_profiler.cpp index fd684ed..642ba6e 100644 --- a/common/trace_profiler.cpp +++ b/common/trace_profiler.cpp @@ -24,11 +24,19 @@ **************************************************************************/ #include "trace_profiler.hpp" +#include "os_time.hpp" #include +#include +#include namespace trace { Profiler::Profiler() - : baseTime(0) + : baseGpuTime(0), + baseCpuTime(0), + minCpuTime(1000), + cpuTimes(false), + gpuTimes(true), + pixelsDrawn(false) { } @@ -36,41 +44,158 @@ 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 << "# call no gpu_start gpu_dura cpu_start cpu_dura pixels program name" << std::endl; +} + +int64_t Profiler::getBaseCpuTime() +{ + return baseCpuTime; } -void Profiler::addFrameStart(unsigned no, uint64_t timestamp) +int64_t Profiler::getBaseGpuTime() { - if (baseTime == 0) - baseTime = timestamp; + return baseGpuTime; +} + +void Profiler::setBaseCpuTime(int64_t cpuStart) +{ + baseCpuTime = cpuStart; +} - lastFrame.no = no; - lastFrame.start = timestamp - baseTime; +void Profiler::setBaseGpuTime(int64_t gpuStart) +{ + baseGpuTime = gpuStart; +} - std::cout << "frame begin " - << lastFrame.no << " " - << lastFrame.start << std::endl; +bool Profiler::hasBaseTimes() +{ + return baseCpuTime != 0 || baseGpuTime != 0; } -void Profiler::addFrameEnd(uint64_t timestamp) +void Profiler::addCall(unsigned no, + const char *name, + unsigned program, + int64_t pixels, + int64_t gpuStart, int64_t gpuDuration, + int64_t cpuStart, int64_t cpuDuration) { - if (baseTime == 0) - baseTime = timestamp; + if (gpuTimes && gpuStart) { + gpuStart -= baseGpuTime; + } else { + gpuStart = 0; + gpuDuration = 0; + } + + if (cpuTimes && cpuStart) { + double cpuTimeScale = 1.0E9 / os::timeFrequency; + cpuStart = (cpuStart - baseCpuTime) * cpuTimeScale; + cpuDuration = cpuDuration * cpuTimeScale; + + if (cpuDuration < minCpuTime) { + return; + } + } else { + cpuStart = 0; + cpuDuration = 0; + } + + if (!pixelsDrawn) { + pixels = 0; + } + + std::cout << "call" + << " " << no + << " " << gpuStart + << " " << gpuDuration + << " " << cpuStart + << " " << cpuDuration + << " " << pixels + << " " << program + << " " << name + << std::endl; +} + +void Profiler::addFrameEnd() +{ + std::cout << "frame_end" << std::endl; +} + +void Profiler::parseLine(const char* in, Profile* profile) +{ + std::stringstream line(in, std::ios_base::in); + std::string type; + static int64_t lastGpuTime; + static int64_t lastCpuTime; + + if (in[0] == '#' || strlen(in) < 4) + return; + + if (profile->programs.size() == 0 && profile->cpuCalls.size() == 0 && profile->frames.size() == 0) { + lastGpuTime = 0; + lastCpuTime = 0; + } + + line >> type; + + if (type.compare("call") == 0) { + Profile::DrawCall draw; + unsigned program; + + line >> draw.no + >> draw.gpuStart + >> draw.gpuDuration + >> draw.cpuStart + >> draw.cpuDuration + >> draw.pixels + >> program + >> draw.name; + + if (lastGpuTime < draw.gpuStart + draw.gpuDuration) { + lastGpuTime = draw.gpuStart + draw.gpuDuration; + } + + if (lastCpuTime < draw.cpuStart + draw.cpuDuration) { + lastCpuTime = draw.cpuStart + draw.cpuDuration; + } + + if (draw.pixels >= 0) { + if (profile->programs.size() <= program) { + profile->programs.resize(program + 1); + } + + profile->programs[program].cpuTotal += draw.cpuDuration; + profile->programs[program].gpuTotal += draw.gpuDuration; + profile->programs[program].pixelTotal += draw.pixels; + profile->programs[program].drawCalls.push_back(draw); + } + + Profile::CpuCall call; + call.no = draw.no; + call.name = draw.name; + call.cpuStart = draw.cpuStart; + call.cpuDuration = draw.cpuDuration; + profile->cpuCalls.push_back(call); + } else if (type.compare("frame_end") == 0) { + Profile::Frame frame; + frame.no = profile->frames.size(); - lastFrame.end = timestamp - baseTime; + if (frame.no == 0) { + frame.gpuStart = 0; + frame.cpuStart = 0; + } else { + frame.gpuStart = profile->frames.back().gpuStart + profile->frames.back().gpuDuration; + frame.cpuStart = profile->frames.back().cpuStart + profile->frames.back().cpuDuration; + } - std::cout << "frame end " - << lastFrame.no << " " - << lastFrame.end << " " - << (lastFrame.end - lastFrame.start) << std::endl; + frame.gpuDuration = lastGpuTime - frame.gpuStart; + frame.cpuDuration = lastCpuTime - frame.cpuStart; + profile->frames.push_back(frame); + } } }