зеркало из https://github.com/mozilla/moz-skia.git
Revert of Move BenchTimer to tools as Timer (https://codereview.chromium.org/344213003/)
Reason for revert: GpuTimer broken Original issue's description: > Move BenchTimer to tools as Timer > > This breaks a bunch of circular dependencies between tools and gm and bench. > > BUG=skia: > > Committed: https://skia.googlesource.com/skia/+/4ed75287aed6371c6e4a41ffcc78c8a49c9810ed R=tfarina@chromium.org, mtklein@chromium.org TBR=mtklein@chromium.org, tfarina@chromium.org NOTREECHECKS=true NOTRY=true BUG=skia: Author: mtklein@google.com Review URL: https://codereview.chromium.org/346753003
This commit is contained in:
Родитель
a3530ef268
Коммит
9e64b78ff6
|
@ -5,11 +5,11 @@
|
|||
* Use of this source code is governed by a BSD-style license that can be
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
#include "GpuTimer.h"
|
||||
#include "BenchGpuTimer_gl.h"
|
||||
#include "gl/SkGLContextHelper.h"
|
||||
#include "gl/GrGLUtil.h"
|
||||
|
||||
GpuTimer::GpuTimer(const SkGLContextHelper* glctx) {
|
||||
BenchGpuTimer::BenchGpuTimer(const SkGLContextHelper* glctx) {
|
||||
fContext = glctx;
|
||||
glctx->ref();
|
||||
glctx->makeCurrent();
|
||||
|
@ -23,7 +23,7 @@ GpuTimer::GpuTimer(const SkGLContextHelper* glctx) {
|
|||
}
|
||||
}
|
||||
|
||||
GpuTimer::~GpuTimer() {
|
||||
BenchGpuTimer::~BenchGpuTimer() {
|
||||
if (fSupported) {
|
||||
fContext->makeCurrent();
|
||||
SK_GL(*fContext, DeleteQueries(1, &fQuery));
|
||||
|
@ -31,7 +31,7 @@ GpuTimer::~GpuTimer() {
|
|||
fContext->unref();
|
||||
}
|
||||
|
||||
void GpuTimer::start() {
|
||||
void BenchGpuTimer::startGpu() {
|
||||
if (fSupported) {
|
||||
fContext->makeCurrent();
|
||||
fStarted = true;
|
||||
|
@ -43,7 +43,7 @@ void GpuTimer::start() {
|
|||
* It is important to stop the cpu clocks first,
|
||||
* as this will cpu wait for the gpu to finish.
|
||||
*/
|
||||
double GpuTimer::end() {
|
||||
double BenchGpuTimer::endGpu() {
|
||||
if (fSupported) {
|
||||
fStarted = false;
|
||||
fContext->makeCurrent();
|
||||
|
@ -52,8 +52,8 @@ double GpuTimer::end() {
|
|||
GrGLint available = 0;
|
||||
while (!available) {
|
||||
SK_GL_NOERRCHECK(*fContext, GetQueryObjectiv(fQuery,
|
||||
GR_GL_QUERY_RESULT_AVAILABLE,
|
||||
&available));
|
||||
GR_GL_QUERY_RESULT_AVAILABLE,
|
||||
&available));
|
||||
// If GetQueryObjectiv is erroring out we need some alternative
|
||||
// means of breaking out of this loop
|
||||
GrGLenum error;
|
|
@ -1,20 +1,21 @@
|
|||
|
||||
/*
|
||||
* Copyright 2011 Google Inc.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license that can be
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
#ifndef GpuTimer_DEFINED
|
||||
#define GpuTimer_DEFINED
|
||||
#ifndef SkBenchGpuTimer_DEFINED
|
||||
#define SkBenchGpuTimer_DEFINED
|
||||
|
||||
class SkGLContextHelper;
|
||||
|
||||
class GpuTimer {
|
||||
class BenchGpuTimer {
|
||||
public:
|
||||
GpuTimer(const SkGLContextHelper*);
|
||||
~GpuTimer();
|
||||
void start();
|
||||
double end();
|
||||
BenchGpuTimer(const SkGLContextHelper* glctx);
|
||||
~BenchGpuTimer();
|
||||
void startGpu();
|
||||
double endGpu();
|
||||
private:
|
||||
unsigned fQuery;
|
||||
int fStarted;
|
|
@ -0,0 +1,27 @@
|
|||
|
||||
/*
|
||||
* 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 "BenchSysTimer_c.h"
|
||||
|
||||
//Time
|
||||
#include <time.h>
|
||||
|
||||
void BenchSysTimer::startWall() {
|
||||
this->fStartWall = time();
|
||||
}
|
||||
void BenchSysTimer::startCpu() {
|
||||
this->fStartCpu = clock();
|
||||
}
|
||||
|
||||
double BenchSysTimer::endCpu() {
|
||||
clock_t end_cpu = clock();
|
||||
this->fCpu = (end_cpu - this->fStartCpu) * CLOCKS_PER_SEC / 1000.0;
|
||||
}
|
||||
double BenchSysTimer::endWall() {
|
||||
time_t end_wall = time();
|
||||
this->fWall = difftime(end_wall, this->fstartWall) / 1000.0;
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
|
||||
/*
|
||||
* Copyright 2011 Google Inc.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license that can be
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
#ifndef SkBenchSysTimer_DEFINED
|
||||
#define SkBenchSysTimer_DEFINED
|
||||
|
||||
//Time
|
||||
#include <time.h>
|
||||
|
||||
// Beware: this timer uses standard (as opposed to high precision) clocks
|
||||
class BenchSysTimer {
|
||||
public:
|
||||
void startWall();
|
||||
void startCpu();
|
||||
double endCpu();
|
||||
double endWall();
|
||||
private:
|
||||
clock_t start_cpu;
|
||||
time_t fStartWall;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -1,12 +1,17 @@
|
|||
|
||||
/*
|
||||
* 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 "SysTimer_mach.h"
|
||||
#include "BenchSysTimer_mach.h"
|
||||
|
||||
static time_value_t mac_cpu_time() {
|
||||
//Time
|
||||
#include <mach/mach.h>
|
||||
#include <mach/mach_time.h>
|
||||
|
||||
static time_value_t macCpuTime() {
|
||||
mach_port_t task = mach_task_self();
|
||||
if (task == MACH_PORT_NULL) {
|
||||
time_value_t none = {0, 0};
|
||||
|
@ -16,9 +21,10 @@ static time_value_t mac_cpu_time() {
|
|||
task_thread_times_info thread_info_data;
|
||||
mach_msg_type_number_t thread_info_count = TASK_THREAD_TIMES_INFO_COUNT;
|
||||
if (KERN_SUCCESS != task_info(task,
|
||||
TASK_THREAD_TIMES_INFO,
|
||||
reinterpret_cast<task_info_t>(&thread_info_data),
|
||||
&thread_info_count)) {
|
||||
TASK_THREAD_TIMES_INFO,
|
||||
reinterpret_cast<task_info_t>(&thread_info_data),
|
||||
&thread_info_count))
|
||||
{
|
||||
time_value_t none = {0, 0};
|
||||
return none;
|
||||
}
|
||||
|
@ -27,40 +33,44 @@ static time_value_t mac_cpu_time() {
|
|||
return thread_info_data.user_time;
|
||||
}
|
||||
|
||||
static double interval_in_ms(time_value_t start_clock, time_value_t end_clock) {
|
||||
static double intervalInMSec(const time_value_t start_clock
|
||||
, const time_value_t end_clock)
|
||||
{
|
||||
double duration_clock;
|
||||
if ((end_clock.microseconds - start_clock.microseconds) < 0) {
|
||||
duration_clock = (end_clock.seconds - start_clock.seconds-1) * 1000;
|
||||
duration_clock += (1000000 + end_clock.microseconds - start_clock.microseconds) / 1000.0;
|
||||
duration_clock = (end_clock.seconds - start_clock.seconds-1)*1000;
|
||||
duration_clock += (1000000
|
||||
+ end_clock.microseconds
|
||||
- start_clock.microseconds) / 1000.0;
|
||||
} else {
|
||||
duration_clock = (end_clock.seconds - start_clock.seconds) * 1000;
|
||||
duration_clock += (end_clock.microseconds - start_clock.microseconds) / 1000.0;
|
||||
duration_clock = (end_clock.seconds - start_clock.seconds)*1000;
|
||||
duration_clock += (end_clock.microseconds - start_clock.microseconds)
|
||||
/ 1000.0;
|
||||
}
|
||||
return duration_clock;
|
||||
}
|
||||
|
||||
void SysTimer::startWall() {
|
||||
fStartWall = mach_absolute_time();
|
||||
void BenchSysTimer::startWall() {
|
||||
this->fStartWall = mach_absolute_time();
|
||||
}
|
||||
void BenchSysTimer::startCpu() {
|
||||
this->fStartCpu = macCpuTime();
|
||||
}
|
||||
|
||||
void SysTimer::startCpu() {
|
||||
fStartCpu = mac_cpu_time();
|
||||
double BenchSysTimer::endCpu() {
|
||||
time_value_t end_cpu = macCpuTime();
|
||||
return intervalInMSec(this->fStartCpu, end_cpu);
|
||||
}
|
||||
|
||||
double SysTimer::endCpu() {
|
||||
time_value_t end_cpu = mac_cpu_time();
|
||||
return interval_in_ms(fStartCpu, end_cpu);
|
||||
}
|
||||
|
||||
double SysTimer::endWall() {
|
||||
double BenchSysTimer::endWall() {
|
||||
uint64_t end_wall = mach_absolute_time();
|
||||
|
||||
uint64_t elapsed = end_wall - fStartWall;
|
||||
uint64_t elapsed = end_wall - this->fStartWall;
|
||||
mach_timebase_info_data_t sTimebaseInfo;
|
||||
if (KERN_SUCCESS != mach_timebase_info(&sTimebaseInfo)) {
|
||||
return 0;
|
||||
} else {
|
||||
uint64_t elapsedNano = elapsed * sTimebaseInfo.numer / sTimebaseInfo.denom;
|
||||
uint64_t elapsedNano = elapsed * sTimebaseInfo.numer
|
||||
/ sTimebaseInfo.denom;
|
||||
return elapsedNano / 1000000.0;
|
||||
}
|
||||
}
|
|
@ -1,16 +1,18 @@
|
|||
|
||||
/*
|
||||
* Copyright 2011 Google Inc.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license that can be
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
#ifndef SysTimer_DEFINED
|
||||
#define SysTimer_DEFINED
|
||||
#ifndef SkBenchSysTimer_DEFINED
|
||||
#define SkBenchSysTimer_DEFINED
|
||||
|
||||
//Time
|
||||
#include <mach/mach.h>
|
||||
#include <mach/mach_time.h>
|
||||
|
||||
class SysTimer {
|
||||
class BenchSysTimer {
|
||||
public:
|
||||
void startWall();
|
||||
void startCpu();
|
|
@ -1,51 +1,57 @@
|
|||
|
||||
/*
|
||||
* 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 "SysTimer_posix.h"
|
||||
#include "BenchSysTimer_posix.h"
|
||||
|
||||
static double interval_in_ms(timespec start_clock, timespec end_clock)
|
||||
//Time
|
||||
#include <time.h>
|
||||
|
||||
static double intervalInMSec(const timespec start_clock
|
||||
, const timespec end_clock)
|
||||
{
|
||||
double duration_clock;
|
||||
if ((end_clock.tv_nsec - start_clock.tv_nsec) < 0) {
|
||||
duration_clock = (end_clock.tv_sec - start_clock.tv_sec - 1) * 1000;
|
||||
duration_clock += (1000000000 + end_clock.tv_nsec - start_clock.tv_nsec) / 1000000.0;
|
||||
duration_clock = (end_clock.tv_sec - start_clock.tv_sec-1)*1000;
|
||||
duration_clock += (1000000000 + end_clock.tv_nsec - start_clock.tv_nsec)
|
||||
/ 1000000.0;
|
||||
} else {
|
||||
duration_clock = (end_clock.tv_sec - start_clock.tv_sec) * 1000;
|
||||
duration_clock = (end_clock.tv_sec - start_clock.tv_sec)*1000;
|
||||
duration_clock += (end_clock.tv_nsec - start_clock.tv_nsec) / 1000000.0;
|
||||
}
|
||||
return duration_clock;
|
||||
}
|
||||
|
||||
void SysTimer::startWall() {
|
||||
if (-1 == clock_gettime(CLOCK_MONOTONIC, &fWall)) {
|
||||
void BenchSysTimer::startWall() {
|
||||
if (-1 == clock_gettime(CLOCK_MONOTONIC, &this->fWall)) {
|
||||
timespec none = {0, 0};
|
||||
fWall = none;
|
||||
this->fWall = none;
|
||||
}
|
||||
}
|
||||
void SysTimer::startCpu() {
|
||||
if (-1 == clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &fCpu)) {
|
||||
void BenchSysTimer::startCpu() {
|
||||
if (-1 == clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &this->fCpu)) {
|
||||
timespec none = {0, 0};
|
||||
fCpu = none;
|
||||
this->fCpu = none;
|
||||
}
|
||||
}
|
||||
|
||||
double SysTimer::endCpu() {
|
||||
double BenchSysTimer::endCpu() {
|
||||
timespec end_cpu;
|
||||
if (-1 == clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end_cpu)) {
|
||||
timespec none = {0, 0};
|
||||
end_cpu = none;
|
||||
}
|
||||
return interval_in_ms(fCpu, end_cpu);
|
||||
return intervalInMSec(this->fCpu, end_cpu);
|
||||
}
|
||||
|
||||
double SysTimer::endWall() {
|
||||
double BenchSysTimer::endWall() {
|
||||
timespec end_wall;
|
||||
if (-1 == clock_gettime(CLOCK_MONOTONIC, &end_wall)) {
|
||||
timespec none = {0, 0};
|
||||
end_wall = none;
|
||||
}
|
||||
return interval_in_ms(fWall, end_wall);
|
||||
return intervalInMSec(this->fWall, end_wall);
|
||||
}
|
|
@ -1,15 +1,17 @@
|
|||
|
||||
/*
|
||||
* Copyright 2011 Google Inc.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license that can be
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
#ifndef SysTimer_DEFINED
|
||||
#define SysTimer_DEFINED
|
||||
#ifndef SkBenchSysTimer_DEFINED
|
||||
#define SkBenchSysTimer_DEFINED
|
||||
|
||||
//Time
|
||||
#include <time.h>
|
||||
|
||||
class SysTimer {
|
||||
class BenchSysTimer {
|
||||
public:
|
||||
void startWall();
|
||||
void startCpu();
|
|
@ -1,17 +1,25 @@
|
|||
|
||||
/*
|
||||
* 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 "SysTimer_windows.h"
|
||||
#include "BenchSysTimer_windows.h"
|
||||
|
||||
static ULONGLONG win_cpu_time() {
|
||||
//Time
|
||||
#define WIN32_LEAN_AND_MEAN 1
|
||||
#include <windows.h>
|
||||
|
||||
static ULONGLONG winCpuTime() {
|
||||
FILETIME createTime;
|
||||
FILETIME exitTime;
|
||||
FILETIME usrTime;
|
||||
FILETIME sysTime;
|
||||
if (0 == GetProcessTimes(GetCurrentProcess(), &createTime, &exitTime, &sysTime, &usrTime)) {
|
||||
if (0 == GetProcessTimes(GetCurrentProcess()
|
||||
, &createTime, &exitTime
|
||||
, &sysTime, &usrTime))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
ULARGE_INTEGER start_cpu_sys;
|
||||
|
@ -23,27 +31,27 @@ static ULONGLONG win_cpu_time() {
|
|||
return start_cpu_sys.QuadPart + start_cpu_usr.QuadPart;
|
||||
}
|
||||
|
||||
void SysTimer::startWall() {
|
||||
if (0 == ::QueryPerformanceCounter(&fStartWall)) {
|
||||
fStartWall.QuadPart = 0;
|
||||
void BenchSysTimer::startWall() {
|
||||
if (0 == ::QueryPerformanceCounter(&this->fStartWall)) {
|
||||
this->fStartWall.QuadPart = 0;
|
||||
}
|
||||
}
|
||||
void SysTimer::startCpu() {
|
||||
fStartCpu = win_cpu_time();
|
||||
void BenchSysTimer::startCpu() {
|
||||
this->fStartCpu = winCpuTime();
|
||||
}
|
||||
|
||||
double SysTimer::endCpu() {
|
||||
ULONGLONG end_cpu = win_cpu_time();
|
||||
return static_cast<double>(end_cpu - fStartCpu) / 10000.0L;
|
||||
double BenchSysTimer::endCpu() {
|
||||
ULONGLONG end_cpu = winCpuTime();
|
||||
return static_cast<double>((end_cpu - this->fStartCpu)) / 10000.0L;
|
||||
}
|
||||
double SysTimer::endWall() {
|
||||
double BenchSysTimer::endWall() {
|
||||
LARGE_INTEGER end_wall;
|
||||
if (0 == ::QueryPerformanceCounter(&end_wall)) {
|
||||
end_wall.QuadPart = 0;
|
||||
}
|
||||
|
||||
LARGE_INTEGER ticks_elapsed;
|
||||
ticks_elapsed.QuadPart = end_wall.QuadPart - fStartWall.QuadPart;
|
||||
ticks_elapsed.QuadPart = end_wall.QuadPart - this->fStartWall.QuadPart;
|
||||
|
||||
LARGE_INTEGER frequency;
|
||||
if (0 == ::QueryPerformanceFrequency(&frequency)) {
|
|
@ -1,17 +1,18 @@
|
|||
|
||||
/*
|
||||
* Copyright 2011 Google Inc.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license that can be
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
#ifndef SysTimer_DEFINED
|
||||
#define SysTimer_DEFINED
|
||||
#ifndef SkBenchSysTimer_DEFINED
|
||||
#define SkBenchSysTimer_DEFINED
|
||||
|
||||
//Time
|
||||
#define WIN32_LEAN_AND_MEAN 1
|
||||
#include <windows.h>
|
||||
|
||||
class SysTimer {
|
||||
class BenchSysTimer {
|
||||
public:
|
||||
void startWall();
|
||||
void startCpu();
|
|
@ -0,0 +1,94 @@
|
|||
|
||||
/*
|
||||
* 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 "BenchTimer.h"
|
||||
#if defined(SK_BUILD_FOR_WIN32)
|
||||
#include "BenchSysTimer_windows.h"
|
||||
#elif defined(SK_BUILD_FOR_MAC)
|
||||
#include "BenchSysTimer_mach.h"
|
||||
#elif defined(SK_BUILD_FOR_UNIX) || defined(SK_BUILD_FOR_ANDROID)
|
||||
#include "BenchSysTimer_posix.h"
|
||||
#else
|
||||
#include "BenchSysTimer_c.h"
|
||||
#endif
|
||||
|
||||
#if SK_SUPPORT_GPU
|
||||
#include "BenchGpuTimer_gl.h"
|
||||
#endif
|
||||
|
||||
BenchTimer::BenchTimer(SkGLContextHelper* gl)
|
||||
: fCpu(-1.0)
|
||||
, fWall(-1.0)
|
||||
, fTruncatedCpu(-1.0)
|
||||
, fTruncatedWall(-1.0)
|
||||
, fGpu(-1.0)
|
||||
{
|
||||
fSysTimer = new BenchSysTimer();
|
||||
fTruncatedSysTimer = new BenchSysTimer();
|
||||
#if SK_SUPPORT_GPU
|
||||
if (gl) {
|
||||
fGpuTimer = new BenchGpuTimer(gl);
|
||||
} else {
|
||||
fGpuTimer = NULL;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
BenchTimer::~BenchTimer() {
|
||||
delete fSysTimer;
|
||||
delete fTruncatedSysTimer;
|
||||
#if SK_SUPPORT_GPU
|
||||
delete fGpuTimer;
|
||||
#endif
|
||||
}
|
||||
|
||||
void BenchTimer::start(double durationScale) {
|
||||
fDurationScale = durationScale;
|
||||
|
||||
fSysTimer->startWall();
|
||||
fTruncatedSysTimer->startWall();
|
||||
#if SK_SUPPORT_GPU
|
||||
if (fGpuTimer) {
|
||||
fGpuTimer->startGpu();
|
||||
}
|
||||
#endif
|
||||
fSysTimer->startCpu();
|
||||
fTruncatedSysTimer->startCpu();
|
||||
}
|
||||
|
||||
void BenchTimer::end() {
|
||||
fCpu = fSysTimer->endCpu() * fDurationScale;
|
||||
#if SK_SUPPORT_GPU
|
||||
//It is important to stop the cpu clocks first,
|
||||
//as the following will cpu wait for the gpu to finish.
|
||||
if (fGpuTimer) {
|
||||
fGpu = fGpuTimer->endGpu() * fDurationScale;
|
||||
}
|
||||
#endif
|
||||
fWall = fSysTimer->endWall() * fDurationScale;
|
||||
}
|
||||
|
||||
void BenchTimer::truncatedEnd() {
|
||||
fTruncatedCpu = fTruncatedSysTimer->endCpu() * fDurationScale;
|
||||
fTruncatedWall = fTruncatedSysTimer->endWall() * fDurationScale;
|
||||
}
|
||||
|
||||
WallTimer::WallTimer() : fWall(-1.0), fSysTimer(new BenchSysTimer) {}
|
||||
|
||||
WallTimer::~WallTimer() {
|
||||
delete fSysTimer;
|
||||
}
|
||||
|
||||
void WallTimer::start(double durationScale) {
|
||||
fDurationScale = durationScale;
|
||||
fSysTimer->startWall();
|
||||
}
|
||||
|
||||
void WallTimer::end() {
|
||||
fWall = fSysTimer->endWall() * fDurationScale;
|
||||
}
|
||||
|
|
@ -1,25 +1,18 @@
|
|||
|
||||
/*
|
||||
* Copyright 2011 Google Inc.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license that can be
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
#ifndef Timer_DEFINED
|
||||
#define Timer_DEFINED
|
||||
#ifndef SkBenchTimer_DEFINED
|
||||
#define SkBenchTimer_DEFINED
|
||||
|
||||
#include "SkTypes.h"
|
||||
#include <SkTypes.h>
|
||||
|
||||
#if defined(SK_BUILD_FOR_WIN32)
|
||||
#include "SysTimer_windows.h"
|
||||
#elif defined(SK_BUILD_FOR_MAC)
|
||||
#include "SysTimer_mach.h"
|
||||
#elif defined(SK_BUILD_FOR_UNIX) || defined(SK_BUILD_FOR_ANDROID)
|
||||
#include "SysTimer_posix.h"
|
||||
#endif
|
||||
|
||||
#if SK_SUPPORT_GPU
|
||||
#include "GpuTimer.h"
|
||||
#endif
|
||||
class BenchSysTimer;
|
||||
class BenchGpuTimer;
|
||||
|
||||
class SkGLContextHelper;
|
||||
|
||||
|
@ -32,15 +25,13 @@ class SkGLContextHelper;
|
|||
* times and (for GPU configurations) can be used to roughly (very
|
||||
* roughly) gauge the GPU load/backlog.
|
||||
*/
|
||||
class Timer {
|
||||
class BenchTimer {
|
||||
public:
|
||||
explicit Timer(SkGLContextHelper* gl = NULL);
|
||||
|
||||
void start();
|
||||
void truncatedEnd();
|
||||
BenchTimer(SkGLContextHelper* gl = NULL);
|
||||
~BenchTimer();
|
||||
void start(double durationScale = 1);
|
||||
void end();
|
||||
|
||||
// All times in milliseconds.
|
||||
void truncatedEnd();
|
||||
double fCpu;
|
||||
double fWall;
|
||||
double fTruncatedCpu;
|
||||
|
@ -48,26 +39,29 @@ public:
|
|||
double fGpu;
|
||||
|
||||
private:
|
||||
SysTimer fSysTimer;
|
||||
SysTimer fTruncatedSysTimer;
|
||||
BenchSysTimer* fSysTimer;
|
||||
BenchSysTimer* fTruncatedSysTimer;
|
||||
#if SK_SUPPORT_GPU
|
||||
GpuTimer fGpuTimer;
|
||||
BenchGpuTimer* fGpuTimer;
|
||||
#endif
|
||||
double fDurationScale; // for this start/end session
|
||||
};
|
||||
|
||||
// Same as Timer above, supporting only fWall but with much lower overhead.
|
||||
// (Typically, ~30ns instead of Timer's ~1us.)
|
||||
// Same as BenchTimer above, supporting only fWall but with much lower overhead.
|
||||
// (Typically, ~30ns instead of BenchTimer's ~1us.)
|
||||
class WallTimer {
|
||||
public:
|
||||
WallTimer();
|
||||
~WallTimer();
|
||||
|
||||
void start();
|
||||
void start(double durationScale = 1);
|
||||
void end();
|
||||
|
||||
double fWall; // Milliseconds.
|
||||
double fWall;
|
||||
|
||||
private:
|
||||
SysTimer fSysTimer;
|
||||
BenchSysTimer* fSysTimer;
|
||||
double fDurationScale;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -1,3 +1,4 @@
|
|||
|
||||
/*
|
||||
* Copyright 2012 Google Inc.
|
||||
*
|
||||
|
@ -6,19 +7,22 @@
|
|||
*/
|
||||
#include "TimerData.h"
|
||||
|
||||
#include "Timer.h"
|
||||
#include "BenchTimer.h"
|
||||
#include <limits>
|
||||
|
||||
TimerData::TimerData(int maxNumTimings)
|
||||
: fMaxNumTimings(maxNumTimings)
|
||||
, fCurrTiming(0)
|
||||
, fWallTimes(maxNumTimings)
|
||||
, fTruncatedWallTimes(maxNumTimings)
|
||||
, fCpuTimes(maxNumTimings)
|
||||
, fTruncatedCpuTimes(maxNumTimings)
|
||||
, fGpuTimes(maxNumTimings) {}
|
||||
using namespace std;
|
||||
|
||||
bool TimerData::appendTimes(Timer* timer) {
|
||||
TimerData::TimerData(int maxNumTimings)
|
||||
: fMaxNumTimings(maxNumTimings)
|
||||
, fCurrTiming(0)
|
||||
, fWallTimes(maxNumTimings)
|
||||
, fTruncatedWallTimes(maxNumTimings)
|
||||
, fCpuTimes(maxNumTimings)
|
||||
, fTruncatedCpuTimes(maxNumTimings)
|
||||
, fGpuTimes(maxNumTimings){
|
||||
}
|
||||
|
||||
bool TimerData::appendTimes(BenchTimer* timer) {
|
||||
SkASSERT(timer != NULL);
|
||||
if (fCurrTiming >= fMaxNumTimings) {
|
||||
return false;
|
|
@ -1,3 +1,4 @@
|
|||
|
||||
/*
|
||||
* Copyright 2012 Google Inc.
|
||||
*
|
||||
|
@ -22,7 +23,7 @@
|
|||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
class Timer;
|
||||
class BenchTimer;
|
||||
|
||||
class TimerData {
|
||||
public:
|
||||
|
@ -32,12 +33,12 @@ public:
|
|||
explicit TimerData(int maxNumTimings);
|
||||
|
||||
/**
|
||||
* Collect times from the Timer for an iteration. It will fail if called more often than
|
||||
* Collect times from the BenchTimer for an iteration. It will fail if called more often than
|
||||
* indicated in the constructor.
|
||||
*
|
||||
* @param Timer Must not be null.
|
||||
* @param BenchTimer Must not be null.
|
||||
*/
|
||||
bool appendTimes(Timer*);
|
||||
bool appendTimes(BenchTimer*);
|
||||
|
||||
enum Result {
|
||||
kMin_Result,
|
|
@ -6,6 +6,7 @@
|
|||
*/
|
||||
|
||||
#include "BenchLogger.h"
|
||||
#include "BenchTimer.h"
|
||||
#include "Benchmark.h"
|
||||
#include "CrashHandler.h"
|
||||
#include "GMBench.h"
|
||||
|
@ -23,7 +24,6 @@
|
|||
#include "SkPictureRecorder.h"
|
||||
#include "SkString.h"
|
||||
#include "SkSurface.h"
|
||||
#include "Timer.h"
|
||||
|
||||
#if SK_SUPPORT_GPU
|
||||
#include "GrContext.h"
|
||||
|
@ -530,9 +530,9 @@ int tool_main(int argc, char** argv) {
|
|||
if (Benchmark::kGPU_Backend == config.backend) {
|
||||
contextHelper = gContextFactory.getGLContext(config.contextType);
|
||||
}
|
||||
Timer timer(contextHelper);
|
||||
BenchTimer timer(contextHelper);
|
||||
#else
|
||||
Timer timer;
|
||||
BenchTimer timer;
|
||||
#endif
|
||||
|
||||
double previous = std::numeric_limits<double>::infinity();
|
||||
|
|
|
@ -17,13 +17,13 @@
|
|||
__SK_FORCE_IMAGE_DECODER_LINKING;
|
||||
|
||||
#if defined(SK_BUILD_FOR_WIN32)
|
||||
#include "SysTimer_windows.h"
|
||||
#include "BenchSysTimer_windows.h"
|
||||
#elif defined(SK_BUILD_FOR_MAC)
|
||||
#include "SysTimer_mach.h"
|
||||
#include "BenchSysTimer_mach.h"
|
||||
#elif defined(SK_BUILD_FOR_UNIX) || defined(SK_BUILD_FOR_ANDROID)
|
||||
#include "SysTimer_posix.h"
|
||||
#include "BenchSysTimer_posix.h"
|
||||
#else
|
||||
#include "SysTimer_c.h"
|
||||
#include "BenchSysTimer_c.h"
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -202,7 +202,7 @@ public:
|
|||
double totTime() const { return fTot; }
|
||||
|
||||
protected:
|
||||
SysTimer fTimer;
|
||||
BenchSysTimer fTimer;
|
||||
SkTDArray<bool> fSkipCommands; // has the command been deleted in the GUI?
|
||||
SkTDArray<double> fTimes; // sum of time consumed for each command
|
||||
SkTDArray<double> fTypeTimes; // sum of time consumed for each type of command (e.g., drawPath)
|
||||
|
|
|
@ -150,8 +150,8 @@
|
|||
'flags.gyp:flags',
|
||||
'lua.gyp:lua',
|
||||
'pdf.gyp:pdf',
|
||||
'resources.gyp:resources',
|
||||
'skia_lib.gyp:skia_lib',
|
||||
'tools.gyp:resources',
|
||||
'views.gyp:views',
|
||||
'views_animated.gyp:views_animated',
|
||||
'xml.gyp:xml',
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
[ 'skia_os == "android" and not skia_android_framework', {
|
||||
'dependencies': [
|
||||
'android_deps.gyp:Android_EntryPoint',
|
||||
'skia_launcher.gyp:skia_launcher',
|
||||
'android_system.gyp:skia_launcher',
|
||||
],
|
||||
}],
|
||||
[ 'skia_os == "nacl"', {
|
||||
|
|
|
@ -9,13 +9,13 @@
|
|||
'target_name': 'bench',
|
||||
'type': 'executable',
|
||||
'dependencies': [
|
||||
'bench_timer',
|
||||
'crash_handler.gyp:CrashHandler',
|
||||
'etc1.gyp:libetc1',
|
||||
'flags.gyp:flags',
|
||||
'jsoncpp.gyp:jsoncpp',
|
||||
'resources.gyp:resources',
|
||||
'skia_lib.gyp:skia_lib',
|
||||
'tools.gyp:crash_handler',
|
||||
'tools.gyp:resources',
|
||||
'tools.gyp:timer',
|
||||
],
|
||||
'sources': [
|
||||
'../bench/BenchLogger.cpp',
|
||||
|
@ -50,5 +50,63 @@
|
|||
'gmslides.gypi',
|
||||
],
|
||||
},
|
||||
{
|
||||
'target_name' : 'bench_timer',
|
||||
'type': 'static_library',
|
||||
'sources': [
|
||||
'../bench/BenchTimer.h',
|
||||
'../bench/BenchTimer.cpp',
|
||||
'../bench/BenchSysTimer_mach.h',
|
||||
'../bench/BenchSysTimer_mach.cpp',
|
||||
'../bench/BenchSysTimer_posix.h',
|
||||
'../bench/BenchSysTimer_posix.cpp',
|
||||
'../bench/BenchSysTimer_windows.h',
|
||||
'../bench/BenchSysTimer_windows.cpp',
|
||||
],
|
||||
'include_dirs': [
|
||||
'../src/core',
|
||||
'../src/gpu',
|
||||
'../tools',
|
||||
],
|
||||
'direct_dependent_settings': {
|
||||
'include_dirs': ['../bench'],
|
||||
},
|
||||
'dependencies': [
|
||||
'skia_lib.gyp:skia_lib',
|
||||
],
|
||||
'conditions': [
|
||||
[ 'skia_os not in ["mac", "ios"]', {
|
||||
'sources!': [
|
||||
'../bench/BenchSysTimer_mach.h',
|
||||
'../bench/BenchSysTimer_mach.cpp',
|
||||
],
|
||||
}],
|
||||
[ 'skia_os not in ["linux", "freebsd", "openbsd", "solaris", "android", "chromeos"]', {
|
||||
'sources!': [
|
||||
'../bench/BenchSysTimer_posix.h',
|
||||
'../bench/BenchSysTimer_posix.cpp',
|
||||
],
|
||||
}],
|
||||
[ 'skia_os in ["linux", "freebsd", "openbsd", "solaris", "chromeos"]', {
|
||||
'link_settings': {
|
||||
'libraries': [
|
||||
'-lrt',
|
||||
],
|
||||
},
|
||||
}],
|
||||
[ 'skia_os != "win"', {
|
||||
'sources!': [
|
||||
'../bench/BenchSysTimer_windows.h',
|
||||
'../bench/BenchSysTimer_windows.cpp',
|
||||
],
|
||||
}],
|
||||
['skia_gpu == 1', {
|
||||
'sources': [
|
||||
'../bench/BenchGpuTimer_gl.h',
|
||||
'../bench/BenchGpuTimer_gl.cpp',
|
||||
],
|
||||
}],
|
||||
],
|
||||
}
|
||||
],
|
||||
}
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
'targets': [{
|
||||
'target_name': 'CrashHandler',
|
||||
'type': 'static_library',
|
||||
'sources': [ '../tools/CrashHandler.cpp' ],
|
||||
'dependencies': [ 'skia_lib.gyp:skia_lib' ],
|
||||
'direct_dependent_settings': {
|
||||
'include_dirs': [ '../tools' ],
|
||||
},
|
||||
'all_dependent_settings': {
|
||||
'msvs_settings': {
|
||||
'VCLinkerTool': {
|
||||
'AdditionalDependencies': [ 'Dbghelp.lib' ],
|
||||
}
|
||||
},
|
||||
}
|
||||
}]
|
||||
}
|
|
@ -96,8 +96,8 @@
|
|||
],
|
||||
'dependencies': [
|
||||
'skia_lib.gyp:skia_lib',
|
||||
'bench.gyp:bench_timer',
|
||||
'tools.gyp:picture_renderer',
|
||||
'tools.gyp:timer',
|
||||
],
|
||||
'conditions': [
|
||||
[ 'skia_os == "nacl"', {
|
||||
|
|
|
@ -55,12 +55,12 @@
|
|||
'../src/utils/debugger/SkObjectParser.cpp',
|
||||
],
|
||||
'dependencies': [
|
||||
'crash_handler.gyp:CrashHandler',
|
||||
'etc1.gyp:libetc1',
|
||||
'flags.gyp:flags',
|
||||
'gputest.gyp:skgputest',
|
||||
'jsoncpp.gyp:jsoncpp',
|
||||
'skia_lib.gyp:skia_lib',
|
||||
'tools.gyp:crash_handler',
|
||||
],
|
||||
'conditions': [
|
||||
['skia_android_framework', {
|
||||
|
|
27
gyp/gm.gyp
27
gyp/gm.gyp
|
@ -4,6 +4,28 @@
|
|||
'apptype_console.gypi',
|
||||
],
|
||||
'targets': [
|
||||
{
|
||||
'target_name': 'gm_expectations',
|
||||
'type': 'static_library',
|
||||
'include_dirs' : [
|
||||
'../src/utils/',
|
||||
],
|
||||
'sources': [
|
||||
'../gm/gm_expectations.h',
|
||||
'../gm/gm_expectations.cpp',
|
||||
'../tools/sk_tool_utils.cpp',
|
||||
],
|
||||
'dependencies': [
|
||||
'crash_handler.gyp:CrashHandler',
|
||||
'jsoncpp.gyp:jsoncpp',
|
||||
'skia_lib.gyp:skia_lib',
|
||||
],
|
||||
'direct_dependent_settings': {
|
||||
'include_dirs': [
|
||||
'../gm/',
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
'target_name': 'gm',
|
||||
'type': 'executable',
|
||||
|
@ -27,12 +49,11 @@
|
|||
'dependencies': [
|
||||
'etc1.gyp:libetc1',
|
||||
'flags.gyp:flags',
|
||||
'gm.gyp:gm_expectations',
|
||||
'jsoncpp.gyp:jsoncpp',
|
||||
'pdf.gyp:pdf',
|
||||
'resources.gyp:resources',
|
||||
'skia_lib.gyp:skia_lib',
|
||||
'tools.gyp:crash_handler',
|
||||
'tools.gyp:gm_expectations',
|
||||
'tools.gyp:resources',
|
||||
],
|
||||
'conditions': [
|
||||
['skia_android_framework', {
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
# Copyright 2014 Google Inc.
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
{
|
||||
'targets': [
|
||||
{
|
||||
'target_name': 'resources',
|
||||
'type': 'static_library',
|
||||
'sources': [
|
||||
'../tools/Resources.cpp',
|
||||
'../tools/Resources.h',
|
||||
],
|
||||
'dependencies': [
|
||||
'flags.gyp:flags',
|
||||
'skia_lib.gyp:skia_lib',
|
||||
],
|
||||
'direct_dependent_settings': {
|
||||
'include_dirs': [
|
||||
'../tools/',
|
||||
],
|
||||
},
|
||||
},
|
||||
]
|
||||
}
|
|
@ -1,3 +0,0 @@
|
|||
{
|
||||
'includes': [ '../platform_tools/android/gyp/skia_launcher.gypi' ]
|
||||
}
|
|
@ -11,7 +11,7 @@
|
|||
'pathops_unittest.gypi',
|
||||
'tests.gypi',
|
||||
],
|
||||
'dependencies': [ 'tools.gyp:crash_handler' ],
|
||||
'dependencies': [ 'crash_handler.gyp:CrashHandler' ],
|
||||
'sources': [
|
||||
'../tests/skia_test.cpp',
|
||||
],
|
||||
|
|
|
@ -20,9 +20,9 @@
|
|||
'experimental.gyp:experimental',
|
||||
'flags.gyp:flags',
|
||||
'pdf.gyp:pdf',
|
||||
'resources.gyp:resources',
|
||||
'skia_lib.gyp:skia_lib',
|
||||
'tools.gyp:picture_utils',
|
||||
'tools.gyp:resources',
|
||||
],
|
||||
'sources': [
|
||||
'../tests/Test.cpp',
|
||||
|
|
107
gyp/tools.gyp
107
gyp/tools.gyp
|
@ -43,86 +43,6 @@
|
|||
],
|
||||
],
|
||||
},
|
||||
{ # This would go in gm.gyp, but it's also used by skimage below.
|
||||
'target_name': 'gm_expectations',
|
||||
'type': 'static_library',
|
||||
'include_dirs' : [ '../src/utils/' ],
|
||||
'sources': [
|
||||
'../gm/gm_expectations.cpp',
|
||||
'../tools/sk_tool_utils.cpp',
|
||||
],
|
||||
'dependencies': [
|
||||
'jsoncpp.gyp:jsoncpp',
|
||||
'skia_lib.gyp:skia_lib',
|
||||
],
|
||||
'direct_dependent_settings': {
|
||||
'include_dirs': [ '../gm/' ],
|
||||
},
|
||||
},
|
||||
{
|
||||
'target_name': 'crash_handler',
|
||||
'type': 'static_library',
|
||||
'sources': [ '../tools/CrashHandler.cpp' ],
|
||||
'dependencies': [ 'skia_lib.gyp:skia_lib' ],
|
||||
'direct_dependent_settings': {
|
||||
'include_dirs': [ '../tools' ],
|
||||
},
|
||||
'all_dependent_settings': {
|
||||
'msvs_settings': {
|
||||
'VCLinkerTool': {
|
||||
'AdditionalDependencies': [ 'Dbghelp.lib' ],
|
||||
}
|
||||
},
|
||||
}
|
||||
},
|
||||
{
|
||||
'target_name': 'resources',
|
||||
'type': 'static_library',
|
||||
'sources': [ '../tools/Resources.cpp' ],
|
||||
'dependencies': [
|
||||
'flags.gyp:flags',
|
||||
'skia_lib.gyp:skia_lib',
|
||||
],
|
||||
'direct_dependent_settings': {
|
||||
'include_dirs': [ '../tools/', ],
|
||||
},
|
||||
},
|
||||
{
|
||||
'target_name' : 'timer',
|
||||
'type': 'static_library',
|
||||
'sources': [
|
||||
'../tools/timer/Timer.cpp',
|
||||
'../tools/timer/TimerData.cpp',
|
||||
],
|
||||
'include_dirs': [
|
||||
'../src/core',
|
||||
'../src/gpu',
|
||||
],
|
||||
'direct_dependent_settings': {
|
||||
'include_dirs': ['../tools/timer'],
|
||||
},
|
||||
'dependencies': [
|
||||
'skia_lib.gyp:skia_lib',
|
||||
'jsoncpp.gyp:jsoncpp',
|
||||
],
|
||||
'conditions': [
|
||||
['skia_gpu == 1', {
|
||||
'sources': [ '../tools/timer/GpuTimer.cpp' ],
|
||||
}],
|
||||
[ 'skia_os in ["mac", "ios"]', {
|
||||
'sources': [ '../tools/timer/SysTimer_mach.cpp' ],
|
||||
}],
|
||||
[ 'skia_os == "win"', {
|
||||
'sources': [ '../tools/timer/SysTimer_windows.cpp' ],
|
||||
}],
|
||||
[ 'skia_os in ["linux", "freebsd", "openbsd", "solaris", "android", "chromeos"]', {
|
||||
'sources': [ '../tools/timer/SysTimer_posix.cpp' ],
|
||||
}],
|
||||
[ 'skia_os in ["linux", "freebsd", "openbsd", "solaris", "chromeos"]', {
|
||||
'link_settings': { 'libraries': [ '-lrt' ] },
|
||||
}],
|
||||
],
|
||||
},
|
||||
{
|
||||
'target_name': 'skdiff',
|
||||
'type': 'executable',
|
||||
|
@ -258,8 +178,8 @@
|
|||
'../src/utils/',
|
||||
],
|
||||
'dependencies': [
|
||||
'gm_expectations',
|
||||
'flags.gyp:flags',
|
||||
'gm.gyp:gm_expectations',
|
||||
'jsoncpp.gyp:jsoncpp',
|
||||
'skia_lib.gyp:skia_lib',
|
||||
],
|
||||
|
@ -379,13 +299,14 @@
|
|||
'../src/lazy/',
|
||||
],
|
||||
'dependencies': [
|
||||
'timer',
|
||||
'crash_handler',
|
||||
'bench.gyp:bench_timer',
|
||||
'crash_handler.gyp:CrashHandler',
|
||||
'flags.gyp:flags',
|
||||
'jsoncpp.gyp:jsoncpp',
|
||||
'skia_lib.gyp:skia_lib',
|
||||
'tools.gyp:picture_renderer',
|
||||
'tools.gyp:picture_utils',
|
||||
'tools.gyp:timer_data',
|
||||
],
|
||||
},
|
||||
{
|
||||
|
@ -401,7 +322,7 @@
|
|||
'../src/lazy',
|
||||
],
|
||||
'dependencies': [
|
||||
'timer',
|
||||
'bench.gyp:bench_timer',
|
||||
'flags.gyp:flags',
|
||||
'skia_lib.gyp:skia_lib',
|
||||
],
|
||||
|
@ -417,7 +338,7 @@
|
|||
'../src/images',
|
||||
],
|
||||
'dependencies': [
|
||||
'timer',
|
||||
'bench.gyp:bench_timer',
|
||||
'flags.gyp:flags',
|
||||
'skia_lib.gyp:skia_lib',
|
||||
],
|
||||
|
@ -436,7 +357,7 @@
|
|||
'../src/lazy',
|
||||
],
|
||||
'dependencies': [
|
||||
'timer',
|
||||
'bench.gyp:bench_timer',
|
||||
'flags.gyp:flags',
|
||||
'skia_lib.gyp:skia_lib',
|
||||
],
|
||||
|
@ -584,8 +505,9 @@
|
|||
# Bench code:
|
||||
],
|
||||
'dependencies': [
|
||||
'timer',
|
||||
'bench.gyp:bench_timer',
|
||||
'flags.gyp:flags',
|
||||
'tools.gyp:timer_data',
|
||||
'skia_lib.gyp:skia_lib',
|
||||
'tools.gyp:picture_renderer',
|
||||
'tools.gyp:picture_utils',
|
||||
|
@ -622,6 +544,17 @@
|
|||
'skia_lib.gyp:skia_lib',
|
||||
],
|
||||
},
|
||||
{
|
||||
'target_name': 'timer_data',
|
||||
'type': 'static_library',
|
||||
'sources': [
|
||||
'../bench/TimerData.cpp',
|
||||
],
|
||||
'dependencies': [
|
||||
'skia_lib.gyp:skia_lib',
|
||||
'jsoncpp.gyp:jsoncpp'
|
||||
]
|
||||
}
|
||||
],
|
||||
'conditions': [
|
||||
['skia_shared_lib',
|
||||
|
|
|
@ -44,6 +44,13 @@
|
|||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
'target_name': 'skia_launcher',
|
||||
'type': 'executable',
|
||||
'sources': [
|
||||
'../launcher/skia_launcher.cpp',
|
||||
],
|
||||
},
|
||||
{
|
||||
'target_name': 'SampleApp_APK',
|
||||
'type': 'none',
|
||||
|
|
|
@ -1,7 +0,0 @@
|
|||
{
|
||||
'targets': [{
|
||||
'target_name': 'skia_launcher',
|
||||
'type': 'executable',
|
||||
'sources': [ '../launcher/skia_launcher.cpp' ],
|
||||
}]
|
||||
}
|
|
@ -10,8 +10,8 @@
|
|||
#include "SkRecord.h"
|
||||
#include "SkRecordDraw.h"
|
||||
|
||||
#include "BenchTimer.h"
|
||||
#include "DumpRecord.h"
|
||||
#include "Timer.h"
|
||||
|
||||
namespace {
|
||||
|
||||
|
@ -33,7 +33,7 @@ public:
|
|||
|
||||
template <typename T>
|
||||
void operator()(const T& command) {
|
||||
Timer timer;
|
||||
BenchTimer timer;
|
||||
timer.start();
|
||||
fDraw(command);
|
||||
timer.end();
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#include "Timer.h"
|
||||
#include "BenchTimer.h"
|
||||
#include "PictureBenchmark.h"
|
||||
#include "SkCanvas.h"
|
||||
#include "SkPicture.h"
|
||||
|
@ -42,13 +42,13 @@ void PictureBenchmark::setTimersToShow(bool wall,
|
|||
fTimerTypes |= gpu ? TimerData::kGpu_Flag : 0;
|
||||
}
|
||||
|
||||
Timer* PictureBenchmark::setupTimer(bool useGLTimer) {
|
||||
BenchTimer* PictureBenchmark::setupTimer(bool useGLTimer) {
|
||||
#if SK_SUPPORT_GPU
|
||||
if (useGLTimer && fRenderer != NULL && fRenderer->isUsingGpuDevice()) {
|
||||
return SkNEW_ARGS(Timer, (fRenderer->getGLContext()));
|
||||
return SkNEW_ARGS(BenchTimer, (fRenderer->getGLContext()));
|
||||
}
|
||||
#endif
|
||||
return SkNEW_ARGS(Timer, (NULL));
|
||||
return SkNEW_ARGS(BenchTimer, (NULL));
|
||||
}
|
||||
|
||||
PictureRenderer* PictureBenchmark::setRenderer(sk_tools::PictureRenderer* renderer) {
|
||||
|
@ -147,11 +147,11 @@ void PictureBenchmark::run(SkPicture* pict) {
|
|||
// seems to cause problems (i.e., INVALID_OPERATIONs) on several
|
||||
// platforms. To work around this, we disable the gpu timer on the
|
||||
// long running timer.
|
||||
SkAutoTDelete<Timer> longRunningTimer(this->setupTimer());
|
||||
SkAutoTDelete<BenchTimer> longRunningTimer(this->setupTimer());
|
||||
TimerData longRunningTimerData(numOuterLoops);
|
||||
|
||||
for (int outer = 0; outer < numOuterLoops; ++outer) {
|
||||
SkAutoTDelete<Timer> perTileTimer(this->setupTimer(false));
|
||||
SkAutoTDelete<BenchTimer> perTileTimer(this->setupTimer(false));
|
||||
TimerData perTileTimerData(numInnerLoops);
|
||||
|
||||
longRunningTimer->start();
|
||||
|
@ -201,11 +201,11 @@ void PictureBenchmark::run(SkPicture* pict) {
|
|||
numInnerLoops);
|
||||
}
|
||||
} else {
|
||||
SkAutoTDelete<Timer> longRunningTimer(this->setupTimer());
|
||||
SkAutoTDelete<BenchTimer> longRunningTimer(this->setupTimer());
|
||||
TimerData longRunningTimerData(numOuterLoops);
|
||||
|
||||
for (int outer = 0; outer < numOuterLoops; ++outer) {
|
||||
SkAutoTDelete<Timer> perRunTimer(this->setupTimer(false));
|
||||
SkAutoTDelete<BenchTimer> perRunTimer(this->setupTimer(false));
|
||||
TimerData perRunTimerData(numInnerLoops);
|
||||
|
||||
longRunningTimer->start();
|
||||
|
|
|
@ -13,8 +13,8 @@
|
|||
#include "SkTypes.h"
|
||||
#include "TimerData.h"
|
||||
|
||||
class BenchTimer;
|
||||
class SkPicture;
|
||||
class Timer;
|
||||
|
||||
namespace sk_tools {
|
||||
|
||||
|
@ -67,7 +67,7 @@ private:
|
|||
|
||||
PictureResultsWriter* fWriter;
|
||||
|
||||
Timer* setupTimer(bool useGLTimer = true);
|
||||
BenchTimer* setupTimer(bool useGLTimer = true);
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#include "Timer.h"
|
||||
#include "BenchTimer.h"
|
||||
#include "Benchmark.h"
|
||||
#include "LazyDecodeBitmap.h"
|
||||
#include "PictureBenchmark.h"
|
||||
|
@ -64,7 +64,7 @@ static void do_benchmark_work(sk_tools::PictureRenderer* renderer,
|
|||
BBoxType bBoxType,
|
||||
SkPicture* pic,
|
||||
const int numRepeats,
|
||||
Timer* timer) {
|
||||
BenchTimer* timer) {
|
||||
renderer->setBBoxHierarchyType(bBoxType);
|
||||
renderer->setGridSize(FLAGS_tilesize, FLAGS_tilesize);
|
||||
renderer->init(pic, NULL, NULL, NULL, false);
|
||||
|
@ -106,14 +106,14 @@ int tool_main(int argc, char** argv) {
|
|||
if (!includeBBoxType[bBoxType]) { continue; }
|
||||
if (FLAGS_playback > 0) {
|
||||
sk_tools::TiledPictureRenderer playbackRenderer;
|
||||
Timer playbackTimer;
|
||||
BenchTimer playbackTimer;
|
||||
do_benchmark_work(&playbackRenderer, (BBoxType)bBoxType,
|
||||
picture, FLAGS_playback, &playbackTimer);
|
||||
measurement.fPlaybackAverage[bBoxType] = playbackTimer.fCpu;
|
||||
}
|
||||
if (FLAGS_record > 0) {
|
||||
sk_tools::RecordPictureRenderer recordRenderer;
|
||||
Timer recordTimer;
|
||||
BenchTimer recordTimer;
|
||||
do_benchmark_work(&recordRenderer, (BBoxType)bBoxType,
|
||||
picture, FLAGS_record, &recordTimer);
|
||||
measurement.fRecordAverage[bBoxType] = recordTimer.fCpu;
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
*/
|
||||
|
||||
#include "BenchLogger.h"
|
||||
#include "Timer.h"
|
||||
#include "BenchTimer.h"
|
||||
#include "CopyTilesRenderer.h"
|
||||
#include "CrashHandler.h"
|
||||
#include "LazyDecodeBitmap.h"
|
||||
|
|
|
@ -16,8 +16,10 @@
|
|||
|
||||
#include "../include/record/SkRecording.h"
|
||||
|
||||
#include "BenchTimer.h"
|
||||
#include "Stats.h"
|
||||
#include "Timer.h"
|
||||
|
||||
typedef WallTimer Timer;
|
||||
|
||||
__SK_FORCE_IMAGE_DECODER_LINKING;
|
||||
|
||||
|
@ -76,16 +78,15 @@ static void bench(SkPMColor* scratch, SkPicture& src, const char* name) {
|
|||
// Draw once to warm any caches. The first sample otherwise can be very noisy.
|
||||
draw(*record, *picture, canvas.get());
|
||||
|
||||
WallTimer timer;
|
||||
const double scale = timescale();
|
||||
Timer timer;
|
||||
SkAutoTMalloc<double> samples(FLAGS_samples);
|
||||
for (int i = 0; i < FLAGS_samples; i++) {
|
||||
// We assume timer overhead (typically, ~30ns) is insignificant
|
||||
// compared to draw runtime (at least ~100us, usually several ms).
|
||||
timer.start();
|
||||
timer.start(timescale());
|
||||
draw(*record, *picture, canvas.get());
|
||||
timer.end();
|
||||
samples[i] = timer.fWall * scale;
|
||||
samples[i] = timer.fWall;
|
||||
}
|
||||
|
||||
Stats stats(samples.get(), FLAGS_samples);
|
||||
|
|
|
@ -14,9 +14,11 @@
|
|||
#include "SkStream.h"
|
||||
#include "SkString.h"
|
||||
|
||||
#include "BenchTimer.h"
|
||||
#include "LazyDecodeBitmap.h"
|
||||
#include "Stats.h"
|
||||
#include "Timer.h"
|
||||
|
||||
typedef WallTimer Timer;
|
||||
|
||||
__SK_FORCE_IMAGE_DECODER_LINKING;
|
||||
|
||||
|
@ -79,13 +81,12 @@ static void bench_record(const SkPicture& src,
|
|||
rerecord(src, bbhFactory);
|
||||
|
||||
// Rerecord once to see how many times we should loop to make timer overhead insignificant.
|
||||
WallTimer timer;
|
||||
const double scale = timescale();
|
||||
Timer timer;
|
||||
do {
|
||||
timer.start();
|
||||
timer.start(timescale());
|
||||
rerecord(src, bbhFactory);
|
||||
timer.end();
|
||||
} while (timer.fWall * scale < timerOverhead); // Loop just in case something bizarre happens.
|
||||
} while (timer.fWall < timerOverhead); // Loop just in case something bizarre happens.
|
||||
|
||||
// We want (timer overhead / measurement) to be less than FLAGS_overheadGoal.
|
||||
// So in each sample, we'll loop enough times to have made that true for our first measurement.
|
||||
|
@ -93,12 +94,12 @@ static void bench_record(const SkPicture& src,
|
|||
|
||||
SkAutoTMalloc<double> samples(FLAGS_samples);
|
||||
for (int i = 0; i < FLAGS_samples; i++) {
|
||||
timer.start();
|
||||
timer.start(timescale());
|
||||
for (int j = 0; j < loops; j++) {
|
||||
rerecord(src, bbhFactory);
|
||||
}
|
||||
timer.end();
|
||||
samples[i] = timer.fWall * scale / loops;
|
||||
samples[i] = timer.fWall / loops;
|
||||
}
|
||||
|
||||
Stats stats(samples.get(), FLAGS_samples);
|
||||
|
@ -131,13 +132,12 @@ int tool_main(int argc, char** argv) {
|
|||
|
||||
// Each run will use this timer overhead estimate to guess how many times it should run.
|
||||
static const int kOverheadLoops = 10000000;
|
||||
WallTimer timer;
|
||||
Timer timer;
|
||||
double overheadEstimate = 0.0;
|
||||
const double scale = timescale();
|
||||
for (int i = 0; i < kOverheadLoops; i++) {
|
||||
timer.start();
|
||||
timer.start(timescale());
|
||||
timer.end();
|
||||
overheadEstimate += timer.fWall * scale;
|
||||
overheadEstimate += timer.fWall;
|
||||
}
|
||||
overheadEstimate /= kOverheadLoops;
|
||||
|
||||
|
|
|
@ -83,7 +83,7 @@ const char* cl_error_to_string(cl_int err) {
|
|||
}
|
||||
#endif
|
||||
|
||||
// TODO refactor Timer to be used here
|
||||
// TODO refactor BenchTimer to be used here
|
||||
double get_seconds() {
|
||||
#if SK_BUILD_FOR_WIN32
|
||||
LARGE_INTEGER currentTime;
|
||||
|
|
|
@ -1,53 +0,0 @@
|
|||
/*
|
||||
* 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();
|
||||
}
|
Загрузка…
Ссылка в новой задаче