| 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
|
|
|