/** * Interpret successive calls. */ void runLeg(trace::Call *call) { /* Consume successive calls for this thread. */ do { assert(call); assert(call->thread_id == leg); retraceCall(call); delete call; call = parser->parse_call(); } while (call && call->thread_id == leg); if (call) { /* Pass the baton */ assert(call->thread_id != leg); flushRendering(); race->passBaton(call); } else { /* Reached the finish line */ if (0) std::cerr << "finished on leg " << leg << "\n"; if (leg) { /* Notify the fore runner */ race->finishLine(); } else { /* We are the fore runner */ finished = true; } } }
void retrace::waitForInput(void) { flushRendering(); while (glws::processEvents()) { os::sleep(100*1000); } }
/** * Interpret successive calls. */ void runLeg(trace::Call *call) { /* Consume successive calls for this thread. */ do { bool callEndsFrame = false; static trace::ParseBookmark frameStart; assert(call); assert(call->thread_id == leg); if (loopCount && call->flags & trace::CALL_FLAG_END_FRAME) { callEndsFrame = true; parser.getBookmark(frameStart); } retraceCall(call); delete call; call = parser.parse_call(); /* Restart last frame if looping is requested. */ if (loopCount) { if (!call) { parser.setBookmark(lastFrameStart); call = parser.parse_call(); if (loopCount > 0) { --loopCount; } } else if (callEndsFrame) { lastFrameStart = frameStart; } } } while (call && call->thread_id == leg); if (call) { /* Pass the baton */ assert(call->thread_id != leg); flushRendering(); race->passBaton(call); } else { /* Reached the finish line */ if (0) std::cerr << "finished on leg " << leg << "\n"; if (leg) { /* Notify the fore runner */ race->finishLine(); } else { /* We are the fore runner */ finished = true; } } }
static void mainLoop() { addCallbacks(retracer); long long startTime = 0; frameNo = 0; startTime = os::getTime(); if (singleThread) { trace::Call *call; while ((call = parser.parse_call())) { retraceCall(call); delete call; }; flushRendering(); } else { RelayRace race; race.run(); } long long endTime = os::getTime(); float timeInterval = (endTime - startTime) * (1.0 / os::timeFrequency); if ((retrace::verbosity >= -1) || (retrace::profiling)) { std::cout << "Rendered " << frameNo << " frames" " in " << timeInterval << " secs," " average of " << (frameNo/timeInterval) << " fps\n"; } if (waitOnFinish) { waitForInput(); } else { return; } }