Bug 1308057 - Use pointer-to-query-slot for is-active status. DeleteQuery should clear its slot if it has one. - r=ethlin draft
authorJeff Gilbert (:jgilbert) <jgilbert@mozilla.com>
Mon, 07 Nov 2016 19:38:48 -0800
changeset 437536 7cea37292bd9fa6903b3f535e9d5c0fce0dc3fa4
parent 437535 fb7eaa78e6efc77e79cbbad783117a369679a3f7
child 437537 c51e0f32071cd3d6ca34af198a5927f5197364c0
push id35436
push userbmo:jgilbert@mozilla.com
push dateFri, 11 Nov 2016 01:52:22 +0000
reviewersethlin
bugs1308057
milestone52.0a1
Bug 1308057 - Use pointer-to-query-slot for is-active status. DeleteQuery should clear its slot if it has one. - r=ethlin MozReview-Commit-ID: 9xY6NzwKOz3
dom/canvas/WebGL2ContextQueries.cpp
dom/canvas/WebGLQuery.cpp
dom/canvas/WebGLQuery.h
--- a/dom/canvas/WebGL2ContextQueries.cpp
+++ b/dom/canvas/WebGL2ContextQueries.cpp
@@ -129,20 +129,17 @@ WebGLContext::BeginQuery(GLenum target, 
     if (!slot)
         return;
 
     if (*slot)
         return ErrorInvalidOperation("%s: Query target already active.", funcName);
 
     ////
 
-    if (!query->BeginQuery(target))
-        return;
-
-    *slot = query;
+    query->BeginQuery(target, *slot);
 }
 
 void
 WebGLContext::EndQuery(GLenum target, const char* funcName)
 {
     if (!funcName) {
         funcName = "endQuery";
     }
@@ -154,18 +151,16 @@ WebGLContext::EndQuery(GLenum target, co
     if (!slot)
         return;
 
     const auto& query = *slot;
     if (!query)
         return ErrorInvalidOperation("%s: Query target not active.", funcName);
 
     query->EndQuery();
-
-    *slot = nullptr;
 }
 
 void
 WebGLContext::GetQuery(JSContext* cx, GLenum target, GLenum pname,
                        JS::MutableHandleValue retval, const char* funcName)
 {
     if (!funcName) {
         funcName = "getQuery";
--- a/dom/canvas/WebGLQuery.cpp
+++ b/dom/canvas/WebGLQuery.cpp
@@ -38,17 +38,17 @@ GenQuery(gl::GLContext* gl)
     gl->fGenQueries(1, &ret);
     return ret;
 }
 
 WebGLQuery::WebGLQuery(WebGLContext* webgl)
     : WebGLContextBoundObject(webgl)
     , mGLName(GenQuery(mContext->gl))
     , mTarget(0)
-    , mIsActive(false)
+    , mActiveSlot(nullptr)
     , mCanBeAvailable(false)
 {
     mContext->mQueries.insertBack(this);
 }
 
 void
 WebGLQuery::Delete()
 {
@@ -75,46 +75,46 @@ TargetForDriver(const gl::GLContext* gl,
         return target;
 
     if (gl->IsSupported(gl::GLFeature::occlusion_query2))
         return LOCAL_GL_ANY_SAMPLES_PASSED;
 
     return LOCAL_GL_SAMPLES_PASSED;
 }
 
-bool
-WebGLQuery::BeginQuery(GLenum target)
+void
+WebGLQuery::BeginQuery(GLenum target, WebGLRefPtr<WebGLQuery>& slot)
 {
     const char funcName[] = "beginQuery";
 
     if (mTarget && target != mTarget) {
         mContext->ErrorInvalidOperation("%s: Queries cannot change targets.", funcName);
-        return false;
+        return;
     }
 
     ////
 
     mTarget = target;
-    mIsActive = true;
+    mActiveSlot = &slot;
+    *mActiveSlot = this;
 
     ////
 
     const auto& gl = mContext->gl;
     gl->MakeCurrent();
 
     const auto driverTarget = TargetForDriver(gl, mTarget);
     gl->fBeginQuery(driverTarget, mGLName);
-
-    return true;
 }
 
 void
 WebGLQuery::EndQuery()
 {
-    mIsActive = false;
+    *mActiveSlot = nullptr;
+    mActiveSlot = nullptr;
     mCanBeAvailable = false;
 
     ////
 
     const auto& gl = mContext->gl;
     gl->MakeCurrent();
 
     const auto driverTarget = TargetForDriver(gl, mTarget);
@@ -141,17 +141,17 @@ WebGLQuery::GetQueryParameter(GLenum pna
         return;
     }
 
     if (!mTarget) {
         mContext->ErrorInvalidOperation("%s: Query has never been active.", funcName);
         return;
     }
 
-    if (mIsActive)
+    if (mActiveSlot)
         return mContext->ErrorInvalidOperation("%s: Query is still active.", funcName);
 
     // End of validation
     ////
 
     // We must usually wait for an event loop before the query can be available.
     const bool canBeAvailable = (mCanBeAvailable || gfxPrefs::WebGLImmediateQueries());
     if (!canBeAvailable) {
@@ -221,17 +221,17 @@ WebGLQuery::IsQuery() const
 }
 
 void
 WebGLQuery::DeleteQuery()
 {
     if (IsDeleted())
         return;
 
-    if (mIsActive) {
+    if (mActiveSlot) {
         EndQuery();
     }
 
     RequestDelete();
 }
 
 void
 WebGLQuery::QueryCounter(const char* funcName, GLenum target)
--- a/dom/canvas/WebGLQuery.h
+++ b/dom/canvas/WebGLQuery.h
@@ -22,23 +22,24 @@ class WebGLQuery final
 {
     friend class AvailableRunnable;
     friend class WebGLRefCountedObject<WebGLQuery>;
 
 public:
     const GLuint mGLName;
 private:
     GLenum mTarget;
-    bool mIsActive;
+    WebGLRefPtr<WebGLQuery>* mActiveSlot;
 
     bool mCanBeAvailable; // Track whether the event loop has spun
 
     ////
 public:
-    bool IsActive() const { return mIsActive; }
+    GLenum Target() const { return mTarget; }
+    bool IsActive() const { return bool(mActiveSlot); }
 
     ////
 
     NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(WebGLQuery)
     NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(WebGLQuery)
 
     explicit WebGLQuery(WebGLContext* webgl);
 
@@ -51,17 +52,17 @@ private:
     void Delete();
 
 public:
     WebGLContext* GetParentObject() const { return mContext; }
     virtual JSObject* WrapObject(JSContext* cx, JS::Handle<JSObject*> givenProto) override;
 
     ////
 
-    bool BeginQuery(GLenum target);
+    void BeginQuery(GLenum target, WebGLRefPtr<WebGLQuery>& slot);
     void DeleteQuery();
     void EndQuery();
     void GetQueryParameter(GLenum pname, JS::MutableHandleValue retval) const;
     bool IsQuery() const;
     void QueryCounter(const char* funcName, GLenum target);
 };
 
 } // namespace mozilla