Chromium Code Reviews| 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() |
|
David Yen
2015/10/05 17:23:16
We also need to reset the cache results when begin
|
| +{ |
| + 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 |