Bug 1382104 - Don't call GL commands if MakeCurrent failed. - r=daoshengmu
MozReview-Commit-ID: DaXUv0snPlr
--- a/dom/canvas/WebGLBuffer.cpp
+++ b/dom/canvas/WebGLBuffer.cpp
@@ -52,18 +52,19 @@ WebGLBuffer::SetContentAfterBind(GLenum
default:
MOZ_CRASH("GFX: invalid target");
}
}
void
WebGLBuffer::Delete()
{
- mContext->MakeContextCurrent();
- mContext->gl->fDeleteBuffers(1, &mGLName);
+ if (mContext->gl->MakeCurrent()) {
+ mContext->gl->fDeleteBuffers(1, &mGLName);
+ }
mByteLength = 0;
mIndexCache = nullptr;
mIndexRanges.clear();
LinkedListElement<WebGLBuffer>::remove(); // remove from mContext->mBuffers
}
////////////////////////////////////////
--- a/dom/canvas/WebGLContext.cpp
+++ b/dom/canvas/WebGLContext.cpp
@@ -216,17 +216,26 @@ ClearLinkedList(LinkedList<T>& list)
}
void
WebGLContext::DestroyResourcesAndContext()
{
if (!gl)
return;
- gl->MakeCurrent();
+ if (gl->MakeCurrent()) {
+ if (mEmptyTFO) {
+ gl->fDeleteTransformFeedbacks(1, &mEmptyTFO);
+ mEmptyTFO = 0;
+ }
+ if (mFakeVertexAttrib0BufferObject) {
+ gl->fDeleteBuffers(1, &mFakeVertexAttrib0BufferObject);
+ mFakeVertexAttrib0BufferObject = 0;
+ }
+ }
mBound2DTextures.Clear();
mBoundCubeMapTextures.Clear();
mBound3DTextures.Clear();
mBound2DArrayTextures.Clear();
mBoundSamplers.Clear();
mBoundArrayBuffer = nullptr;
mBoundCopyReadBuffer = nullptr;
@@ -261,37 +270,25 @@ WebGLContext::DestroyResourcesAndContext
ClearLinkedList(mShaders);
ClearLinkedList(mSyncs);
ClearLinkedList(mTextures);
ClearLinkedList(mTransformFeedbacks);
ClearLinkedList(mVertexArrays);
//////
- if (mEmptyTFO) {
- gl->fDeleteTransformFeedbacks(1, &mEmptyTFO);
- mEmptyTFO = 0;
- }
-
- //////
-
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;
mFakeBlack_2D_Array_0001 = nullptr;
- if (mFakeVertexAttrib0BufferObject) {
- gl->fDeleteBuffers(1, &mFakeVertexAttrib0BufferObject);
- mFakeVertexAttrib0BufferObject = 0;
- }
-
// disable all extensions except "WEBGL_lose_context". see bug #927969
// spec: http://www.khronos.org/registry/webgl/specs/latest/1.0/#5.15.2
for (size_t i = 0; i < size_t(WebGLExtensionID::Max); ++i) {
WebGLExtensionID extension = WebGLExtensionID(i);
if (!IsExtensionEnabled(extension) || (extension == WebGLExtensionID::WEBGL_lose_context))
continue;
--- a/dom/canvas/WebGLFramebuffer.cpp
+++ b/dom/canvas/WebGLFramebuffer.cpp
@@ -650,18 +650,19 @@ WebGLFramebuffer::Delete()
mDepthAttachment.Clear(funcName);
mStencilAttachment.Clear(funcName);
mDepthStencilAttachment.Clear(funcName);
for (auto& cur : mColorAttachments) {
cur.Clear(funcName);
}
- mContext->MakeContextCurrent();
- mContext->gl->fDeleteFramebuffers(1, &mGLName);
+ if (mContext->gl->MakeCurrent()) {
+ mContext->gl->fDeleteFramebuffers(1, &mGLName);
+ }
LinkedListElement<WebGLFramebuffer>::removeFrom(mContext->mFramebuffers);
#ifdef ANDROID
mIsFB = false;
#endif
}
--- a/dom/canvas/WebGLProgram.cpp
+++ b/dom/canvas/WebGLProgram.cpp
@@ -477,20 +477,19 @@ WebGLProgram::WebGLProgram(WebGLContext*
WebGLProgram::~WebGLProgram()
{
DeleteOnce();
}
void
WebGLProgram::Delete()
{
- gl::GLContext* gl = mContext->GL();
-
- gl->MakeCurrent();
- gl->fDeleteProgram(mGLName);
+ if (mContext->gl->MakeCurrent()) {
+ mContext->gl->fDeleteProgram(mGLName);
+ }
mVertShader = nullptr;
mFragShader = nullptr;
mMostRecentLinkInfo = nullptr;
LinkedListElement<WebGLProgram>::removeFrom(mContext->mPrograms);
}
--- a/dom/canvas/WebGLQuery.cpp
+++ b/dom/canvas/WebGLQuery.cpp
@@ -51,18 +51,19 @@ WebGLQuery::WebGLQuery(WebGLContext* web
, mCanBeAvailable(false)
{
mContext->mQueries.insertBack(this);
}
void
WebGLQuery::Delete()
{
- mContext->MakeContextCurrent();
- mContext->gl->fDeleteQueries(1, &mGLName);
+ if (mContext->gl->MakeCurrent()) {
+ mContext->gl->fDeleteQueries(1, &mGLName);
+ }
LinkedListElement<WebGLQuery>::removeFrom(mContext->mQueries);
}
////
static GLenum
TargetForDriver(const gl::GLContext* gl, GLenum target)
{
--- a/dom/canvas/WebGLRenderbuffer.cpp
+++ b/dom/canvas/WebGLRenderbuffer.cpp
@@ -57,21 +57,22 @@ WebGLRenderbuffer::WebGLRenderbuffer(Web
, mHasBeenBound(false)
{
mContext->mRenderbuffers.insertBack(this);
}
void
WebGLRenderbuffer::Delete()
{
- mContext->MakeContextCurrent();
-
- mContext->gl->fDeleteRenderbuffers(1, &mPrimaryRB);
- if (mSecondaryRB)
- mContext->gl->fDeleteRenderbuffers(1, &mSecondaryRB);
+ if (mContext->gl->MakeCurrent()) {
+ mContext->gl->fDeleteRenderbuffers(1, &mPrimaryRB);
+ if (mSecondaryRB) {
+ mContext->gl->fDeleteRenderbuffers(1, &mSecondaryRB);
+ }
+ }
LinkedListElement<WebGLRenderbuffer>::removeFrom(mContext->mRenderbuffers);
}
int64_t
WebGLRenderbuffer::MemoryUsage() const
{
// If there is no defined format, we're not taking up any memory
--- a/dom/canvas/WebGLSampler.cpp
+++ b/dom/canvas/WebGLSampler.cpp
@@ -30,18 +30,19 @@ WebGLSampler::WebGLSampler(WebGLContext*
WebGLSampler::~WebGLSampler()
{
DeleteOnce();
}
void
WebGLSampler::Delete()
{
- mContext->MakeContextCurrent();
- mContext->gl->fDeleteSamplers(1, &mGLName);
+ if (mContext->gl->MakeCurrent()) {
+ mContext->gl->fDeleteSamplers(1, &mGLName);
+ }
removeFrom(mContext->mSamplers);
}
WebGLContext*
WebGLSampler::GetParentObject() const
{
return mContext;
--- a/dom/canvas/WebGLShader.cpp
+++ b/dom/canvas/WebGLShader.cpp
@@ -441,20 +441,19 @@ WebGLShader::SizeOfIncludingThis(MallocS
mValidationLog.SizeOfExcludingThisIfUnshared(mallocSizeOf) +
mTranslatedSource.SizeOfExcludingThisIfUnshared(mallocSizeOf) +
mCompilationLog.SizeOfExcludingThisIfUnshared(mallocSizeOf);
}
void
WebGLShader::Delete()
{
- gl::GLContext* gl = mContext->GL();
-
- gl->MakeCurrent();
- gl->fDeleteShader(mGLName);
+ if (mContext->gl->MakeCurrent()) {
+ mContext->gl->fDeleteShader(mGLName);
+ }
LinkedListElement<WebGLShader>::removeFrom(mContext->mShaders);
}
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_0(WebGLShader)
NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(WebGLShader, AddRef)
NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(WebGLShader, Release)
--- a/dom/canvas/WebGLSync.cpp
+++ b/dom/canvas/WebGLSync.cpp
@@ -21,19 +21,19 @@ WebGLSync::WebGLSync(WebGLContext* webgl
WebGLSync::~WebGLSync()
{
DeleteOnce();
}
void
WebGLSync::Delete()
{
- mContext->MakeContextCurrent();
- mContext->gl->fDeleteSync(mGLName);
- mGLName = 0;
+ if (mContext->gl->MakeCurrent()) {
+ mContext->gl->fDeleteSync(mGLName);
+ }
LinkedListElement<WebGLSync>::removeFrom(mContext->mSyncs);
}
WebGLContext*
WebGLSync::GetParentObject() const
{
return mContext;
}
--- a/dom/canvas/WebGLTexture.cpp
+++ b/dom/canvas/WebGLTexture.cpp
@@ -147,18 +147,19 @@ WebGLTexture::WebGLTexture(WebGLContext*
void
WebGLTexture::Delete()
{
const char funcName[] = "WebGLTexture::Delete";
for (auto& cur : mImageInfoArr) {
cur.Clear(funcName);
}
- mContext->MakeContextCurrent();
- mContext->gl->fDeleteTextures(1, &mGLName);
+ if (mContext->gl->MakeCurrent()) {
+ mContext->gl->fDeleteTextures(1, &mGLName);
+ }
LinkedListElement<WebGLTexture>::removeFrom(mContext->mTextures);
}
size_t
WebGLTexture::MemoryUsage() const
{
if (IsDeleted())
--- a/dom/canvas/WebGLTransformFeedback.cpp
+++ b/dom/canvas/WebGLTransformFeedback.cpp
@@ -25,18 +25,17 @@ WebGLTransformFeedback::WebGLTransformFe
WebGLTransformFeedback::~WebGLTransformFeedback()
{
DeleteOnce();
}
void
WebGLTransformFeedback::Delete()
{
- if (mGLName) {
- mContext->MakeContextCurrent();
+ if (mContext->gl->MakeCurrent()) {
mContext->gl->fDeleteTransformFeedbacks(1, &mGLName);
}
removeFrom(mContext->mTransformFeedbacks);
}
////////////////////////////////////////
void
--- a/dom/canvas/WebGLVertexArrayGL.cpp
+++ b/dom/canvas/WebGLVertexArrayGL.cpp
@@ -20,18 +20,19 @@ WebGLVertexArrayGL::~WebGLVertexArrayGL(
DeleteOnce();
}
void
WebGLVertexArrayGL::DeleteImpl()
{
mElementArrayBuffer = nullptr;
- mContext->MakeContextCurrent();
- mContext->gl->fDeleteVertexArrays(1, &mGLName);
+ if (mContext->gl->MakeCurrent()) {
+ mContext->gl->fDeleteVertexArrays(1, &mGLName);
+ }
mIsVAO = false;
}
void
WebGLVertexArrayGL::BindVertexArrayImpl()
{
mContext->mBoundVertexArray = this;