Index: bench/BenchGpuTimer_gl.cpp |
diff --git a/bench/BenchGpuTimer_gl.cpp b/bench/BenchGpuTimer_gl.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..349fc1529de6ac32754950f20c1ab5bd6037ecb2 |
--- /dev/null |
+++ b/bench/BenchGpuTimer_gl.cpp |
@@ -0,0 +1,74 @@ |
+ |
+/* |
+ * 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 "BenchGpuTimer_gl.h" |
+#include "gl/SkGLContextHelper.h" |
+#include "gl/GrGLUtil.h" |
+ |
+BenchGpuTimer::BenchGpuTimer(const SkGLContextHelper* glctx) { |
+ fContext = glctx; |
+ glctx->ref(); |
+ glctx->makeCurrent(); |
+ fStarted = false; |
+ fSupported = GrGLGetVersion(glctx->gl()) > GR_GL_VER(3,3) || |
+ glctx->hasExtension("GL_ARB_timer_query") || |
+ glctx->hasExtension("GL_EXT_timer_query"); |
+ |
+ if (fSupported) { |
+ SK_GL(*glctx, GenQueries(1, &fQuery)); |
+ } |
+} |
+ |
+BenchGpuTimer::~BenchGpuTimer() { |
+ if (fSupported) { |
+ fContext->makeCurrent(); |
+ SK_GL(*fContext, DeleteQueries(1, &fQuery)); |
+ } |
+ fContext->unref(); |
+} |
+ |
+void BenchGpuTimer::startGpu() { |
+ if (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 BenchGpuTimer::endGpu() { |
+ if (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; |
+ } |
+} |