/*
 * Copyright 2011 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
#include "Timer.h"

Timer::Timer(SkGLContextHelper* gl)
        : fCpu(-1.0)
        , fWall(-1.0)
        , fTruncatedCpu(-1.0)
        , fTruncatedWall(-1.0)
        , fGpu(-1.0)
#if SK_SUPPORT_GPU
        , fGpuTimer(gl)
#endif
        {}

void Timer::start() {
    fSysTimer.startWall();
    fTruncatedSysTimer.startWall();
#if SK_SUPPORT_GPU
    fGpuTimer.start();
#endif
    fSysTimer.startCpu();
    fTruncatedSysTimer.startCpu();
}

void Timer::end() {
    fCpu = fSysTimer.endCpu();
#if SK_SUPPORT_GPU
    //It is important to stop the cpu clocks first,
    //as the following will cpu wait for the gpu to finish.
    fGpu = fGpuTimer.end();
#endif
    fWall = fSysTimer.endWall();
}

void Timer::truncatedEnd() {
    fTruncatedCpu = fTruncatedSysTimer.endCpu();
    fTruncatedWall = fTruncatedSysTimer.endWall();
}

WallTimer::WallTimer() : fWall(-1.0) {}

void WallTimer::start() {
    fSysTimer.startWall();
}

void WallTimer::end() {
    fWall = fSysTimer.endWall();
}
