Add destroy hooks for several GL objects.
These hooks allow the back-end renderer to free object resources
without having to store pointers to shared device handles for
each and every object. This will allow us to save memory on
back-ends that really care about memory overhead.
There is a downside in that there is more boilerplate in passing
gl::Context handles around everywhere.
BUG=angleproject:1684
Change-Id: I89463bba8d23f92920e8956650cb73c7fc6d66b7
Reviewed-on: https://chromium-review.googlesource.com/426401
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp
index 246ab66..0f6a15b 100644
--- a/src/libANGLE/Context.cpp
+++ b/src/libANGLE/Context.cpp
@@ -385,7 +385,7 @@
void Context::destroy(egl::Display *display)
{
- mGLState.reset();
+ mGLState.reset(this);
for (auto fence : mFenceNVMap)
{
@@ -409,7 +409,7 @@
{
if (transformFeedback.second != nullptr)
{
- transformFeedback.second->release();
+ transformFeedback.second->release(this);
}
}
@@ -424,6 +424,15 @@
releaseSurface(display);
SafeDelete(mCompiler);
+
+ mState.mBuffers->release(this);
+ mState.mShaderPrograms->release(this);
+ mState.mTextures->release(this);
+ mState.mRenderbuffers->release(this);
+ mState.mSamplers->release(this);
+ mState.mFenceSyncs->release(this);
+ mState.mPaths->release(this);
+ mState.mFramebuffers->release(this);
}
Context::~Context()
@@ -616,17 +625,17 @@
detachBuffer(buffer);
}
- mState.mBuffers->deleteObject(buffer);
+ mState.mBuffers->deleteObject(this, buffer);
}
void Context::deleteShader(GLuint shader)
{
- mState.mShaderPrograms->deleteShader(shader);
+ mState.mShaderPrograms->deleteShader(this, shader);
}
void Context::deleteProgram(GLuint program)
{
- mState.mShaderPrograms->deleteProgram(program);
+ mState.mShaderPrograms->deleteProgram(this, program);
}
void Context::deleteTexture(GLuint texture)
@@ -636,7 +645,7 @@
detachTexture(texture);
}
- mState.mTextures->deleteObject(texture);
+ mState.mTextures->deleteObject(this, texture);
}
void Context::deleteRenderbuffer(GLuint renderbuffer)
@@ -646,7 +655,7 @@
detachRenderbuffer(renderbuffer);
}
- mState.mRenderbuffers->deleteObject(renderbuffer);
+ mState.mRenderbuffers->deleteObject(this, renderbuffer);
}
void Context::deleteFenceSync(GLsync fenceSync)
@@ -655,7 +664,8 @@
// wait commands finish. However, since the name becomes invalid, we cannot query the fence,
// and since our API is currently designed for being called from a single thread, we can delete
// the fence immediately.
- mState.mFenceSyncs->deleteObject(static_cast<GLuint>(reinterpret_cast<uintptr_t>(fenceSync)));
+ mState.mFenceSyncs->deleteObject(this,
+ static_cast<GLuint>(reinterpret_cast<uintptr_t>(fenceSync)));
}
void Context::deletePaths(GLuint first, GLsizei range)
@@ -772,7 +782,7 @@
detachSampler(sampler);
}
- mState.mSamplers->deleteObject(sampler);
+ mState.mSamplers->deleteObject(this, sampler);
}
void Context::deleteTransformFeedback(GLuint transformFeedback)
@@ -784,7 +794,7 @@
if (transformFeedbackObject != nullptr)
{
detachTransformFeedback(transformFeedback);
- transformFeedbackObject->release();
+ transformFeedbackObject->release(this);
}
mTransformFeedbackMap.erase(iter);
@@ -799,7 +809,7 @@
detachFramebuffer(framebuffer);
}
- mState.mFramebuffers->deleteObject(framebuffer);
+ mState.mFramebuffers->deleteObject(this, framebuffer);
}
void Context::deleteFenceNV(GLuint fence)
@@ -1068,7 +1078,7 @@
void Context::useProgram(GLuint program)
{
- mGLState.setProgram(getProgram(program));
+ mGLState.setProgram(this, getProgram(program));
}
void Context::bindTransformFeedback(GLuint transformFeedbackHandle)
@@ -2378,7 +2388,7 @@
ASSERT(transformFeedback != nullptr);
ASSERT(!transformFeedback->isPaused());
- transformFeedback->begin(primitiveMode, mGLState.getProgram());
+ transformFeedback->begin(this, primitiveMode, mGLState.getProgram());
}
bool Context::hasActiveTransformFeedback(GLuint program) const