Pass gl::Context to impl methods instead of ContextImpl.

In some cases we might have to call back into the GL layer, passing
the Context, and if we just have a ContextImpl pointer this isn't
possible. It also removes the need for SafeGetImpl.

BUG=angleproject:2044

Change-Id: I6363e84b25648c992c25779d4c43f795aa2866d6
Reviewed-on: https://chromium-review.googlesource.com/516835
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/Buffer.cpp b/src/libANGLE/Buffer.cpp
index 5e6412f..77b9ff9 100644
--- a/src/libANGLE/Buffer.cpp
+++ b/src/libANGLE/Buffer.cpp
@@ -48,7 +48,7 @@
 {
     // In tests, mImpl might be null.
     if (mImpl)
-        mImpl->destroy(rx::SafeGetImpl(context));
+        mImpl->destroy(context);
 }
 
 void Buffer::setLabel(const std::string &label)
@@ -80,7 +80,7 @@
         dataForImpl = scratchBuffer->data();
     }
 
-    ANGLE_TRY(mImpl->setData(rx::SafeGetImpl(context), target, dataForImpl, size, usage));
+    ANGLE_TRY(mImpl->setData(context, target, dataForImpl, size, usage));
 
     mIndexRangeCache.clear();
     mState.mUsage = usage;
