Index: third_party/WebKit/Source/modules/webgl/WebGLTimerQueryEXT.cpp |
diff --git a/third_party/WebKit/Source/modules/webgl/WebGLTimerQueryEXT.cpp b/third_party/WebKit/Source/modules/webgl/WebGLTimerQueryEXT.cpp |
index e61cb6e066560f5ad98fc985db550eec99a4a468..2557991243f893e85d09a798ee7d1d9a3e907a97 100644 |
--- a/third_party/WebKit/Source/modules/webgl/WebGLTimerQueryEXT.cpp |
+++ b/third_party/WebKit/Source/modules/webgl/WebGLTimerQueryEXT.cpp |
@@ -7,6 +7,7 @@ |
#include "modules/webgl/WebGLTimerQueryEXT.h" |
#include "modules/webgl/WebGLRenderingContextBase.h" |
+#include "public/platform/Platform.h" |
namespace blink { |
@@ -17,6 +18,8 @@ WebGLTimerQueryEXT* WebGLTimerQueryEXT::create(WebGLRenderingContextBase* ctx) |
WebGLTimerQueryEXT::~WebGLTimerQueryEXT() |
{ |
+ unregisterTaskObserver(); |
+ |
// See the comment in WebGLObject::detachAndDeleteObject(). |
detachAndDeleteObject(); |
} |
@@ -25,14 +28,84 @@ WebGLTimerQueryEXT::WebGLTimerQueryEXT(WebGLRenderingContextBase* ctx) |
: WebGLContextObject(ctx) |
, m_target(0) |
, m_queryId(0) |
+ , m_taskObserverRegistered(false) |
+ , m_canUpdateAvailability(false) |
+ , m_queryResultAvailable(false) |
+ , m_queryResult(0) |
{ |
m_queryId = context()->webContext()->createQueryEXT(); |
} |
+void WebGLTimerQueryEXT::resetCachedResult() |
+{ |
+ m_canUpdateAvailability = false; |
+ m_queryResultAvailable = false; |
+ m_queryResult = 0; |
+ // When this is called, the implication is that we should start |
+ // keeping track of whether we can update the cached availability |
+ // and result. |
+ registerTaskObserver(); |
+} |
+ |
+void WebGLTimerQueryEXT::updateCachedResult(WebGraphicsContext3D* ctx) |
+{ |
+ if (m_queryResultAvailable) |
+ return; |
+ |
+ if (!m_canUpdateAvailability) |
+ return; |
+ |
+ if (!hasTarget()) |
+ return; |
+ |
+ // We can only update the cached result when control returns to the browser. |
+ m_canUpdateAvailability = false; |
+ GLuint available = 0; |
+ ctx->getQueryObjectuivEXT(object(), GL_QUERY_RESULT_AVAILABLE_EXT, &available); |
+ m_queryResultAvailable = !!available; |
+ if (m_queryResultAvailable) { |
+ GLuint64 result = 0; |
+ ctx->getQueryObjectui64vEXT(object(), GL_QUERY_RESULT_EXT, &result); |
+ m_queryResult = result; |
+ unregisterTaskObserver(); |
+ } |
+} |
+ |
+bool WebGLTimerQueryEXT::isQueryResultAvailable() |
+{ |
+ return m_queryResultAvailable; |
+} |
+ |
+GLuint64 WebGLTimerQueryEXT::getQueryResult() |
+{ |
+ return m_queryResult; |
+} |
+ |
void WebGLTimerQueryEXT::deleteObjectImpl(WebGraphicsContext3D* context3d) |
{ |
context3d->deleteQueryEXT(m_queryId); |
m_queryId = 0; |
} |
+void WebGLTimerQueryEXT::registerTaskObserver() |
+{ |
+ if (!m_taskObserverRegistered) { |
+ m_taskObserverRegistered = true; |
+ Platform::current()->currentThread()->addTaskObserver(this); |
+ } |
+} |
+ |
+void WebGLTimerQueryEXT::unregisterTaskObserver() |
+{ |
+ if (m_taskObserverRegistered) { |
+ m_taskObserverRegistered = false; |
+ Platform::current()->currentThread()->removeTaskObserver(this); |
+ } |
+} |
+ |
+void WebGLTimerQueryEXT::didProcessTask() |
+{ |
+ m_canUpdateAvailability = true; |
+} |
+ |
} // namespace blink |