+ 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();
+
+ 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;
+ }
+
+ frame.gpuDuration = lastGpuTime - frame.gpuStart;
+ frame.cpuDuration = lastCpuTime - frame.cpuStart;
+ profile->frames.push_back(frame);
+ }