Add a ContextImpl class.

This class can contain impl-specific functionality for a Context.
This will eventually replace the Renderer class, and we can then
start passing around a gl::Context instead of gl::ContextState.

In D3D11, the ContextImpl could hold a DeferredContext, which would
enable multi-thread rendering. In GL, we can implement non-virtual
(native) Contexts. In Vulkan it might store the logical device.

BUG=angleproject:1363

Change-Id: I39617e6d1a605d1a9574832e4d322400b09867ec
Reviewed-on: https://chromium-review.googlesource.com/340745
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp
index 683ec18..2e89b81 100644
--- a/src/libANGLE/Context.cpp
+++ b/src/libANGLE/Context.cpp
@@ -31,6 +31,7 @@
 #include "libANGLE/VertexArray.h"
 #include "libANGLE/formatutils.h"
 #include "libANGLE/validationES.h"
+#include "libANGLE/renderer/ContextImpl.h"
 #include "libANGLE/renderer/Renderer.h"
 
 namespace
@@ -133,6 +134,7 @@
                         nullptr,
                         mLimitations,
                         GetNoError(attribs)),
+      mImplementation(renderer->createContext()),
       mCompiler(nullptr),
       mRenderer(renderer),
       mClientVersion(GetClientVersion(attribs)),
@@ -261,6 +263,8 @@
     mBlitDirtyBits.set(State::DIRTY_BIT_SCISSOR);
     mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
     mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
+
+    handleError(mImplementation->initialize(renderer));
 }
 
 Context::~Context()
@@ -1650,7 +1654,7 @@
     programObject->bindUniformLocation(location, name);
 }
 
-void Context::recordError(const Error &error)
+void Context::handleError(const Error &error)
 {
     if (error.isError())
     {
@@ -2165,56 +2169,31 @@
 
     syncStateForBlit();
 
-    Error error = drawFramebuffer->blit(mState, srcArea, dstArea, mask, filter, readFramebuffer);
-    if (error.isError())
-    {
-        recordError(error);
-        return;
-    }
+    handleError(drawFramebuffer->blit(mState, srcArea, dstArea, mask, filter, readFramebuffer));
 }
 
 void Context::clear(GLbitfield mask)
 {
     syncStateForClear();
-
-    Error error = mState.getDrawFramebuffer()->clear(mData, mask);
-    if (error.isError())
-    {
-        recordError(error);
-    }
+    handleError(mState.getDrawFramebuffer()->clear(mData, mask));
 }
 
 void Context::clearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *values)
 {
     syncStateForClear();
-
-    Error error = mState.getDrawFramebuffer()->clearBufferfv(mData, buffer, drawbuffer, values);
-    if (error.isError())
-    {
-        recordError(error);
-    }
+    handleError(mState.getDrawFramebuffer()->clearBufferfv(mData, buffer, drawbuffer, values));
 }
 
 void Context::clearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *values)
 {
     syncStateForClear();
-
-    Error error = mState.getDrawFramebuffer()->clearBufferuiv(mData, buffer, drawbuffer, values);
-    if (error.isError())
-    {
-        recordError(error);
-    }
+    handleError(mState.getDrawFramebuffer()->clearBufferuiv(mData, buffer, drawbuffer, values));
 }
 
 void Context::clearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *values)
 {
     syncStateForClear();
-
-    Error error = mState.getDrawFramebuffer()->clearBufferiv(mData, buffer, drawbuffer, values);
-    if (error.isError())
-    {
-        recordError(error);
-    }
+    handleError(mState.getDrawFramebuffer()->clearBufferiv(mData, buffer, drawbuffer, values));
 }
 
 void Context::clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
@@ -2230,12 +2209,7 @@
     }
 
     syncStateForClear();