@@ -95,7 +95,7 @@
                             GLsizeiptr size,
                             GLintptr offset)
 {
-    ANGLE_TRY(mImpl->setSubData(rx::SafeGetImpl(context), target, data, size, offset));
+    ANGLE_TRY(mImpl->setSubData(context, target, data, size, offset));
 
     mIndexRangeCache.invalidateRange(static_cast<unsigned int>(offset), static_cast<unsigned int>(size));
 
@@ -108,8 +108,8 @@
                                 GLintptr destOffset,
                                 GLsizeiptr size)
 {
-    ANGLE_TRY(mImpl->copySubData(rx::SafeGetImpl(context), source->getImplementation(),
-                                 sourceOffset, destOffset, size));
+    ANGLE_TRY(
+        mImpl->copySubData(context, source->getImplementation(), sourceOffset, destOffset, size));
 
     mIndexRangeCache.invalidateRange(static_cast<unsigned int>(destOffset), static_cast<unsigned int>(size));
 
@@ -121,7 +121,7 @@
     ASSERT(!mState.mMapped);
 
     mState.mMapPointer = nullptr;
-    ANGLE_TRY(mImpl->map(rx::SafeGetImpl(context), access, &mState.mMapPointer));
+    ANGLE_TRY(mImpl->map(context, access, &mState.mMapPointer));
 
     ASSERT(access == GL_WRITE_ONLY_OES);
 
@@ -144,8 +144,7 @@
     ASSERT(offset + length <= mState.mSize);
 
     mState.mMapPointer = nullptr;
-    ANGLE_TRY(
-        mImpl->mapRange(rx::SafeGetImpl(context), offset, length, access, &mState.mMapPointer));
+    ANGLE_TRY(mImpl->mapRange(context, offset, length, access, &mState.mMapPointer));
 
     mState.mMapped      = GL_TRUE;
     mState.mMapOffset   = static_cast<GLint64>(offset);
@@ -171,7 +170,7 @@
     ASSERT(mState.mMapped);
 
     *result = GL_FALSE;
-    ANGLE_TRY(mImpl->unmap(rx::SafeGetImpl(context), result));
+    ANGLE_TRY(mImpl->unmap(context, result));
 
     mState.mMapped      = GL_FALSE;
     mState.mMapPointer  = nullptr;
diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp
index 8213f3d..3e434b4 100644
--- a/src/libANGLE/Context.cpp
+++ b/src/libANGLE/Context.cpp
@@ -1821,7 +1821,7 @@
 void Context::drawArrays(GLenum mode, GLint first, GLsizei count)
 {
     syncRendererState();
-    auto error = mImplementation->drawArrays(mode, first, count);
+    auto error = mImplementation->drawArrays(this, mode, first, count);
     handleError(error);
     if (!error.isError())
     {
@@ -1832,7 +1832,7 @@
 void Context::drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
 {
     syncRendererState();
-    auto error = mImplementation->drawArraysInstanced(mode, first, count, instanceCount);
+    auto error = mImplementation->drawArraysInstanced(this, mode, first, count, instanceCount);
     handleError(error);
     if (!error.isError())
     {
@@ -1844,7 +1844,7 @@
 {
     syncRendererState();
     const IndexRange &indexRange = getParams<HasIndexRange>().getIndexRange().value();
-    handleError(mImplementation->drawElements(mode, count, type, indices, indexRange));
+    handleError(mImplementation->drawElements(this, mode, count, type, indices, indexRange));
 }
 
 void Context::drawElementsInstanced(GLenum mode,
@@ -1855,8 +1855,8 @@
 {
     syncRendererState();
     const IndexRange &indexRange = getParams<HasIndexRange>().getIndexRange().value();
-    handleError(
-        mImplementation->drawElementsInstanced(mode, count, type, indices, instances, indexRange));
+    handleError(mImplementation->drawElementsInstanced(this, mode, count, type, indices, instances,
+                                                       indexRange));
 }
 
 void Context::drawRangeElements(GLenum mode,
@@ -1868,20 +1868,20 @@
 {
     syncRendererState();
     const IndexRange &indexRange = getParams<HasIndexRange>().getIndexRange().value();
-    handleError(
-        mImplementation->drawRangeElements(mode, start, end, count, type, indices, indexRange));
+    handleError(mImplementation->drawRangeElements(this, mode, start, end, count, type, indices,
+                                                   indexRange));
 }
 
 void Context::drawArraysIndirect(GLenum mode, const void *indirect)
 {
     syncRendererState();
-    handleError(mImplementation->drawArraysIndirect(mode, indirect));
+    handleError(mImplementation->drawArraysIndirect(this, mode, indirect));
 }
 
 void Context::drawElementsIndirect(GLenum mode, GLenum type, const void *indirect)
 {
     syncRendererState();
-    handleError(mImplementation->drawElementsIndirect(mode, type, indirect));
+    handleError(mImplementation->drawElementsIndirect(this, mode, type, indirect));
 }
 
 void Context::flush()
@@ -2782,34 +2782,31 @@
 
     syncStateForBlit();
 
-    handleError(drawFramebuffer->blit(mImplementation.get(), srcArea, dstArea, mask, filter));
+    handleError(drawFramebuffer->blit(this, srcArea, dstArea, mask, filter));
 }
 
 void Context::clear(GLbitfield mask)
 {
     syncStateForClear();
-    handleError(mGLState.getDrawFramebuffer()->clear(mImplementation.get(), mask));
+    handleError(mGLState.getDrawFramebuffer()->clear(this, mask));
 }
 
 void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
 {
     syncStateForClear();
-    handleError(mGLState.getDrawFramebuffer()->clearBufferfv(mImplementation.get(), buffer,
-                                                             drawbuffer, values));
+    handleError(mGLState.getDrawFramebuffer()->clearBufferfv(this, buffer, drawbuffer, values));
 }
 
 void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
 {
     syncStateForClear();
-    handleError(mGLState.getDrawFramebuffer()->clearBufferuiv(mImplementation.get(), buffer,
-                                                              drawbuffer, values));
+    handleError(mGLState.getDrawFramebuffer()->clearBufferuiv(this, buffer, drawbuffer, values));
 }
 
 void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
 {
     syncStateForClear();
-    handleError(mGLState.getDrawFramebuffer()->clearBufferiv(mImplementation.get(), buffer,
-                                                             drawbuffer, values));
+    handleError(mGLState.getDrawFramebuffer()->clearBufferiv(this, buffer, drawbuffer, values));
 }
 
 void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
@@ -2825,8 +2822,7 @@
     }
 
     syncStateForClear();
-    handleError(framebufferObject->clearBufferfi(mImplementation.get(), buffer, drawbuffer, depth,
-                                                 stencil));
+    handleError(framebufferObject->clearBufferfi(this, buffer, drawbuffer, depth, stencil));
 }
 
 void Context::readPixels(GLint x,
@@ -2848,7 +2844,7 @@
     ASSERT(framebufferObject);
 
     Rectangle area(x, y, width, height);
-    handleError(framebufferObject->readPixels(mImplementation.get(), area, format, type, pixels));
+    handleError(framebufferObject->readPixels(this, area, format, type, pixels));
 }
 
 void Context::copyTexImage2D(GLenum target,
diff --git a/src/libANGLE/Framebuffer.cpp b/src/libANGLE/Framebuffer.cpp
index 38eae38..a2aac1d 100644
--- a/src/libANGLE/Framebuffer.cpp
+++ b/src/libANGLE/Framebuffer.cpp
@@ -480,12 +480,12 @@
 
 void Framebuffer::destroy(const Context *context)
 {
-    mImpl->destroy(rx::SafeGetImpl(context));
+    mImpl->destroy(context);
 }
 
 void Framebuffer::destroyDefault(const egl::Display *display)
 {
-    mImpl->destroyDefault(rx::SafeGetImpl(display));
+    mImpl->destroyDefault(display);
 }
 
 void Framebuffer::setLabel(const std::string &label)
@@ -934,7 +934,7 @@
     return mImpl->invalidateSub(count, attachments, area);
 }
 
-Error Framebuffer::clear(rx::ContextImpl *context, GLbitfield mask)
+Error Framebuffer::clear(const gl::Context *context, GLbitfield mask)
 {
     if (context->getGLState().isRasterizerDiscardEnabled())
     {
@@ -944,7 +944,7 @@
     return mImpl->clear(context, mask);
 }
 
-Error Framebuffer::clearBufferfv(rx::ContextImpl *context,
+Error Framebuffer::clearBufferfv(const gl::Context *context,
                                  GLenum buffer,
                                  GLint drawbuffer,
                                  const GLfloat *values)
@@ -957,7 +957,7 @@
     return mImpl->clearBufferfv(context, buffer, drawbuffer, values);
 }
 
-Error Framebuffer::clearBufferuiv(rx::ContextImpl *context,
+Error Framebuffer::clearBufferuiv(const gl::Context *context,
                                   GLenum buffer,
                                   GLint drawbuffer,
                                   const GLuint *values)
@@ -970,7 +970,7 @@
     return mImpl->clearBufferuiv(context, buffer, drawbuffer, values);
 }
 
-Error Framebuffer::clearBufferiv(rx::ContextImpl *context,
+Error Framebuffer::clearBufferiv(const gl::Context *context,
                                  GLenum buffer,
                                  GLint drawbuffer,
                                  const GLint *values)
@@ -983,7 +983,7 @@
     return mImpl->clearBufferiv(context, buffer, drawbuffer, values);
 }
 
-Error Framebuffer::clearBufferfi(rx::ContextImpl *context,
+Error Framebuffer::clearBufferfi(const gl::Context *context,
                                  GLenum buffer,
                                  GLint drawbuffer,
                                  GLfloat depth,
@@ -1007,7 +1007,7 @@
     return mImpl->getImplementationColorReadType();
 }
 
-Error Framebuffer::readPixels(rx::ContextImpl *context,
+Error Framebuffer::readPixels(const gl::Context *context,
                               const Rectangle &area,
                               GLenum format,
                               GLenum type,
@@ -1024,7 +1024,7 @@
     return NoError();
 }
 
-Error Framebuffer::blit(rx::ContextImpl *context,
+Error Framebuffer::blit(const gl::Context *context,
                         const Rectangle &sourceArea,
                         const Rectangle &destArea,
                         GLbitfield mask,
@@ -1272,7 +1272,7 @@
 {
     if (mDirtyBits.any())
     {
-        mImpl->syncState(rx::SafeGetImpl(context), mDirtyBits);
+        mImpl->syncState(context, mDirtyBits);
         mDirtyBits.reset();
         if (mId != 0)
         {
diff --git a/src/libANGLE/Framebuffer.h b/src/libANGLE/Framebuffer.h
index 516c98f..e4fcc26 100644
--- a/src/libANGLE/Framebuffer.h
+++ b/src/libANGLE/Framebuffer.h
@@ -23,7 +23,6 @@
 
 namespace rx
 {
-class ContextImpl;
 class GLImplFactory;
 class FramebufferImpl;
 class RenderbufferImpl;
@@ -211,20 +210,20 @@
     Error invalidate(size_t count, const GLenum *attachments);
     Error invalidateSub(size_t count, const GLenum *attachments, const gl::Rectangle &area);
 
-    Error clear(rx::ContextImpl *context, GLbitfield mask);
-    Error clearBufferfv(rx::ContextImpl *context,
+    Error clear(const gl::Context *context, GLbitfield mask);
+    Error clearBufferfv(const gl::Context *context,
                         GLenum buffer,
                         GLint drawbuffer,
                         const GLfloat *values);
-    Error clearBufferuiv(rx::ContextImpl *context,
+    Error clearBufferuiv(const gl::Context *context,
                          GLenum buffer,
                          GLint drawbuffer,
                          const GLuint *values);
-    Error clearBufferiv(rx::ContextImpl *context,
+    Error clearBufferiv(const gl::Context *context,
                         GLenum buffer,
                         GLint drawbuffer,
                         const GLint *values);
-    Error clearBufferfi(rx::ContextImpl *context,
+    Error clearBufferfi(const gl::Context *context,
                         GLenum buffer,
                         GLint drawbuffer,
                         GLfloat depth,
@@ -232,13 +231,13 @@
 
     GLenum getImplementationColorReadFormat() const;
     GLenum getImplementationColorReadType() const;
-    Error readPixels(rx::ContextImpl *context,
+    Error readPixels(const gl::Context *context,
                      const gl::Rectangle &area,
                      GLenum format,
                      GLenum type,
                      void *pixels) const;
 
-    Error blit(rx::ContextImpl *context,
+    Error blit(const gl::Context *context,
                const Rectangle &sourceArea,
                const Rectangle &destArea,
                GLbitfield mask,
diff --git a/src/libANGLE/Program.cpp b/src/libANGLE/Program.cpp
index 95d2763..d12c5ae 100644
--- a/src/libANGLE/Program.cpp
+++ b/src/libANGLE/Program.cpp
@@ -447,7 +447,7 @@
         mState.mAttachedComputeShader = nullptr;
     }
 
-    mProgram->destroy(rx::SafeGetImpl(context));
+    mProgram->destroy(context);
 }
 
 void Program::setLabel(const std::string &label)
@@ -672,8 +672,7 @@
         }
 
         gl::VaryingPacking noPacking(0, PackMode::ANGLE_RELAXED);
-        ANGLE_TRY_RESULT(mProgram->link(context->getImplementation(), noPacking, mInfoLog),
-                         mLinked);
+        ANGLE_TRY_RESULT(mProgram->link(context, noPacking, mInfoLog), mLinked);
         if (!mLinked)
         {
             return NoError();
@@ -742,8 +741,7 @@
             return NoError();
         }
 
-        ANGLE_TRY_RESULT(mProgram->link(context->getImplementation(), varyingPacking, mInfoLog),
-                         mLinked);
+        ANGLE_TRY_RESULT(mProgram->link(context, varyingPacking, mInfoLog), mLinked);
         if (!mLinked)
         {
             return NoError();
@@ -957,7 +955,7 @@
         mState.mSamplerBindings.emplace_back(SamplerBinding(textureType, bindingCount));
     }
 
-    ANGLE_TRY_RESULT(mProgram->load(context->getImplementation(), mInfoLog, &stream), mLinked);
+    ANGLE_TRY_RESULT(mProgram->load(context, mInfoLog, &stream), mLinked);
 
     return NoError();
 #endif  // #if ANGLE_PROGRAM_BINARY_LOAD == ANGLE_ENABLED
diff --git a/src/libANGLE/Surface.cpp b/src/libANGLE/Surface.cpp
index 231dab6..0db540e 100644
--- a/src/libANGLE/Surface.cpp
+++ b/src/libANGLE/Surface.cpp
@@ -97,14 +97,14 @@
     }
     if (mImplementation)
     {
-        mImplementation->destroy(rx::SafeGetImpl(display));
+        mImplementation->destroy(display);
     }
     delete this;
 }
 
 Error Surface::initialize(const Display &display)
 {
-    ANGLE_TRY(mImplementation->initialize(display.getImplementation()));
+    ANGLE_TRY(mImplementation->initialize(&display));
 
     // Initialized here since impl is nullptr in the constructor.
     // Must happen after implementation initialize for Android.
@@ -149,7 +149,7 @@
 
 Error Surface::swap(const Display &display)
 {
-    return mImplementation->swap(display.getImplementation());
+    return mImplementation->swap(&display);
 }
 
 Error Surface::swapWithDamage(EGLint *rects, EGLint n_rects)
diff --git a/src/libANGLE/Surface_unittest.cpp b/src/libANGLE/Surface_unittest.cpp
index 022be38..ca04f4f 100644
--- a/src/libANGLE/Surface_unittest.cpp
+++ b/src/libANGLE/Surface_unittest.cpp
@@ -28,10 +28,10 @@
     MockSurfaceImpl() : SurfaceImpl(mockState), mockState(nullptr) {}
     virtual ~MockSurfaceImpl() { destructor(); }
 
-    MOCK_METHOD1(destroy, void(const DisplayImpl *));
-    MOCK_METHOD1(initialize, egl::Error(const DisplayImpl *));
+    MOCK_METHOD1(destroy, void(const egl::Display *));
+    MOCK_METHOD1(initialize, egl::Error(const egl::Display *));
     MOCK_METHOD1(createDefaultFramebuffer, rx::FramebufferImpl *(const gl::FramebufferState &data));
-    MOCK_METHOD1(swap, egl::Error(const DisplayImpl *));
+    MOCK_METHOD1(swap, egl::Error(const egl::Display *));
     MOCK_METHOD2(swapWithDamage, egl::Error(EGLint *, EGLint));
     MOCK_METHOD4(postSubBuffer, egl::Error(EGLint, EGLint, EGLint, EGLint));
     MOCK_METHOD2(querySurfacePointerANGLE, egl::Error(EGLint, void**));
diff --git a/src/libANGLE/Texture.cpp b/src/libANGLE/Texture.cpp
index 4186aee..e4b7203 100644
--- a/src/libANGLE/Texture.cpp
+++ b/src/libANGLE/Texture.cpp
@@ -882,8 +882,8 @@
     releaseTexImageInternal();
     orphanImages();
 
-    ANGLE_TRY(mTexture->setImage(rx::SafeGetImpl(context), target, level, internalFormat, size,
-                                 format, type, unpackState, pixels));
+    ANGLE_TRY(mTexture->setImage(context, target, level, internalFormat, size, format, type,
+                                 unpackState, pixels));
 
     mState.setImageDesc(target, level, ImageDesc(size, Format(internalFormat, type)));
     mDirtyChannel.signal();
@@ -902,8 +902,7 @@
 {
     ASSERT(target == mState.mTarget ||
            (mState.mTarget == GL_TEXTURE_CUBE_MAP && IsCubeMapTextureTarget(target)));
-    return mTexture->setSubImage(rx::SafeGetImpl(context), target, level, area, format, type,
-                                 unpackState, pixels);
+    return mTexture->setSubImage(context, target, level, area, format, type, unpackState, pixels);
 }
 
 Error Texture::setCompressedImage(const Context *context,
@@ -922,8 +921,8 @@
     releaseTexImageInternal();
     orphanImages();
 
-    ANGLE_TRY(mTexture->setCompressedImage(rx::SafeGetImpl(context), target, level, internalFormat,
-                                           size, unpackState, imageSize, pixels));
+    ANGLE_TRY(mTexture->setCompressedImage(context, target, level, internalFormat, size,
+                                           unpackState, imageSize, pixels));
 
     mState.setImageDesc(target, level, ImageDesc(size, Format(internalFormat)));
     mDirtyChannel.signal();
@@ -943,8 +942,8 @@
     ASSERT(target == mState.mTarget ||
            (mState.mTarget == GL_TEXTURE_CUBE_MAP && IsCubeMapTextureTarget(target)));
 
-    return mTexture->setCompressedSubImage(rx::SafeGetImpl(context), target, level, area, format,
-                                           unpackState, imageSize, pixels);
+    return mTexture->setCompressedSubImage(context, target, level, area, format, unpackState,
+                                           imageSize, pixels);
 }
 
 Error Texture::copyImage(const Context *context,
@@ -961,8 +960,7 @@
     releaseTexImageInternal();
     orphanImages();
 
-    ANGLE_TRY(mTexture->copyImage(rx::SafeGetImpl(context), target, level, sourceArea,
-                                  internalFormat, source));
+    ANGLE_TRY(mTexture->copyImage(context, target, level, sourceArea, internalFormat, source));
 
     const InternalFormat &internalFormatInfo =
         GetInternalFormatInfo(internalFormat, GL_UNSIGNED_BYTE);
@@ -983,8 +981,7 @@
     ASSERT(target == mState.mTarget ||
            (mState.mTarget == GL_TEXTURE_CUBE_MAP && IsCubeMapTextureTarget(target)));
 
-    return mTexture->copySubImage(rx::SafeGetImpl(context), target, level, destOffset, sourceArea,
-                                  source);
+    return mTexture->copySubImage(context, target, level, destOffset, sourceArea, source);
 }
 
 Error Texture::copyTexture(const Context *context,
@@ -1005,9 +1002,9 @@
     releaseTexImageInternal();
     orphanImages();
 
-    ANGLE_TRY(mTexture->copyTexture(rx::SafeGetImpl(context), target, level, internalFormat, type,
-                                    sourceLevel, unpackFlipY, unpackPremultiplyAlpha,
-                                    unpackUnmultiplyAlpha, source));
+    ANGLE_TRY(mTexture->copyTexture(context, target, level, internalFormat, type, sourceLevel,
+                                    unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha,
+                                    source));
 
     const auto &sourceDesc   = source->mState.getImageDesc(source->getTarget(), 0);
     const InternalFormat &internalFormatInfo = GetInternalFormatInfo(internalFormat, type);
@@ -1031,9 +1028,9 @@
     ASSERT(target == mState.mTarget ||
            (mState.mTarget == GL_TEXTURE_CUBE_MAP && IsCubeMapTextureTarget(target)));
 
-    return mTexture->copySubTexture(rx::SafeGetImpl(context), target, level, destOffset,
-                                    sourceLevel, sourceArea, unpackFlipY, unpackPremultiplyAlpha,
-                                    unpackUnmultiplyAlpha, source);
+    return mTexture->copySubTexture(context, target, level, destOffset, sourceLevel, sourceArea,
+                                    unpackFlipY, unpackPremultiplyAlpha, unpackUnmultiplyAlpha,
+                                    source);
 }
 
 Error Texture::copyCompressedTexture(const Context *context, const Texture *source)
@@ -1042,7 +1039,7 @@
     releaseTexImageInternal();
     orphanImages();
 
-    ANGLE_TRY(mTexture->copyCompressedTexture(rx::SafeGetImpl(context), source));
+    ANGLE_TRY(mTexture->copyCompressedTexture(context, source));
 
     ASSERT(source->getTarget() != GL_TEXTURE_CUBE_MAP && getTarget() != GL_TEXTURE_CUBE_MAP);
     const auto &sourceDesc = source->mState.getImageDesc(source->getTarget(), 0);
@@ -1063,7 +1060,7 @@
     releaseTexImageInternal();
     orphanImages();
 
-    ANGLE_TRY(mTexture->setStorage(rx::SafeGetImpl(context), target, levels, internalFormat, size));
+    ANGLE_TRY(mTexture->setStorage(context, target, levels, internalFormat, size));
 
     mState.mImmutableFormat = true;
     mState.mImmutableLevels = static_cast<GLuint>(levels);
@@ -1095,8 +1092,8 @@
     releaseTexImageInternal();
     orphanImages();
 
-    ANGLE_TRY(mTexture->setStorageMultisample(rx::SafeGetImpl(context), target, samples,
-                                              internalFormat, size, fixedSampleLocations));
+    ANGLE_TRY(mTexture->setStorageMultisample(context, target, samples, internalFormat, size,
+                                              fixedSampleLocations));
 
     mState.mImmutableFormat = true;
     mState.mImmutableLevels = static_cast<GLuint>(1);
@@ -1127,7 +1124,7 @@
     if (maxLevel > baseLevel)
     {
         syncImplState();
-        ANGLE_TRY(mTexture->generateMipmap(rx::SafeGetImpl(context)));
+        ANGLE_TRY(mTexture->generateMipmap(context));
 
         const ImageDesc &baseImageInfo =
             mState.getImageDesc(mState.getBaseImageTarget(), baseLevel);
diff --git a/src/libANGLE/VertexArray.cpp b/src/libANGLE/VertexArray.cpp
index b19e6ea..00d2180 100644
--- a/src/libANGLE/VertexArray.cpp
+++ b/src/libANGLE/VertexArray.cpp
@@ -218,7 +218,7 @@
 {
     if (mDirtyBits.any())
     {
-        mVertexArray->syncState(rx::SafeGetImpl(context), mDirtyBits);
+        mVertexArray->syncState(context, mDirtyBits);
         mDirtyBits.reset();
     }
 }
diff --git a/src/libANGLE/angletypes.h b/src/libANGLE/angletypes.h
index 3cb59d5..8842f7a 100644
--- a/src/libANGLE/angletypes.h
+++ b/src/libANGLE/angletypes.h
@@ -334,13 +334,6 @@
     return src != nullptr ? GetAs<DestT>(src->getImplementation()) : nullptr;
 }
 
-// In some cases we want to retrieve an Impl object, while handling nullptr cases trivially.
-template <typename ObjT>
-auto SafeGetImpl(ObjT *src) -> decltype(src->getImplementation())
-{
-    return src ? src->getImplementation() : nullptr;
-}
-
 }  // namespace rx
 
 #include "angletypes.inl"
diff --git a/src/libANGLE/renderer/BufferImpl.h b/src/libANGLE/renderer/BufferImpl.h
index 73afe37..5ca69ee 100644
--- a/src/libANGLE/renderer/BufferImpl.h
+++ b/src/libANGLE/renderer/BufferImpl.h
@@ -18,41 +18,40 @@
 namespace gl
 {
 class BufferState;
+class Context;
 }
 
 namespace rx
 {
-class ContextImpl;
-
 class BufferImpl : angle::NonCopyable
 {
   public:
     BufferImpl(const gl::BufferState &state) : mState(state) {}
     virtual ~BufferImpl() {}
-    virtual void destroy(ContextImpl *contextImpl) {}
+    virtual void destroy(const gl::Context *context) {}
 
-    virtual gl::Error setData(ContextImpl *context,
+    virtual gl::Error setData(const gl::Context *context,
                               GLenum target,
                               const void *data,
                               size_t size,
                               GLenum usage) = 0;
-    virtual gl::Error setSubData(ContextImpl *context,
+    virtual gl::Error setSubData(const gl::Context *context,
                                  GLenum target,
                                  const void *data,
                                  size_t size,
                                  size_t offset) = 0;
-    virtual gl::Error copySubData(ContextImpl *contextImpl,
+    virtual gl::Error copySubData(const gl::Context *context,
                                   BufferImpl *source,
                                   GLintptr sourceOffset,
                                   GLintptr destOffset,
                                   GLsizeiptr size) = 0;
-    virtual gl::Error map(ContextImpl *contextImpl, GLenum access, void **mapPtr) = 0;
-    virtual gl::Error mapRange(ContextImpl *contextImpl,
+    virtual gl::Error map(const gl::Context *context, GLenum access, void **mapPtr) = 0;
+    virtual gl::Error mapRange(const gl::Context *context,
                                size_t offset,
                                size_t length,
                                GLbitfield access,
                                void **mapPtr) = 0;
-    virtual gl::Error unmap(ContextImpl *contextImpl, GLboolean *result) = 0;
+    virtual gl::Error unmap(const gl::Context *context, GLboolean *result) = 0;
 
     virtual gl::Error getIndexRange(GLenum type,
                                     size_t offset,
diff --git a/src/libANGLE/renderer/BufferImpl_mock.h b/src/libANGLE/renderer/BufferImpl_mock.h
index 16a6c1f..68249e5 100644
--- a/src/libANGLE/renderer/BufferImpl_mock.h
+++ b/src/libANGLE/renderer/BufferImpl_mock.h
@@ -22,14 +22,15 @@
     MockBufferImpl() : BufferImpl(mMockState) {}
     ~MockBufferImpl() { destructor(); }
 
-    MOCK_METHOD5(setData, gl::Error(ContextImpl *, GLenum, const void *, size_t, GLenum));
-    MOCK_METHOD5(setSubData, gl::Error(ContextImpl *, GLenum, const void *, size_t, size_t));
-    MOCK_METHOD5(copySubData,
-                 gl::Error(ContextImpl *contextImpl, BufferImpl *, GLintptr, GLintptr, GLsizeiptr));
-    MOCK_METHOD3(map, gl::Error(ContextImpl *contextImpl, GLenum, void **));
+    MOCK_METHOD5(setData, gl::Error(const gl::Context *, GLenum, const void *, size_t, GLenum));
+    MOCK_METHOD5(setSubData, gl::Error(const gl::Context *, GLenum, const void *, size_t, size_t));
+    MOCK_METHOD5(
+        copySubData,
+        gl::Error(const gl::Context *contextImpl, BufferImpl *, GLintptr, GLintptr, GLsizeiptr));
+    MOCK_METHOD3(map, gl::Error(const gl::Context *contextImpl, GLenum, void **));
     MOCK_METHOD5(mapRange,
-                 gl::Error(ContextImpl *contextImpl, size_t, size_t, GLbitfield, void **));
-    MOCK_METHOD2(unmap, gl::Error(ContextImpl *contextImpl, GLboolean *result));
+                 gl::Error(const gl::Context *contextImpl, size_t, size_t, GLbitfield, void **));
+    MOCK_METHOD2(unmap, gl::Error(const gl::Context *contextImpl, GLboolean *result));
 
     MOCK_METHOD5(getIndexRange, gl::Error(GLenum, size_t, size_t, bool, gl::IndexRange *));
 
diff --git a/src/libANGLE/renderer/ContextImpl.h b/src/libANGLE/renderer/ContextImpl.h
index b5f1be9..1597332 100644
--- a/src/libANGLE/renderer/ContextImpl.h
+++ b/src/libANGLE/renderer/ContextImpl.h
@@ -36,24 +36,31 @@
     virtual gl::Error finish() = 0;
 
     // Drawing methods.
-    virtual gl::Error drawArrays(GLenum mode, GLint first, GLsizei count) = 0;
-    virtual gl::Error drawArraysInstanced(GLenum mode,
+    virtual gl::Error drawArrays(const gl::Context *context,
+                                 GLenum mode,
+                                 GLint first,
+                                 GLsizei count) = 0;
+    virtual gl::Error drawArraysInstanced(const gl::Context *context,
+                                          GLenum mode,
                                           GLint first,
                                           GLsizei count,
                                           GLsizei instanceCount) = 0;
 
-    virtual gl::Error drawElements(GLenum mode,
+    virtual gl::Error drawElements(const gl::Context *context,
+                                   GLenum mode,
                                    GLsizei count,
                                    GLenum type,
                                    const void *indices,
                                    const gl::IndexRange &indexRange) = 0;
-    virtual gl::Error drawElementsInstanced(GLenum mode,
+    virtual gl::Error drawElementsInstanced(const gl::Context *context,
+                                            GLenum mode,
                                             GLsizei count,
                                             GLenum type,
                                             const void *indices,
                                             GLsizei instances,
                                             const gl::IndexRange &indexRange) = 0;
-    virtual gl::Error drawRangeElements(GLenum mode,
+    virtual gl::Error drawRangeElements(const gl::Context *context,
+                                        GLenum mode,
                                         GLuint start,
                                         GLuint end,
                                         GLsizei count,
@@ -61,8 +68,13 @@
                                         const void *indices,
                                         const gl::IndexRange &indexRange) = 0;
 
-    virtual gl::Error drawArraysIndirect(GLenum mode, const void *indirect) = 0;
-    virtual gl::Error drawElementsIndirect(GLenum mode, GLenum type, const void *indirect) = 0;
+    virtual gl::Error drawArraysIndirect(const gl::Context *context,
+                                         GLenum mode,
+                                         const void *indirect) = 0;
+    virtual gl::Error drawElementsIndirect(const gl::Context *context,
+                                           GLenum mode,
+                                           GLenum type,
+                                           const void *indirect) = 0;
 
     // CHROMIUM_path_rendering path drawing methods.
     virtual void stencilFillPath(const gl::Path *path, GLenum fillMode, GLuint mask);
diff --git a/src/libANGLE/renderer/FramebufferImpl.h b/src/libANGLE/renderer/FramebufferImpl.h
index b4438f8..c4871bd 100644
--- a/src/libANGLE/renderer/FramebufferImpl.h
+++ b/src/libANGLE/renderer/FramebufferImpl.h
@@ -31,8 +31,8 @@
   public:
     explicit FramebufferImpl(const gl::FramebufferState &state) : mState(state) {}
     virtual ~FramebufferImpl() {}
-    virtual void destroy(ContextImpl *contextImpl) {}
-    virtual void destroyDefault(DisplayImpl *displayImpl) {}
+    virtual void destroy(const gl::Context *context) {}
+    virtual void destroyDefault(const egl::Display *display) {}
 
     virtual gl::Error discard(size_t count, const GLenum *attachments)    = 0;
     virtual gl::Error invalidate(size_t count, const GLenum *attachments) = 0;
@@ -40,20 +40,20 @@
                                     const GLenum *attachments,
                                     const gl::Rectangle &area) = 0;
 
-    virtual gl::Error clear(ContextImpl *context, GLbitfield mask) = 0;
-    virtual gl::Error clearBufferfv(ContextImpl *context,
+    virtual gl::Error clear(const gl::Context *context, GLbitfield mask) = 0;
+    virtual gl::Error clearBufferfv(const gl::Context *context,
                                     GLenum buffer,
                                     GLint drawbuffer,
                                     const GLfloat *values) = 0;
-    virtual gl::Error clearBufferuiv(ContextImpl *context,
+    virtual gl::Error clearBufferuiv(const gl::Context *context,
                                      GLenum buffer,
                                      GLint drawbuffer,
                                      const GLuint *values) = 0;
-    virtual gl::Error clearBufferiv(ContextImpl *context,
+    virtual gl::Error clearBufferiv(const gl::Context *context,
                                     GLenum buffer,
                                     GLint drawbuffer,
                                     const GLint *values) = 0;
-    virtual gl::Error clearBufferfi(ContextImpl *context,
+    virtual gl::Error clearBufferfi(const gl::Context *context,
                                     GLenum buffer,
                                     GLint drawbuffer,
                                     GLfloat depth,
@@ -61,13 +61,13 @@
 
     virtual GLenum getImplementationColorReadFormat() const = 0;
     virtual GLenum getImplementationColorReadType() const   = 0;
-    virtual gl::Error readPixels(ContextImpl *context,
+    virtual gl::Error readPixels(const gl::Context *context,
                                  const gl::Rectangle &area,
                                  GLenum format,
                                  GLenum type,
                                  void *pixels) const = 0;
 
-    virtual gl::Error blit(ContextImpl *context,
+    virtual gl::Error blit(const gl::Context *context,
                            const gl::Rectangle &sourceArea,
                            const gl::Rectangle &destArea,
                            GLbitfield mask,
@@ -75,7 +75,7 @@
 
     virtual bool checkStatus() const = 0;
 
-    virtual void syncState(ContextImpl *contextImpl,
+    virtual void syncState(const gl::Context *context,
                            const gl::Framebuffer::DirtyBits &dirtyBits) = 0;
 
     virtual gl::Error getSamplePosition(size_t index, GLfloat *xy) const = 0;
diff --git a/src/libANGLE/renderer/FramebufferImpl_mock.h b/src/libANGLE/renderer/FramebufferImpl_mock.h
index 401ddb4..a773bcf 100644
--- a/src/libANGLE/renderer/FramebufferImpl_mock.h
+++ b/src/libANGLE/renderer/FramebufferImpl_mock.h
@@ -27,26 +27,30 @@
     MOCK_METHOD2(invalidate, gl::Error(size_t, const GLenum *));
     MOCK_METHOD3(invalidateSub, gl::Error(size_t, const GLenum *, const gl::Rectangle &));
 
-    MOCK_METHOD2(clear, gl::Error(ContextImpl *, GLbitfield));
-    MOCK_METHOD4(clearBufferfv, gl::Error(ContextImpl *, GLenum, GLint, const GLfloat *));
-    MOCK_METHOD4(clearBufferuiv, gl::Error(ContextImpl *, GLenum, GLint, const GLuint *));
-    MOCK_METHOD4(clearBufferiv, gl::Error(ContextImpl *, GLenum, GLint, const GLint *));
-    MOCK_METHOD5(clearBufferfi, gl::Error(ContextImpl *, GLenum, GLint, GLfloat, GLint));
+    MOCK_METHOD2(clear, gl::Error(const gl::Context *, GLbitfield));
+    MOCK_METHOD4(clearBufferfv, gl::Error(const gl::Context *, GLenum, GLint, const GLfloat *));
+    MOCK_METHOD4(clearBufferuiv, gl::Error(const gl::Context *, GLenum, GLint, const GLuint *));
+    MOCK_METHOD4(clearBufferiv, gl::Error(const gl::Context *, GLenum, GLint, const GLint *));
+    MOCK_METHOD5(clearBufferfi, gl::Error(const gl::Context *, GLenum, GLint, GLfloat, GLint));
 
     MOCK_CONST_METHOD0(getImplementationColorReadFormat, GLenum());
     MOCK_CONST_METHOD0(getImplementationColorReadType, GLenum());
-    MOCK_CONST_METHOD5(readPixels,
-                       gl::Error(ContextImpl *, const gl::Rectangle &, GLenum, GLenum, void *));
+    MOCK_CONST_METHOD5(
+        readPixels,
+        gl::Error(const gl::Context *, const gl::Rectangle &, GLenum, GLenum, void *));
 
     MOCK_CONST_METHOD2(getSamplePosition, gl::Error(size_t, GLfloat *));
 
-    MOCK_METHOD5(
-        blit,
-        gl::Error(ContextImpl *, const gl::Rectangle &, const gl::Rectangle &, GLbitfield, GLenum));
+    MOCK_METHOD5(blit,
+                 gl::Error(const gl::Context *,
+                           const gl::Rectangle &,
+                           const gl::Rectangle &,
+                           GLbitfield,
+                           GLenum));
 
     MOCK_CONST_METHOD0(checkStatus, bool());
 
-    MOCK_METHOD2(syncState, void(ContextImpl *, const gl::Framebuffer::DirtyBits &));
+    MOCK_METHOD2(syncState, void(const gl::Context *, const gl::Framebuffer::DirtyBits &));
 
     MOCK_METHOD0(destructor, void());
 };
diff --git a/src/libANGLE/renderer/ProgramImpl.h b/src/libANGLE/renderer/ProgramImpl.h
index 30a6a26..7111475 100644
--- a/src/libANGLE/renderer/ProgramImpl.h
+++ b/src/libANGLE/renderer/ProgramImpl.h
@@ -19,6 +19,7 @@
 
 namespace gl
 {
+class Context;
 class VaryingPacking;
 }
 
@@ -29,7 +30,6 @@
 
 namespace rx
 {
-class ContextImpl;
 
 using LinkResult = gl::ErrorOrResult<bool>;
 
@@ -38,16 +38,16 @@
   public:
     ProgramImpl(const gl::ProgramState &state) : mState(state) {}
     virtual ~ProgramImpl() {}
-    virtual void destroy(const ContextImpl *contextImpl) {}
+    virtual void destroy(const gl::Context *context) {}
 
-    virtual LinkResult load(const ContextImpl *contextImpl,
+    virtual LinkResult load(const gl::Context *context,
                             gl::InfoLog &infoLog,
                             gl::BinaryInputStream *stream)  = 0;
     virtual gl::Error save(gl::BinaryOutputStream *stream) = 0;
     virtual void setBinaryRetrievableHint(bool retrievable) = 0;
     virtual void setSeparable(bool separable)               = 0;
 
-    virtual LinkResult link(ContextImpl *contextImpl,
+    virtual LinkResult link(const gl::Context *context,
                             const gl::VaryingPacking &packing,
                             gl::InfoLog &infoLog) = 0;
     virtual GLboolean validate(const gl::Caps &caps, gl::InfoLog *infoLog) = 0;
diff --git a/src/libANGLE/renderer/ProgramImpl_mock.h b/src/libANGLE/renderer/ProgramImpl_mock.h
index 9b830c0..a1f1501 100644
--- a/src/libANGLE/renderer/ProgramImpl_mock.h
+++ b/src/libANGLE/renderer/ProgramImpl_mock.h
@@ -23,12 +23,12 @@
     MockProgramImpl() : ProgramImpl(gl::ProgramState()) {}
     virtual ~MockProgramImpl() { destructor(); }
 
-    MOCK_METHOD3(load, LinkResult(const ContextImpl *, gl::InfoLog &, gl::BinaryInputStream *));
+    MOCK_METHOD3(load, LinkResult(const gl::Context *, gl::InfoLog &, gl::BinaryInputStream *));
     MOCK_METHOD1(save, gl::Error(gl::BinaryOutputStream *));
     MOCK_METHOD1(setBinaryRetrievableHint, void(bool));
     MOCK_METHOD1(setSeparable, void(bool));
 
-    MOCK_METHOD3(link, LinkResult(ContextImpl *, const gl::VaryingPacking &, gl::InfoLog &));
+    MOCK_METHOD3(link, LinkResult(const gl::Context *, const gl::VaryingPacking &, gl::InfoLog &));
     MOCK_METHOD2(validate, GLboolean(const gl::Caps &, gl::InfoLog *));
 
     MOCK_METHOD3(setUniform1fv, void(GLint, GLsizei, const GLfloat *));
diff --git a/src/libANGLE/renderer/SurfaceImpl.h b/src/libANGLE/renderer/SurfaceImpl.h
index 0e4f177..6bfc74f 100644
--- a/src/libANGLE/renderer/SurfaceImpl.h
+++ b/src/libANGLE/renderer/SurfaceImpl.h
@@ -31,7 +31,6 @@
 
 namespace rx
 {
-class DisplayImpl;
 class FramebufferImpl;
 
 class SurfaceImpl : public FramebufferAttachmentObjectImpl
@@ -39,11 +38,11 @@
   public:
     SurfaceImpl(const egl::SurfaceState &surfaceState);
     virtual ~SurfaceImpl();
-    virtual void destroy(const DisplayImpl *displayImpl) {}
+    virtual void destroy(const egl::Display *display) {}
 
-    virtual egl::Error initialize(const DisplayImpl *displayImpl)                        = 0;
+    virtual egl::Error initialize(const egl::Display *display)                           = 0;
     virtual FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &state) = 0;
-    virtual egl::Error swap(const DisplayImpl *displayImpl)                              = 0;
+    virtual egl::Error swap(const egl::Display *display)                                 = 0;
     virtual egl::Error swapWithDamage(EGLint *rects, EGLint n_rects);
     virtual egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) = 0;
     virtual egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) = 0;
diff --git a/src/libANGLE/renderer/TextureImpl.cpp b/src/libANGLE/renderer/TextureImpl.cpp
index 47a7390..9f637d7 100644
--- a/src/libANGLE/renderer/TextureImpl.cpp
+++ b/src/libANGLE/renderer/TextureImpl.cpp
@@ -19,7 +19,7 @@
 {
 }
 
-gl::Error TextureImpl::copyTexture(ContextImpl *contextImpl,
+gl::Error TextureImpl::copyTexture(const gl::Context *context,
                                    GLenum target,
                                    size_t level,
                                    GLenum internalFormat,
@@ -34,7 +34,7 @@
     return gl::Error(GL_INVALID_OPERATION, "CHROMIUM_copy_texture exposed but not implemented.");
 }
 
-gl::Error TextureImpl::copySubTexture(ContextImpl *contextImpl,
+gl::Error TextureImpl::copySubTexture(const gl::Context *context,
                                       GLenum target,
                                       size_t level,
                                       const gl::Offset &destOffset,
@@ -49,7 +49,7 @@
     return gl::Error(GL_INVALID_OPERATION, "CHROMIUM_copy_texture exposed but not implemented.");
 }
 
-gl::Error TextureImpl::copyCompressedTexture(ContextImpl *contextImpl, const gl::Texture *source)
+gl::Error TextureImpl::copyCompressedTexture(const gl::Context *context, const gl::Texture *source)
 {
     UNREACHABLE();
     return gl::Error(GL_INVALID_OPERATION,
diff --git a/src/libANGLE/renderer/TextureImpl.h b/src/libANGLE/renderer/TextureImpl.h
index 077485c..b814534 100644
--- a/src/libANGLE/renderer/TextureImpl.h
+++ b/src/libANGLE/renderer/TextureImpl.h
@@ -46,7 +46,7 @@
     TextureImpl(const gl::TextureState &state);
     virtual ~TextureImpl();
 
-    virtual gl::Error setImage(ContextImpl *contextImpl,
+    virtual gl::Error setImage(const gl::Context *context,
                                GLenum target,
                                size_t level,
                                GLenum internalFormat,
@@ -55,7 +55,7 @@
                                GLenum type,
                                const gl::PixelUnpackState &unpack,
                                const uint8_t *pixels) = 0;
-    virtual gl::Error setSubImage(ContextImpl *contextImpl,
+    virtual gl::Error setSubImage(const gl::Context *context,
                                   GLenum target,
                                   size_t level,
                                   const gl::Box &area,
@@ -64,7 +64,7 @@
                                   const gl::PixelUnpackState &unpack,
                                   const uint8_t *pixels) = 0;
 
-    virtual gl::Error setCompressedImage(ContextImpl *contextImpl,
+    virtual gl::Error setCompressedImage(const gl::Context *context,
                                          GLenum target,
                                          size_t level,
                                          GLenum internalFormat,
@@ -72,7 +72,7 @@
                                          const gl::PixelUnpackState &unpack,
                                          size_t imageSize,
                                          const uint8_t *pixels) = 0;
-    virtual gl::Error setCompressedSubImage(ContextImpl *contextImpl,
+    virtual gl::Error setCompressedSubImage(const gl::Context *context,
                                             GLenum target,
                                             size_t level,
                                             const gl::Box &area,
@@ -81,20 +81,20 @@
                                             size_t imageSize,
                                             const uint8_t *pixels) = 0;
 
-    virtual gl::Error copyImage(ContextImpl *contextImpl,
+    virtual gl::Error copyImage(const gl::Context *context,
                                 GLenum target,
                                 size_t level,
                                 const gl::Rectangle &sourceArea,
                                 GLenum internalFormat,
                                 const gl::Framebuffer *source) = 0;
-    virtual gl::Error copySubImage(ContextImpl *contextImpl,
+    virtual gl::Error copySubImage(const gl::Context *context,
                                    GLenum target,
                                    size_t level,
                                    const gl::Offset &destOffset,
                                    const gl::Rectangle &sourceArea,
                                    const gl::Framebuffer *source) = 0;
 
-    virtual gl::Error copyTexture(ContextImpl *contextImpl,
+    virtual gl::Error copyTexture(const gl::Context *context,
                                   GLenum target,
                                   size_t level,
                                   GLenum internalFormat,
@@ -104,7 +104,7 @@
                                   bool unpackPremultiplyAlpha,
                                   bool unpackUnmultiplyAlpha,
                                   const gl::Texture *source);
-    virtual gl::Error copySubTexture(ContextImpl *contextImpl,
+    virtual gl::Error copySubTexture(const gl::Context *context,
                                      GLenum target,
                                      size_t level,
                                      const gl::Offset &destOffset,
@@ -115,15 +115,15 @@
                                      bool unpackUnmultiplyAlpha,
                                      const gl::Texture *source);
 
-    virtual gl::Error copyCompressedTexture(ContextImpl *contextImpl, const gl::Texture *source);
+    virtual gl::Error copyCompressedTexture(const gl::Context *context, const gl::Texture *source);
 
-    virtual gl::Error setStorage(ContextImpl *contextImpl,
+    virtual gl::Error setStorage(const gl::Context *context,
                                  GLenum target,
                                  size_t levels,
                                  GLenum internalFormat,
                                  const gl::Extents &size) = 0;
 
-    virtual gl::Error setStorageMultisample(ContextImpl *contextImpl,
+    virtual gl::Error setStorageMultisample(const gl::Context *context,
                                             GLenum target,
                                             GLsizei samples,
                                             GLint internalformat,
@@ -136,7 +136,7 @@
                                        egl::Stream *stream,
                                        const egl::Stream::GLTextureDescription &desc) = 0;
 
-    virtual gl::Error generateMipmap(ContextImpl *contextImpl) = 0;
+    virtual gl::Error generateMipmap(const gl::Context *context) = 0;
 
     virtual void setBaseLevel(GLuint baseLevel) = 0;
 
diff --git a/src/libANGLE/renderer/TextureImpl_mock.h b/src/libANGLE/renderer/TextureImpl_mock.h
index 83a1d21..71de0c2 100644
--- a/src/libANGLE/renderer/TextureImpl_mock.h
+++ b/src/libANGLE/renderer/TextureImpl_mock.h
@@ -22,7 +22,7 @@
     MockTextureImpl() : TextureImpl(mMockState), mMockState(GL_TEXTURE_2D) {}
     virtual ~MockTextureImpl() { destructor(); }
     MOCK_METHOD9(setImage,
-                 gl::Error(ContextImpl *,
+                 gl::Error(const gl::Context *,
                            GLenum,
                            size_t,
                            GLenum,
@@ -32,7 +32,7 @@
                            const gl::PixelUnpackState &,
                            const uint8_t *));
     MOCK_METHOD8(setSubImage,
-                 gl::Error(ContextImpl *,
+                 gl::Error(const gl::Context *,
                            GLenum,
                            size_t,
                            const gl::Box &,
@@ -41,7 +41,7 @@
                            const gl::PixelUnpackState &,
                            const uint8_t *));
     MOCK_METHOD8(setCompressedImage,
-                 gl::Error(ContextImpl *,
+                 gl::Error(const gl::Context *,
                            GLenum,
                            size_t,
                            GLenum,
@@ -50,7 +50,7 @@
                            size_t,
                            const uint8_t *));
     MOCK_METHOD8(setCompressedSubImage,
-                 gl::Error(ContextImpl *,
+                 gl::Error(const gl::Context *,
                            GLenum,
                            size_t,
                            const gl::Box &,
@@ -59,21 +59,21 @@
                            size_t,
                            const uint8_t *));
     MOCK_METHOD6(copyImage,
-                 gl::Error(ContextImpl *,
+                 gl::Error(const gl::Context *,
                            GLenum,
                            size_t,
                            const gl::Rectangle &,
                            GLenum,
                            const gl::Framebuffer *));
     MOCK_METHOD6(copySubImage,
-                 gl::Error(ContextImpl *,
+                 gl::Error(const gl::Context *,
                            GLenum,
                            size_t,
                            const gl::Offset &,
                            const gl::Rectangle &,
                            const gl::Framebuffer *));
     MOCK_METHOD10(copyTexture,
-                  gl::Error(ContextImpl *,
+                  gl::Error(const gl::Context *,
                             GLenum,
                             size_t,
                             GLenum,
@@ -84,7 +84,7 @@
                             bool,
                             const gl::Texture *));
     MOCK_METHOD10(copySubTexture,
-                  gl::Error(ContextImpl *,
+                  gl::Error(const gl::Context *,
                             GLenum,
                             size_t,
                             const gl::Offset &,
@@ -94,20 +94,22 @@
                             bool,
                             bool,
                             const gl::Texture *));
-    MOCK_METHOD2(copyCompressedTexture, gl::Error(ContextImpl *, const gl::Texture *source));
-    MOCK_METHOD5(setStorage, gl::Error(ContextImpl *, GLenum, size_t, GLenum, const gl::Extents &));
+    MOCK_METHOD2(copyCompressedTexture, gl::Error(const gl::Context *, const gl::Texture *source));
+    MOCK_METHOD5(setStorage,
+                 gl::Error(const gl::Context *, GLenum, size_t, GLenum, const gl::Extents &));
     MOCK_METHOD3(setImageExternal,
                  gl::Error(GLenum, egl::Stream *, const egl::Stream::GLTextureDescription &));
     MOCK_METHOD2(setEGLImageTarget, gl::Error(GLenum, egl::Image *));
-    MOCK_METHOD1(generateMipmap, gl::Error(ContextImpl *));
+    MOCK_METHOD1(generateMipmap, gl::Error(const gl::Context *));
     MOCK_METHOD1(bindTexImage, void(egl::Surface *));
     MOCK_METHOD0(releaseTexImage, void(void));
 
     MOCK_METHOD3(getAttachmentRenderTarget,
                  gl::Error(GLenum, const gl::ImageIndex &, FramebufferAttachmentRenderTarget **));
 
-    MOCK_METHOD6(setStorageMultisample,
-                 gl::Error(ContextImpl *, GLenum, GLsizei, GLint, const gl::Extents &, GLboolean));
+    MOCK_METHOD6(
+        setStorageMultisample,
+        gl::Error(const gl::Context *, GLenum, GLsizei, GLint, const gl::Extents &, GLboolean));
 
     MOCK_METHOD1(setBaseLevel, void(GLuint));
 
diff --git a/src/libANGLE/renderer/VertexArrayImpl.h b/src/libANGLE/renderer/VertexArrayImpl.h
index a933ba2..f31cf78 100644
--- a/src/libANGLE/renderer/VertexArrayImpl.h
+++ b/src/libANGLE/renderer/VertexArrayImpl.h
@@ -22,7 +22,10 @@
   public:
     VertexArrayImpl(const gl::VertexArrayState &data) : mData(data) {}
     virtual ~VertexArrayImpl() { }
-    virtual void syncState(ContextImpl *contextImpl, const gl::VertexArray::DirtyBits &dirtyBits) {}
+    virtual void syncState(const gl::Context *context, const gl::VertexArray::DirtyBits &dirtyBits)
+    {
+    }
+
   protected:
     const gl::VertexArrayState &mData;
 };
diff --git a/src/libANGLE/renderer/d3d/FramebufferD3D.cpp b/src/libANGLE/renderer/d3d/FramebufferD3D.cpp
index 86653f6..20ce293 100644
--- a/src/libANGLE/renderer/d3d/FramebufferD3D.cpp
+++ b/src/libANGLE/renderer/d3d/FramebufferD3D.cpp
@@ -9,6 +9,7 @@
 #include "libANGLE/renderer/d3d/FramebufferD3D.h"
 
 #include "common/bitset_utils.h"
+#include "libANGLE/Context.h"
 #include "libANGLE/Framebuffer.h"
 #include "libANGLE/FramebufferAttachment.h"
 #include "libANGLE/Surface.h"
@@ -95,13 +96,13 @@
 {
 }
 
-gl::Error FramebufferD3D::clear(ContextImpl *context, GLbitfield mask)
+gl::Error FramebufferD3D::clear(const gl::Context *context, GLbitfield mask)
 {
     ClearParameters clearParams = GetClearParameters(context->getGLState(), mask);
     return clearImpl(context, clearParams);
 }
 
-gl::Error FramebufferD3D::clearBufferfv(ContextImpl *context,
+gl::Error FramebufferD3D::clearBufferfv(const gl::Context *context,
                                         GLenum buffer,
                                         GLint drawbuffer,
                                         const GLfloat *values)
@@ -128,7 +129,7 @@
     return clearImpl(context, clearParams);
 }
 
-gl::Error FramebufferD3D::clearBufferuiv(ContextImpl *context,
+gl::Error FramebufferD3D::clearBufferuiv(const gl::Context *context,
                                          GLenum buffer,
                                          GLint drawbuffer,
                                          const GLuint *values)
@@ -145,7 +146,7 @@
     return clearImpl(context, clearParams);
 }
 
-gl::Error FramebufferD3D::clearBufferiv(ContextImpl *context,
+gl::Error FramebufferD3D::clearBufferiv(const gl::Context *context,
                                         GLenum buffer,
                                         GLint drawbuffer,
                                         const GLint *values)
@@ -172,7 +173,7 @@
     return clearImpl(context, clearParams);
 }
 
-gl::Error FramebufferD3D::clearBufferfi(ContextImpl *context,
+gl::Error FramebufferD3D::clearBufferfi(const gl::Context *context,
                                         GLenum buffer,
                                         GLint drawbuffer,
                                         GLfloat depth,
@@ -234,7 +235,7 @@
     return implementationFormatInfo.getReadPixelsType();
 }
 
-gl::Error FramebufferD3D::readPixels(ContextImpl *context,
+gl::Error FramebufferD3D::readPixels(const gl::Context *context,
                                      const gl::Rectangle &area,
                                      GLenum format,
                                      GLenum type,
@@ -256,7 +257,7 @@
                           reinterpret_cast<uint8_t *>(pixels) + outputSkipBytes);
 }
 
-gl::Error FramebufferD3D::blit(ContextImpl *context,
+gl::Error FramebufferD3D::blit(const gl::Context *context,
                                const gl::Rectangle &sourceArea,
                                const gl::Rectangle &destArea,
                                GLbitfield mask,
@@ -297,7 +298,7 @@
     return true;
 }
 
-void FramebufferD3D::syncState(ContextImpl *contextImpl,
+void FramebufferD3D::syncState(const gl::Context *context,
                                const gl::Framebuffer::DirtyBits &dirtyBits)
 {
     bool invalidateColorAttachmentCache = false;
diff --git a/src/libANGLE/renderer/d3d/FramebufferD3D.h b/src/libANGLE/renderer/d3d/FramebufferD3D.h
index 903b3fe..36c48fc 100644
--- a/src/libANGLE/renderer/d3d/FramebufferD3D.h
+++ b/src/libANGLE/renderer/d3d/FramebufferD3D.h
@@ -59,20 +59,20 @@
     FramebufferD3D(const gl::FramebufferState &data, RendererD3D *renderer);
     virtual ~FramebufferD3D();
 
-    gl::Error clear(ContextImpl *impl, GLbitfield mask) override;
-    gl::Error clearBufferfv(ContextImpl *impl,
+    gl::Error clear(const gl::Context *context, GLbitfield mask) override;
+    gl::Error clearBufferfv(const gl::Context *context,
                             GLenum buffer,
                             GLint drawbuffer,
                             const GLfloat *values) override;
-    gl::Error clearBufferuiv(ContextImpl *impl,
+    gl::Error clearBufferuiv(const gl::Context *context,
                              GLenum buffer,
                              GLint drawbuffer,
                              const GLuint *values) override;
-    gl::Error clearBufferiv(ContextImpl *impl,
+    gl::Error clearBufferiv(const gl::Context *context,
                             GLenum buffer,
                             GLint drawbuffer,
                             const GLint *values) override;
-    gl::Error clearBufferfi(ContextImpl *impl,
+    gl::Error clearBufferfi(const gl::Context *context,
                             GLenum buffer,
                             GLint drawbuffer,
                             GLfloat depth,
@@ -80,13 +80,13 @@
 
     GLenum getImplementationColorReadFormat() const override;
     GLenum getImplementationColorReadType() const override;
-    gl::Error readPixels(ContextImpl *impl,
+    gl::Error readPixels(const gl::Context *context,
                          const gl::Rectangle &area,
                          GLenum format,
                          GLenum type,
                          void *pixels) const override;
 
-    gl::Error blit(ContextImpl *impl,
+    gl::Error blit(const gl::Context *context,
                    const gl::Rectangle &sourceArea,
                    const gl::Rectangle &destArea,
                    GLbitfield mask,
@@ -94,14 +94,15 @@
 
     bool checkStatus() const override;
 
-    void syncState(ContextImpl *contextImpl, const gl::Framebuffer::DirtyBits &dirtyBits) override;
+    void syncState(const gl::Context *context,
+                   const gl::Framebuffer::DirtyBits &dirtyBits) override;
 
     const gl::AttachmentList &getColorAttachmentsForRender() const;
 
     gl::Error getSamplePosition(size_t index, GLfloat *xy) const override;
 
   private:
-    virtual gl::Error clearImpl(ContextImpl *impl, const ClearParameters &clearParams) = 0;
+    virtual gl::Error clearImpl(const gl::Context *context, const ClearParameters &clearParams) = 0;
 
     virtual gl::Error readPixelsImpl(const gl::Rectangle &area,
                                      GLenum format,
diff --git a/src/libANGLE/renderer/d3d/ProgramD3D.cpp b/src/libANGLE/renderer/d3d/ProgramD3D.cpp
index b8df596..11ed561 100644
--- a/src/libANGLE/renderer/d3d/ProgramD3D.cpp
+++ b/src/libANGLE/renderer/d3d/ProgramD3D.cpp
@@ -10,6 +10,7 @@
 
 #include "common/bitset_utils.h"
 #include "common/utilities.h"
+#include "libANGLE/Context.h"
 #include "libANGLE/Framebuffer.h"
 #include "libANGLE/FramebufferAttachment.h"
 #include "libANGLE/Program.h"
@@ -691,7 +692,7 @@
     }
 }
 
-LinkResult ProgramD3D::load(const ContextImpl *contextImpl,
+LinkResult ProgramD3D::load(const gl::Context *context,
                             gl::InfoLog &infoLog,
                             gl::BinaryInputStream *stream)
 {
@@ -1479,11 +1480,11 @@
     return mComputeExecutable.get() != nullptr;
 }
 
-LinkResult ProgramD3D::link(ContextImpl *contextImpl,
+LinkResult ProgramD3D::link(const gl::Context *context,
                             const gl::VaryingPacking &packing,
                             gl::InfoLog &infoLog)
 {
-    const auto &data = contextImpl->getContextState();
+    const auto &data = context->getContextState();
 
     reset();
 
diff --git a/src/libANGLE/renderer/d3d/ProgramD3D.h b/src/libANGLE/renderer/d3d/ProgramD3D.h
index 47613ed..7db7fc7 100644
--- a/src/libANGLE/renderer/d3d/ProgramD3D.h
+++ b/src/libANGLE/renderer/d3d/ProgramD3D.h
@@ -158,7 +158,7 @@
     bool usesGeometryShader(GLenum drawMode) const;
     bool usesInstancedPointSpriteEmulation() const;
 
-    LinkResult load(const ContextImpl *contextImpl,
+    LinkResult load(const gl::Context *context,
                     gl::InfoLog &infoLog,
                     gl::BinaryInputStream *stream) override;
     gl::Error save(gl::BinaryOutputStream *stream) override;
@@ -178,7 +178,7 @@
                                                     ShaderExecutableD3D **outExecutable,
                                                     gl::InfoLog *infoLog);
     gl::Error getComputeExecutable(ShaderExecutableD3D **outExecutable);
-    LinkResult link(ContextImpl *contextImpl,
+    LinkResult link(const gl::Context *context,
                     const gl::VaryingPacking &packing,
                     gl::InfoLog &infoLog) override;
     GLboolean validate(const gl::Caps &caps, gl::InfoLog *infoLog) override;
diff --git a/src/libANGLE/renderer/d3d/SurfaceD3D.cpp b/src/libANGLE/renderer/d3d/SurfaceD3D.cpp
index 4e3252d..251030f 100644
--- a/src/libANGLE/renderer/d3d/SurfaceD3D.cpp
+++ b/src/libANGLE/renderer/d3d/SurfaceD3D.cpp
@@ -81,7 +81,7 @@
     SafeDelete(mSwapChain);
 }
 
-egl::Error SurfaceD3D::initialize(const DisplayImpl *displayImpl)
+egl::Error SurfaceD3D::initialize(const egl::Display *display)
 {
     if (mNativeWindow->getNativeWindow())
     {
@@ -91,12 +91,7 @@
         }
     }
 
-    egl::Error error = resetSwapChain();
-    if (error.isError())
-    {
-        return error;
-    }
-
+    ANGLE_TRY(resetSwapChain());
     return egl::Error(EGL_SUCCESS);
 }
 
@@ -285,7 +280,7 @@
     return wasDirty;
 }
 
-egl::Error SurfaceD3D::swap(const DisplayImpl *displayImpl)
+egl::Error SurfaceD3D::swap(const egl::Display *display)
 {
     return swapRect(0, 0, mWidth, mHeight);
 }
diff --git a/src/libANGLE/renderer/d3d/SurfaceD3D.h b/src/libANGLE/renderer/d3d/SurfaceD3D.h
index 3be2888..9f613e3 100644
--- a/src/libANGLE/renderer/d3d/SurfaceD3D.h
+++ b/src/libANGLE/renderer/d3d/SurfaceD3D.h
@@ -28,10 +28,10 @@
     ~SurfaceD3D() override;
     void releaseSwapChain();
 
-    egl::Error initialize(const DisplayImpl *displayImpl) override;
+    egl::Error initialize(const egl::Display *display) override;
     FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &state) override;
 
-    egl::Error swap(const DisplayImpl *displayImpl) override;
+    egl::Error swap(const egl::Display *display) override;
     egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) override;
     egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) override;
     egl::Error bindTexImage(gl::Texture *texture, EGLint buffer) override;
diff --git a/src/libANGLE/renderer/d3d/TextureD3D.cpp b/src/libANGLE/renderer/d3d/TextureD3D.cpp
index 7aa5bfe..78e90b5 100644
--- a/src/libANGLE/renderer/d3d/TextureD3D.cpp
+++ b/src/libANGLE/renderer/d3d/TextureD3D.cpp
@@ -156,7 +156,7 @@
     return (baseImage ? baseImage->getInternalFormat() : GL_NONE);
 }
 
-gl::Error TextureD3D::setStorageMultisample(ContextImpl *contextImpl,
+gl::Error TextureD3D::setStorageMultisample(const gl::Context *context,
                                             GLenum target,
                                             GLsizei samples,
                                             GLint internalFormat,
@@ -374,7 +374,7 @@
     return gl::Error(GL_INVALID_OPERATION);
 }
 
-gl::Error TextureD3D::generateMipmap(ContextImpl *contextImpl)
+gl::Error TextureD3D::generateMipmap(const gl::Context *context)
 {
     const GLuint baseLevel = mState.getEffectiveBaseLevel();
     const GLuint maxLevel = mState.getMipmapMaxLevel();
@@ -612,7 +612,7 @@
     return nullptr;
 }
 
-gl::Error TextureD3D_2DMultisample::setImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_2DMultisample::setImage(const gl::Context *context,
                                              GLenum target,
                                              size_t level,
                                              GLenum internalFormat,
@@ -626,7 +626,7 @@
     return gl::InternalError();
 }
 
-gl::Error TextureD3D_2DMultisample::setSubImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_2DMultisample::setSubImage(const gl::Context *context,
                                                 GLenum target,
                                                 size_t level,
                                                 const gl::Box &area,
@@ -639,7 +639,7 @@
     return gl::InternalError();
 }
 
-gl::Error TextureD3D_2DMultisample::setCompressedImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_2DMultisample::setCompressedImage(const gl::Context *context,
                                                        GLenum target,
                                                        size_t level,
                                                        GLenum internalFormat,
@@ -652,7 +652,7 @@
     return gl::InternalError();
 }
 
-gl::Error TextureD3D_2DMultisample::setCompressedSubImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_2DMultisample::setCompressedSubImage(const gl::Context *context,
                                                           GLenum target,
                                                           size_t level,
                                                           const gl::Box &area,
@@ -665,7 +665,7 @@
     return gl::InternalError();
 }
 
-gl::Error TextureD3D_2DMultisample::copyImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_2DMultisample::copyImage(const gl::Context *context,
                                               GLenum target,
                                               size_t level,
                                               const gl::Rectangle &sourceArea,
@@ -676,7 +676,7 @@
     return gl::InternalError();
 }
 
-gl::Error TextureD3D_2DMultisample::copySubImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_2DMultisample::copySubImage(const gl::Context *context,
                                                  GLenum target,
                                                  size_t level,
                                                  const gl::Offset &destOffset,
@@ -687,7 +687,7 @@
     return gl::InternalError();
 }
 
-gl::Error TextureD3D_2DMultisample::setStorage(ContextImpl *contextImpl,
+gl::Error TextureD3D_2DMultisample::setStorage(const gl::Context *context,
                                                GLenum target,
                                                size_t levels,
                                                GLenum internalFormat,
@@ -856,7 +856,7 @@
     return gl::GetSizedInternalFormatInfo(getInternalFormat(level)).depthBits > 0;
 }
 
-gl::Error TextureD3D_2D::setImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_2D::setImage(const gl::Context *context,
                                   GLenum target,
                                   size_t imageLevel,
                                   GLenum internalFormat,
@@ -903,7 +903,7 @@
     return gl::NoError();
 }
 
-gl::Error TextureD3D_2D::setSubImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_2D::setSubImage(const gl::Context *context,
                                      GLenum target,
                                      size_t imageLevel,
                                      const gl::Box &area,
@@ -930,7 +930,7 @@
     }
 }
 
-gl::Error TextureD3D_2D::setCompressedImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_2D::setCompressedImage(const gl::Context *context,
                                             GLenum target,
                                             size_t imageLevel,
                                             GLenum internalFormat,
@@ -948,7 +948,7 @@
     return setCompressedImageImpl(gl::ImageIndex::Make2D(level), unpack, pixels, 0);
 }
 
-gl::Error TextureD3D_2D::setCompressedSubImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_2D::setCompressedSubImage(const gl::Context *context,
                                                GLenum target,
                                                size_t level,
                                                const gl::Box &area,
@@ -965,7 +965,7 @@
     return commitRegion(index, area);
 }
 
-gl::Error TextureD3D_2D::copyImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_2D::copyImage(const gl::Context *context,
                                    GLenum target,
                                    size_t imageLevel,
                                    const gl::Rectangle &sourceArea,
@@ -1005,7 +1005,7 @@
     return gl::NoError();
 }
 
-gl::Error TextureD3D_2D::copySubImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_2D::copySubImage(const gl::Context *context,
                                       GLenum target,
                                       size_t imageLevel,
                                       const gl::Offset &destOffset,
@@ -1043,7 +1043,7 @@
     return gl::NoError();
 }
 
-gl::Error TextureD3D_2D::copyTexture(ContextImpl *contextImpl,
+gl::Error TextureD3D_2D::copyTexture(const gl::Context *context,
                                      GLenum target,
                                      size_t level,
                                      GLenum internalFormat,
@@ -1097,7 +1097,7 @@
     return gl::NoError();
 }
 
-gl::Error TextureD3D_2D::copySubTexture(ContextImpl *contextImpl,
+gl::Error TextureD3D_2D::copySubTexture(const gl::Context *context,
                                         GLenum target,
                                         size_t level,
                                         const gl::Offset &destOffset,
@@ -1141,7 +1141,8 @@
     return gl::NoError();
 }
 
-gl::Error TextureD3D_2D::copyCompressedTexture(ContextImpl *contextImpl, const gl::Texture *source)
+gl::Error TextureD3D_2D::copyCompressedTexture(const gl::Context *context,
+                                               const gl::Texture *source)
 {
     GLenum sourceTarget = source->getTarget();
     GLint sourceLevel   = 0;
@@ -1162,7 +1163,7 @@
     return gl::NoError();
 }
 
-gl::Error TextureD3D_2D::setStorage(ContextImpl *contextImpl,
+gl::Error TextureD3D_2D::setStorage(const gl::Context *context,
                                     GLenum target,
                                     size_t levels,
                                     GLenum internalFormat,
@@ -1520,7 +1521,7 @@
     mDirtyImages = true;
 }
 
-gl::Error TextureD3D_2D::setStorageMultisample(ContextImpl *contextImpl,
+gl::Error TextureD3D_2D::setStorageMultisample(const gl::Context *context,
                                                GLenum target,
                                                GLsizei samples,
                                                GLint internalFormat,
@@ -1598,7 +1599,7 @@
     return gl::Error(GL_INVALID_OPERATION);
 }
 
-gl::Error TextureD3D_Cube::setImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_Cube::setImage(const gl::Context *context,
                                     GLenum target,
                                     size_t level,
                                     GLenum internalFormat,
@@ -1619,7 +1620,7 @@
     return setImageImpl(index, type, unpack, pixels, 0);
 }
 
-gl::Error TextureD3D_Cube::setSubImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_Cube::setSubImage(const gl::Context *context,
                                        GLenum target,
                                        size_t level,
                                        const gl::Box &area,
@@ -1634,7 +1635,7 @@
     return TextureD3D::subImage(index, area, format, type, unpack, pixels, 0);
 }
 
-gl::Error TextureD3D_Cube::setCompressedImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_Cube::setCompressedImage(const gl::Context *context,
                                               GLenum target,
                                               size_t level,
                                               GLenum internalFormat,
@@ -1654,7 +1655,7 @@
     return setCompressedImageImpl(index, unpack, pixels, 0);
 }
 
-gl::Error TextureD3D_Cube::setCompressedSubImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_Cube::setCompressedSubImage(const gl::Context *context,
                                                  GLenum target,
                                                  size_t level,
                                                  const gl::Box &area,
@@ -1671,7 +1672,7 @@
     return commitRegion(index, area);
 }
 
-gl::Error TextureD3D_Cube::copyImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_Cube::copyImage(const gl::Context *context,
                                      GLenum target,
                                      size_t imageLevel,
                                      const gl::Rectangle &sourceArea,
@@ -1715,7 +1716,7 @@
     return gl::NoError();
 }
 
-gl::Error TextureD3D_Cube::copySubImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_Cube::copySubImage(const gl::Context *context,
                                         GLenum target,
                                         size_t imageLevel,
                                         const gl::Offset &destOffset,
@@ -1755,7 +1756,7 @@
     return gl::NoError();
 }
 
-gl::Error TextureD3D_Cube::copyTexture(ContextImpl *contextImpl,
+gl::Error TextureD3D_Cube::copyTexture(const gl::Context *context,
                                        GLenum target,
                                        size_t level,
                                        GLenum internalFormat,
@@ -1811,7 +1812,7 @@
     return gl::NoError();
 }
 
-gl::Error TextureD3D_Cube::copySubTexture(ContextImpl *contextImpl,
+gl::Error TextureD3D_Cube::copySubTexture(const gl::Context *context,
                                           GLenum target,
                                           size_t level,
                                           const gl::Offset &destOffset,
@@ -1857,7 +1858,7 @@
     return gl::NoError();
 }
 
-gl::Error TextureD3D_Cube::setStorage(ContextImpl *contextImpl,
+gl::Error TextureD3D_Cube::setStorage(const gl::Context *context,
                                       GLenum target,
                                       size_t levels,
                                       GLenum internalFormat,
@@ -2283,7 +2284,7 @@
     return gl::Error(GL_INVALID_OPERATION);
 }
 
-gl::Error TextureD3D_3D::setImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_3D::setImage(const gl::Context *context,
                                   GLenum target,
                                   size_t imageLevel,
                                   GLenum internalFormat,
@@ -2330,7 +2331,7 @@
     return gl::NoError();
 }
 
-gl::Error TextureD3D_3D::setSubImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_3D::setSubImage(const gl::Context *context,
                                      GLenum target,
                                      size_t imageLevel,
                                      const gl::Box &area,
@@ -2359,7 +2360,7 @@
     }
 }
 
-gl::Error TextureD3D_3D::setCompressedImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_3D::setCompressedImage(const gl::Context *context,
                                             GLenum target,
                                             size_t imageLevel,
                                             GLenum internalFormat,
@@ -2378,7 +2379,7 @@
     return setCompressedImageImpl(index, unpack, pixels, 0);
 }
 
-gl::Error TextureD3D_3D::setCompressedSubImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_3D::setCompressedSubImage(const gl::Context *context,
                                                GLenum target,
                                                size_t level,
                                                const gl::Box &area,
@@ -2394,7 +2395,7 @@
     return commitRegion(index, area);
 }
 
-gl::Error TextureD3D_3D::copyImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_3D::copyImage(const gl::Context *context,
                                    GLenum target,
                                    size_t level,
                                    const gl::Rectangle &sourceArea,
@@ -2405,7 +2406,7 @@
     return gl::Error(GL_INVALID_OPERATION, "Copying 3D textures is unimplemented.");
 }
 
-gl::Error TextureD3D_3D::copySubImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_3D::copySubImage(const gl::Context *context,
                                       GLenum target,
                                       size_t imageLevel,
                                       const gl::Offset &destOffset,
@@ -2442,7 +2443,7 @@
     return gl::NoError();
 }
 
-gl::Error TextureD3D_3D::setStorage(ContextImpl *contextImpl,
+gl::Error TextureD3D_3D::setStorage(const gl::Context *context,
                                     GLenum target,
                                     size_t levels,
                                     GLenum internalFormat,
@@ -2804,7 +2805,7 @@
     return gl::Error(GL_INVALID_OPERATION);
 }
 
-gl::Error TextureD3D_2DArray::setImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_2DArray::setImage(const gl::Context *context,
                                        GLenum target,
                                        size_t imageLevel,
                                        GLenum internalFormat,
@@ -2836,7 +2837,7 @@
     return gl::NoError();
 }
 
-gl::Error TextureD3D_2DArray::setSubImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_2DArray::setSubImage(const gl::Context *context,
                                           GLenum target,
                                           size_t imageLevel,
                                           const gl::Box &area,
@@ -2869,7 +2870,7 @@
     return gl::NoError();
 }
 
-gl::Error TextureD3D_2DArray::setCompressedImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_2DArray::setCompressedImage(const gl::Context *context,
                                                  GLenum target,
                                                  size_t imageLevel,
                                                  GLenum internalFormat,
@@ -2901,7 +2902,7 @@
     return gl::NoError();
 }
 
-gl::Error TextureD3D_2DArray::setCompressedSubImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_2DArray::setCompressedSubImage(const gl::Context *context,
                                                     GLenum target,
                                                     size_t level,
                                                     const gl::Box &area,
@@ -2934,7 +2935,7 @@
     return gl::NoError();
 }
 
-gl::Error TextureD3D_2DArray::copyImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_2DArray::copyImage(const gl::Context *context,
                                         GLenum target,
                                         size_t level,
                                         const gl::Rectangle &sourceArea,
@@ -2945,7 +2946,7 @@
     return gl::Error(GL_INVALID_OPERATION, "Copying 2D array textures is unimplemented.");
 }
 
-gl::Error TextureD3D_2DArray::copySubImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_2DArray::copySubImage(const gl::Context *context,
                                            GLenum target,
                                            size_t imageLevel,
                                            const gl::Offset &destOffset,
@@ -2979,7 +2980,7 @@
     return gl::NoError();
 }
 
-gl::Error TextureD3D_2DArray::setStorage(ContextImpl *contextImpl,
+gl::Error TextureD3D_2DArray::setStorage(const gl::Context *context,
                                          GLenum target,
                                          size_t levels,
                                          GLenum internalFormat,
@@ -3364,7 +3365,7 @@
     return 1;
 }
 
-gl::Error TextureD3D_External::setImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_External::setImage(const gl::Context *context,
                                         GLenum target,
                                         size_t imageLevel,
                                         GLenum internalFormat,
@@ -3379,7 +3380,7 @@
     return gl::Error(GL_INVALID_OPERATION);
 }
 
-gl::Error TextureD3D_External::setSubImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_External::setSubImage(const gl::Context *context,
                                            GLenum target,
                                            size_t imageLevel,
                                            const gl::Box &area,
@@ -3392,7 +3393,7 @@
     return gl::Error(GL_INVALID_OPERATION);
 }
 
-gl::Error TextureD3D_External::setCompressedImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_External::setCompressedImage(const gl::Context *context,
                                                   GLenum target,
                                                   size_t imageLevel,
                                                   GLenum internalFormat,
@@ -3405,7 +3406,7 @@
     return gl::Error(GL_INVALID_OPERATION);
 }
 
-gl::Error TextureD3D_External::setCompressedSubImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_External::setCompressedSubImage(const gl::Context *context,
                                                      GLenum target,
                                                      size_t level,
                                                      const gl::Box &area,
@@ -3418,7 +3419,7 @@
     return gl::Error(GL_INVALID_OPERATION);
 }
 
-gl::Error TextureD3D_External::copyImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_External::copyImage(const gl::Context *context,
                                          GLenum target,
                                          size_t imageLevel,
                                          const gl::Rectangle &sourceArea,
@@ -3429,7 +3430,7 @@
     return gl::Error(GL_INVALID_OPERATION);
 }
 
-gl::Error TextureD3D_External::copySubImage(ContextImpl *contextImpl,
+gl::Error TextureD3D_External::copySubImage(const gl::Context *context,
                                             GLenum target,
                                             size_t imageLevel,
                                             const gl::Offset &destOffset,
@@ -3440,7 +3441,7 @@
     return gl::Error(GL_INVALID_OPERATION);
 }
 
-gl::Error TextureD3D_External::setStorage(ContextImpl *contextImpl,
+gl::Error TextureD3D_External::setStorage(const gl::Context *context,
                                           GLenum target,
                                           size_t levels,
                                           GLenum internalFormat,
diff --git a/src/libANGLE/renderer/d3d/TextureD3D.h b/src/libANGLE/renderer/d3d/TextureD3D.h
index 5f91bc5..2df8d95 100644
--- a/src/libANGLE/renderer/d3d/TextureD3D.h
+++ b/src/libANGLE/renderer/d3d/TextureD3D.h
@@ -47,7 +47,7 @@
     GLint getBaseLevelHeight() const;
     GLenum getBaseLevelInternalFormat() const;
 
-    gl::Error setStorageMultisample(ContextImpl *contextImpl,
+    gl::Error setStorageMultisample(const gl::Context *context,
                                     GLenum target,
                                     GLsizei samples,
                                     GLint internalFormat,
@@ -69,7 +69,7 @@
     virtual gl::Error setImageExternal(GLenum target,
                                        egl::Stream *stream,
                                        const egl::Stream::GLTextureDescription &desc) override;
-    gl::Error generateMipmap(ContextImpl *contextImpl) override;
+    gl::Error generateMipmap(const gl::Context *context) override;
     TextureStorage *getStorage();
     ImageD3D *getBaseLevelImage() const;
 
@@ -155,7 +155,7 @@
     GLenum getInternalFormat(GLint level) const;
     bool isDepth(GLint level) const;
 
-    gl::Error setImage(ContextImpl *contextImpl,
+    gl::Error setImage(const gl::Context *context,
                        GLenum target,
                        size_t level,
                        GLenum internalFormat,
@@ -164,7 +164,7 @@
                        GLenum type,
                        const gl::PixelUnpackState &unpack,
                        const uint8_t *pixels) override;
-    gl::Error setSubImage(ContextImpl *contextImpl,
+    gl::Error setSubImage(const gl::Context *context,
                           GLenum target,
                           size_t level,
                           const gl::Box &area,
@@ -173,7 +173,7 @@
                           const gl::PixelUnpackState &unpack,
                           const uint8_t *pixels) override;
 
-    gl::Error setCompressedImage(ContextImpl *contextImpl,
+    gl::Error setCompressedImage(const gl::Context *context,
                                  GLenum target,
                                  size_t level,
                                  GLenum internalFormat,
@@ -181,7 +181,7 @@
                                  const gl::PixelUnpackState &unpack,
                                  size_t imageSize,
                                  const uint8_t *pixels) override;
-    gl::Error setCompressedSubImage(ContextImpl *contextImpl,
+    gl::Error setCompressedSubImage(const gl::Context *context,
                                     GLenum target,
                                     size_t level,
                                     const gl::Box &area,
@@ -190,20 +190,20 @@
                                     size_t imageSize,
                                     const uint8_t *pixels) override;
 
-    gl::Error copyImage(ContextImpl *contextImpl,
+    gl::Error copyImage(const gl::Context *context,
                         GLenum target,
                         size_t level,
                         const gl::Rectangle &sourceArea,
                         GLenum internalFormat,
                         const gl::Framebuffer *source) override;
-    gl::Error copySubImage(ContextImpl *contextImpl,
+    gl::Error copySubImage(const gl::Context *context,
                            GLenum target,
                            size_t level,
                            const gl::Offset &destOffset,
                            const gl::Rectangle &sourceArea,
                            const gl::Framebuffer *source) override;
 
-    gl::Error copyTexture(ContextImpl *contextImpl,
+    gl::Error copyTexture(const gl::Context *context,
                           GLenum target,
                           size_t level,
                           GLenum internalFormat,
@@ -213,7 +213,7 @@
                           bool unpackPremultiplyAlpha,
                           bool unpackUnmultiplyAlpha,
                           const gl::Texture *source) override;
-    gl::Error copySubTexture(ContextImpl *contextImpl,
+    gl::Error copySubTexture(const gl::Context *context,
                              GLenum target,
                              size_t level,
                              const gl::Offset &destOffset,
@@ -223,9 +223,9 @@
                              bool unpackPremultiplyAlpha,
                              bool unpackUnmultiplyAlpha,
                              const gl::Texture *source) override;
-    gl::Error copyCompressedTexture(ContextImpl *contextImpl, const gl::Texture *source) override;
+    gl::Error copyCompressedTexture(const gl::Context *context, const gl::Texture *source) override;
 
-    gl::Error setStorage(ContextImpl *contextImpl,
+    gl::Error setStorage(const gl::Context *context,
                          GLenum target,
                          size_t levels,
                          GLenum internalFormat,
@@ -242,7 +242,7 @@
     virtual gl::ImageIndex getImageIndex(GLint mip, GLint layer) const;
     virtual bool isValidIndex(const gl::ImageIndex &index) const;
 
-    gl::Error setStorageMultisample(ContextImpl *contextImpl,
+    gl::Error setStorageMultisample(const gl::Context *context,
                                     GLenum target,
                                     GLsizei samples,
                                     GLint internalFormat,
@@ -291,7 +291,7 @@
     GLenum getInternalFormat(GLint level, GLint layer) const;
     bool isDepth(GLint level, GLint layer) const;
 
-    gl::Error setImage(ContextImpl *contextImpl,
+    gl::Error setImage(const gl::Context *context,
                        GLenum target,
                        size_t level,
                        GLenum internalFormat,
@@ -300,7 +300,7 @@
                        GLenum type,
                        const gl::PixelUnpackState &unpack,
                        const uint8_t *pixels) override;
-    gl::Error setSubImage(ContextImpl *contextImpl,
+    gl::Error setSubImage(const gl::Context *context,
                           GLenum target,
                           size_t level,
                           const gl::Box &area,
@@ -309,7 +309,7 @@
                           const gl::PixelUnpackState &unpack,
                           const uint8_t *pixels) override;
 
-    gl::Error setCompressedImage(ContextImpl *contextImpl,
+    gl::Error setCompressedImage(const gl::Context *context,
                                  GLenum target,
                                  size_t level,
                                  GLenum internalFormat,
@@ -317,7 +317,7 @@
                                  const gl::PixelUnpackState &unpack,
                                  size_t imageSize,
                                  const uint8_t *pixels) override;
-    gl::Error setCompressedSubImage(ContextImpl *contextImpl,
+    gl::Error setCompressedSubImage(const gl::Context *context,
                                     GLenum target,
                                     size_t level,
                                     const gl::Box &area,
@@ -326,20 +326,20 @@
                                     size_t imageSize,
                                     const uint8_t *pixels) override;
 
-    gl::Error copyImage(ContextImpl *contextImpl,
+    gl::Error copyImage(const gl::Context *context,
                         GLenum target,
                         size_t level,
                         const gl::Rectangle &sourceArea,
                         GLenum internalFormat,
                         const gl::Framebuffer *source) override;
-    gl::Error copySubImage(ContextImpl *contextImpl,
+    gl::Error copySubImage(const gl::Context *context,
                            GLenum target,
                            size_t level,
                            const gl::Offset &destOffset,
                            const gl::Rectangle &sourceArea,
                            const gl::Framebuffer *source) override;
 
-    gl::Error copyTexture(ContextImpl *contextImpl,
+    gl::Error copyTexture(const gl::Context *context,
                           GLenum target,
                           size_t level,
                           GLenum internalFormat,
@@ -349,7 +349,7 @@
                           bool unpackPremultiplyAlpha,
                           bool unpackUnmultiplyAlpha,
                           const gl::Texture *source) override;
-    gl::Error copySubTexture(ContextImpl *contextImpl,
+    gl::Error copySubTexture(const gl::Context *context,
                              GLenum target,
                              size_t level,
                              const gl::Offset &destOffset,
@@ -360,7 +360,7 @@
                              bool unpackUnmultiplyAlpha,
                              const gl::Texture *source) override;
 
-    gl::Error setStorage(ContextImpl *contextImpl,
+    gl::Error setStorage(const gl::Context *context,
                          GLenum target,
                          size_t levels,
                          GLenum internalFormat,
@@ -415,7 +415,7 @@
     GLenum getInternalFormat(GLint level) const;
     bool isDepth(GLint level) const;
 
-    gl::Error setImage(ContextImpl *contextImpl,
+    gl::Error setImage(const gl::Context *context,
                        GLenum target,
                        size_t level,
                        GLenum internalFormat,
@@ -424,7 +424,7 @@
                        GLenum type,
                        const gl::PixelUnpackState &unpack,
                        const uint8_t *pixels) override;
-    gl::Error setSubImage(ContextImpl *contextImpl,
+    gl::Error setSubImage(const gl::Context *context,
                           GLenum target,
                           size_t level,
                           const gl::Box &area,
@@ -433,7 +433,7 @@
                           const gl::PixelUnpackState &unpack,
                           const uint8_t *pixels) override;
 
-    gl::Error setCompressedImage(ContextImpl *contextImpl,
+    gl::Error setCompressedImage(const gl::Context *context,
                                  GLenum target,
                                  size_t level,
                                  GLenum internalFormat,
@@ -441,7 +441,7 @@
                                  const gl::PixelUnpackState &unpack,
                                  size_t imageSize,
                                  const uint8_t *pixels) override;
-    gl::Error setCompressedSubImage(ContextImpl *contextImpl,
+    gl::Error setCompressedSubImage(const gl::Context *context,
                                     GLenum target,
                                     size_t level,
                                     const gl::Box &area,
@@ -450,20 +450,20 @@
                                     size_t imageSize,
                                     const uint8_t *pixels) override;
 
-    gl::Error copyImage(ContextImpl *contextImpl,
+    gl::Error copyImage(const gl::Context *context,
                         GLenum target,
                         size_t level,
                         const gl::Rectangle &sourceArea,
                         GLenum internalFormat,
                         const gl::Framebuffer *source) override;
-    gl::Error copySubImage(ContextImpl *contextImpl,
+    gl::Error copySubImage(const gl::Context *context,
                            GLenum target,
                            size_t level,
                            const gl::Offset &destOffset,
                            const gl::Rectangle &sourceArea,
                            const gl::Framebuffer *source) override;
 
-    gl::Error setStorage(ContextImpl *contextImpl,
+    gl::Error setStorage(const gl::Context *context,
                          GLenum target,
                          size_t levels,
                          GLenum internalFormat,
@@ -517,7 +517,7 @@
     GLenum getInternalFormat(GLint level) const;
     bool isDepth(GLint level) const;
 
-    gl::Error setImage(ContextImpl *contextImpl,
+    gl::Error setImage(const gl::Context *context,
                        GLenum target,
                        size_t level,
                        GLenum internalFormat,
@@ -526,7 +526,7 @@
                        GLenum type,
                        const gl::PixelUnpackState &unpack,
                        const uint8_t *pixels) override;
-    gl::Error setSubImage(ContextImpl *contextImpl,
+    gl::Error setSubImage(const gl::Context *context,
                           GLenum target,
                           size_t level,
                           const gl::Box &area,
@@ -535,7 +535,7 @@
                           const gl::PixelUnpackState &unpack,
                           const uint8_t *pixels) override;
 
-    gl::Error setCompressedImage(ContextImpl *contextImpl,
+    gl::Error setCompressedImage(const gl::Context *context,
                                  GLenum target,
                                  size_t level,
                                  GLenum internalFormat,
@@ -543,7 +543,7 @@
                                  const gl::PixelUnpackState &unpack,
                                  size_t imageSize,
                                  const uint8_t *pixels) override;
-    gl::Error setCompressedSubImage(ContextImpl *contextImpl,
+    gl::Error setCompressedSubImage(const gl::Context *context,
                                     GLenum target,
                                     size_t level,
                                     const gl::Box &area,
@@ -552,20 +552,20 @@
                                     size_t imageSize,
                                     const uint8_t *pixels) override;
 
-    gl::Error copyImage(ContextImpl *contextImpl,
+    gl::Error copyImage(const gl::Context *context,
                         GLenum target,
                         size_t level,
                         const gl::Rectangle &sourceArea,
                         GLenum internalFormat,
                         const gl::Framebuffer *source) override;
-    gl::Error copySubImage(ContextImpl *contextImpl,
+    gl::Error copySubImage(const gl::Context *context,
                            GLenum target,
                            size_t level,
                            const gl::Offset &destOffset,
                            const gl::Rectangle &sourceArea,
                            const gl::Framebuffer *source) override;
 
-    gl::Error setStorage(ContextImpl *contextImpl,
+    gl::Error setStorage(const gl::Context *context,
                          GLenum target,
                          size_t levels,
                          GLenum internalFormat,
@@ -618,7 +618,7 @@
     ImageD3D *getImage(const gl::ImageIndex &index) const override;
     GLsizei getLayerCount(int level) const override;
 
-    gl::Error setImage(ContextImpl *contextImpl,
+    gl::Error setImage(const gl::Context *context,
                        GLenum target,
                        size_t level,
                        GLenum internalFormat,
@@ -627,7 +627,7 @@
                        GLenum type,
                        const gl::PixelUnpackState &unpack,
                        const uint8_t *pixels) override;
-    gl::Error setSubImage(ContextImpl *contextImpl,
+    gl::Error setSubImage(const gl::Context *context,
                           GLenum target,
                           size_t level,
                           const gl::Box &area,
@@ -636,7 +636,7 @@
                           const gl::PixelUnpackState &unpack,
                           const uint8_t *pixels) override;
 
-    gl::Error setCompressedImage(ContextImpl *contextImpl,
+    gl::Error setCompressedImage(const gl::Context *context,
                                  GLenum target,
                                  size_t level,
                                  GLenum internalFormat,
@@ -644,7 +644,7 @@
                                  const gl::PixelUnpackState &unpack,
                                  size_t imageSize,
                                  const uint8_t *pixels) override;
-    gl::Error setCompressedSubImage(ContextImpl *contextImpl,
+    gl::Error setCompressedSubImage(const gl::Context *context,
                                     GLenum target,
                                     size_t level,
                                     const gl::Box &area,
@@ -653,20 +653,20 @@
                                     size_t imageSize,
                                     const uint8_t *pixels) override;
 
-    gl::Error copyImage(ContextImpl *contextImpl,
+    gl::Error copyImage(const gl::Context *context,
                         GLenum target,
                         size_t level,
                         const gl::Rectangle &sourceArea,
                         GLenum internalFormat,
                         const gl::Framebuffer *source) override;
-    gl::Error copySubImage(ContextImpl *contextImpl,
+    gl::Error copySubImage(const gl::Context *context,
                            GLenum target,
                            size_t level,
                            const gl::Offset &destOffset,
                            const gl::Rectangle &sourceArea,
                            const gl::Framebuffer *source) override;
 
-    gl::Error setStorage(ContextImpl *contextImpl,
+    gl::Error setStorage(const gl::Context *context,
                          GLenum target,
                          size_t levels,
                          GLenum internalFormat,
@@ -709,7 +709,7 @@
     ~TextureD3D_2DMultisample() override;
 
     ImageD3D *getImage(const gl::ImageIndex &index) const override;
-    gl::Error setImage(ContextImpl *contextImpl,
+    gl::Error setImage(const gl::Context *context,
                        GLenum target,
                        size_t level,
                        GLenum internalFormat,
@@ -718,7 +718,7 @@
                        GLenum type,
                        const gl::PixelUnpackState &unpack,
                        const uint8_t *pixels) override;
-    gl::Error setSubImage(ContextImpl *contextImpl,
+    gl::Error setSubImage(const gl::Context *context,
                           GLenum target,
                           size_t level,
                           const gl::Box &area,
@@ -727,7 +727,7 @@
                           const gl::PixelUnpackState &unpack,
                           const uint8_t *pixels) override;
 
-    gl::Error setCompressedImage(ContextImpl *contextImpl,
+    gl::Error setCompressedImage(const gl::Context *context,
                                  GLenum target,
                                  size_t level,
                                  GLenum internalFormat,
@@ -735,7 +735,7 @@
                                  const gl::PixelUnpackState &unpack,
                                  size_t imageSize,
                                  const uint8_t *pixels) override;
-    gl::Error setCompressedSubImage(ContextImpl *contextImpl,
+    gl::Error setCompressedSubImage(const gl::Context *context,
                                     GLenum target,
                                     size_t level,
                                     const gl::Box &area,
@@ -744,20 +744,20 @@
                                     size_t imageSize,
                                     const uint8_t *pixels) override;
 
-    gl::Error copyImage(ContextImpl *contextImpl,
+    gl::Error copyImage(const gl::Context *context,
                         GLenum target,
                         size_t level,
                         const gl::Rectangle &sourceArea,
                         GLenum internalFormat,
                         const gl::Framebuffer *source) override;
-    gl::Error copySubImage(ContextImpl *contextImpl,
+    gl::Error copySubImage(const gl::Context *context,
                            GLenum target,
                            size_t level,
                            const gl::Offset &destOffset,
                            const gl::Rectangle &sourceArea,
                            const gl::Framebuffer *source) override;
 
-    gl::Error setStorage(ContextImpl *contextImpl,
+    gl::Error setStorage(const gl::Context *context,
                          GLenum target,
                          size_t levels,
                          GLenum internalFormat,
diff --git a/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp b/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp
index d0e7e0b..8197412 100644
--- a/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/Buffer11.cpp
@@ -299,7 +299,7 @@
     mRenderer->onBufferDelete(this);
 }
 
-gl::Error Buffer11::setData(ContextImpl *context,
+gl::Error Buffer11::setData(const gl::Context *context,
                             GLenum target,
                             const void *data,
                             size_t size,
@@ -328,7 +328,7 @@
     return GetAs<SystemMemoryStorage>(storage);
 }
 
-gl::Error Buffer11::setSubData(ContextImpl * /*context*/,
+gl::Error Buffer11::setSubData(const gl::Context * /*context*/,
                                GLenum target,
                                const void *data,
                                size_t size,
@@ -388,7 +388,7 @@
     return gl::NoError();
 }
 
-gl::Error Buffer11::copySubData(ContextImpl *context,
+gl::Error Buffer11::copySubData(const gl::Context *context,
                                 BufferImpl *source,
                                 GLintptr sourceOffset,
                                 GLintptr destOffset,
@@ -452,7 +452,7 @@
     return gl::NoError();
 }
 
-gl::Error Buffer11::map(ContextImpl *context, GLenum access, void **mapPtr)
+gl::Error Buffer11::map(const gl::Context *context, GLenum access, void **mapPtr)
 {
     // GL_OES_mapbuffer uses an enum instead of a bitfield for it's access, convert to a bitfield
     // and call mapRange.
@@ -460,7 +460,7 @@
     return mapRange(context, 0, mSize, GL_MAP_WRITE_BIT, mapPtr);
 }
 
-gl::Error Buffer11::mapRange(ContextImpl *context,
+gl::Error Buffer11::mapRange(const gl::Context *context,
                              size_t offset,
                              size_t length,
                              GLbitfield access,
@@ -504,7 +504,7 @@
     return gl::NoError();
 }
 
-gl::Error Buffer11::unmap(ContextImpl *context, GLboolean *result)
+gl::Error Buffer11::unmap(const gl::Context *context, GLboolean *result)
 {
     ASSERT(mMappedStorage);
     mMappedStorage->unmap();
diff --git a/src/libANGLE/renderer/d3d/d3d11/Buffer11.h b/src/libANGLE/renderer/d3d/d3d11/Buffer11.h
index a198f45..4ae869d 100644
--- a/src/libANGLE/renderer/d3d/d3d11/Buffer11.h
+++ b/src/libANGLE/renderer/d3d/d3d11/Buffer11.h
@@ -76,28 +76,28 @@
     void invalidateStaticData() override;
 
     // BufferImpl implementation
-    gl::Error setData(ContextImpl *context,
+    gl::Error setData(const gl::Context *context,
                       GLenum target,
                       const void *data,
                       size_t size,
                       GLenum usage) override;
-    gl::Error setSubData(ContextImpl *context,
+    gl::Error setSubData(const gl::Context *context,
                          GLenum target,
                          const void *data,
                          size_t size,
                          size_t offset) override;
-    gl::Error copySubData(ContextImpl *contextImpl,
+    gl::Error copySubData(const gl::Context *context,
                           BufferImpl *source,
                           GLintptr sourceOffset,
                           GLintptr destOffset,
                           GLsizeiptr size) override;
-    gl::Error map(ContextImpl *contextImpl, GLenum access, void **mapPtr) override;
-    gl::Error mapRange(ContextImpl *contextImpl,
+    gl::Error map(const gl::Context *context, GLenum access, void **mapPtr) override;
+    gl::Error mapRange(const gl::Context *context,
                        size_t offset,
                        size_t length,
                        GLbitfield access,
                        void **mapPtr) override;
-    gl::Error unmap(ContextImpl *contextImpl, GLboolean *result) override;
+    gl::Error unmap(const gl::Context *context, GLboolean *result) override;
     gl::Error markTransformFeedbackUsage() override;
 
     // We use two set of dirty events. Static buffers are marked dirty whenever
diff --git a/src/libANGLE/renderer/d3d/d3d11/Context11.cpp b/src/libANGLE/renderer/d3d/d3d11/Context11.cpp
index 5a960fe..9085565 100644
--- a/src/libANGLE/renderer/d3d/d3d11/Context11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/Context11.cpp
@@ -149,39 +149,44 @@
     return mRenderer->finish();
 }
 
-gl::Error Context11::drawArrays(GLenum mode, GLint first, GLsizei count)
+gl::Error Context11::drawArrays(const gl::Context *context, GLenum mode, GLint first, GLsizei count)
 {
-    return mRenderer->genericDrawArrays(this, mode, first, count, 0);
+    return mRenderer->genericDrawArrays(context, mode, first, count, 0);
 }
 
-gl::Error Context11::drawArraysInstanced(GLenum mode,
+gl::Error Context11::drawArraysInstanced(const gl::Context *context,
+                                         GLenum mode,
                                          GLint first,
                                          GLsizei count,
                                          GLsizei instanceCount)
 {
-    return mRenderer->genericDrawArrays(this, mode, first, count, instanceCount);
+    return mRenderer->genericDrawArrays(context, mode, first, count, instanceCount);
 }
 
-gl::Error Context11::drawElements(GLenum mode,
+gl::Error Context11::drawElements(const gl::Context *context,
+                                  GLenum mode,
                                   GLsizei count,
                                   GLenum type,
                                   const void *indices,
                                   const gl::IndexRange &indexRange)
 {
-    return mRenderer->genericDrawElements(this, mode, count, type, indices, 0, indexRange);
+    return mRenderer->genericDrawElements(context, mode, count, type, indices, 0, indexRange);
 }
 
-gl::Error Context11::drawElementsInstanced(GLenum mode,
+gl::Error Context11::drawElementsInstanced(const gl::Context *context,
+                                           GLenum mode,
                                            GLsizei count,
                                            GLenum type,
                                            const void *indices,
                                            GLsizei instances,
                                            const gl::IndexRange &indexRange)
 {
-    return mRenderer->genericDrawElements(this, mode, count, type, indices, instances, indexRange);
+    return mRenderer->genericDrawElements(context, mode, count, type, indices, instances,
+                                          indexRange);
 }
 
-gl::Error Context11::drawRangeElements(GLenum mode,
+gl::Error Context11::drawRangeElements(const gl::Context *context,
+                                       GLenum mode,
                                        GLuint start,
                                        GLuint end,
                                        GLsizei count,
@@ -189,17 +194,22 @@
                                        const void *indices,
                                        const gl::IndexRange &indexRange)
 {
-    return mRenderer->genericDrawElements(this, mode, count, type, indices, 0, indexRange);
+    return mRenderer->genericDrawElements(context, mode, count, type, indices, 0, indexRange);
 }
 
-gl::Error Context11::drawArraysIndirect(GLenum mode, const void *indirect)
+gl::Error Context11::drawArraysIndirect(const gl::Context *context,
+                                        GLenum mode,
+                                        const void *indirect)
 {
-    return mRenderer->genericDrawIndirect(this, mode, GL_NONE, indirect);
+    return mRenderer->genericDrawIndirect(context, mode, GL_NONE, indirect);
 }
 
-gl::Error Context11::drawElementsIndirect(GLenum mode, GLenum type, const void *indirect)
+gl::Error Context11::drawElementsIndirect(const gl::Context *context,
+                                          GLenum mode,
+                                          GLenum type,
+                                          const void *indirect)
 {
-    return mRenderer->genericDrawIndirect(this, mode, type, indirect);
+    return mRenderer->genericDrawIndirect(context, mode, type, indirect);
 }
 
 GLenum Context11::getResetStatus()
diff --git a/src/libANGLE/renderer/d3d/d3d11/Context11.h b/src/libANGLE/renderer/d3d/d3d11/Context11.h
index 6947877..f27dc09 100644
--- a/src/libANGLE/renderer/d3d/d3d11/Context11.h
+++ b/src/libANGLE/renderer/d3d/d3d11/Context11.h
@@ -64,32 +64,44 @@
     gl::Error finish() override;
 
     // Drawing methods.
-    gl::Error drawArrays(GLenum mode, GLint first, GLsizei count) override;
-    gl::Error drawArraysInstanced(GLenum mode,
+    gl::Error drawArrays(const gl::Context *context,
+                         GLenum mode,
+                         GLint first,
+                         GLsizei count) override;
+    gl::Error drawArraysInstanced(const gl::Context *context,
+                                  GLenum mode,
                                   GLint first,
                                   GLsizei count,
                                   GLsizei instanceCount) override;
 
-    gl::Error drawElements(GLenum mode,
+    gl::Error drawElements(const gl::Context *context,
+                           GLenum mode,
                            GLsizei count,
                            GLenum type,
                            const void *indices,
                            const gl::IndexRange &indexRange) override;
-    gl::Error drawElementsInstanced(GLenum mode,
+    gl::Error drawElementsInstanced(const gl::Context *context,
+                                    GLenum mode,
                                     GLsizei count,
                                     GLenum type,
                                     const void *indices,
                                     GLsizei instances,
                                     const gl::IndexRange &indexRange) override;
-    gl::Error drawRangeElements(GLenum mode,
+    gl::Error drawRangeElements(const gl::Context *context,
+                                GLenum mode,
                                 GLuint start,
                                 GLuint end,
                                 GLsizei count,
                                 GLenum type,
                                 const void *indices,
                                 const gl::IndexRange &indexRange) override;
-    gl::Error drawArraysIndirect(GLenum mode, const void *indirect) override;
-    gl::Error drawElementsIndirect(GLenum mode, GLenum type, const void *indirect) override;
+    gl::Error drawArraysIndirect(const gl::Context *context,
+                                 GLenum mode,
+                                 const void *indirect) override;
+    gl::Error drawElementsIndirect(const gl::Context *context,
+                                   GLenum mode,
+                                   GLenum type,
+                                   const void *indirect) override;
 
     // Device loss
     GLenum getResetStatus() override;
diff --git a/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp b/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp
index 4cbabbc..f111e4f 100644
--- a/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp
@@ -104,7 +104,7 @@
     return gl::NoError();
 }
 
-gl::Error Framebuffer11::clearImpl(ContextImpl *context, const ClearParameters &clearParams)
+gl::Error Framebuffer11::clearImpl(const gl::Context *context, const ClearParameters &clearParams)
 {
     Clear11 *clearer = mRenderer->getClearer();
 
@@ -376,7 +376,8 @@
                              &mDepthStencilRenderTargetDirty);
 }
 
-void Framebuffer11::syncState(ContextImpl *contextImpl, const gl::Framebuffer::DirtyBits &dirtyBits)
+void Framebuffer11::syncState(const gl::Context *context,
+                              const gl::Framebuffer::DirtyBits &dirtyBits)
 {
     mRenderer->getStateManager()->invalidateRenderTarget();
 
@@ -409,7 +410,7 @@
     // We should not have dirtied any additional state during our sync.
     ASSERT(!mInternalDirtyBits.any());
 
-    FramebufferD3D::syncState(contextImpl, dirtyBits);
+    FramebufferD3D::syncState(context, dirtyBits);
 }
 
 void Framebuffer11::signal(size_t channelID)
@@ -438,9 +439,9 @@
     return mInternalDirtyBits.any();
 }
 
-void Framebuffer11::syncInternalState(ContextImpl *contextImpl)
+void Framebuffer11::syncInternalState(const gl::Context *context)
 {
-    syncState(contextImpl, gl::Framebuffer::DirtyBits());
+    syncState(context, gl::Framebuffer::DirtyBits());
 }
 
 }  // namespace rx
diff --git a/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.h b/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.h
index 383caf6..f42c4a9 100644
--- a/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.h
+++ b/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.h
@@ -30,7 +30,8 @@
     // Invalidate the cached swizzles of all bound texture attachments.
     gl::Error markAttachmentsDirty() const;
 
-    void syncState(ContextImpl *contextImpl, const gl::Framebuffer::DirtyBits &dirtyBits) override;
+    void syncState(const gl::Context *context,
+                   const gl::Framebuffer::DirtyBits &dirtyBits) override;
 
     const RenderTargetArray &getCachedColorRenderTargets() const
     {
@@ -42,14 +43,14 @@
     }
 
     bool hasAnyInternalDirtyBit() const;
-    void syncInternalState(ContextImpl *contextImpl);
+    void syncInternalState(const gl::Context *context);
 
     void signal(size_t channelID) override;
 
     gl::Error getSamplePosition(size_t index, GLfloat *xy) const override;
 
   private:
-    gl::Error clearImpl(ContextImpl *context, const ClearParameters &clearParams) override;
+    gl::Error clearImpl(const gl::Context *context, const ClearParameters &clearParams) override;
 
     gl::Error readPixelsImpl(const gl::Rectangle &area,
                              GLenum format,
diff --git a/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp b/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
index f7dbd88..9f21206 100644
--- a/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
@@ -15,6 +15,7 @@
 #include "common/tls.h"
 #include "common/utilities.h"
 #include "libANGLE/Buffer.h"
+#include "libANGLE/Context.h"
 #include "libANGLE/Display.h"
 #include "libANGLE/Framebuffer.h"
 #include "libANGLE/FramebufferAttachment.h"
@@ -1665,16 +1666,16 @@
     return gl::NoError();
 }
 
-gl::Error Renderer11::updateState(ContextImpl *contextImpl, GLenum drawMode)
+gl::Error Renderer11::updateState(const gl::Context *context, GLenum drawMode)
 {
-    const auto &data    = contextImpl->getContextState();
+    const auto &data    = context->getContextState();
     const auto &glState = data.getState();
 
     // Applies the render target surface, depth stencil surface, viewport rectangle and
     // scissor rectangle to the renderer
     gl::Framebuffer *framebuffer = glState.getDrawFramebuffer();
     ASSERT(framebuffer && !framebuffer->hasAnyDirtyBit() && framebuffer->cachedComplete());
-    ANGLE_TRY(mStateManager.syncFramebuffer(contextImpl, framebuffer));
+    ANGLE_TRY(mStateManager.syncFramebuffer(context, framebuffer));
 
     // Set the present path state
     auto firstColorAttachment        = framebuffer->getFirstColorbuffer();
@@ -4659,7 +4660,7 @@
     return new Context11(state, this);
 }
 
-gl::Error Renderer11::genericDrawElements(Context11 *context,
+gl::Error Renderer11::genericDrawElements(const gl::Context *context,
                                           GLenum mode,
                                           GLsizei count,
                                           GLenum type,
@@ -4698,7 +4699,7 @@
     size_t vertexCount = indexInfo.indexRange.vertexCount();
     ANGLE_TRY(applyVertexBuffer(glState, mode, static_cast<GLsizei>(indexInfo.indexRange.start),
                                 static_cast<GLsizei>(vertexCount), instances, &indexInfo));
-    ANGLE_TRY(applyTextures(context, data));
+    ANGLE_TRY(applyTextures(context->getImplementation(), data));
     ANGLE_TRY(applyShaders(data, mode));
     ANGLE_TRY(programD3D->applyUniformBuffers(data));
 
@@ -4710,7 +4711,7 @@
     return gl::NoError();
 }
 
-gl::Error Renderer11::genericDrawArrays(Context11 *context,
+gl::Error Renderer11::genericDrawArrays(const gl::Context *context,
                                         GLenum mode,
                                         GLint first,
                                         GLsizei count,
@@ -4734,7 +4735,7 @@
     ANGLE_TRY(updateState(context, mode));
     ANGLE_TRY(applyTransformFeedbackBuffers(data));
     ANGLE_TRY(applyVertexBuffer(glState, mode, first, count, instances, nullptr));
-    ANGLE_TRY(applyTextures(context, data));
+    ANGLE_TRY(applyTextures(context->getImplementation(), data));
     ANGLE_TRY(applyShaders(data, mode));
     ANGLE_TRY(programD3D->applyUniformBuffers(data));
 
@@ -4751,7 +4752,7 @@
     return gl::NoError();
 }
 
-gl::Error Renderer11::genericDrawIndirect(Context11 *context,
+gl::Error Renderer11::genericDrawIndirect(const gl::Context *context,
                                           GLenum mode,
                                           GLenum type,
                                           const void *indirect)
@@ -4769,7 +4770,7 @@
     ANGLE_TRY(updateState(context, mode));
     ANGLE_TRY(applyTransformFeedbackBuffers(data));
     ASSERT(!glState.isTransformFeedbackActiveUnpaused());
-    ANGLE_TRY(applyTextures(context, data));
+    ANGLE_TRY(applyTextures(context->getImplementation(), data));
     ANGLE_TRY(applyShaders(data, mode));
     ANGLE_TRY(programD3D->applyUniformBuffers(data));
 
diff --git a/src/libANGLE/renderer/d3d/d3d11/Renderer11.h b/src/libANGLE/renderer/d3d/d3d11/Renderer11.h
index 267e24d..fc1fbb3 100644
--- a/src/libANGLE/renderer/d3d/d3d11/Renderer11.h
+++ b/src/libANGLE/renderer/d3d/d3d11/Renderer11.h
@@ -148,7 +148,7 @@
                                 const std::vector<GLint> &vertexUniformBuffers,
                                 const std::vector<GLint> &fragmentUniformBuffers) override;
 
-    gl::Error updateState(ContextImpl *contextImpl, GLenum drawMode);
+    gl::Error updateState(const gl::Context *context, GLenum drawMode);
 
     bool applyPrimitiveType(GLenum mode, GLsizei count, bool usesPointSize);
     gl::Error applyUniforms(const ProgramD3D &programD3D,
@@ -384,13 +384,13 @@
 
     egl::Error getEGLDevice(DeviceImpl **device) override;
 
-    gl::Error genericDrawArrays(Context11 *context,
+    gl::Error genericDrawArrays(const gl::Context *context,
                                 GLenum mode,
                                 GLint first,
                                 GLsizei count,
                                 GLsizei instances);
 
-    gl::Error genericDrawElements(Context11 *context,
+    gl::Error genericDrawElements(const gl::Context *context,
                                   GLenum mode,
                                   GLsizei count,
                                   GLenum type,
@@ -398,7 +398,7 @@
                                   GLsizei instances,
                                   const gl::IndexRange &indexRange);
 
-    gl::Error genericDrawIndirect(Context11 *context,
+    gl::Error genericDrawIndirect(const gl::Context *context,
                                   GLenum mode,
                                   GLenum type,
                                   const void *indirect);
diff --git a/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp b/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp
index a920d0a..506ed87 100644
--- a/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/StateManager11.cpp
@@ -986,7 +986,7 @@
     mCurrentValueAttribs.clear();
 }
 
-gl::Error StateManager11::syncFramebuffer(ContextImpl *contextImpl, gl::Framebuffer *framebuffer)
+gl::Error StateManager11::syncFramebuffer(const gl::Context *context, gl::Framebuffer *framebuffer)
 {
     Framebuffer11 *framebuffer11 = GetImplAs<Framebuffer11>(framebuffer);
     ANGLE_TRY(framebuffer11->markAttachmentsDirty());
@@ -994,7 +994,7 @@
     if (framebuffer11->hasAnyInternalDirtyBit())
     {
         ASSERT(framebuffer->id() != 0);
-        framebuffer11->syncInternalState(contextImpl);
+        framebuffer11->syncInternalState(context);
     }
 
     if (!mRenderTargetIsDirty)
diff --git a/src/libANGLE/renderer/d3d/d3d11/StateManager11.h b/src/libANGLE/renderer/d3d/d3d11/StateManager11.h
index 83e8dfa..f9dea00 100644
--- a/src/libANGLE/renderer/d3d/d3d11/StateManager11.h
+++ b/src/libANGLE/renderer/d3d/d3d11/StateManager11.h
@@ -86,7 +86,7 @@
                            ID3D11ShaderResourceView *srv);
     gl::Error clearTextures(gl::SamplerType samplerType, size_t rangeStart, size_t rangeEnd);
 
-    gl::Error syncFramebuffer(ContextImpl *contextImpl, gl::Framebuffer *framebuffer);
+    gl::Error syncFramebuffer(const gl::Context *context, gl::Framebuffer *framebuffer);
 
     void invalidateRenderTarget();
     void invalidateBoundViews();
diff --git a/src/libANGLE/renderer/d3d/d3d11/VertexArray11.cpp b/src/libANGLE/renderer/d3d/d3d11/VertexArray11.cpp
index 73814a7..9083d9e 100644
--- a/src/libANGLE/renderer/d3d/d3d11/VertexArray11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/VertexArray11.cpp
@@ -40,7 +40,8 @@
     }
 }
 
-void VertexArray11::syncState(ContextImpl *contextImpl, const gl::VertexArray::DirtyBits &dirtyBits)
+void VertexArray11::syncState(const gl::Context *context,
+                              const gl::VertexArray::DirtyBits &dirtyBits)
 {
     for (auto dirtyBit : dirtyBits)
     {
diff --git a/src/libANGLE/renderer/d3d/d3d11/VertexArray11.h b/src/libANGLE/renderer/d3d/d3d11/VertexArray11.h
index 4fda434..7eb453b 100644
--- a/src/libANGLE/renderer/d3d/d3d11/VertexArray11.h
+++ b/src/libANGLE/renderer/d3d/d3d11/VertexArray11.h
@@ -24,7 +24,8 @@
     VertexArray11(const gl::VertexArrayState &data);
     ~VertexArray11() override;
 
-    void syncState(ContextImpl *contextImpl, const gl::VertexArray::DirtyBits &dirtyBits) override;
+    void syncState(const gl::Context *context,
+                   const gl::VertexArray::DirtyBits &dirtyBits) override;
     // This will flush any pending attrib updates and then check the dynamic attribs mask.
     bool hasDynamicAttrib(const gl::State &state);
     gl::Error updateDirtyAndDynamicAttribs(VertexDataManager *vertexDataManager,
diff --git a/src/libANGLE/renderer/d3d/d3d9/Buffer9.cpp b/src/libANGLE/renderer/d3d/d3d9/Buffer9.cpp
index 534a252..1e65b71 100644
--- a/src/libANGLE/renderer/d3d/d3d9/Buffer9.cpp
+++ b/src/libANGLE/renderer/d3d/d3d9/Buffer9.cpp
@@ -22,7 +22,7 @@
     mSize = 0;
 }
 
-gl::Error Buffer9::setData(ContextImpl * /*context*/,
+gl::Error Buffer9::setData(const gl::Context * /*context*/,
                            GLenum /*target*/,
                            const void *data,
                            size_t size,
@@ -55,7 +55,7 @@
     return gl::NoError();
 }
 
-gl::Error Buffer9::setSubData(ContextImpl * /*context*/,
+gl::Error Buffer9::setSubData(const gl::Context * /*context*/,
                               GLenum /*target*/,
                               const void *data,
                               size_t size,
@@ -80,7 +80,7 @@
     return gl::NoError();
 }
 
-gl::Error Buffer9::copySubData(ContextImpl *context,
+gl::Error Buffer9::copySubData(const gl::Context *context,
                                BufferImpl *source,
                                GLintptr sourceOffset,
                                GLintptr destOffset,
@@ -98,13 +98,13 @@
 }
 
 // We do not support buffer mapping in D3D9
-gl::Error Buffer9::map(ContextImpl *context, GLenum access, void **mapPtr)
+gl::Error Buffer9::map(const gl::Context *context, GLenum access, void **mapPtr)
 {
     UNREACHABLE();
     return gl::Error(GL_INVALID_OPERATION);
 }
 
-gl::Error Buffer9::mapRange(ContextImpl *context,
+gl::Error Buffer9::mapRange(const gl::Context *context,
                             size_t offset,
                             size_t length,
                             GLbitfield access,
@@ -114,7 +114,7 @@
     return gl::Error(GL_INVALID_OPERATION);
 }
 
-gl::Error Buffer9::unmap(ContextImpl *context, GLboolean *result)
+gl::Error Buffer9::unmap(const gl::Context *context, GLboolean *result)
 {
     UNREACHABLE();
     return gl::Error(GL_INVALID_OPERATION);
diff --git a/src/libANGLE/renderer/d3d/d3d9/Buffer9.h b/src/libANGLE/renderer/d3d/d3d9/Buffer9.h
index a0a6ccc..6173afa 100644
--- a/src/libANGLE/renderer/d3d/d3d9/Buffer9.h
+++ b/src/libANGLE/renderer/d3d/d3d9/Buffer9.h
@@ -29,28 +29,28 @@
     gl::Error getData(const uint8_t **outData) override;
 
     // BufferImpl implementation
-    gl::Error setData(ContextImpl *context,
+    gl::Error setData(const gl::Context *context,
                       GLenum target,
                       const void *data,
                       size_t size,
                       GLenum usage) override;
-    gl::Error setSubData(ContextImpl *context,
+    gl::Error setSubData(const gl::Context *context,
                          GLenum target,
                          const void *data,
                          size_t size,
                          size_t offset) override;
-    gl::Error copySubData(ContextImpl *context,
+    gl::Error copySubData(const gl::Context *context,
                           BufferImpl *source,
                           GLintptr sourceOffset,
                           GLintptr destOffset,
                           GLsizeiptr size) override;
-    gl::Error map(ContextImpl *context, GLenum access, void **mapPtr) override;
-    gl::Error mapRange(ContextImpl *context,
+    gl::Error map(const gl::Context *context, GLenum access, void **mapPtr) override;
+    gl::Error mapRange(const gl::Context *context,
                        size_t offset,
                        size_t length,
                        GLbitfield access,
                        void **mapPtr) override;
-    gl::Error unmap(ContextImpl *context, GLboolean *result) override;
+    gl::Error unmap(const gl::Context *context, GLboolean *result) override;
     gl::Error markTransformFeedbackUsage() override;
 
   private:
diff --git a/src/libANGLE/renderer/d3d/d3d9/Context9.cpp b/src/libANGLE/renderer/d3d/d3d9/Context9.cpp
index 3263980..ba56811 100644
--- a/src/libANGLE/renderer/d3d/d3d9/Context9.cpp
+++ b/src/libANGLE/renderer/d3d/d3d9/Context9.cpp
@@ -135,12 +135,13 @@
     return mRenderer->finish();
 }
 
-gl::Error Context9::drawArrays(GLenum mode, GLint first, GLsizei count)
+gl::Error Context9::drawArrays(const gl::Context *context, GLenum mode, GLint first, GLsizei count)
 {
     return mRenderer->genericDrawArrays(this, mode, first, count, 0);
 }
 
-gl::Error Context9::drawArraysInstanced(GLenum mode,
+gl::Error Context9::drawArraysInstanced(const gl::Context *context,
+                                        GLenum mode,
                                         GLint first,
                                         GLsizei count,
                                         GLsizei instanceCount)
@@ -148,7 +149,8 @@
     return mRenderer->genericDrawArrays(this, mode, first, count, instanceCount);
 }
 
-gl::Error Context9::drawElements(GLenum mode,
+gl::Error Context9::drawElements(const gl::Context *context,
+                                 GLenum mode,
                                  GLsizei count,
                                  GLenum type,
                                  const void *indices,
@@ -157,7 +159,8 @@
     return mRenderer->genericDrawElements(this, mode, count, type, indices, 0, indexRange);
 }
 
-gl::Error Context9::drawElementsInstanced(GLenum mode,
+gl::Error Context9::drawElementsInstanced(const gl::Context *context,
+                                          GLenum mode,
                                           GLsizei count,
                                           GLenum type,
                                           const void *indices,
@@ -167,7 +170,8 @@
     return mRenderer->genericDrawElements(this, mode, count, type, indices, instances, indexRange);
 }
 
-gl::Error Context9::drawRangeElements(GLenum mode,
+gl::Error Context9::drawRangeElements(const gl::Context *context,
+                                      GLenum mode,
                                       GLuint start,
                                       GLuint end,
                                       GLsizei count,
@@ -178,13 +182,18 @@
     return mRenderer->genericDrawElements(this, mode, count, type, indices, 0, indexRange);
 }
 
-gl::Error Context9::drawArraysIndirect(GLenum mode, const void *indirect)
+gl::Error Context9::drawArraysIndirect(const gl::Context *context,
+                                       GLenum mode,
+                                       const void *indirect)
 {
     UNREACHABLE();
     return gl::InternalError() << "D3D9 doesn't support ES 3.1 DrawArraysIndirect API";
 }
 
-gl::Error Context9::drawElementsIndirect(GLenum mode, GLenum type, const void *indirect)
+gl::Error Context9::drawElementsIndirect(const gl::Context *context,
+                                         GLenum mode,
+                                         GLenum type,
+                                         const void *indirect)
 {
     UNREACHABLE();
     return gl::InternalError() << "D3D9 doesn't support ES 3.1 DrawElementsIndirect API";
diff --git a/src/libANGLE/renderer/d3d/d3d9/Context9.h b/src/libANGLE/renderer/d3d/d3d9/Context9.h
index f69ed97..132bf4e 100644
--- a/src/libANGLE/renderer/d3d/d3d9/Context9.h
+++ b/src/libANGLE/renderer/d3d/d3d9/Context9.h
@@ -64,32 +64,44 @@
     gl::Error finish() override;
 
     // Drawing methods.
-    gl::Error drawArrays(GLenum mode, GLint first, GLsizei count) override;
-    gl::Error drawArraysInstanced(GLenum mode,
+    gl::Error drawArrays(const gl::Context *context,
+                         GLenum mode,
+                         GLint first,
+                         GLsizei count) override;
+    gl::Error drawArraysInstanced(const gl::Context *context,
+                                  GLenum mode,
                                   GLint first,
                                   GLsizei count,
                                   GLsizei instanceCount) override;
 
-    gl::Error drawElements(GLenum mode,
+    gl::Error drawElements(const gl::Context *context,
+                           GLenum mode,
                            GLsizei count,
                            GLenum type,
                            const void *indices,
                            const gl::IndexRange &indexRange) override;
-    gl::Error drawElementsInstanced(GLenum mode,
+    gl::Error drawElementsInstanced(const gl::Context *context,
+                                    GLenum mode,
                                     GLsizei count,
                                     GLenum type,
                                     const void *indices,
                                     GLsizei instances,
                                     const gl::IndexRange &indexRange) override;
-    gl::Error drawRangeElements(GLenum mode,
+    gl::Error drawRangeElements(const gl::Context *context,
+                                GLenum mode,
                                 GLuint start,
                                 GLuint end,
                                 GLsizei count,
                                 GLenum type,
                                 const void *indices,
                                 const gl::IndexRange &indexRange) override;
-    gl::Error drawArraysIndirect(GLenum mode, const void *indirect) override;
-    gl::Error drawElementsIndirect(GLenum mode, GLenum type, const void *indirect) override;
+    gl::Error drawArraysIndirect(const gl::Context *context,
+                                 GLenum mode,
+                                 const void *indirect) override;
+    gl::Error drawElementsIndirect(const gl::Context *context,
+                                   GLenum mode,
+                                   GLenum type,
+                                   const void *indirect) override;
 
     // Device loss
     GLenum getResetStatus() override;
diff --git a/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.cpp b/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.cpp
index 9155c98..eb09437 100644
--- a/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.cpp
+++ b/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.cpp
@@ -8,18 +8,19 @@
 
 #include "libANGLE/renderer/d3d/d3d9/Framebuffer9.h"
 
+#include "libANGLE/Context.h"
 #include "libANGLE/Framebuffer.h"
 #include "libANGLE/FramebufferAttachment.h"
 #include "libANGLE/Texture.h"
 #include "libANGLE/formatutils.h"
 #include "libANGLE/renderer/ContextImpl.h"
-#include "libANGLE/renderer/renderer_utils.h"
 #include "libANGLE/renderer/d3d/TextureD3D.h"
-#include "libANGLE/renderer/d3d/d3d9/Renderer9.h"
 #include "libANGLE/renderer/d3d/d3d9/RenderTarget9.h"
+#include "libANGLE/renderer/d3d/d3d9/Renderer9.h"
 #include "libANGLE/renderer/d3d/d3d9/TextureStorage9.h"
 #include "libANGLE/renderer/d3d/d3d9/formatutils9.h"
 #include "libANGLE/renderer/d3d/d3d9/renderer9_utils.h"
+#include "libANGLE/renderer/renderer_utils.h"
 
 namespace rx
 {
@@ -55,17 +56,13 @@
     return gl::NoError();
 }
 
-gl::Error Framebuffer9::clearImpl(ContextImpl *context, const ClearParameters &clearParams)
+gl::Error Framebuffer9::clearImpl(const gl::Context *context, const ClearParameters &clearParams)
 {
     const gl::FramebufferAttachment *colorAttachment        = mState.getColorAttachment(0);
     const gl::FramebufferAttachment *depthStencilAttachment = mState.getDepthOrStencilAttachment();
 
-    gl::Error error =
-        mRenderer->applyRenderTarget(context, colorAttachment, depthStencilAttachment);
-    if (error.isError())
-    {
-        return error;
-    }
+    ANGLE_TRY(mRenderer->applyRenderTarget(context->getImplementation(), colorAttachment,
+                                           depthStencilAttachment));
 
     const gl::State &glState = context->getGLState();
     float nearZ              = glState.getNearPlane();
diff --git a/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.h b/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.h
index 8401350..a569cb0 100644
--- a/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.h
+++ b/src/libANGLE/renderer/d3d/d3d9/Framebuffer9.h
@@ -26,7 +26,7 @@
     gl::Error invalidateSub(size_t count, const GLenum *attachments, const gl::Rectangle &area) override;
 
   private:
-    gl::Error clearImpl(ContextImpl *context, const ClearParameters &clearParams) override;
+    gl::Error clearImpl(const gl::Context *context, const ClearParameters &clearParams) override;
 
     gl::Error readPixelsImpl(const gl::Rectangle &area,
                              GLenum format,
diff --git a/src/libANGLE/renderer/gl/BufferGL.cpp b/src/libANGLE/renderer/gl/BufferGL.cpp
index 91c8757..2a1b393 100644
--- a/src/libANGLE/renderer/gl/BufferGL.cpp
+++ b/src/libANGLE/renderer/gl/BufferGL.cpp
@@ -55,7 +55,7 @@
     mBufferID = 0;
 }
 
-gl::Error BufferGL::setData(ContextImpl * /*context*/,
+gl::Error BufferGL::setData(const gl::Context * /*context*/,
                             GLenum /*target*/,
                             const void *data,
                             size_t size,
@@ -82,7 +82,7 @@
     return gl::NoError();
 }
 
-gl::Error BufferGL::setSubData(ContextImpl * /*context*/,
+gl::Error BufferGL::setSubData(const gl::Context * /*context*/,
                                GLenum /*target*/,
                                const void *data,
                                size_t size,
@@ -99,7 +99,7 @@
     return gl::NoError();
 }
 
-gl::Error BufferGL::copySubData(ContextImpl *context,
+gl::Error BufferGL::copySubData(const gl::Context *context,
                                 BufferImpl *source,
                                 GLintptr sourceOffset,
                                 GLintptr destOffset,
@@ -122,7 +122,7 @@
     return gl::NoError();
 }
 
-gl::Error BufferGL::map(ContextImpl *context, GLenum access, void **mapPtr)
+gl::Error BufferGL::map(const gl::Context *context, GLenum access, void **mapPtr)
 {
     if (mShadowBufferData)
     {
@@ -148,7 +148,7 @@
     return gl::NoError();
 }
 
-gl::Error BufferGL::mapRange(ContextImpl *context,
+gl::Error BufferGL::mapRange(const gl::Context *context,
                              size_t offset,
                              size_t length,
                              GLbitfield access,
@@ -171,7 +171,7 @@
     return gl::NoError();
 }
 
-gl::Error BufferGL::unmap(ContextImpl *context, GLboolean *result)
+gl::Error BufferGL::unmap(const gl::Context *context, GLboolean *result)
 {
     ASSERT(result);
     ASSERT(mIsMapped);
diff --git a/src/libANGLE/renderer/gl/BufferGL.h b/src/libANGLE/renderer/gl/BufferGL.h
index 2114ddb..b79d47d 100644
--- a/src/libANGLE/renderer/gl/BufferGL.h
+++ b/src/libANGLE/renderer/gl/BufferGL.h
@@ -26,28 +26,28 @@
              StateManagerGL *stateManager);
     ~BufferGL() override;
 
-    gl::Error setData(ContextImpl *context,
+    gl::Error setData(const gl::Context *context,
                       GLenum target,
                       const void *data,
                       size_t size,
                       GLenum usage) override;
-    gl::Error setSubData(ContextImpl *context,
+    gl::Error setSubData(const gl::Context *context,
                          GLenum target,
                          const void *data,
                          size_t size,
                          size_t offset) override;
-    gl::Error copySubData(ContextImpl *contextImpl,
+    gl::Error copySubData(const gl::Context *context,
                           BufferImpl *source,
                           GLintptr sourceOffset,
                           GLintptr destOffset,
                           GLsizeiptr size) override;
-    gl::Error map(ContextImpl *contextImpl, GLenum access, void **mapPtr) override;
-    gl::Error mapRange(ContextImpl *contextImpl,
+    gl::Error map(const gl::Context *context, GLenum access, void **mapPtr) override;
+    gl::Error mapRange(const gl::Context *context,
                        size_t offset,
                        size_t length,
                        GLbitfield access,
                        void **mapPtr) override;
-    gl::Error unmap(ContextImpl *contextImpl, GLboolean *result) override;
+    gl::Error unmap(const gl::Context *context, GLboolean *result) override;
 
     gl::Error getIndexRange(GLenum type,
                             size_t offset,
diff --git a/src/libANGLE/renderer/gl/ContextGL.cpp b/src/libANGLE/renderer/gl/ContextGL.cpp
index 7093caf..5641bc4 100644
--- a/src/libANGLE/renderer/gl/ContextGL.cpp
+++ b/src/libANGLE/renderer/gl/ContextGL.cpp
@@ -150,12 +150,13 @@
     return mRenderer->finish();
 }
 
-gl::Error ContextGL::drawArrays(GLenum mode, GLint first, GLsizei count)
+gl::Error ContextGL::drawArrays(const gl::Context *context, GLenum mode, GLint first, GLsizei count)
 {
     return mRenderer->drawArrays(mState, mode, first, count);
 }
 
-gl::Error ContextGL::drawArraysInstanced(GLenum mode,
+gl::Error ContextGL::drawArraysInstanced(const gl::Context *context,
+                                         GLenum mode,
                                          GLint first,
                                          GLsizei count,
                                          GLsizei instanceCount)
@@ -163,7 +164,8 @@
     return mRenderer->drawArraysInstanced(mState, mode, first, count, instanceCount);
 }
 
-gl::Error ContextGL::drawElements(GLenum mode,
+gl::Error ContextGL::drawElements(const gl::Context *context,
+                                  GLenum mode,
                                   GLsizei count,
                                   GLenum type,
                                   const void *indices,
@@ -172,7 +174,8 @@
     return mRenderer->drawElements(mState, mode, count, type, indices, indexRange);
 }
 
-gl::Error ContextGL::drawElementsInstanced(GLenum mode,
+gl::Error ContextGL::drawElementsInstanced(const gl::Context *context,
+                                           GLenum mode,
                                            GLsizei count,
                                            GLenum type,
                                            const void *indices,
@@ -183,7 +186,8 @@
                                             indexRange);
 }
 
-gl::Error ContextGL::drawRangeElements(GLenum mode,
+gl::Error ContextGL::drawRangeElements(const gl::Context *context,
+                                       GLenum mode,
                                        GLuint start,
                                        GLuint end,
                                        GLsizei count,
@@ -194,12 +198,17 @@
     return mRenderer->drawRangeElements(mState, mode, start, end, count, type, indices, indexRange);
 }
 
-gl::Error ContextGL::drawArraysIndirect(GLenum mode, const void *indirect)
+gl::Error ContextGL::drawArraysIndirect(const gl::Context *context,
+                                        GLenum mode,
+                                        const void *indirect)
 {
     return mRenderer->drawArraysIndirect(mState, mode, indirect);
 }
 
-gl::Error ContextGL::drawElementsIndirect(GLenum mode, GLenum type, const void *indirect)
+gl::Error ContextGL::drawElementsIndirect(const gl::Context *context,
+                                          GLenum mode,
+                                          GLenum type,
+                                          const void *indirect)
 {
     return mRenderer->drawElementsIndirect(mState, mode, type, indirect);
 }
diff --git a/src/libANGLE/renderer/gl/ContextGL.h b/src/libANGLE/renderer/gl/ContextGL.h
index 2e8a162..8260350 100644
--- a/src/libANGLE/renderer/gl/ContextGL.h
+++ b/src/libANGLE/renderer/gl/ContextGL.h
@@ -72,32 +72,44 @@
     gl::Error finish() override;
 
     // Drawing methods.
-    gl::Error drawArrays(GLenum mode, GLint first, GLsizei count) override;
-    gl::Error drawArraysInstanced(GLenum mode,
+    gl::Error drawArrays(const gl::Context *context,
+                         GLenum mode,
+                         GLint first,
+                         GLsizei count) override;
+    gl::Error drawArraysInstanced(const gl::Context *context,
+                                  GLenum mode,
                                   GLint first,
                                   GLsizei count,
                                   GLsizei instanceCount) override;
 
-    gl::Error drawElements(GLenum mode,
+    gl::Error drawElements(const gl::Context *context,
+                           GLenum mode,
                            GLsizei count,
                            GLenum type,
                            const void *indices,
                            const gl::IndexRange &indexRange) override;
-    gl::Error drawElementsInstanced(GLenum mode,
+    gl::Error drawElementsInstanced(const gl::Context *context,
+                                    GLenum mode,
                                     GLsizei count,
                                     GLenum type,
                                     const void *indices,
                                     GLsizei instances,
                                     const gl::IndexRange &indexRange) override;
-    gl::Error drawRangeElements(GLenum mode,
+    gl::Error drawRangeElements(const gl::Context *context,
+                                GLenum mode,
                                 GLuint start,
                                 GLuint end,
                                 GLsizei count,
                                 GLenum type,
                                 const void *indices,
                                 const gl::IndexRange &indexRange) override;
-    gl::Error drawArraysIndirect(GLenum mode, const void *indirect) override;
-    gl::Error drawElementsIndirect(GLenum mode, GLenum type, const void *indirect) override;
+    gl::Error drawArraysIndirect(const gl::Context *context,
+                                 GLenum mode,
+                                 const void *indirect) override;
+    gl::Error drawElementsIndirect(const gl::Context *context,
+                                   GLenum mode,
+                                   GLenum type,
+                                   const void *indirect) override;
 
     // CHROMIUM_path_rendering implementation
     void stencilFillPath(const gl::Path *path, GLenum fillMode, GLuint mask) override;
diff --git a/src/libANGLE/renderer/gl/FramebufferGL.cpp b/src/libANGLE/renderer/gl/FramebufferGL.cpp
index 15f23d4..d286f8d 100644
--- a/src/libANGLE/renderer/gl/FramebufferGL.cpp
+++ b/src/libANGLE/renderer/gl/FramebufferGL.cpp
@@ -10,7 +10,7 @@
 
 #include "common/bitset_utils.h"
 #include "common/debug.h"
-#include "libANGLE/ContextState.h"
+#include "libANGLE/Context.h"
 #include "libANGLE/FramebufferAttachment.h"
 #include "libANGLE/State.h"
 #include "libANGLE/angletypes.h"
@@ -189,7 +189,7 @@
     return NoError();
 }
 
-Error FramebufferGL::clear(ContextImpl *context, GLbitfield mask)
+Error FramebufferGL::clear(const gl::Context *context, GLbitfield mask)
 {
     syncClearState(context, mask);
     mStateManager->bindFramebuffer(GL_FRAMEBUFFER, mFramebufferID);
@@ -198,7 +198,7 @@
     return NoError();
 }
 
-Error FramebufferGL::clearBufferfv(ContextImpl *context,
+Error FramebufferGL::clearBufferfv(const gl::Context *context,
                                    GLenum buffer,
                                    GLint drawbuffer,
                                    const GLfloat *values)
@@ -210,7 +210,7 @@
     return NoError();
 }
 
-Error FramebufferGL::clearBufferuiv(ContextImpl *context,
+Error FramebufferGL::clearBufferuiv(const gl::Context *context,
                                     GLenum buffer,
                                     GLint drawbuffer,
                                     const GLuint *values)
@@ -222,7 +222,7 @@
     return NoError();
 }
 
-Error FramebufferGL::clearBufferiv(ContextImpl *context,
+Error FramebufferGL::clearBufferiv(const gl::Context *context,
                                    GLenum buffer,
                                    GLint drawbuffer,
                                    const GLint *values)
@@ -234,7 +234,7 @@
     return NoError();
 }
 
-Error FramebufferGL::clearBufferfi(ContextImpl *context,
+Error FramebufferGL::clearBufferfi(const gl::Context *context,
                                    GLenum buffer,
                                    GLint drawbuffer,
                                    GLfloat depth,
@@ -261,7 +261,7 @@
     return format.info->getReadPixelsType();
 }
 
-Error FramebufferGL::readPixels(ContextImpl *context,
+Error FramebufferGL::readPixels(const gl::Context *context,
                                 const gl::Rectangle &area,
                                 GLenum format,
                                 GLenum type,
@@ -305,7 +305,7 @@
     return gl::NoError();
 }
 
-Error FramebufferGL::blit(ContextImpl *context,
+Error FramebufferGL::blit(const gl::Context *context,
                           const gl::Rectangle &sourceArea,
                           const gl::Rectangle &destArea,
                           GLbitfield mask,
@@ -411,7 +411,7 @@
     return (status == GL_FRAMEBUFFER_COMPLETE);
 }
 
-void FramebufferGL::syncState(ContextImpl *contextImpl, const Framebuffer::DirtyBits &dirtyBits)
+void FramebufferGL::syncState(const gl::Context *context, const Framebuffer::DirtyBits &dirtyBits)
 {
     // Don't need to sync state for the default FBO.
     if (mIsDefault)
@@ -485,7 +485,7 @@
     return mIsDefault;
 }
 
-void FramebufferGL::syncClearState(ContextImpl *context, GLbitfield mask)
+void FramebufferGL::syncClearState(const gl::Context *context, GLbitfield mask)
 {
     if (mFunctions->standard == STANDARD_GL_DESKTOP)
     {
@@ -511,7 +511,9 @@
     }
 }
 
-void FramebufferGL::syncClearBufferState(ContextImpl *context, GLenum buffer, GLint drawBuffer)
+void FramebufferGL::syncClearBufferState(const gl::Context *context,
+                                         GLenum buffer,
+                                         GLint drawBuffer)
 {
     if (mFunctions->standard == STANDARD_GL_DESKTOP)
     {
diff --git a/src/libANGLE/renderer/gl/FramebufferGL.h b/src/libANGLE/renderer/gl/FramebufferGL.h
index b8abb5c..3c7c3e3 100644
--- a/src/libANGLE/renderer/gl/FramebufferGL.h
+++ b/src/libANGLE/renderer/gl/FramebufferGL.h
@@ -45,20 +45,20 @@
                             const GLenum *attachments,
                             const gl::Rectangle &area) override;
 
-    gl::Error clear(ContextImpl *context, GLbitfield mask) override;
-    gl::Error clearBufferfv(ContextImpl *context,
+    gl::Error clear(const gl::Context *context, GLbitfield mask) override;
+    gl::Error clearBufferfv(const gl::Context *context,
                             GLenum buffer,
                             GLint drawbuffer,
                             const GLfloat *values) override;
-    gl::Error clearBufferuiv(ContextImpl *context,
+    gl::Error clearBufferuiv(const gl::Context *context,
                              GLenum buffer,
                              GLint drawbuffer,
                              const GLuint *values) override;
-    gl::Error clearBufferiv(ContextImpl *context,
+    gl::Error clearBufferiv(const gl::Context *context,
                             GLenum buffer,
                             GLint drawbuffer,
                             const GLint *values) override;
-    gl::Error clearBufferfi(ContextImpl *context,
+    gl::Error clearBufferfi(const gl::Context *context,
                             GLenum buffer,
                             GLint drawbuffer,
                             GLfloat depth,
@@ -66,13 +66,13 @@
 
     GLenum getImplementationColorReadFormat() const override;
     GLenum getImplementationColorReadType() const override;
-    gl::Error readPixels(ContextImpl *context,
+    gl::Error readPixels(const gl::Context *context,
                          const gl::Rectangle &area,
                          GLenum format,
                          GLenum type,
                          void *pixels) const override;
 
-    gl::Error blit(ContextImpl *context,
+    gl::Error blit(const gl::Context *context,
                    const gl::Rectangle &sourceArea,
                    const gl::Rectangle &destArea,
                    GLbitfield mask,
@@ -82,14 +82,15 @@
 
     bool checkStatus() const override;
 
-    void syncState(ContextImpl *contextImpl, const gl::Framebuffer::DirtyBits &dirtyBits) override;
+    void syncState(const gl::Context *context,
+                   const gl::Framebuffer::DirtyBits &dirtyBits) override;
 
     GLuint getFramebufferID() const;
     bool isDefault() const;
 
   private:
-    void syncClearState(ContextImpl *context, GLbitfield mask);
-    void syncClearBufferState(ContextImpl *context, GLenum buffer, GLint drawBuffer);
+    void syncClearState(const gl::Context *context, GLbitfield mask);
+    void syncClearBufferState(const gl::Context *context, GLenum buffer, GLint drawBuffer);
 
     bool modifyInvalidateAttachmentsForEmulatedDefaultFBO(
         size_t count,
diff --git a/src/libANGLE/renderer/gl/ProgramGL.cpp b/src/libANGLE/renderer/gl/ProgramGL.cpp
index b3e5546..ccdcd5d 100644
--- a/src/libANGLE/renderer/gl/ProgramGL.cpp
+++ b/src/libANGLE/renderer/gl/ProgramGL.cpp
@@ -8,17 +8,18 @@
 
 #include "libANGLE/renderer/gl/ProgramGL.h"
 
-#include "common/bitset_utils.h"
 #include "common/angleutils.h"
+#include "common/bitset_utils.h"
 #include "common/debug.h"
 #include "common/string_utils.h"
 #include "common/utilities.h"
+#include "libANGLE/Context.h"
+#include "libANGLE/Uniform.h"
 #include "libANGLE/renderer/gl/ContextGL.h"
 #include "libANGLE/renderer/gl/FunctionsGL.h"
 #include "libANGLE/renderer/gl/ShaderGL.h"
 #include "libANGLE/renderer/gl/StateManagerGL.h"
 #include "libANGLE/renderer/gl/WorkaroundsGL.h"
-#include "libANGLE/Uniform.h"
 #include "platform/Platform.h"
 
 namespace rx
@@ -48,7 +49,7 @@
     mProgramID = 0;
 }
 
-LinkResult ProgramGL::load(const ContextImpl *contextImpl,
+LinkResult ProgramGL::load(const gl::Context *context,
                            gl::InfoLog &infoLog,
                            gl::BinaryInputStream *stream)
 {
@@ -72,7 +73,7 @@
     postLink();
 
     // Re-apply UBO bindings to work around driver bugs.
-    const WorkaroundsGL &workaroundsGL = GetAs<ContextGL>(contextImpl)->getWorkaroundsGL();
+    const WorkaroundsGL &workaroundsGL = GetImplAs<ContextGL>(context)->getWorkaroundsGL();
     if (workaroundsGL.reapplyUBOBindingsAfterLoadingBinaryProgram)
     {
         for (size_t bindingIndex : mState.getActiveUniformBlockBindingsMask())
@@ -117,7 +118,7 @@
     mFunctions->programParameteri(mProgramID, GL_PROGRAM_SEPARABLE, separable ? GL_TRUE : GL_FALSE);
 }
 
-LinkResult ProgramGL::link(ContextImpl *contextImpl,
+LinkResult ProgramGL::link(const gl::Context *context,
                            const gl::VaryingPacking &packing,
                            gl::InfoLog &infoLog)
 {
diff --git a/src/libANGLE/renderer/gl/ProgramGL.h b/src/libANGLE/renderer/gl/ProgramGL.h
index fa5a7c4..ccb08d7 100644
--- a/src/libANGLE/renderer/gl/ProgramGL.h
+++ b/src/libANGLE/renderer/gl/ProgramGL.h
@@ -31,14 +31,14 @@
               bool enablePathRendering);
     ~ProgramGL() override;
 
-    LinkResult load(const ContextImpl *contextImpl,
+    LinkResult load(const gl::Context *contextImpl,
                     gl::InfoLog &infoLog,
                     gl::BinaryInputStream *stream) override;
     gl::Error save(gl::BinaryOutputStream *stream) override;
     void setBinaryRetrievableHint(bool retrievable) override;
     void setSeparable(bool separable) override;
 
-    LinkResult link(ContextImpl *contextImpl,
+    LinkResult link(const gl::Context *contextImpl,
                     const gl::VaryingPacking &packing,
                     gl::InfoLog &infoLog) override;
     GLboolean validate(const gl::Caps &caps, gl::InfoLog *infoLog) override;
diff --git a/src/libANGLE/renderer/gl/TextureGL.cpp b/src/libANGLE/renderer/gl/TextureGL.cpp
index f84a534..8bb4cb3 100644
--- a/src/libANGLE/renderer/gl/TextureGL.cpp
+++ b/src/libANGLE/renderer/gl/TextureGL.cpp
@@ -148,7 +148,7 @@
     mTextureID = 0;
 }
 
-gl::Error TextureGL::setImage(ContextImpl *contextImpl,
+gl::Error TextureGL::setImage(const gl::Context *context,
                               GLenum target,
                               size_t level,
                               GLenum internalFormat,
@@ -250,7 +250,7 @@
     setImageHelper(target, level, internalFormat, size, format, type, nullptr);
 }
 
-gl::Error TextureGL::setSubImage(ContextImpl *contextImpl,
+gl::Error TextureGL::setSubImage(const gl::Context *context,
                                  GLenum target,
                                  size_t level,
                                  const gl::Box &area,
@@ -449,7 +449,7 @@
     return gl::NoError();
 }
 
-gl::Error TextureGL::setCompressedImage(ContextImpl *contextImpl,
+gl::Error TextureGL::setCompressedImage(const gl::Context *context,
                                         GLenum target,
                                         size_t level,
                                         GLenum internalFormat,
@@ -488,7 +488,7 @@
     return gl::NoError();
 }
 
-gl::Error TextureGL::setCompressedSubImage(ContextImpl *contextImpl,
+gl::Error TextureGL::setCompressedSubImage(const gl::Context *context,
                                            GLenum target,
                                            size_t level,
                                            const gl::Box &area,
@@ -528,7 +528,7 @@
     return gl::NoError();
 }
 
-gl::Error TextureGL::copyImage(ContextImpl *contextImpl,
+gl::Error TextureGL::copyImage(const gl::Context *context,
                                GLenum target,
                                size_t level,
                                const gl::Rectangle &sourceArea,
@@ -574,7 +574,7 @@
     return gl::NoError();
 }
 
-gl::Error TextureGL::copySubImage(ContextImpl *contextImpl,
+gl::Error TextureGL::copySubImage(const gl::Context *context,
                                   GLenum target,
                                   size_t level,
                                   const gl::Offset &destOffset,
@@ -621,7 +621,7 @@
     return gl::NoError();
 }
 
-gl::Error TextureGL::copyTexture(ContextImpl *contextImpl,
+gl::Error TextureGL::copyTexture(const gl::Context *context,
                                  GLenum target,
                                  size_t level,
                                  GLenum internalFormat,
@@ -645,7 +645,7 @@
                                 unpackUnmultiplyAlpha, source);
 }
 
-gl::Error TextureGL::copySubTexture(ContextImpl *contextImpl,
+gl::Error TextureGL::copySubTexture(const gl::Context *context,
                                     GLenum target,
                                     size_t level,
                                     const gl::Offset &destOffset,
@@ -698,7 +698,7 @@
         unpackPremultiplyAlpha, unpackUnmultiplyAlpha);
 }
 
-gl::Error TextureGL::setStorage(ContextImpl *contextImpl,
+gl::Error TextureGL::setStorage(const gl::Context *context,
                                 GLenum target,
                                 size_t levels,
                                 GLenum internalFormat,
@@ -864,7 +864,7 @@
     return gl::NoError();
 }
 
-gl::Error TextureGL::setStorageMultisample(ContextImpl *contextImpl,
+gl::Error TextureGL::setStorageMultisample(const gl::Context *context,
                                            GLenum target,
                                            GLsizei samples,
                                            GLint internalFormat,
@@ -894,7 +894,7 @@
     return gl::Error(GL_INVALID_OPERATION);
 }
 
-gl::Error TextureGL::generateMipmap(ContextImpl *contextImpl)
+gl::Error TextureGL::generateMipmap(const gl::Context *context)
 {
     mStateManager->bindTexture(getTarget(), mTextureID);
     mFunctions->generateMipmap(getTarget());
diff --git a/src/libANGLE/renderer/gl/TextureGL.h b/src/libANGLE/renderer/gl/TextureGL.h
index e302f93..baf7069 100644
--- a/src/libANGLE/renderer/gl/TextureGL.h
+++ b/src/libANGLE/renderer/gl/TextureGL.h
@@ -59,7 +59,7 @@
               BlitGL *blitter);
     ~TextureGL() override;
 
-    gl::Error setImage(ContextImpl *contextImpl,
+    gl::Error setImage(const gl::Context *context,
                        GLenum target,
                        size_t level,
                        GLenum internalFormat,
@@ -68,7 +68,7 @@
                        GLenum type,
                        const gl::PixelUnpackState &unpack,
                        const uint8_t *pixels) override;
-    gl::Error setSubImage(ContextImpl *contextImpl,
+    gl::Error setSubImage(const gl::Context *context,
                           GLenum target,
                           size_t level,
                           const gl::Box &area,
@@ -77,7 +77,7 @@
                           const gl::PixelUnpackState &unpack,
                           const uint8_t *pixels) override;
 
-    gl::Error setCompressedImage(ContextImpl *contextImpl,
+    gl::Error setCompressedImage(const gl::Context *context,
                                  GLenum target,
                                  size_t level,
                                  GLenum internalFormat,
@@ -85,7 +85,7 @@
                                  const gl::PixelUnpackState &unpack,
                                  size_t imageSize,
                                  const uint8_t *pixels) override;
-    gl::Error setCompressedSubImage(ContextImpl *contextImpl,
+    gl::Error setCompressedSubImage(const gl::Context *context,
                                     GLenum target,
                                     size_t level,
                                     const gl::Box &area,
@@ -94,20 +94,20 @@
                                     size_t imageSize,
                                     const uint8_t *pixels) override;
 
-    gl::Error copyImage(ContextImpl *contextImpl,
+    gl::Error copyImage(const gl::Context *context,
                         GLenum target,
                         size_t level,
                         const gl::Rectangle &sourceArea,
                         GLenum internalFormat,
                         const gl::Framebuffer *source) override;
-    gl::Error copySubImage(ContextImpl *contextImpl,
+    gl::Error copySubImage(const gl::Context *context,
                            GLenum target,
                            size_t level,
                            const gl::Offset &destOffset,
                            const gl::Rectangle &sourceArea,
                            const gl::Framebuffer *source) override;
 
-    gl::Error copyTexture(ContextImpl *contextImpl,
+    gl::Error copyTexture(const gl::Context *context,
                           GLenum target,
                           size_t level,
                           GLenum internalFormat,
@@ -117,7 +117,7 @@
                           bool unpackPremultiplyAlpha,
                           bool unpackUnmultiplyAlpha,
                           const gl::Texture *source) override;
-    gl::Error copySubTexture(ContextImpl *contextImpl,
+    gl::Error copySubTexture(const gl::Context *context,
                              GLenum target,
                              size_t level,
                              const gl::Offset &destOffset,
@@ -138,13 +138,13 @@
                                    bool unpackUnmultiplyAlpha,
                                    const gl::Texture *source);
 
-    gl::Error setStorage(ContextImpl *contextImpl,
+    gl::Error setStorage(const gl::Context *context,
                          GLenum target,
                          size_t levels,
                          GLenum internalFormat,
                          const gl::Extents &size) override;
 
-    gl::Error setStorageMultisample(ContextImpl *contextImpl,
+    gl::Error setStorageMultisample(const gl::Context *context,
                                     GLenum target,
                                     GLsizei samples,
                                     GLint internalFormat,
@@ -155,7 +155,7 @@
                                egl::Stream *stream,
                                const egl::Stream::GLTextureDescription &desc) override;
 
-    gl::Error generateMipmap(ContextImpl *contextImpl) override;
+    gl::Error generateMipmap(const gl::Context *context) override;
 
     void bindTexImage(egl::Surface *surface) override;
     void releaseTexImage() override;
diff --git a/src/libANGLE/renderer/gl/VertexArrayGL.cpp b/src/libANGLE/renderer/gl/VertexArrayGL.cpp
index e5581e3..358223b 100644
--- a/src/libANGLE/renderer/gl/VertexArrayGL.cpp
+++ b/src/libANGLE/renderer/gl/VertexArrayGL.cpp
@@ -541,7 +541,7 @@
     mAppliedBindings[bindingIndex].divisor       = divisor;
 }
 
-void VertexArrayGL::syncState(ContextImpl *contextImpl, const VertexArray::DirtyBits &dirtyBits)
+void VertexArrayGL::syncState(const gl::Context *context, const VertexArray::DirtyBits &dirtyBits)
 {
     mStateManager->bindVertexArray(mVertexArrayID, getAppliedElementArrayBufferID());
 
diff --git a/src/libANGLE/renderer/gl/VertexArrayGL.h b/src/libANGLE/renderer/gl/VertexArrayGL.h
index 24b3023..d7c5578 100644
--- a/src/libANGLE/renderer/gl/VertexArrayGL.h
+++ b/src/libANGLE/renderer/gl/VertexArrayGL.h
@@ -41,7 +41,8 @@
     GLuint getVertexArrayID() const;
     GLuint getAppliedElementArrayBufferID() const;
 
-    void syncState(ContextImpl *contextImpl, const gl::VertexArray::DirtyBits &dirtyBits) override;
+    void syncState(const gl::Context *context,
+                   const gl::VertexArray::DirtyBits &dirtyBits) override;
 
   private:
     gl::Error syncDrawState(const gl::AttributesMask &activeAttributesMask,
diff --git a/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.h b/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.h
index f2c60dd..b23d002 100644
--- a/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.h
+++ b/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.h
@@ -29,10 +29,10 @@
                       const FunctionsGL *functions);
     ~PbufferSurfaceCGL() override;
 
-    egl::Error initialize(const DisplayImpl *displayImpl) override;
+    egl::Error initialize(const egl::Display *display) override;
     egl::Error makeCurrent() override;
 
-    egl::Error swap(const DisplayImpl *displayImpl) override;
+    egl::Error swap(const egl::Display *display) override;
     egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) override;
     egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) override;
     egl::Error bindTexImage(gl::Texture *texture, EGLint buffer) override;
diff --git a/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.mm b/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.mm
index 4c3d172..aae9210 100644
--- a/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.mm
+++ b/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.mm
@@ -55,7 +55,7 @@
     }
 }
 
-egl::Error PbufferSurfaceCGL::initialize(const DisplayImpl *displayImpl)
+egl::Error PbufferSurfaceCGL::initialize(const egl::Display *display)
 {
     mFunctions->genRenderbuffers(1, &mColorRenderbuffer);
     mStateManager->bindRenderbuffer(GL_RENDERBUFFER, mColorRenderbuffer);
@@ -80,7 +80,7 @@
     return egl::Error(EGL_SUCCESS);
 }
 
-egl::Error PbufferSurfaceCGL::swap(const DisplayImpl *displayImpl)
+egl::Error PbufferSurfaceCGL::swap(const egl::Display *display)
 {
     return egl::Error(EGL_SUCCESS);
 }
diff --git a/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h b/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h
index 44a5bf7..ad61371 100644
--- a/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h
+++ b/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h
@@ -61,10 +61,10 @@
                      CGLContextObj context);
     ~WindowSurfaceCGL() override;
 
-    egl::Error initialize(const DisplayImpl *displayImpl) override;
+    egl::Error initialize(const egl::Display *display) override;
     egl::Error makeCurrent() override;
 
-    egl::Error swap(const DisplayImpl *displayImpl) override;
+    egl::Error swap(const egl::Display *display) override;
     egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) override;
     egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) override;
     egl::Error bindTexImage(gl::Texture *texture, EGLint buffer) override;
diff --git a/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm b/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm
index ea87919..ef13595 100644
--- a/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm
+++ b/src/libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm
@@ -194,7 +194,7 @@
     }
 }
 
-egl::Error WindowSurfaceCGL::initialize(const DisplayImpl *displayImpl)
+egl::Error WindowSurfaceCGL::initialize(const egl::Display *display)
 {
     unsigned width  = getWidth();
     unsigned height = getHeight();
@@ -237,7 +237,7 @@
     return egl::Error(EGL_SUCCESS);
 }
 
-egl::Error WindowSurfaceCGL::swap(const DisplayImpl *displayImpl)
+egl::Error WindowSurfaceCGL::swap(const egl::Display *display)
 {
     mFunctions->flush();
     mSwapState.beingRendered->swapId = ++mCurrentSwapId;
diff --git a/src/libANGLE/renderer/gl/egl/PbufferSurfaceEGL.cpp b/src/libANGLE/renderer/gl/egl/PbufferSurfaceEGL.cpp
index 4dd6370..1911f8a 100644
--- a/src/libANGLE/renderer/gl/egl/PbufferSurfaceEGL.cpp
+++ b/src/libANGLE/renderer/gl/egl/PbufferSurfaceEGL.cpp
@@ -25,7 +25,7 @@
 {
 }
 
-egl::Error PbufferSurfaceEGL::initialize(const DisplayImpl *displayImpl)
+egl::Error PbufferSurfaceEGL::initialize(const egl::Display *display)
 {
     mSurface = mEGL->createPbufferSurface(mConfig, mAttribList.data());
     if (mSurface == EGL_NO_SURFACE)
diff --git a/src/libANGLE/renderer/gl/egl/PbufferSurfaceEGL.h b/src/libANGLE/renderer/gl/egl/PbufferSurfaceEGL.h
index fb4fe6b..debbc7e 100644
--- a/src/libANGLE/renderer/gl/egl/PbufferSurfaceEGL.h
+++ b/src/libANGLE/renderer/gl/egl/PbufferSurfaceEGL.h
@@ -28,7 +28,7 @@
                       RendererGL *renderer);
     ~PbufferSurfaceEGL() override;
 
-    egl::Error initialize(const DisplayImpl *displayImpl) override;
+    egl::Error initialize(const egl::Display *display) override;
 };
 
 }  // namespace rx
diff --git a/src/libANGLE/renderer/gl/egl/SurfaceEGL.cpp b/src/libANGLE/renderer/gl/egl/SurfaceEGL.cpp
index 364def9..b5e7654 100644
--- a/src/libANGLE/renderer/gl/egl/SurfaceEGL.cpp
+++ b/src/libANGLE/renderer/gl/egl/SurfaceEGL.cpp
@@ -47,7 +47,7 @@
     return egl::Error(EGL_SUCCESS);
 }
 
-egl::Error SurfaceEGL::swap(const DisplayImpl *displayImpl)
+egl::Error SurfaceEGL::swap(const egl::Display *display)
 {
     EGLBoolean success = mEGL->swapBuffers(mSurface);
     if (success == EGL_FALSE)
diff --git a/src/libANGLE/renderer/gl/egl/SurfaceEGL.h b/src/libANGLE/renderer/gl/egl/SurfaceEGL.h
index 6033ace..f2dcadb 100644
--- a/src/libANGLE/renderer/gl/egl/SurfaceEGL.h
+++ b/src/libANGLE/renderer/gl/egl/SurfaceEGL.h
@@ -29,7 +29,7 @@
     ~SurfaceEGL() override;
 
     egl::Error makeCurrent() override;
-    egl::Error swap(const DisplayImpl *displayImpl) override;
+    egl::Error swap(const egl::Display *display) override;
     egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) override;
     egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) override;
     egl::Error bindTexImage(gl::Texture *texture, EGLint buffer) override;
diff --git a/src/libANGLE/renderer/gl/egl/WindowSurfaceEGL.cpp b/src/libANGLE/renderer/gl/egl/WindowSurfaceEGL.cpp
index c4d3853..0bf73d3 100644
--- a/src/libANGLE/renderer/gl/egl/WindowSurfaceEGL.cpp
+++ b/src/libANGLE/renderer/gl/egl/WindowSurfaceEGL.cpp
@@ -26,7 +26,7 @@
 {
 }
 
-egl::Error WindowSurfaceEGL::initialize(const DisplayImpl *displayImpl)
+egl::Error WindowSurfaceEGL::initialize(const egl::Display *display)
 {
     mSurface = mEGL->createWindowSurface(mConfig, mWindow, mAttribList.data());
     if (mSurface == EGL_NO_SURFACE)
diff --git a/src/libANGLE/renderer/gl/egl/WindowSurfaceEGL.h b/src/libANGLE/renderer/gl/egl/WindowSurfaceEGL.h
index 51f8945..8a8bc69 100644
--- a/src/libANGLE/renderer/gl/egl/WindowSurfaceEGL.h
+++ b/src/libANGLE/renderer/gl/egl/WindowSurfaceEGL.h
@@ -26,7 +26,7 @@
                      RendererGL *renderer);
     ~WindowSurfaceEGL() override;
 
-    egl::Error initialize(const DisplayImpl *displayImpl) override;
+    egl::Error initialize(const egl::Display *display) override;
 
   private:
     EGLNativeWindowType mWindow;
diff --git a/src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.cpp b/src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.cpp
index f1b056c..b41dfc5 100644
--- a/src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.cpp
+++ b/src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.cpp
@@ -26,7 +26,7 @@
     delete mBuffer;
 }
 
-egl::Error SurfaceOzone::initialize(const DisplayImpl *displayImpl)
+egl::Error SurfaceOzone::initialize(const egl::Display *display)
 {
     return egl::Error(EGL_SUCCESS);
 }
@@ -41,7 +41,7 @@
     return egl::Error(EGL_SUCCESS);
 }
 
-egl::Error SurfaceOzone::swap(const DisplayImpl *displayImpl)
+egl::Error SurfaceOzone::swap(const egl::Display *display)
 {
     mBuffer->present();
     return egl::Error(EGL_SUCCESS);
diff --git a/src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.h b/src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.h
index 918b72b..e4dd4bc 100644
--- a/src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.h
+++ b/src/libANGLE/renderer/gl/egl/ozone/SurfaceOzone.h
@@ -25,10 +25,10 @@
 
     FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &state) override;
 
-    egl::Error initialize(const DisplayImpl *displayImpl) override;
+    egl::Error initialize(const egl::Display *display) override;
     egl::Error makeCurrent() override;
 
-    egl::Error swap(const DisplayImpl *displayImpl) override;
+    egl::Error swap(const egl::Display *display) override;
     egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) override;
     egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) override;
     egl::Error bindTexImage(gl::Texture *texture, EGLint buffer) override;
diff --git a/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.cpp b/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.cpp
index 57e2283..5ada764a 100644
--- a/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.cpp
+++ b/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.cpp
@@ -42,7 +42,7 @@
     }
 }
 
-egl::Error PbufferSurfaceGLX::initialize(const DisplayImpl *displayImpl)
+egl::Error PbufferSurfaceGLX::initialize(const egl::Display *display)
 {
     // Avoid creating 0-sized PBuffers as it fails on the Intel Mesa driver
     // as commented on https://bugs.freedesktop.org/show_bug.cgi?id=38869 so we
@@ -82,7 +82,7 @@
     return egl::Error(EGL_SUCCESS);
 }
 
-egl::Error PbufferSurfaceGLX::swap(const DisplayImpl *displayImpl)
+egl::Error PbufferSurfaceGLX::swap(const egl::Display *display)
 {
     return egl::Error(EGL_SUCCESS);
 }
diff --git a/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.h b/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.h
index cf390e5..557cfa1 100644
--- a/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.h
+++ b/src/libANGLE/renderer/gl/glx/PbufferSurfaceGLX.h
@@ -30,10 +30,10 @@
                       glx::FBConfig fbConfig);
     ~PbufferSurfaceGLX() override;
 
-    egl::Error initialize(const DisplayImpl *displayImpl) override;
+    egl::Error initialize(const egl::Display *display) override;
     egl::Error makeCurrent() override;
 
-    egl::Error swap(const DisplayImpl *displayImpl) override;
+    egl::Error swap(const egl::Display *display) override;
     egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) override;
     egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) override;
     egl::Error bindTexImage(gl::Texture *texture, EGLint buffer) override;
diff --git a/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.cpp b/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.cpp
index c357f9d..9472cc4 100644
--- a/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.cpp
+++ b/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.cpp
@@ -63,7 +63,7 @@
     mGLXDisplay->syncXCommands();
 }
 
-egl::Error WindowSurfaceGLX::initialize(const DisplayImpl *displayImpl)
+egl::Error WindowSurfaceGLX::initialize(const egl::Display *display)
 {
     // Check that the window's visual ID is valid, as part of the AMGLE_x11_visual
     // extension.
@@ -141,7 +141,7 @@
     return egl::Error(EGL_SUCCESS);
 }
 
-egl::Error WindowSurfaceGLX::swap(const DisplayImpl *displayImpl)
+egl::Error WindowSurfaceGLX::swap(const egl::Display *display)
 {
     // We need to swap before resizing as some drivers clobber the back buffer
     // when the window is resized.
diff --git a/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.h b/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.h
index 00515cc..77d1117 100644
--- a/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.h
+++ b/src/libANGLE/renderer/gl/glx/WindowSurfaceGLX.h
@@ -32,10 +32,10 @@
                      glx::FBConfig fbConfig);
     ~WindowSurfaceGLX() override;
 
-    egl::Error initialize(const DisplayImpl *displayImpl) override;
+    egl::Error initialize(const egl::Display *display) override;
     egl::Error makeCurrent() override;
 
-    egl::Error swap(const DisplayImpl *displayImpl) override;
+    egl::Error swap(const egl::Display *display) override;
     egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) override;
     egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) override;
     egl::Error bindTexImage(gl::Texture *texture, EGLint buffer) override;
diff --git a/src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.cpp b/src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.cpp
index b60f981..b3f68ed 100644
--- a/src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.cpp
+++ b/src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.cpp
@@ -287,7 +287,7 @@
                              nullptr);
 }
 
-egl::Error D3DTextureSurfaceWGL::initialize(const DisplayImpl *displayImpl)
+egl::Error D3DTextureSurfaceWGL::initialize(const egl::Display *display)
 {
     IUnknown *device = nullptr;
     ANGLE_TRY(GetD3DTextureInfo(mBuftype, mClientBuffer, mDisplayD3D11Device, &mWidth, &mHeight,
@@ -372,7 +372,7 @@
     return egl::Error(EGL_SUCCESS);
 }
 
-egl::Error D3DTextureSurfaceWGL::swap(const DisplayImpl *displayImpl)
+egl::Error D3DTextureSurfaceWGL::swap(const egl::Display *display)
 {
     return egl::Error(EGL_SUCCESS);
 }
diff --git a/src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.h b/src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.h
index 2ce2b05..2896b1c 100644
--- a/src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.h
+++ b/src/libANGLE/renderer/gl/wgl/D3DTextureSurfaceWGL.h
@@ -41,11 +41,11 @@
                                                      EGLClientBuffer clientBuffer,
                                                      ID3D11Device *d3d11Device);
 
-    egl::Error initialize(const DisplayImpl *displayImpl) override;
+    egl::Error initialize(const egl::Display *display) override;
     egl::Error makeCurrent() override;
     egl::Error unMakeCurrent() override;
 
-    egl::Error swap(const DisplayImpl *displayImpl) override;
+    egl::Error swap(const egl::Display *display) override;
     egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) override;
     egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) override;
     egl::Error bindTexImage(gl::Texture *texture, EGLint buffer) override;
diff --git a/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.cpp b/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.cpp
index 068ea99..6eaa488 100644
--- a/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.cpp
+++ b/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.cpp
@@ -86,7 +86,7 @@
     SafeRelease(mSwapChain1);
 }
 
-egl::Error DXGISwapChainWindowSurfaceWGL::initialize(const DisplayImpl *displayImpl)
+egl::Error DXGISwapChainWindowSurfaceWGL::initialize(const egl::Display *display)
 {
     if (mOrientation != EGL_SURFACE_ORIENTATION_INVERT_Y_ANGLE)
     {
@@ -128,24 +128,16 @@
     return egl::Error(EGL_SUCCESS);
 }
 
-egl::Error DXGISwapChainWindowSurfaceWGL::swap(const DisplayImpl *displayImpl)
+egl::Error DXGISwapChainWindowSurfaceWGL::swap(const egl::Display *display)
 {
     mFunctionsGL->flush();
 
-    egl::Error error = setObjectsLocked(false);
-    if (error.isError())
-    {
-        return error;
-    }
+    ANGLE_TRY(setObjectsLocked(false));
 
     HRESULT result = mSwapChain->Present(mSwapInterval, 0);
     mFirstSwap     = false;
 
-    error = setObjectsLocked(true);
-    if (error.isError())
-    {
-        return error;
-    }
+    ANGLE_TRY(setObjectsLocked(true));
 
     if (FAILED(result))
     {
@@ -164,11 +156,7 @@
 
     mFunctionsGL->flush();
 
-    egl::Error error = setObjectsLocked(false);
-    if (error.isError())
-    {
-        return error;
-    }
+    ANGLE_TRY(setObjectsLocked(false));
 
     HRESULT result = S_OK;
     if (mFirstSwap)
@@ -184,11 +172,7 @@
         result                         = mSwapChain1->Present1(mSwapInterval, 0, &params);
     }
 
-    error = setObjectsLocked(true);
-    if (error.isError())
-    {
-        return error;
-    }
+    ANGLE_TRY(setObjectsLocked(true));
 
     if (FAILED(result))
     {
diff --git a/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.h b/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.h
index a4c34a7..6d706b3 100644
--- a/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.h
+++ b/src/libANGLE/renderer/gl/wgl/DXGISwapChainWindowSurfaceWGL.h
@@ -38,10 +38,10 @@
                                   EGLint orientation);
     ~DXGISwapChainWindowSurfaceWGL() override;
 
-    egl::Error initialize(const DisplayImpl *displayImpl) override;
+    egl::Error initialize(const egl::Display *display) override;
     egl::Error makeCurrent() override;
 
-    egl::Error swap(const DisplayImpl *displayImpl) override;
+    egl::Error swap(const egl::Display *display) override;
     egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) override;
     egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) override;
     egl::Error bindTexImage(gl::Texture *texture, EGLint buffer) override;
diff --git a/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.cpp b/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.cpp
index 0650e91..1d49e1a 100644
--- a/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.cpp
+++ b/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.cpp
@@ -72,7 +72,7 @@
     }
 }
 
-egl::Error PbufferSurfaceWGL::initialize(const DisplayImpl *displayImpl)
+egl::Error PbufferSurfaceWGL::initialize(const egl::Display *display)
 {
     const int pbufferCreationAttributes[] =
     {
@@ -122,7 +122,7 @@
     return egl::Error(EGL_SUCCESS);
 }
 
-egl::Error PbufferSurfaceWGL::swap(const DisplayImpl *displayImpl)
+egl::Error PbufferSurfaceWGL::swap(const egl::Display *display)
 {
     return egl::Error(EGL_SUCCESS);
 }
diff --git a/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.h b/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.h
index aed4279..488800c 100644
--- a/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.h
+++ b/src/libANGLE/renderer/gl/wgl/PbufferSurfaceWGL.h
@@ -34,10 +34,10 @@
                       const FunctionsWGL *functions);
     ~PbufferSurfaceWGL() override;
 
-    egl::Error initialize(const DisplayImpl *displayImpl) override;
+    egl::Error initialize(const egl::Display *display) override;
     egl::Error makeCurrent() override;
 
-    egl::Error swap(const DisplayImpl *displayImpl) override;
+    egl::Error swap(const egl::Display *display) override;
     egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) override;
     egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) override;
     egl::Error bindTexImage(gl::Texture *texture, EGLint buffer) override;
diff --git a/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.cpp b/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.cpp
index b686547..eed964b 100644
--- a/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.cpp
+++ b/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.cpp
@@ -41,7 +41,7 @@
     mDeviceContext = nullptr;
 }
 
-egl::Error WindowSurfaceWGL::initialize(const DisplayImpl *displayImpl)
+egl::Error WindowSurfaceWGL::initialize(const egl::Display *display)
 {
     mDeviceContext = GetDC(mWindow);
     if (!mDeviceContext)
@@ -100,7 +100,7 @@
     return egl::Error(EGL_SUCCESS);
 }
 
-egl::Error WindowSurfaceWGL::swap(const DisplayImpl *displayImpl)
+egl::Error WindowSurfaceWGL::swap(const egl::Display *display)
 {
     if (!mFunctionsWGL->swapBuffers(mDeviceContext))
     {
diff --git a/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.h b/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.h
index 981ef41..4eebbd9 100644
--- a/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.h
+++ b/src/libANGLE/renderer/gl/wgl/WindowSurfaceWGL.h
@@ -30,10 +30,10 @@
                      EGLint orientation);
     ~WindowSurfaceWGL() override;
 
-    egl::Error initialize(const DisplayImpl *displayImpl) override;
+    egl::Error initialize(const egl::Display *display) override;
     egl::Error makeCurrent() override;
 
-    egl::Error swap(const DisplayImpl *displayImpl) override;
+    egl::Error swap(const egl::Display *display) override;
     egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) override;
     egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) override;
     egl::Error bindTexImage(gl::Texture *texture, EGLint buffer) override;
diff --git a/src/libANGLE/renderer/null/BufferNULL.cpp b/src/libANGLE/renderer/null/BufferNULL.cpp
index 0c5300d..97c6a59 100644
--- a/src/libANGLE/renderer/null/BufferNULL.cpp
+++ b/src/libANGLE/renderer/null/BufferNULL.cpp
@@ -29,7 +29,7 @@
     ASSERT(memoryReleaseResult);
 }
 
-gl::Error BufferNULL::setData(ContextImpl *context,
+gl::Error BufferNULL::setData(const gl::Context *context,
                               GLenum target,
                               const void *data,
                               size_t size,
@@ -48,7 +48,7 @@
     return gl::NoError();
 }
 
-gl::Error BufferNULL::setSubData(ContextImpl *context,
+gl::Error BufferNULL::setSubData(const gl::Context *context,
                                  GLenum target,
                                  const void *data,
                                  size_t size,
@@ -61,7 +61,7 @@
     return gl::NoError();
 }
 
-gl::Error BufferNULL::copySubData(ContextImpl *context,
+gl::Error BufferNULL::copySubData(const gl::Context *context,
                                   BufferImpl *source,
                                   GLintptr sourceOffset,
                                   GLintptr destOffset,
@@ -75,13 +75,13 @@
     return gl::NoError();
 }
 
-gl::Error BufferNULL::map(ContextImpl *context, GLenum access, void **mapPtr)
+gl::Error BufferNULL::map(const gl::Context *context, GLenum access, void **mapPtr)
 {
     *mapPtr = mData.data();
     return gl::NoError();
 }
 
-gl::Error BufferNULL::mapRange(ContextImpl *context,
+gl::Error BufferNULL::mapRange(const gl::Context *context,
                                size_t offset,
                                size_t length,
                                GLbitfield access,
@@ -91,7 +91,7 @@
     return gl::NoError();
 }
 
-gl::Error BufferNULL::unmap(ContextImpl *context, GLboolean *result)
+gl::Error BufferNULL::unmap(const gl::Context *context, GLboolean *result)
 {
     *result = GL_TRUE;
     return gl::NoError();
diff --git a/src/libANGLE/renderer/null/BufferNULL.h b/src/libANGLE/renderer/null/BufferNULL.h
index 6ba23cd..b8fa163 100644
--- a/src/libANGLE/renderer/null/BufferNULL.h
+++ b/src/libANGLE/renderer/null/BufferNULL.h
@@ -23,28 +23,28 @@
     BufferNULL(const gl::BufferState &state, AllocationTrackerNULL *allocationTracker);
     ~BufferNULL() override;
 
-    gl::Error setData(ContextImpl *context,
+    gl::Error setData(const gl::Context *context,
                       GLenum target,
                       const void *data,
                       size_t size,
                       GLenum usage) override;
-    gl::Error setSubData(ContextImpl *context,
+    gl::Error setSubData(const gl::Context *context,
                          GLenum target,
                          const void *data,
                          size_t size,
                          size_t offset) override;
-    gl::Error copySubData(ContextImpl *contextImpl,
+    gl::Error copySubData(const gl::Context *context,
                           BufferImpl *source,
                           GLintptr sourceOffset,
                           GLintptr destOffset,
                           GLsizeiptr size) override;
-    gl::Error map(ContextImpl *contextImpl, GLenum access, void **mapPtr) override;
-    gl::Error mapRange(ContextImpl *contextImpl,
+    gl::Error map(const gl::Context *context, GLenum access, void **mapPtr) override;
+    gl::Error mapRange(const gl::Context *context,
                        size_t offset,
                        size_t length,
                        GLbitfield access,
                        void **mapPtr) override;
-    gl::Error unmap(ContextImpl *contextImpl, GLboolean *result) override;
+    gl::Error unmap(const gl::Context *context, GLboolean *result) override;
 
     gl::Error getIndexRange(GLenum type,
                             size_t offset,
diff --git a/src/libANGLE/renderer/null/ContextNULL.cpp b/src/libANGLE/renderer/null/ContextNULL.cpp
index 4532541..58c06a0 100644
--- a/src/libANGLE/renderer/null/ContextNULL.cpp
+++ b/src/libANGLE/renderer/null/ContextNULL.cpp
@@ -92,12 +92,16 @@
     return gl::NoError();
 }
 
-gl::Error ContextNULL::drawArrays(GLenum mode, GLint first, GLsizei count)
+gl::Error ContextNULL::drawArrays(const gl::Context *context,
+                                  GLenum mode,
+                                  GLint first,
+                                  GLsizei count)
 {
     return gl::NoError();
 }
 
-gl::Error ContextNULL::drawArraysInstanced(GLenum mode,
+gl::Error ContextNULL::drawArraysInstanced(const gl::Context *context,
+                                           GLenum mode,
                                            GLint first,
                                            GLsizei count,
                                            GLsizei instanceCount)
@@ -105,7 +109,8 @@
     return gl::NoError();
 }
 
-gl::Error ContextNULL::drawElements(GLenum mode,
+gl::Error ContextNULL::drawElements(const gl::Context *context,
+                                    GLenum mode,
                                     GLsizei count,
                                     GLenum type,
                                     const void *indices,
@@ -114,7 +119,8 @@
     return gl::NoError();
 }
 
-gl::Error ContextNULL::drawElementsInstanced(GLenum mode,
+gl::Error ContextNULL::drawElementsInstanced(const gl::Context *context,
+                                             GLenum mode,
                                              GLsizei count,
                                              GLenum type,
                                              const void *indices,
@@ -124,7 +130,8 @@
     return gl::NoError();
 }
 
-gl::Error ContextNULL::drawRangeElements(GLenum mode,
+gl::Error ContextNULL::drawRangeElements(const gl::Context *context,
+                                         GLenum mode,
                                          GLuint start,
                                          GLuint end,
                                          GLsizei count,
@@ -135,12 +142,17 @@
     return gl::NoError();
 }
 
-gl::Error ContextNULL::drawArraysIndirect(GLenum mode, const void *indirect)
+gl::Error ContextNULL::drawArraysIndirect(const gl::Context *context,
+                                          GLenum mode,
+                                          const void *indirect)
 {
     return gl::NoError();
 }
 
-gl::Error ContextNULL::drawElementsIndirect(GLenum mode, GLenum type, const void *indirect)
+gl::Error ContextNULL::drawElementsIndirect(const gl::Context *context,
+                                            GLenum mode,
+                                            GLenum type,
+                                            const void *indirect)
 {
     return gl::NoError();
 }
diff --git a/src/libANGLE/renderer/null/ContextNULL.h b/src/libANGLE/renderer/null/ContextNULL.h
index 0da4880..3070c9e 100644
--- a/src/libANGLE/renderer/null/ContextNULL.h
+++ b/src/libANGLE/renderer/null/ContextNULL.h
@@ -43,32 +43,44 @@
     gl::Error finish() override;
 
     // Drawing methods.
-    gl::Error drawArrays(GLenum mode, GLint first, GLsizei count) override;
-    gl::Error drawArraysInstanced(GLenum mode,
+    gl::Error drawArrays(const gl::Context *context,
+                         GLenum mode,
+                         GLint first,
+                         GLsizei count) override;
+    gl::Error drawArraysInstanced(const gl::Context *context,
+                                  GLenum mode,
                                   GLint first,
                                   GLsizei count,
                                   GLsizei instanceCount) override;
 
-    gl::Error drawElements(GLenum mode,
+    gl::Error drawElements(const gl::Context *context,
+                           GLenum mode,
                            GLsizei count,
                            GLenum type,
                            const void *indices,
                            const gl::IndexRange &indexRange) override;
-    gl::Error drawElementsInstanced(GLenum mode,
+    gl::Error drawElementsInstanced(const gl::Context *context,
+                                    GLenum mode,
                                     GLsizei count,
                                     GLenum type,
                                     const void *indices,
                                     GLsizei instances,
                                     const gl::IndexRange &indexRange) override;
-    gl::Error drawRangeElements(GLenum mode,
+    gl::Error drawRangeElements(const gl::Context *context,
+                                GLenum mode,
                                 GLuint start,
                                 GLuint end,
                                 GLsizei count,
                                 GLenum type,
                                 const void *indices,
                                 const gl::IndexRange &indexRange) override;
-    gl::Error drawArraysIndirect(GLenum mode, const void *indirect) override;
-    gl::Error drawElementsIndirect(GLenum mode, GLenum type, const void *indirect) override;
+    gl::Error drawArraysIndirect(const gl::Context *context,
+                                 GLenum mode,
+                                 const void *indirect) override;
+    gl::Error drawElementsIndirect(const gl::Context *context,
+                                   GLenum mode,
+                                   GLenum type,
+                                   const void *indirect) override;
 
     // CHROMIUM_path_rendering path drawing methods.
     void stencilFillPath(const gl::Path *path, GLenum fillMode, GLuint mask) override;
diff --git a/src/libANGLE/renderer/null/FramebufferNULL.cpp b/src/libANGLE/renderer/null/FramebufferNULL.cpp
index 4744fa7..eb02b95 100644
--- a/src/libANGLE/renderer/null/FramebufferNULL.cpp
+++ b/src/libANGLE/renderer/null/FramebufferNULL.cpp
@@ -41,12 +41,12 @@
     return gl::NoError();
 }
 
-gl::Error FramebufferNULL::clear(ContextImpl *context, GLbitfield mask)
+gl::Error FramebufferNULL::clear(const gl::Context *context, GLbitfield mask)
 {
     return gl::NoError();
 }
 
-gl::Error FramebufferNULL::clearBufferfv(ContextImpl *context,
+gl::Error FramebufferNULL::clearBufferfv(const gl::Context *context,
                                          GLenum buffer,
                                          GLint drawbuffer,
                                          const GLfloat *values)
@@ -54,7 +54,7 @@
     return gl::NoError();
 }
 
-gl::Error FramebufferNULL::clearBufferuiv(ContextImpl *context,
+gl::Error FramebufferNULL::clearBufferuiv(const gl::Context *context,
                                           GLenum buffer,
                                           GLint drawbuffer,
                                           const GLuint *values)
@@ -62,7 +62,7 @@
     return gl::NoError();
 }
 
-gl::Error FramebufferNULL::clearBufferiv(ContextImpl *context,
+gl::Error FramebufferNULL::clearBufferiv(const gl::Context *context,
                                          GLenum buffer,
                                          GLint drawbuffer,
                                          const GLint *values)
@@ -70,7 +70,7 @@
     return gl::NoError();
 }
 
-gl::Error FramebufferNULL::clearBufferfi(ContextImpl *context,
+gl::Error FramebufferNULL::clearBufferfi(const gl::Context *context,
                                          GLenum buffer,
                                          GLint drawbuffer,
                                          GLfloat depth,
@@ -105,7 +105,7 @@
     return format.info->getReadPixelsType();
 }
 
-gl::Error FramebufferNULL::readPixels(ContextImpl *context,
+gl::Error FramebufferNULL::readPixels(const gl::Context *context,
                                       const gl::Rectangle &area,
                                       GLenum format,
                                       GLenum type,
@@ -114,7 +114,7 @@
     return gl::NoError();
 }
 
-gl::Error FramebufferNULL::blit(ContextImpl *context,
+gl::Error FramebufferNULL::blit(const gl::Context *context,
                                 const gl::Rectangle &sourceArea,
                                 const gl::Rectangle &destArea,
                                 GLbitfield mask,
@@ -128,7 +128,7 @@
     return true;
 }
 
-void FramebufferNULL::syncState(ContextImpl *contextImpl,
+void FramebufferNULL::syncState(const gl::Context *context,
                                 const gl::Framebuffer::DirtyBits &dirtyBits)
 {
 }
diff --git a/src/libANGLE/renderer/null/FramebufferNULL.h b/src/libANGLE/renderer/null/FramebufferNULL.h
index 93756d7..9451487 100644
--- a/src/libANGLE/renderer/null/FramebufferNULL.h
+++ b/src/libANGLE/renderer/null/FramebufferNULL.h
@@ -27,20 +27,20 @@
                             const GLenum *attachments,
                             const gl::Rectangle &area) override;
 
-    gl::Error clear(ContextImpl *context, GLbitfield mask) override;
-    gl::Error clearBufferfv(ContextImpl *context,
+    gl::Error clear(const gl::Context *context, GLbitfield mask) override;
+    gl::Error clearBufferfv(const gl::Context *context,
                             GLenum buffer,
                             GLint drawbuffer,
                             const GLfloat *values) override;
-    gl::Error clearBufferuiv(ContextImpl *context,
+    gl::Error clearBufferuiv(const gl::Context *context,
                              GLenum buffer,
                              GLint drawbuffer,
                              const GLuint *values) override;
-    gl::Error clearBufferiv(ContextImpl *context,
+    gl::Error clearBufferiv(const gl::Context *context,
                             GLenum buffer,
                             GLint drawbuffer,
                             const GLint *values) override;
-    gl::Error clearBufferfi(ContextImpl *context,
+    gl::Error clearBufferfi(const gl::Context *context,
                             GLenum buffer,
                             GLint drawbuffer,
                             GLfloat depth,
@@ -48,13 +48,13 @@
 
     GLenum getImplementationColorReadFormat() const override;
     GLenum getImplementationColorReadType() const override;
-    gl::Error readPixels(ContextImpl *context,
+    gl::Error readPixels(const gl::Context *context,
                          const gl::Rectangle &area,
                          GLenum format,
                          GLenum type,
                          void *pixels) const override;
 
-    gl::Error blit(ContextImpl *context,
+    gl::Error blit(const gl::Context *context,
                    const gl::Rectangle &sourceArea,
                    const gl::Rectangle &destArea,
                    GLbitfield mask,
@@ -62,7 +62,8 @@
 
     bool checkStatus() const override;
 
-    void syncState(ContextImpl *contextImpl, const gl::Framebuffer::DirtyBits &dirtyBits) override;
+    void syncState(const gl::Context *context,
+                   const gl::Framebuffer::DirtyBits &dirtyBits) override;
 
     gl::Error getSamplePosition(size_t index, GLfloat *xy) const override;
 };
diff --git a/src/libANGLE/renderer/null/ProgramNULL.cpp b/src/libANGLE/renderer/null/ProgramNULL.cpp
index 35bd46d..d46608c 100644
--- a/src/libANGLE/renderer/null/ProgramNULL.cpp
+++ b/src/libANGLE/renderer/null/ProgramNULL.cpp
@@ -22,7 +22,7 @@
 {
 }
 
-LinkResult ProgramNULL::load(const ContextImpl *contextImpl,
+LinkResult ProgramNULL::load(const gl::Context *contextImpl,
                              gl::InfoLog &infoLog,
                              gl::BinaryInputStream *stream)
 {
@@ -42,7 +42,7 @@
 {
 }
 
-LinkResult ProgramNULL::link(ContextImpl *contextImpl,
+LinkResult ProgramNULL::link(const gl::Context *contextImpl,
                              const gl::VaryingPacking &packing,
                              gl::InfoLog &infoLog)
 {
diff --git a/src/libANGLE/renderer/null/ProgramNULL.h b/src/libANGLE/renderer/null/ProgramNULL.h
index 88c0598..b6e1e63 100644
--- a/src/libANGLE/renderer/null/ProgramNULL.h
+++ b/src/libANGLE/renderer/null/ProgramNULL.h
@@ -21,14 +21,14 @@
     ProgramNULL(const gl::ProgramState &state);
     ~ProgramNULL() override;
 
-    LinkResult load(const ContextImpl *contextImpl,
+    LinkResult load(const gl::Context *context,
                     gl::InfoLog &infoLog,
                     gl::BinaryInputStream *stream) override;
     gl::Error save(gl::BinaryOutputStream *stream) override;
     void setBinaryRetrievableHint(bool retrievable) override;
     void setSeparable(bool separable) override;
 
-    LinkResult link(ContextImpl *contextImpl,
+    LinkResult link(const gl::Context *context,
                     const gl::VaryingPacking &packing,
                     gl::InfoLog &infoLog) override;
     GLboolean validate(const gl::Caps &caps, gl::InfoLog *infoLog) override;
diff --git a/src/libANGLE/renderer/null/SurfaceNULL.cpp b/src/libANGLE/renderer/null/SurfaceNULL.cpp
index 868269b..0e11c3e 100644
--- a/src/libANGLE/renderer/null/SurfaceNULL.cpp
+++ b/src/libANGLE/renderer/null/SurfaceNULL.cpp
@@ -24,7 +24,7 @@
 {
 }
 
-egl::Error SurfaceNULL::initialize(const DisplayImpl *displayImpl)
+egl::Error SurfaceNULL::initialize(const egl::Display *display)
 {
     return egl::NoError();
 }
@@ -34,7 +34,7 @@
     return new FramebufferNULL(state);
 }
 
-egl::Error SurfaceNULL::swap(const DisplayImpl *displayImpl)
+egl::Error SurfaceNULL::swap(const egl::Display *display)
 {
     return egl::NoError();
 }
diff --git a/src/libANGLE/renderer/null/SurfaceNULL.h b/src/libANGLE/renderer/null/SurfaceNULL.h
index 4b084a3..f67e357 100644
--- a/src/libANGLE/renderer/null/SurfaceNULL.h
+++ b/src/libANGLE/renderer/null/SurfaceNULL.h
@@ -21,9 +21,9 @@
     SurfaceNULL(const egl::SurfaceState &surfaceState);
     ~SurfaceNULL() override;
 
-    egl::Error initialize(const DisplayImpl *displayImpl) override;
+    egl::Error initialize(const egl::Display *display) override;
     FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &state) override;
-    egl::Error swap(const DisplayImpl *displayImpl) override;
+    egl::Error swap(const egl::Display *display) override;
     egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) override;
     egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) override;
     egl::Error bindTexImage(gl::Texture *texture, EGLint buffer) override;
diff --git a/src/libANGLE/renderer/null/TextureNULL.cpp b/src/libANGLE/renderer/null/TextureNULL.cpp
index 16ef4cc..a21ad9e 100644
--- a/src/libANGLE/renderer/null/TextureNULL.cpp
+++ b/src/libANGLE/renderer/null/TextureNULL.cpp
@@ -22,7 +22,7 @@
 {
 }
 
-gl::Error TextureNULL::setImage(ContextImpl *contextImpl,
+gl::Error TextureNULL::setImage(const gl::Context *context,
                                 GLenum target,
                                 size_t level,
                                 GLenum internalFormat,
@@ -37,7 +37,7 @@
     return gl::NoError();
 }
 
-gl::Error TextureNULL::setSubImage(ContextImpl *contextImpl,
+gl::Error TextureNULL::setSubImage(const gl::Context *context,
                                    GLenum target,
                                    size_t level,
                                    const gl::Box &area,
@@ -49,7 +49,7 @@
     return gl::NoError();
 }
 
-gl::Error TextureNULL::setCompressedImage(ContextImpl *contextImpl,
+gl::Error TextureNULL::setCompressedImage(const gl::Context *context,
                                           GLenum target,
                                           size_t level,
                                           GLenum internalFormat,
@@ -61,7 +61,7 @@
     return gl::NoError();
 }
 
-gl::Error TextureNULL::setCompressedSubImage(ContextImpl *contextImpl,
+gl::Error TextureNULL::setCompressedSubImage(const gl::Context *context,
                                              GLenum target,
                                              size_t level,
                                              const gl::Box &area,
@@ -73,7 +73,7 @@
     return gl::NoError();
 }
 
-gl::Error TextureNULL::copyImage(ContextImpl *contextImpl,
+gl::Error TextureNULL::copyImage(const gl::Context *context,
                                  GLenum target,
                                  size_t level,
                                  const gl::Rectangle &sourceArea,
@@ -83,7 +83,7 @@
     return gl::NoError();
 }
 
-gl::Error TextureNULL::copySubImage(ContextImpl *contextImpl,
+gl::Error TextureNULL::copySubImage(const gl::Context *context,
                                     GLenum target,
                                     size_t level,
                                     const gl::Offset &destOffset,
@@ -93,7 +93,7 @@
     return gl::NoError();
 }
 
-gl::Error TextureNULL::setStorage(ContextImpl *contextImpl,
+gl::Error TextureNULL::setStorage(const gl::Context *context,
                                   GLenum target,
                                   size_t levels,
                                   GLenum internalFormat,
@@ -114,7 +114,7 @@
     return gl::NoError();
 }
 
-gl::Error TextureNULL::generateMipmap(ContextImpl *contextImpl)
+gl::Error TextureNULL::generateMipmap(const gl::Context *context)
 {
     return gl::NoError();
 }
@@ -135,7 +135,7 @@
 {
 }
 
-gl::Error TextureNULL::setStorageMultisample(ContextImpl *contextImpl,
+gl::Error TextureNULL::setStorageMultisample(const gl::Context *context,
                                              GLenum target,
                                              GLsizei samples,
                                              GLint internalformat,
diff --git a/src/libANGLE/renderer/null/TextureNULL.h b/src/libANGLE/renderer/null/TextureNULL.h
index c529090..a7e2752 100644
--- a/src/libANGLE/renderer/null/TextureNULL.h
+++ b/src/libANGLE/renderer/null/TextureNULL.h
@@ -21,7 +21,7 @@
     TextureNULL(const gl::TextureState &state);
     ~TextureNULL() override;
 
-    gl::Error setImage(ContextImpl *contextImpl,
+    gl::Error setImage(const gl::Context *context,
                        GLenum target,
                        size_t level,
                        GLenum internalFormat,
@@ -30,7 +30,7 @@
                        GLenum type,
                        const gl::PixelUnpackState &unpack,
                        const uint8_t *pixels) override;
-    gl::Error setSubImage(ContextImpl *contextImpl,
+    gl::Error setSubImage(const gl::Context *context,
                           GLenum target,
                           size_t level,
                           const gl::Box &area,
@@ -39,7 +39,7 @@
                           const gl::PixelUnpackState &unpack,
                           const uint8_t *pixels) override;
 
-    gl::Error setCompressedImage(ContextImpl *contextImpl,
+    gl::Error setCompressedImage(const gl::Context *context,
                                  GLenum target,
                                  size_t level,
                                  GLenum internalFormat,
@@ -47,7 +47,7 @@
                                  const gl::PixelUnpackState &unpack,
                                  size_t imageSize,
                                  const uint8_t *pixels) override;
-    gl::Error setCompressedSubImage(ContextImpl *contextImpl,
+    gl::Error setCompressedSubImage(const gl::Context *context,
                                     GLenum target,
                                     size_t level,
                                     const gl::Box &area,
@@ -56,20 +56,20 @@
                                     size_t imageSize,
                                     const uint8_t *pixels) override;
 
-    gl::Error copyImage(ContextImpl *contextImpl,
+    gl::Error copyImage(const gl::Context *context,
                         GLenum target,
                         size_t level,
                         const gl::Rectangle &sourceArea,
                         GLenum internalFormat,
                         const gl::Framebuffer *source) override;
-    gl::Error copySubImage(ContextImpl *contextImpl,
+    gl::Error copySubImage(const gl::Context *context,
                            GLenum target,
                            size_t level,
                            const gl::Offset &destOffset,
                            const gl::Rectangle &sourceArea,
                            const gl::Framebuffer *source) override;
 
-    gl::Error setStorage(ContextImpl *contextImpl,
+    gl::Error setStorage(const gl::Context *context,
                          GLenum target,
                          size_t levels,
                          GLenum internalFormat,
@@ -81,7 +81,7 @@
                                egl::Stream *stream,
                                const egl::Stream::GLTextureDescription &desc) override;
 
-    gl::Error generateMipmap(ContextImpl *contextImpl) override;
+    gl::Error generateMipmap(const gl::Context *context) override;
 
     void setBaseLevel(GLuint baseLevel) override;
 
@@ -90,7 +90,7 @@
 
     void syncState(const gl::Texture::DirtyBits &dirtyBits) override;
 
-    gl::Error setStorageMultisample(ContextImpl *contextImpl,
+    gl::Error setStorageMultisample(const gl::Context *context,
                                     GLenum target,
                                     GLsizei samples,
                                     GLint internalformat,
diff --git a/src/libANGLE/renderer/vulkan/BufferVk.cpp b/src/libANGLE/renderer/vulkan/BufferVk.cpp
index bdfa32c..2f102aa 100644
--- a/src/libANGLE/renderer/vulkan/BufferVk.cpp
+++ b/src/libANGLE/renderer/vulkan/BufferVk.cpp
@@ -10,6 +10,7 @@
 #include "libANGLE/renderer/vulkan/BufferVk.h"
 
 #include "common/debug.h"
+#include "libANGLE/Context.h"
 #include "libANGLE/renderer/vulkan/ContextVk.h"
 #include "libANGLE/renderer/vulkan/RendererVk.h"
 
@@ -24,20 +25,20 @@
 {
 }
 
-void BufferVk::destroy(ContextImpl *contextImpl)
+void BufferVk::destroy(const gl::Context *context)
 {
-    VkDevice device = GetAs<ContextVk>(contextImpl)->getDevice();
+    VkDevice device = GetImplAs<ContextVk>(context)->getDevice();
 
     mBuffer.destroy(device);
 }
 
-gl::Error BufferVk::setData(ContextImpl *context,
+gl::Error BufferVk::setData(const gl::Context *context,
                             GLenum target,
                             const void *data,
                             size_t size,
                             GLenum usage)
 {
-    ContextVk *contextVk = GetAs<ContextVk>(context);
+    ContextVk *contextVk = GetImplAs<ContextVk>(context);
     auto device          = contextVk->getDevice();
 
     // TODO(jmadill): Proper usage bit implementation. Likely will involve multiple backing buffers
@@ -93,7 +94,7 @@
     return gl::NoError();
 }
 
-gl::Error BufferVk::setSubData(ContextImpl *context,
+gl::Error BufferVk::setSubData(const gl::Context *context,
                                GLenum target,
                                const void *data,
                                size_t size,
@@ -102,14 +103,14 @@
     ASSERT(mBuffer.getHandle() != VK_NULL_HANDLE);
     ASSERT(mBuffer.getMemory().getHandle() != VK_NULL_HANDLE);
 
-    VkDevice device = GetAs<ContextVk>(context)->getDevice();
+    VkDevice device = GetImplAs<ContextVk>(context)->getDevice();
 
     ANGLE_TRY(setDataImpl(device, static_cast<const uint8_t *>(data), size, offset));
 
     return gl::NoError();
 }
 
-gl::Error BufferVk::copySubData(ContextImpl *context,
+gl::Error BufferVk::copySubData(const gl::Context *context,
                                 BufferImpl *source,
                                 GLintptr sourceOffset,
                                 GLintptr destOffset,
@@ -119,12 +120,12 @@
     return gl::Error(GL_INVALID_OPERATION);
 }
 
-gl::Error BufferVk::map(ContextImpl *context, GLenum access, void **mapPtr)
+gl::Error BufferVk::map(const gl::Context *context, GLenum access, void **mapPtr)
 {
     ASSERT(mBuffer.getHandle() != VK_NULL_HANDLE);
     ASSERT(mBuffer.getMemory().getHandle() != VK_NULL_HANDLE);
 
-    VkDevice device = GetAs<ContextVk>(context)->getDevice();
+    VkDevice device = GetImplAs<ContextVk>(context)->getDevice();
 
     ANGLE_TRY(mBuffer.getMemory().map(device, 0, mState.getSize(), 0,
                                       reinterpret_cast<uint8_t **>(mapPtr)));
@@ -132,7 +133,7 @@
     return gl::NoError();
 }
 
-gl::Error BufferVk::mapRange(ContextImpl *context,
+gl::Error BufferVk::mapRange(const gl::Context *context,
                              size_t offset,
                              size_t length,
                              GLbitfield access,
@@ -141,7 +142,7 @@
     ASSERT(mBuffer.getHandle() != VK_NULL_HANDLE);
     ASSERT(mBuffer.getMemory().getHandle() != VK_NULL_HANDLE);
 
-    VkDevice device = GetAs<ContextVk>(context)->getDevice();
+    VkDevice device = GetImplAs<ContextVk>(context)->getDevice();
 
     ANGLE_TRY(
         mBuffer.getMemory().map(device, offset, length, 0, reinterpret_cast<uint8_t **>(mapPtr)));
@@ -149,12 +150,12 @@
     return gl::NoError();
 }
 
-gl::Error BufferVk::unmap(ContextImpl *context, GLboolean *result)
+gl::Error BufferVk::unmap(const gl::Context *context, GLboolean *result)
 {
     ASSERT(mBuffer.getHandle() != VK_NULL_HANDLE);
     ASSERT(mBuffer.getMemory().getHandle() != VK_NULL_HANDLE);
 
-    VkDevice device = GetAs<ContextVk>(context)->getDevice();
+    VkDevice device = GetImplAs<ContextVk>(context)->getDevice();
 
     mBuffer.getMemory().unmap(device);
 
diff --git a/src/libANGLE/renderer/vulkan/BufferVk.h b/src/libANGLE/renderer/vulkan/BufferVk.h
index 410b500..bd08621 100644
--- a/src/libANGLE/renderer/vulkan/BufferVk.h
+++ b/src/libANGLE/renderer/vulkan/BufferVk.h
@@ -21,30 +21,30 @@
   public:
     BufferVk(const gl::BufferState &state);
     ~BufferVk() override;
-    void destroy(ContextImpl *contextImpl) override;
+    void destroy(const gl::Context *context) override;
 
-    gl::Error setData(ContextImpl *context,
+    gl::Error setData(const gl::Context *context,
                       GLenum target,
                       const void *data,
                       size_t size,
                       GLenum usage) override;
-    gl::Error setSubData(ContextImpl *context,
+    gl::Error setSubData(const gl::Context *context,
                          GLenum target,
                          const void *data,
                          size_t size,
                          size_t offset) override;
-    gl::Error copySubData(ContextImpl *contextImpl,
+    gl::Error copySubData(const gl::Context *context,
                           BufferImpl *source,
                           GLintptr sourceOffset,
                           GLintptr destOffset,
                           GLsizeiptr size) override;
-    gl::Error map(ContextImpl *contextImpl, GLenum access, void **mapPtr) override;
-    gl::Error mapRange(ContextImpl *contextImpl,
+    gl::Error map(const gl::Context *context, GLenum access, void **mapPtr) override;
+    gl::Error mapRange(const gl::Context *context,
                        size_t offset,
                        size_t length,
                        GLbitfield access,
                        void **mapPtr) override;
-    gl::Error unmap(ContextImpl *contextImpl, GLboolean *result) override;
+    gl::Error unmap(const gl::Context *context, GLboolean *result) override;
 
     gl::Error getIndexRange(GLenum type,
                             size_t offset,
diff --git a/src/libANGLE/renderer/vulkan/ContextVk.cpp b/src/libANGLE/renderer/vulkan/ContextVk.cpp
index 2a2c699..ed7b4a9 100644
--- a/src/libANGLE/renderer/vulkan/ContextVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ContextVk.cpp
@@ -264,7 +264,7 @@
     return gl::NoError();
 }
 
-gl::Error ContextVk::drawArrays(GLenum mode, GLint first, GLsizei count)
+gl::Error ContextVk::drawArrays(const gl::Context *context, GLenum mode, GLint first, GLsizei count)
 {
     if (mode != mCurrentDrawMode)
     {
@@ -326,7 +326,8 @@
     return gl::NoError();
 }
 
-gl::Error ContextVk::drawArraysInstanced(GLenum mode,
+gl::Error ContextVk::drawArraysInstanced(const gl::Context *context,
+                                         GLenum mode,
                                          GLint first,
                                          GLsizei count,
                                          GLsizei instanceCount)
@@ -335,7 +336,8 @@
     return gl::Error(GL_INVALID_OPERATION);
 }
 
-gl::Error ContextVk::drawElements(GLenum mode,
+gl::Error ContextVk::drawElements(const gl::Context *context,
+                                  GLenum mode,
                                   GLsizei count,
                                   GLenum type,
                                   const void *indices,
@@ -345,7 +347,8 @@
     return gl::Error(GL_INVALID_OPERATION);
 }
 
-gl::Error ContextVk::drawElementsInstanced(GLenum mode,
+gl::Error ContextVk::drawElementsInstanced(const gl::Context *context,
+                                           GLenum mode,
                                            GLsizei count,
                                            GLenum type,
                                            const void *indices,
@@ -356,7 +359,8 @@
     return gl::Error(GL_INVALID_OPERATION);
 }
 
-gl::Error ContextVk::drawRangeElements(GLenum mode,
+gl::Error ContextVk::drawRangeElements(const gl::Context *context,
+                                       GLenum mode,
                                        GLuint start,
                                        GLuint end,
                                        GLsizei count,
@@ -384,13 +388,18 @@
     return vk::NoError();
 }
 
-gl::Error ContextVk::drawArraysIndirect(GLenum mode, const void *indirect)
+gl::Error ContextVk::drawArraysIndirect(const gl::Context *context,
+                                        GLenum mode,
+                                        const void *indirect)
 {
     UNIMPLEMENTED();
     return gl::InternalError() << "DrawArraysIndirect hasn't been implemented for vulkan backend.";
 }
 
-gl::Error ContextVk::drawElementsIndirect(GLenum mode, GLenum type, const void *indirect)
+gl::Error ContextVk::drawElementsIndirect(const gl::Context *context,
+                                          GLenum mode,
+                                          GLenum type,
+                                          const void *indirect)
 {
     UNIMPLEMENTED();
     return gl::InternalError()
diff --git a/src/libANGLE/renderer/vulkan/ContextVk.h b/src/libANGLE/renderer/vulkan/ContextVk.h
index 07d0810..fb3ba55 100644
--- a/src/libANGLE/renderer/vulkan/ContextVk.h
+++ b/src/libANGLE/renderer/vulkan/ContextVk.h
@@ -32,32 +32,44 @@
     gl::Error finish() override;
 
     // Drawing methods.
-    gl::Error drawArrays(GLenum mode, GLint first, GLsizei count) override;
-    gl::Error drawArraysInstanced(GLenum mode,
+    gl::Error drawArrays(const gl::Context *context,
+                         GLenum mode,
+                         GLint first,
+                         GLsizei count) override;
+    gl::Error drawArraysInstanced(const gl::Context *context,
+                                  GLenum mode,
                                   GLint first,
                                   GLsizei count,
                                   GLsizei instanceCount) override;
 
-    gl::Error drawElements(GLenum mode,
+    gl::Error drawElements(const gl::Context *context,
+                           GLenum mode,
                            GLsizei count,
                            GLenum type,
                            const void *indices,
                            const gl::IndexRange &indexRange) override;
-    gl::Error drawElementsInstanced(GLenum mode,
+    gl::Error drawElementsInstanced(const gl::Context *context,
+                                    GLenum mode,
                                     GLsizei count,
                                     GLenum type,
                                     const void *indices,
                                     GLsizei instances,
                                     const gl::IndexRange &indexRange) override;
-    gl::Error drawRangeElements(GLenum mode,
+    gl::Error drawRangeElements(const gl::Context *context,
+                                GLenum mode,
                                 GLuint start,
                                 GLuint end,
                                 GLsizei count,
                                 GLenum type,
                                 const void *indices,
                                 const gl::IndexRange &indexRange) override;
-    gl::Error drawArraysIndirect(GLenum mode, const void *indirect) override;
-    gl::Error drawElementsIndirect(GLenum mode, GLenum type, const void *indirect) override;
+    gl::Error drawArraysIndirect(const gl::Context *context,
+                                 GLenum mode,
+                                 const void *indirect) override;
+    gl::Error drawElementsIndirect(const gl::Context *context,
+                                   GLenum mode,
+                                   GLenum type,
+                                   const void *indirect) override;
 
     // Device loss
     GLenum getResetStatus() override;
diff --git a/src/libANGLE/renderer/vulkan/FramebufferVk.cpp b/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
index 84b8907..b7adc97 100644
--- a/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
+++ b/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
@@ -14,6 +14,8 @@
 
 #include "common/debug.h"
 #include "image_util/imageformats.h"
+#include "libANGLE/Context.h"
+#include "libANGLE/Display.h"
 #include "libANGLE/formatutils.h"
 #include "libANGLE/renderer/renderer_utils.h"
 #include "libANGLE/renderer/vulkan/ContextVk.h"
@@ -91,17 +93,17 @@
 {
 }
 
-void FramebufferVk::destroy(ContextImpl *contextImpl)
+void FramebufferVk::destroy(const gl::Context *context)
 {
-    VkDevice device = GetAs<ContextVk>(contextImpl)->getDevice();
+    VkDevice device = GetImplAs<ContextVk>(context)->getDevice();
 
     mRenderPass.destroy(device);
     mFramebuffer.destroy(device);
 }
 
-void FramebufferVk::destroyDefault(DisplayImpl *displayImpl)
+void FramebufferVk::destroyDefault(const egl::Display *display)
 {
-    VkDevice device = GetAs<DisplayVk>(displayImpl)->getRenderer()->getDevice();
+    VkDevice device = GetImplAs<DisplayVk>(display)->getRenderer()->getDevice();
 
     mRenderPass.destroy(device);
     mFramebuffer.destroy(device);
@@ -127,9 +129,9 @@
     return gl::Error(GL_INVALID_OPERATION);
 }
 
-gl::Error FramebufferVk::clear(ContextImpl *context, GLbitfield mask)
+gl::Error FramebufferVk::clear(const gl::Context *context, GLbitfield mask)
 {
-    ContextVk *contextVk = GetAs<ContextVk>(context);
+    ContextVk *contextVk = GetImplAs<ContextVk>(context);
 
     if (mState.getDepthAttachment() && (mask & GL_DEPTH_BUFFER_BIT) != 0)
     {
@@ -180,7 +182,7 @@
     return gl::NoError();
 }
 
-gl::Error FramebufferVk::clearBufferfv(ContextImpl *context,
+gl::Error FramebufferVk::clearBufferfv(const gl::Context *context,
                                        GLenum buffer,
                                        GLint drawbuffer,
                                        const GLfloat *values)
@@ -189,7 +191,7 @@
     return gl::Error(GL_INVALID_OPERATION);
 }
 
-gl::Error FramebufferVk::clearBufferuiv(ContextImpl *context,
+gl::Error FramebufferVk::clearBufferuiv(const gl::Context *context,
                                         GLenum buffer,
                                         GLint drawbuffer,
                                         const GLuint *values)
@@ -198,7 +200,7 @@
     return gl::Error(GL_INVALID_OPERATION);
 }
 
-gl::Error FramebufferVk::clearBufferiv(ContextImpl *context,
+gl::Error FramebufferVk::clearBufferiv(const gl::Context *context,
                                        GLenum buffer,
                                        GLint drawbuffer,
                                        const GLint *values)
@@ -207,7 +209,7 @@
     return gl::Error(GL_INVALID_OPERATION);
 }
 
-gl::Error FramebufferVk::clearBufferfi(ContextImpl *context,
+gl::Error FramebufferVk::clearBufferfi(const gl::Context *context,
                                        GLenum buffer,
                                        GLint drawbuffer,
                                        GLfloat depth,
@@ -245,7 +247,7 @@
     return errOrResult.getResult()->type;
 }
 
-gl::Error FramebufferVk::readPixels(ContextImpl *context,
+gl::Error FramebufferVk::readPixels(const gl::Context *context,
                                     const gl::Rectangle &area,
                                     GLenum format,
                                     GLenum type,
@@ -258,7 +260,7 @@
     RenderTargetVk *renderTarget = nullptr;
     ANGLE_TRY(readAttachment->getRenderTarget(&renderTarget));
 
-    ContextVk *contextVk = GetAs<ContextVk>(context);
+    ContextVk *contextVk = GetImplAs<ContextVk>(context);
     RendererVk *renderer = contextVk->getRenderer();
     VkDevice device      = renderer->getDevice();
 
@@ -318,7 +320,7 @@
     return vk::NoError();
 }
 
-gl::Error FramebufferVk::blit(ContextImpl *context,
+gl::Error FramebufferVk::blit(const gl::Context *context,
                               const gl::Rectangle &sourceArea,
                               const gl::Rectangle &destArea,
                               GLbitfield mask,
@@ -334,9 +336,10 @@
     return bool();
 }
 
-void FramebufferVk::syncState(ContextImpl *contextImpl, const gl::Framebuffer::DirtyBits &dirtyBits)
+void FramebufferVk::syncState(const gl::Context *context,
+                              const gl::Framebuffer::DirtyBits &dirtyBits)
 {
-    auto contextVk = GetAs<ContextVk>(contextImpl);
+    auto contextVk = GetImplAs<ContextVk>(context);
 
     ASSERT(dirtyBits.any());
 
diff --git a/src/libANGLE/renderer/vulkan/FramebufferVk.h b/src/libANGLE/renderer/vulkan/FramebufferVk.h
index b28ffbd..01926b5 100644
--- a/src/libANGLE/renderer/vulkan/FramebufferVk.h
+++ b/src/libANGLE/renderer/vulkan/FramebufferVk.h
@@ -31,8 +31,8 @@
                                            WindowSurfaceVk *backbuffer);
 
     ~FramebufferVk() override;
-    void destroy(ContextImpl *contextImpl) override;
-    void destroyDefault(DisplayImpl *displayImpl) override;
+    void destroy(const gl::Context *context) override;
+    void destroyDefault(const egl::Display *display) override;
 
     gl::Error discard(size_t count, const GLenum *attachments) override;
     gl::Error invalidate(size_t count, const GLenum *attachments) override;
@@ -40,20 +40,20 @@
                             const GLenum *attachments,
                             const gl::Rectangle &area) override;
 
-    gl::Error clear(ContextImpl *context, GLbitfield mask) override;
-    gl::Error clearBufferfv(ContextImpl *context,
+    gl::Error clear(const gl::Context *context, GLbitfield mask) override;
+    gl::Error clearBufferfv(const gl::Context *context,
                             GLenum buffer,
                             GLint drawbuffer,
                             const GLfloat *values) override;
-    gl::Error clearBufferuiv(ContextImpl *context,
+    gl::Error clearBufferuiv(const gl::Context *context,
                              GLenum buffer,
                              GLint drawbuffer,
                              const GLuint *values) override;
-    gl::Error clearBufferiv(ContextImpl *context,
+    gl::Error clearBufferiv(const gl::Context *context,
                             GLenum buffer,
                             GLint drawbuffer,
                             const GLint *values) override;
-    gl::Error clearBufferfi(ContextImpl *context,
+    gl::Error clearBufferfi(const gl::Context *context,
                             GLenum buffer,
                             GLint drawbuffer,
                             GLfloat depth,
@@ -61,13 +61,13 @@
 
     GLenum getImplementationColorReadFormat() const override;
     GLenum getImplementationColorReadType() const override;
-    gl::Error readPixels(ContextImpl *context,
+    gl::Error readPixels(const gl::Context *context,
                          const gl::Rectangle &area,
                          GLenum format,
                          GLenum type,
                          void *pixels) const override;
 
-    gl::Error blit(ContextImpl *context,
+    gl::Error blit(const gl::Context *context,
                    const gl::Rectangle &sourceArea,
                    const gl::Rectangle &destArea,
                    GLbitfield mask,
@@ -75,7 +75,8 @@
 
     bool checkStatus() const override;
 
-    void syncState(ContextImpl *contextImpl, const gl::Framebuffer::DirtyBits &dirtyBits) override;
+    void syncState(const gl::Context *context,
+                   const gl::Framebuffer::DirtyBits &dirtyBits) override;
 
     gl::Error getSamplePosition(size_t index, GLfloat *xy) const override;
 
diff --git a/src/libANGLE/renderer/vulkan/ProgramVk.cpp b/src/libANGLE/renderer/vulkan/ProgramVk.cpp
index 6e53883..b5e63da 100644
--- a/src/libANGLE/renderer/vulkan/ProgramVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ProgramVk.cpp
@@ -10,6 +10,7 @@
 #include "libANGLE/renderer/vulkan/ProgramVk.h"
 
 #include "common/debug.h"
+#include "libANGLE/Context.h"
 #include "libANGLE/renderer/vulkan/ContextVk.h"
 #include "libANGLE/renderer/vulkan/GlslangWrapper.h"
 #include "libANGLE/renderer/vulkan/RendererVk.h"
@@ -25,16 +26,16 @@
 {
 }
 
-void ProgramVk::destroy(const ContextImpl *contextImpl)
+void ProgramVk::destroy(const gl::Context *contextImpl)
 {
-    VkDevice device = GetAs<ContextVk>(contextImpl)->getDevice();
+    VkDevice device = GetImplAs<ContextVk>(contextImpl)->getDevice();
 
     mLinkedFragmentModule.destroy(device);
     mLinkedVertexModule.destroy(device);
     mPipelineLayout.destroy(device);
 }
 
-LinkResult ProgramVk::load(const ContextImpl *contextImpl,
+LinkResult ProgramVk::load(const gl::Context *contextImpl,
                            gl::InfoLog &infoLog,
                            gl::BinaryInputStream *stream)
 {
@@ -58,11 +59,11 @@
     UNIMPLEMENTED();
 }
 
-LinkResult ProgramVk::link(ContextImpl *contextImpl,
+LinkResult ProgramVk::link(const gl::Context *glContext,
                            const gl::VaryingPacking &packing,
                            gl::InfoLog &infoLog)
 {
-    ContextVk *context             = GetAs<ContextVk>(contextImpl);
+    ContextVk *context             = GetImplAs<ContextVk>(glContext);
     RendererVk *renderer           = context->getRenderer();
     GlslangWrapper *glslangWrapper = renderer->getGlslangWrapper();
 
diff --git a/src/libANGLE/renderer/vulkan/ProgramVk.h b/src/libANGLE/renderer/vulkan/ProgramVk.h
index ff8efc5..82e9c92 100644
--- a/src/libANGLE/renderer/vulkan/ProgramVk.h
+++ b/src/libANGLE/renderer/vulkan/ProgramVk.h
@@ -21,16 +21,16 @@
   public:
     ProgramVk(const gl::ProgramState &state);
     ~ProgramVk() override;
-    void destroy(const ContextImpl *contextImpl) override;
+    void destroy(const gl::Context *context) override;
 
-    LinkResult load(const ContextImpl *contextImpl,
+    LinkResult load(const gl::Context *context,
                     gl::InfoLog &infoLog,
                     gl::BinaryInputStream *stream) override;
     gl::Error save(gl::BinaryOutputStream *stream) override;
     void setBinaryRetrievableHint(bool retrievable) override;
     void setSeparable(bool separable) override;
 
-    LinkResult link(ContextImpl *contextImpl,
+    LinkResult link(const gl::Context *context,
                     const gl::VaryingPacking &packing,
                     gl::InfoLog &infoLog) override;
     GLboolean validate(const gl::Caps &caps, gl::InfoLog *infoLog) override;
diff --git a/src/libANGLE/renderer/vulkan/SurfaceVk.cpp b/src/libANGLE/renderer/vulkan/SurfaceVk.cpp
index d98f4fe..e0e173f 100644
--- a/src/libANGLE/renderer/vulkan/SurfaceVk.cpp
+++ b/src/libANGLE/renderer/vulkan/SurfaceVk.cpp
@@ -10,6 +10,7 @@
 #include "libANGLE/renderer/vulkan/SurfaceVk.h"
 
 #include "common/debug.h"
+#include "libANGLE/Display.h"
 #include "libANGLE/Surface.h"
 #include "libANGLE/renderer/vulkan/DisplayVk.h"
 #include "libANGLE/renderer/vulkan/FramebufferVk.h"
@@ -65,7 +66,7 @@
 {
 }
 
-egl::Error OffscreenSurfaceVk::initialize(const DisplayImpl *displayImpl)
+egl::Error OffscreenSurfaceVk::initialize(const egl::Display *display)
 {
     return egl::Error(EGL_SUCCESS);
 }
@@ -76,7 +77,7 @@
     return FramebufferVk::CreateUserFBO(state);
 }
 
-egl::Error OffscreenSurfaceVk::swap(const DisplayImpl *displayImpl)
+egl::Error OffscreenSurfaceVk::swap(const egl::Display *display)
 {
     return egl::Error(EGL_SUCCESS);
 }
@@ -170,9 +171,9 @@
     ASSERT(mSwapchain == VK_NULL_HANDLE);
 }
 
-void WindowSurfaceVk::destroy(const DisplayImpl *displayImpl)
+void WindowSurfaceVk::destroy(const egl::Display *display)
 {
-    const DisplayVk *displayVk = GetAs<DisplayVk>(displayImpl);
+    const DisplayVk *displayVk = GetImplAs<DisplayVk>(display);
     RendererVk *rendererVk     = displayVk->getRenderer();
     VkDevice device            = rendererVk->getDevice();
     VkInstance instance        = rendererVk->getInstance();
@@ -211,9 +212,9 @@
     }
 }
 
-egl::Error WindowSurfaceVk::initialize(const DisplayImpl *displayImpl)
+egl::Error WindowSurfaceVk::initialize(const egl::Display *display)
 {
-    const DisplayVk *displayVk = GetAs<DisplayVk>(displayImpl);
+    const DisplayVk *displayVk = GetImplAs<DisplayVk>(display);
     return initializeImpl(displayVk->getRenderer()).toEGL(EGL_BAD_SURFACE);
 }
 
@@ -413,9 +414,9 @@
     return FramebufferVk::CreateDefaultFBO(state, this);
 }
 
-egl::Error WindowSurfaceVk::swap(const DisplayImpl *displayImpl)
+egl::Error WindowSurfaceVk::swap(const egl::Display *display)
 {
-    const DisplayVk *displayVk = GetAs<DisplayVk>(displayImpl);
+    const DisplayVk *displayVk = GetImplAs<DisplayVk>(display);
     return swapImpl(displayVk->getRenderer()).toEGL(EGL_BAD_ALLOC);
 }
 
diff --git a/src/libANGLE/renderer/vulkan/SurfaceVk.h b/src/libANGLE/renderer/vulkan/SurfaceVk.h
index e42696b..018e8ab 100644
--- a/src/libANGLE/renderer/vulkan/SurfaceVk.h
+++ b/src/libANGLE/renderer/vulkan/SurfaceVk.h
@@ -26,9 +26,9 @@
     OffscreenSurfaceVk(const egl::SurfaceState &surfaceState, EGLint width, EGLint height);
     ~OffscreenSurfaceVk() override;
 
-    egl::Error initialize(const DisplayImpl *displayImpl) override;
+    egl::Error initialize(const egl::Display *display) override;
     FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &state) override;
-    egl::Error swap(const DisplayImpl *displayImpl) override;
+    egl::Error swap(const egl::Display *display) override;
     egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) override;
     egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) override;
     egl::Error bindTexImage(gl::Texture *texture, EGLint buffer) override;
@@ -61,11 +61,11 @@
                     EGLint height);
     ~WindowSurfaceVk() override;
 
-    void destroy(const DisplayImpl *contextImpl) override;
+    void destroy(const egl::Display *display) override;
 
-    egl::Error initialize(const DisplayImpl *displayImpl) override;
+    egl::Error initialize(const egl::Display *display) override;
     FramebufferImpl *createDefaultFramebuffer(const gl::FramebufferState &state) override;
-    egl::Error swap(const DisplayImpl *displayImpl) override;
+    egl::Error swap(const egl::Display *display) override;
     egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) override;
     egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) override;
     egl::Error bindTexImage(gl::Texture *texture, EGLint buffer) override;
diff --git a/src/libANGLE/renderer/vulkan/TextureVk.cpp b/src/libANGLE/renderer/vulkan/TextureVk.cpp
index 7c3bf4b..16d7bb4 100644
--- a/src/libANGLE/renderer/vulkan/TextureVk.cpp
+++ b/src/libANGLE/renderer/vulkan/TextureVk.cpp
@@ -22,7 +22,7 @@
 {
 }
 
-gl::Error TextureVk::setImage(ContextImpl *contextImpl,
+gl::Error TextureVk::setImage(const gl::Context *context,
                               GLenum target,
                               size_t level,
                               GLenum internalFormat,
@@ -36,7 +36,7 @@
     return gl::Error(GL_INVALID_OPERATION);
 }
 
-gl::Error TextureVk::setSubImage(ContextImpl *contextImpl,
+gl::Error TextureVk::setSubImage(const gl::Context *context,
                                  GLenum target,
                                  size_t level,
                                  const gl::Box &area,
@@ -49,7 +49,7 @@
     return gl::Error(GL_INVALID_OPERATION);
 }
 
-gl::Error TextureVk::setCompressedImage(ContextImpl *contextImpl,
+gl::Error TextureVk::setCompressedImage(const gl::Context *context,
                                         GLenum target,
                                         size_t level,
                                         GLenum internalFormat,
@@ -62,7 +62,7 @@
     return gl::Error(GL_INVALID_OPERATION);
 }
 
-gl::Error TextureVk::setCompressedSubImage(ContextImpl *contextImpl,
+gl::Error TextureVk::setCompressedSubImage(const gl::Context *context,
                                            GLenum target,
                                            size_t level,
                                            const gl::Box &area,
@@ -75,7 +75,7 @@
     return gl::Error(GL_INVALID_OPERATION);
 }
 
-gl::Error TextureVk::copyImage(ContextImpl *contextImpl,
+gl::Error TextureVk::copyImage(const gl::Context *context,
                                GLenum target,
                                size_t level,
                                const gl::Rectangle &sourceArea,
@@ -86,7 +86,7 @@
     return gl::Error(GL_INVALID_OPERATION);
 }
 
-gl::Error TextureVk::copySubImage(ContextImpl *contextImpl,
+gl::Error TextureVk::copySubImage(const gl::Context *context,
                                   GLenum target,
                                   size_t level,
                                   const gl::Offset &destOffset,
@@ -97,7 +97,7 @@
     return gl::Error(GL_INVALID_OPERATION);
 }
 
-gl::Error TextureVk::setStorage(ContextImpl *contextImpl,
+gl::Error TextureVk::setStorage(const gl::Context *context,
                                 GLenum target,
                                 size_t levels,
                                 GLenum internalFormat,
@@ -121,7 +121,7 @@
     return gl::Error(GL_INVALID_OPERATION);
 }
 
-gl::Error TextureVk::generateMipmap(ContextImpl *contextImpl)
+gl::Error TextureVk::generateMipmap(const gl::Context *context)
 {
     UNIMPLEMENTED();
     return gl::Error(GL_INVALID_OPERATION);
@@ -155,7 +155,7 @@
     UNIMPLEMENTED();
 }
 
-gl::Error TextureVk::setStorageMultisample(ContextImpl *contextImpl,
+gl::Error TextureVk::setStorageMultisample(const gl::Context *context,
                                            GLenum target,
                                            GLsizei samples,
                                            GLint internalformat,
diff --git a/src/libANGLE/renderer/vulkan/TextureVk.h b/src/libANGLE/renderer/vulkan/TextureVk.h
index 4ad6a30..d50854e 100644
--- a/src/libANGLE/renderer/vulkan/TextureVk.h
+++ b/src/libANGLE/renderer/vulkan/TextureVk.h
@@ -21,7 +21,7 @@
     TextureVk(const gl::TextureState &state);
     ~TextureVk() override;
 
-    gl::Error setImage(ContextImpl *contextImpl,
+    gl::Error setImage(const gl::Context *context,
                        GLenum target,
                        size_t level,
                        GLenum internalFormat,
@@ -30,7 +30,7 @@
                        GLenum type,
                        const gl::PixelUnpackState &unpack,
                        const uint8_t *pixels) override;
-    gl::Error setSubImage(ContextImpl *contextImpl,
+    gl::Error setSubImage(const gl::Context *context,
                           GLenum target,
                           size_t level,
                           const gl::Box &area,
@@ -39,7 +39,7 @@
                           const gl::PixelUnpackState &unpack,
                           const uint8_t *pixels) override;
 
-    gl::Error setCompressedImage(ContextImpl *contextImpl,
+    gl::Error setCompressedImage(const gl::Context *context,
                                  GLenum target,
                                  size_t level,
                                  GLenum internalFormat,
@@ -47,7 +47,7 @@
                                  const gl::PixelUnpackState &unpack,
                                  size_t imageSize,
                                  const uint8_t *pixels) override;
-    gl::Error setCompressedSubImage(ContextImpl *contextImpl,
+    gl::Error setCompressedSubImage(const gl::Context *context,
                                     GLenum target,
                                     size_t level,
                                     const gl::Box &area,
@@ -56,20 +56,20 @@
                                     size_t imageSize,
                                     const uint8_t *pixels) override;
 
-    gl::Error copyImage(ContextImpl *contextImpl,
+    gl::Error copyImage(const gl::Context *context,
                         GLenum target,
                         size_t level,
                         const gl::Rectangle &sourceArea,
                         GLenum internalFormat,
                         const gl::Framebuffer *source) override;
-    gl::Error copySubImage(ContextImpl *contextImpl,
+    gl::Error copySubImage(const gl::Context *context,
                            GLenum target,
                            size_t level,
                            const gl::Offset &destOffset,
                            const gl::Rectangle &sourceArea,
                            const gl::Framebuffer *source) override;
 
-    gl::Error setStorage(ContextImpl *contextImpl,
+    gl::Error setStorage(const gl::Context *context,
                          GLenum target,
                          size_t levels,
                          GLenum internalFormat,
@@ -81,7 +81,7 @@
                                egl::Stream *stream,
                                const egl::Stream::GLTextureDescription &desc) override;
 
-    gl::Error generateMipmap(ContextImpl *contextImpl) override;
+    gl::Error generateMipmap(const gl::Context *context) override;
 
     void setBaseLevel(GLuint baseLevel) override;
 
@@ -94,7 +94,7 @@
 
     void syncState(const gl::Texture::DirtyBits &dirtyBits) override;
 
-    gl::Error setStorageMultisample(ContextImpl *contextImpl,
+    gl::Error setStorageMultisample(const gl::Context *context,
                                     GLenum target,
                                     GLsizei samples,
                                     GLint internalformat,
diff --git a/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp b/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
index e835be7..0aabb4a 100644
--- a/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
+++ b/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
@@ -11,6 +11,7 @@
 
 #include "common/debug.h"
 
+#include "libANGLE/Context.h"
 #include "libANGLE/renderer/vulkan/ContextVk.h"
 
 namespace rx
@@ -24,12 +25,13 @@
 {
 }
 
-void VertexArrayVk::syncState(ContextImpl *contextImpl, const gl::VertexArray::DirtyBits &dirtyBits)
+void VertexArrayVk::syncState(const gl::Context *context,
+                              const gl::VertexArray::DirtyBits &dirtyBits)
 {
     ASSERT(dirtyBits.any());
 
     // TODO(jmadill): Use pipeline cache.
-    auto contextVk = GetAs<ContextVk>(contextImpl);
+    auto contextVk = GetImplAs<ContextVk>(context);
     contextVk->invalidateCurrentPipeline();
 }
 
diff --git a/src/libANGLE/renderer/vulkan/VertexArrayVk.h b/src/libANGLE/renderer/vulkan/VertexArrayVk.h
index 7592bc0..63f9ffa 100644
--- a/src/libANGLE/renderer/vulkan/VertexArrayVk.h
+++ b/src/libANGLE/renderer/vulkan/VertexArrayVk.h
@@ -21,7 +21,8 @@
     VertexArrayVk(const gl::VertexArrayState &data);
     ~VertexArrayVk() override;
 
-    void syncState(ContextImpl *contextImpl, const gl::VertexArray::DirtyBits &dirtyBits) override;
+    void syncState(const gl::Context *context,
+                   const gl::VertexArray::DirtyBits &dirtyBits) override;
 };
 
 }  // namespace rx
diff --git a/src/tests/perf_tests/IndexDataManagerTest.cpp b/src/tests/perf_tests/IndexDataManagerTest.cpp
index 8a37ece..a42fcba 100644
--- a/src/tests/perf_tests/IndexDataManagerTest.cpp
+++ b/src/tests/perf_tests/IndexDataManagerTest.cpp
@@ -78,7 +78,7 @@
     MockBufferD3D(rx::BufferFactoryD3D *factory) : BufferD3D(mockState, factory), mData() {}
 
     // BufferImpl
-    gl::Error setData(rx::ContextImpl *context,
+    gl::Error setData(const gl::Context *context,
                       GLenum target,
                       const void *data,
                       size_t size,
@@ -92,13 +92,12 @@
         return gl::NoError();
     }
 
-    MOCK_METHOD5(setSubData, gl::Error(rx::ContextImpl *, GLenum, const void *, size_t, size_t));
+    MOCK_METHOD5(setSubData, gl::Error(const gl::Context *, GLenum, const void *, size_t, size_t));
     MOCK_METHOD5(copySubData,
-                 gl::Error(rx::ContextImpl *context, BufferImpl *, GLintptr, GLintptr, GLsizeiptr));
-    MOCK_METHOD3(map, gl::Error(rx::ContextImpl *context, GLenum, void **));
-    MOCK_METHOD5(mapRange,
-                 gl::Error(rx::ContextImpl *context, size_t, size_t, GLbitfield, void **));
-    MOCK_METHOD2(unmap, gl::Error(rx::ContextImpl *context, GLboolean *));
+                 gl::Error(const gl::Context *, BufferImpl *, GLintptr, GLintptr, GLsizeiptr));
+    MOCK_METHOD3(map, gl::Error(const gl::Context *context, GLenum, void **));
+    MOCK_METHOD5(mapRange, gl::Error(const gl::Context *, size_t, size_t, GLbitfield, void **));
+    MOCK_METHOD2(unmap, gl::Error(const gl::Context *context, GLboolean *));
 
     // BufferD3D
     MOCK_METHOD0(markTransformFeedbackUsage, gl::Error());