| Index: tools/timer/GpuTimer.cpp
|
| diff --git a/tools/timer/GpuTimer.cpp b/tools/timer/GpuTimer.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..51ab3ad2359ba436bfab33e04cec941601f0f7c0
|
| --- /dev/null
|
| +++ b/tools/timer/GpuTimer.cpp
|
| @@ -0,0 +1,77 @@
|
| +
|
| +/*
|
| + * 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 "GpuTimer.h"
|
| +#include "gl/SkGLContext.h"
|
| +#include "gl/GrGLUtil.h"
|
| +
|
| +GpuTimer::GpuTimer(const SkGLContext* glctx) : fContext(glctx) {
|
| + if (fContext) {
|
| + fContext->ref();
|
| + fContext->makeCurrent();
|
| + fStarted = false;
|
| + fSupported = GrGLGetVersion(fContext->gl()) > GR_GL_VER(3,3) ||
|
| + fContext->gl()->hasExtension("GL_ARB_timer_query") ||
|
| + fContext->gl()->hasExtension("GL_EXT_timer_query");
|
| +
|
| + if (fSupported) {
|
| + SK_GL(*fContext, GenQueries(1, &fQuery));
|
| + }
|
| + }
|
| +}
|
| +
|
| +GpuTimer::~GpuTimer() {
|
| + if (fContext) {
|
| + if (fSupported) {
|
| + fContext->makeCurrent();
|
| + SK_GL(*fContext, DeleteQueries(1, &fQuery));
|
| + }
|
| + fContext->unref();
|
| + }
|
| +}
|
| +
|
| +void GpuTimer::start() {
|
| + if (fContext && fSupported) {
|
| + fContext->makeCurrent();
|
| + fStarted = true;
|
| + SK_GL(*fContext, BeginQuery(GR_GL_TIME_ELAPSED, fQuery));
|
| + }
|
| +}
|
| +
|
| +/**
|
| + * It is important to stop the cpu clocks first,
|
| + * as this will cpu wait for the gpu to finish.
|
| + */
|
| +double GpuTimer::end() {
|
| + if (fContext && fSupported) {
|
| + fStarted = false;
|
| + fContext->makeCurrent();
|
| + SK_GL(*fContext, EndQuery(GR_GL_TIME_ELAPSED));
|
| +
|
| + GrGLint available = 0;
|
| + while (!available) {
|
| + SK_GL_NOERRCHECK(*fContext, GetQueryObjectiv(fQuery,
|
| + GR_GL_QUERY_RESULT_AVAILABLE,
|
| + &available));
|
| + // If GetQueryObjectiv is erroring out we need some alternative
|
| + // means of breaking out of this loop
|
| + GrGLenum error;
|
| + SK_GL_RET_NOERRCHECK(*fContext, error, GetError());
|
| + if (GR_GL_NO_ERROR != error) {
|
| + break;
|
| + }
|
| + }
|
| + GrGLuint64 totalGPUTimeElapsed = 0;
|
| + SK_GL(*fContext, GetQueryObjectui64v(fQuery,
|
| + GR_GL_QUERY_RESULT,
|
| + &totalGPUTimeElapsed));
|
| +
|
| + return totalGPUTimeElapsed / 1000000.0;
|
| + } else {
|
| + return 0;
|
| + }
|
| +}
|
|
|