-
-    Error error = framebufferObject->clearBufferfi(mData, buffer, drawbuffer, depth, stencil);
-    if (error.isError())
-    {
-        recordError(error);
-    }
+    handleError(framebufferObject->clearBufferfi(mData, buffer, drawbuffer, depth, stencil));
 }
 
 void Context::readPixels(GLint x,
@@ -2252,11 +2226,7 @@
     ASSERT(framebufferObject);
 
     Rectangle area(x, y, width, height);
-    Error error = framebufferObject->readPixels(mState, area, format, type, pixels);
-    if (error.isError())
-    {
-        recordError(error);
-    }
+    handleError(framebufferObject->readPixels(mState, area, format, type, pixels));
 }
 
 void Context::copyTexImage2D(GLenum target,
@@ -2276,11 +2246,7 @@
     const Framebuffer *framebuffer = mState.getReadFramebuffer();
     Texture *texture =
         getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
-    Error error = texture->copyImage(target, level, sourceArea, internalformat, framebuffer);
-    if (error.isError())
-    {
-        recordError(error);
-    }
+    handleError(texture->copyImage(target, level, sourceArea, internalformat, framebuffer));
 }
 
 void Context::copyTexSubImage2D(GLenum target,
@@ -2301,11 +2267,7 @@
     const Framebuffer *framebuffer = mState.getReadFramebuffer();
     Texture *texture =
         getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
-    Error error = texture->copySubImage(target, level, destOffset, sourceArea, framebuffer);
-    if (error.isError())
-    {
-        recordError(error);
-    }
+    handleError(texture->copySubImage(target, level, destOffset, sourceArea, framebuffer));
 }
 
 void Context::copyTexSubImage3D(GLenum target,
@@ -2326,11 +2288,7 @@
 
     const Framebuffer *framebuffer = mState.getReadFramebuffer();
     Texture *texture               = getTargetTexture(target);
-    Error error = texture->copySubImage(target, level, destOffset, sourceArea, framebuffer);
-    if (error.isError())
-    {
-        recordError(error);
-    }
+    handleError(texture->copySubImage(target, level, destOffset, sourceArea, framebuffer));
 }
 
 void Context::framebufferTexture2D(GLenum target,
@@ -2450,11 +2408,7 @@
 
     // The specification isn't clear what should be done when the framebuffer isn't complete.
     // We leave it up to the framebuffer implementation to decide what to do.
-    Error error = framebuffer->discard(numAttachments, attachments);
-    if (error.isError())
-    {
-        recordError(error);
-    }
+    handleError(framebuffer->discard(numAttachments, attachments));
 }
 
 void Context::invalidateFramebuffer(GLenum target,
@@ -2467,15 +2421,12 @@
     Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
     ASSERT(framebuffer);
 
-    if (framebuffer->checkStatus(mData) == GL_FRAMEBUFFER_COMPLETE)
+    if (framebuffer->checkStatus(mData) != GL_FRAMEBUFFER_COMPLETE)
     {
-        Error error = framebuffer->invalidate(numAttachments, attachments);
-        if (error.isError())
-        {
-            recordError(error);
-            return;
-        }
+        return;
     }
+
+    handleError(framebuffer->invalidate(numAttachments, attachments));
 }
 
 void Context::invalidateSubFramebuffer(GLenum target,
@@ -2492,16 +2443,13 @@
     Framebuffer *framebuffer = mState.getTargetFramebuffer(target);
     ASSERT(framebuffer);
 
-    if (framebuffer->checkStatus(mData) == GL_FRAMEBUFFER_COMPLETE)
+    if (framebuffer->checkStatus(mData) != GL_FRAMEBUFFER_COMPLETE)
     {
-        Rectangle area(x, y, width, height);
-        Error error = framebuffer->invalidateSub(numAttachments, attachments, area);
-        if (error.isError())
-        {
-            recordError(error);
-            return;
-        }
+        return;
     }
+
+    Rectangle area(x, y, width, height);
+    handleError(framebuffer->invalidateSub(numAttachments, attachments, area));
 }
 
 void Context::texImage2D(GLenum target,
@@ -2519,12 +2467,8 @@
     Extents size(width, height, 1);
     Texture *texture =
         getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
-    Error error = texture->setImage(mState.getUnpackState(), target, level, internalformat, size,
-                                    format, type, reinterpret_cast<const uint8_t *>(pixels));
-    if (error.isError())
-    {
-        recordError(error);
-    }
+    handleError(texture->setImage(mState.getUnpackState(), target, level, internalformat, size,
+                                  format, type, reinterpret_cast<const uint8_t *>(pixels)));
 }
 
 void Context::texImage3D(GLenum target,
@@ -2542,12 +2486,8 @@
 
     Extents size(width, height, depth);
     Texture *texture = getTargetTexture(target);
-    Error error = texture->setImage(mState.getUnpackState(), target, level, internalformat, size,
-                                    format, type, reinterpret_cast<const uint8_t *>(pixels));
-    if (error.isError())
-    {
-        recordError(error);
-    }
+    handleError(texture->setImage(mState.getUnpackState(), target, level, internalformat, size,
+                                  format, type, reinterpret_cast<const uint8_t *>(pixels)));
 }
 
 void Context::texSubImage2D(GLenum target,
@@ -2571,12 +2511,8 @@
     Box area(xoffset, yoffset, 0, width, height, 1);
     Texture *texture =
         getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
-    Error error = texture->setSubImage(mState.getUnpackState(), target, level, area, format, type,
-                                       reinterpret_cast<const uint8_t *>(pixels));
-    if (error.isError())
-    {
-        recordError(error);
-    }
+    handleError(texture->setSubImage(mState.getUnpackState(), target, level, area, format, type,
+                                     reinterpret_cast<const uint8_t *>(pixels)));
 }
 
 void Context::texSubImage3D(GLenum target,
@@ -2601,12 +2537,8 @@
 
     Box area(xoffset, yoffset, zoffset, width, height, depth);
     Texture *texture = getTargetTexture(target);
-    Error error = texture->setSubImage(mState.getUnpackState(), target, level, area, format, type,
-                                       reinterpret_cast<const uint8_t *>(pixels));
-    if (error.isError())
-    {
-        recordError(error);
-    }
+    handleError(texture->setSubImage(mState.getUnpackState(), target, level, area, format, type,
+                                     reinterpret_cast<const uint8_t *>(pixels)));
 }
 
 void Context::compressedTexImage2D(GLenum target,
@@ -2623,13 +2555,9 @@
     Extents size(width, height, 1);
     Texture *texture =
         getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
-    Error error =
-        texture->setCompressedImage(mState.getUnpackState(), target, level, internalformat, size,
-                                    imageSize, reinterpret_cast<const uint8_t *>(data));
-    if (error.isError())
-    {
-        recordError(error);
-    }
+    handleError(texture->setCompressedImage(mState.getUnpackState(), target, level, internalformat,
+                                            size, imageSize,
+                                            reinterpret_cast<const uint8_t *>(data)));
 }
 
 void Context::compressedTexImage3D(GLenum target,
@@ -2646,13 +2574,9 @@
 
     Extents size(width, height, depth);
     Texture *texture = getTargetTexture(target);
-    Error error =
-        texture->setCompressedImage(mState.getUnpackState(), target, level, internalformat, size,
-                                    imageSize, reinterpret_cast<const uint8_t *>(data));
-    if (error.isError())
-    {
-        recordError(error);
-    }
+    handleError(texture->setCompressedImage(mState.getUnpackState(), target, level, internalformat,
+                                            size, imageSize,
+                                            reinterpret_cast<const uint8_t *>(data)));
 }
 
 void Context::compressedTexSubImage2D(GLenum target,
@@ -2670,13 +2594,8 @@
     Box area(xoffset, yoffset, 0, width, height, 1);
     Texture *texture =
         getTargetTexture(IsCubeMapTextureTarget(target) ? GL_TEXTURE_CUBE_MAP : target);
-    Error error =
-        texture->setCompressedSubImage(mState.getUnpackState(), target, level, area, format,
-                                       imageSize, reinterpret_cast<const uint8_t *>(data));
-    if (error.isError())
-    {
-        recordError(error);
-    }
+    handleError(texture->setCompressedSubImage(mState.getUnpackState(), target, level, area, format,
+                                               imageSize, reinterpret_cast<const uint8_t *>(data)));
 }
 
 void Context::compressedTexSubImage3D(GLenum target,
@@ -2701,13 +2620,8 @@
 
     Box area(xoffset, yoffset, zoffset, width, height, depth);
     Texture *texture = getTargetTexture(target);
-    Error error =
-        texture->setCompressedSubImage(mState.getUnpackState(), target, level, area, format,
-                                       imageSize, reinterpret_cast<const uint8_t *>(data));
-    if (error.isError())
-    {
-        recordError(error);
-    }
+    handleError(texture->setCompressedSubImage(mState.getUnpackState(), target, level, area, format,
+                                               imageSize, reinterpret_cast<const uint8_t *>(data)));
 }
 
 void Context::getBufferPointerv(GLenum target, GLenum /*pname*/, void **params)
@@ -2733,7 +2647,7 @@
     Error error = buffer->map(access);
     if (error.isError())
     {
-        recordError(error);
+        handleError(error);
         return nullptr;
     }
 
@@ -2749,7 +2663,7 @@
     Error error = buffer->unmap(&result);
     if (error.isError())
     {
-        recordError(error);
+        handleError(error);
         return GL_FALSE;
     }
 
@@ -2767,7 +2681,7 @@
     Error error = buffer->mapRange(offset, length, access);
     if (error.isError())
     {
-        recordError(error);
+        handleError(error);
         return nullptr;
     }