Bug 1275866 - Clear WebGLTimerQuerys on WebGL GLContext teardown. - r=jerry,jrmuizel
--- a/dom/canvas/WebGLContext.cpp
+++ b/dom/canvas/WebGLContext.cpp
@@ -62,16 +62,17 @@
#include "WebGLExtensions.h"
#include "WebGLFramebuffer.h"
#include "WebGLMemoryTracker.h"
#include "WebGLObjectModel.h"
#include "WebGLProgram.h"
#include "WebGLQuery.h"
#include "WebGLSampler.h"
#include "WebGLShader.h"
+#include "WebGLTimerQuery.h"
#include "WebGLTransformFeedback.h"
#include "WebGLVertexArray.h"
#include "WebGLVertexAttribData.h"
#ifdef MOZ_WIDGET_COCOA
#include "nsCocoaFeatures.h"
#endif
@@ -208,16 +209,25 @@ WebGLContext::~WebGLContext()
// XXX mtseng: bug 709490, not thread safe
WebGLMemoryTracker::RemoveWebGLContext(this);
}
mContextLossHandler->DisableTimer();
mContextLossHandler = nullptr;
}
+template<typename T>
+static void
+ClearLinkedList(LinkedList<T>& list)
+{
+ while (!list.isEmpty()) {
+ list.getLast()->DeleteOnce();
+ }
+}
+
void
WebGLContext::DestroyResourcesAndContext()
{
if (!gl)
return;
gl->MakeCurrent();
@@ -242,36 +252,31 @@ WebGLContext::DestroyResourcesAndContext
mBoundVertexArray = nullptr;
mDefaultVertexArray = nullptr;
mBoundTransformFeedback = nullptr;
mDefaultTransformFeedback = nullptr;
mBoundTransformFeedbackBuffers.Clear();
mBoundUniformBuffers.Clear();
- while (!mTextures.isEmpty())
- mTextures.getLast()->DeleteOnce();
- while (!mVertexArrays.isEmpty())
- mVertexArrays.getLast()->DeleteOnce();
- while (!mBuffers.isEmpty())
- mBuffers.getLast()->DeleteOnce();
- while (!mRenderbuffers.isEmpty())
- mRenderbuffers.getLast()->DeleteOnce();
- while (!mFramebuffers.isEmpty())
- mFramebuffers.getLast()->DeleteOnce();
- while (!mShaders.isEmpty())
- mShaders.getLast()->DeleteOnce();
- while (!mPrograms.isEmpty())
- mPrograms.getLast()->DeleteOnce();
- while (!mQueries.isEmpty())
- mQueries.getLast()->DeleteOnce();
- while (!mSamplers.isEmpty())
- mSamplers.getLast()->DeleteOnce();
- while (!mTransformFeedbacks.isEmpty())
- mTransformFeedbacks.getLast()->DeleteOnce();
+ //////
+
+ ClearLinkedList(mBuffers);
+ ClearLinkedList(mFramebuffers);
+ ClearLinkedList(mPrograms);
+ ClearLinkedList(mQueries);
+ ClearLinkedList(mRenderbuffers);
+ ClearLinkedList(mSamplers);
+ ClearLinkedList(mShaders);
+ ClearLinkedList(mTextures);
+ ClearLinkedList(mTimerQueries);
+ ClearLinkedList(mTransformFeedbacks);
+ ClearLinkedList(mVertexArrays);
+
+ //////
mFakeBlack_2D_0000 = nullptr;
mFakeBlack_2D_0001 = nullptr;
mFakeBlack_CubeMap_0000 = nullptr;
mFakeBlack_CubeMap_0001 = nullptr;
mFakeBlack_3D_0000 = nullptr;
mFakeBlack_3D_0001 = nullptr;
mFakeBlack_2D_Array_0000 = nullptr;
--- a/dom/canvas/WebGLContext.h
+++ b/dom/canvas/WebGLContext.h
@@ -96,16 +96,17 @@ class WebGLExtensionBase;
class WebGLFramebuffer;
class WebGLProgram;
class WebGLQuery;
class WebGLRenderbuffer;
class WebGLSampler;
class WebGLShader;
class WebGLShaderPrecisionFormat;
class WebGLTexture;
+class WebGLTimerQuery;
class WebGLTransformFeedback;
class WebGLUniformLocation;
class WebGLVertexArray;
namespace dom {
class Element;
class ImageData;
class OwningHTMLCanvasElementOrOffscreenCanvas;
@@ -1389,29 +1390,28 @@ protected:
bool ValidateFramebufferTarget(GLenum target, const char* const info);
WebGLRefPtr<WebGLFramebuffer> mBoundDrawFramebuffer;
WebGLRefPtr<WebGLFramebuffer> mBoundReadFramebuffer;
WebGLRefPtr<WebGLRenderbuffer> mBoundRenderbuffer;
WebGLRefPtr<WebGLTransformFeedback> mBoundTransformFeedback;
WebGLRefPtr<WebGLVertexArray> mBoundVertexArray;
- LinkedList<WebGLTexture> mTextures;
LinkedList<WebGLBuffer> mBuffers;
+ LinkedList<WebGLFramebuffer> mFramebuffers;
LinkedList<WebGLProgram> mPrograms;
LinkedList<WebGLQuery> mQueries;
+ LinkedList<WebGLRenderbuffer> mRenderbuffers;
+ LinkedList<WebGLSampler> mSamplers;
LinkedList<WebGLShader> mShaders;
- LinkedList<WebGLRenderbuffer> mRenderbuffers;
- LinkedList<WebGLFramebuffer> mFramebuffers;
+ LinkedList<WebGLTexture> mTextures;
+ LinkedList<WebGLTimerQuery> mTimerQueries;
+ LinkedList<WebGLTransformFeedback> mTransformFeedbacks;
LinkedList<WebGLVertexArray> mVertexArrays;
- // TODO(djg): Does this need a rethink? Should it be WebGL2Context?
- LinkedList<WebGLSampler> mSamplers;
- LinkedList<WebGLTransformFeedback> mTransformFeedbacks;
-
WebGLRefPtr<WebGLTransformFeedback> mDefaultTransformFeedback;
WebGLRefPtr<WebGLVertexArray> mDefaultVertexArray;
// PixelStore parameters
uint32_t mPixelStore_UnpackImageHeight;
uint32_t mPixelStore_UnpackSkipImages;
uint32_t mPixelStore_UnpackRowLength;
uint32_t mPixelStore_UnpackSkipRows;
--- a/dom/canvas/WebGLTimerQuery.cpp
+++ b/dom/canvas/WebGLTimerQuery.cpp
@@ -21,16 +21,17 @@ WebGLTimerQuery::WrapObject(JSContext* c
}
WebGLTimerQuery::WebGLTimerQuery(WebGLContext* webgl, GLuint name)
: WebGLContextBoundObject(webgl)
, mGLName(name)
, mTarget(LOCAL_GL_NONE)
, mCanBeAvailable(false)
{
+ mContext->mTimerQueries.insertBack(this);
}
WebGLTimerQuery::~WebGLTimerQuery()
{
DeleteOnce();
}
WebGLTimerQuery*
@@ -40,18 +41,22 @@ WebGLTimerQuery::Create(WebGLContext* we
webgl->MakeContextCurrent();
webgl->gl->fGenQueries(1, &name);
return new WebGLTimerQuery(webgl, name);
}
void
WebGLTimerQuery::Delete()
{
- mContext->MakeContextCurrent();
- mContext->gl->fDeleteQueries(1, &mGLName);
+ gl::GLContext* gl = mContext->GL();
+
+ gl->MakeCurrent();
+ gl->fDeleteQueries(1, &mGLName);
+
+ LinkedListElement<WebGLTimerQuery>::removeFrom(mContext->mTimerQueries);
}
WebGLContext*
WebGLTimerQuery::GetParentObject() const
{
return mContext;
}
--- a/dom/canvas/WebGLTimerQuery.h
+++ b/dom/canvas/WebGLTimerQuery.h
@@ -11,16 +11,17 @@
#include "nsWrapperCache.h"
#include "WebGLObjectModel.h"
namespace mozilla {
class WebGLTimerQuery final
: public nsWrapperCache
, public WebGLRefCountedObject<WebGLTimerQuery>
+ , public LinkedListElement<WebGLTimerQuery>
, public WebGLContextBoundObject
{
public:
static WebGLTimerQuery* Create(WebGLContext* webgl);
void Delete();
bool HasEverBeenBound() const { return mTarget != LOCAL_GL_NONE; }