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