Replace rx::Renderer with rx::ContextImpl.

Previously Context had no Impl class, but had a special relationship
with the instanced Renderer class. Having a ContextImpl backing every
Context will allow new designs to enable things like multithreading
(where each ContextImpl stores a Context-specific device) or non-
virtual Contexts on Android or other platforms where it is more
efficient.

A large refactoring patch that touches every back-end.

BUG=angleproject:1363

Change-Id: Icb73a7d37447f08a664eeb499a310ba05d71a57e
Reviewed-on: https://chromium-review.googlesource.com/342052
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp
index 4330803..16ce699 100644
--- a/src/libANGLE/Context.cpp
+++ b/src/libANGLE/Context.cpp
@@ -32,7 +32,7 @@
 #include "libANGLE/formatutils.h"
 #include "libANGLE/validationES.h"
 #include "libANGLE/renderer/ContextImpl.h"
-#include "libANGLE/renderer/Renderer.h"
+#include "libANGLE/renderer/EGLImplFactory.h"
 
 namespace
 {
@@ -122,9 +122,9 @@
 namespace gl
 {
 
-Context::Context(const egl::Config *config,
+Context::Context(rx::EGLImplFactory *implFactory,
+                 const egl::Config *config,
                  const Context *shareContext,
-                 rx::Renderer *renderer,
                  const egl::AttributeMap &attribs)
     : ValidationContext(GetClientVersion(attribs),
                         mState,
@@ -134,9 +134,8 @@
                         nullptr,
                         mLimitations,
                         GetNoError(attribs)),
-      mImplementation(renderer->createContext(getData())),
+      mImplementation(implFactory->createContext(getData())),
       mCompiler(nullptr),
-      mRenderer(renderer),
       mClientVersion(GetClientVersion(attribs)),
       mConfig(config),
       mClientType(EGL_OPENGL_ES_API),
@@ -156,14 +155,14 @@
 
     mFenceNVHandleAllocator.setBaseHandle(0);
 
-    if (shareContext != NULL)
+    if (shareContext != nullptr)
     {
         mResourceManager = shareContext->mResourceManager;
         mResourceManager->addRef();
     }
     else
     {
-        mResourceManager = new ResourceManager(mRenderer);
+        mResourceManager = new ResourceManager(mImplementation.get());
     }
 
     mData.resourceManager = mResourceManager;
@@ -174,25 +173,26 @@
     // In order that access to these initial textures not be lost, they are treated as texture
     // objects all of whose names are 0.
 
-    Texture *zeroTexture2D = new Texture(mRenderer, 0, GL_TEXTURE_2D);
+    Texture *zeroTexture2D = new Texture(mImplementation.get(), 0, GL_TEXTURE_2D);
     mZeroTextures[GL_TEXTURE_2D].set(zeroTexture2D);
 
-    Texture *zeroTextureCube = new Texture(mRenderer, 0, GL_TEXTURE_CUBE_MAP);
+    Texture *zeroTextureCube = new Texture(mImplementation.get(), 0, GL_TEXTURE_CUBE_MAP);
     mZeroTextures[GL_TEXTURE_CUBE_MAP].set(zeroTextureCube);
 
     if (mClientVersion >= 3)
     {
         // TODO: These could also be enabled via extension
-        Texture *zeroTexture3D = new Texture(mRenderer, 0, GL_TEXTURE_3D);
+        Texture *zeroTexture3D = new Texture(mImplementation.get(), 0, GL_TEXTURE_3D);
         mZeroTextures[GL_TEXTURE_3D].set(zeroTexture3D);
 
-        Texture *zeroTexture2DArray = new Texture(mRenderer, 0, GL_TEXTURE_2D_ARRAY);
+        Texture *zeroTexture2DArray = new Texture(mImplementation.get(), 0, GL_TEXTURE_2D_ARRAY);
         mZeroTextures[GL_TEXTURE_2D_ARRAY].set(zeroTexture2DArray);
     }
 
     if (mExtensions.eglImageExternal || mExtensions.eglStreamConsumerExternal)
     {
-        Texture *zeroTextureExternal = new Texture(mRenderer, 0, GL_TEXTURE_EXTERNAL_OES);
+        Texture *zeroTextureExternal =
+            new Texture(mImplementation.get(), 0, GL_TEXTURE_EXTERNAL_OES);
         mZeroTextures[GL_TEXTURE_EXTERNAL_OES].set(zeroTextureExternal);
     }
 
@@ -224,7 +224,7 @@
         bindTransformFeedback(0);
     }
 
-    mCompiler = new Compiler(mRenderer, getData());
+    mCompiler = new Compiler(mImplementation.get(), getData());
 
     // Initialize dirty bit masks
     // TODO(jmadill): additional ES3 state
@@ -264,7 +264,7 @@
     mBlitDirtyObjects.set(State::DIRTY_OBJECT_READ_FRAMEBUFFER);
     mBlitDirtyObjects.set(State::DIRTY_OBJECT_DRAW_FRAMEBUFFER);
 
-    handleError(mImplementation->initialize(renderer));
+    handleError(mImplementation->initialize());
 }
 
 Context::~Context()
@@ -366,7 +366,7 @@
     }
 
     // Notify the renderer of a context switch
-    mRenderer->onMakeCurrent(getData());
+    mImplementation->onMakeCurrent(getData());
 }
 
 void Context::releaseSurface()
@@ -416,7 +416,7 @@
 
 GLuint Context::createShader(GLenum type)
 {
-    return mResourceManager->createShader(mRenderer->getRendererLimitations(), type);
+    return mResourceManager->createShader(mImplementation->getNativeLimitations(), type);
 }
 
 GLuint Context::createTexture()
@@ -469,7 +469,7 @@
 {
     GLuint handle = mFenceNVHandleAllocator.allocate();
 
-    mFenceNVMap[handle] = new FenceNV(mRenderer->createFenceNV());
+    mFenceNVMap[handle] = new FenceNV(mImplementation->createFenceNV());
 
     return handle;
 }
@@ -951,7 +951,7 @@
     {
         if (!query->second && create)
         {
-            query->second = new Query(mRenderer->createQuery(type), handle);
+            query->second = new Query(mImplementation->createQuery(type), handle);
             query->second->addRef();
         }
         return query->second;
@@ -1109,7 +1109,7 @@
 
       // GL_EXT_disjoint_timer_query
       case GL_GPU_DISJOINT_EXT:
-          *params = mRenderer->getGPUDisjoint();
+          *params = mImplementation->getGPUDisjoint();
           break;
 
       default:
@@ -1142,7 +1142,7 @@
 
       // GL_EXT_disjoint_timer_query
       case GL_TIMESTAMP_EXT:
-          *params = mRenderer->getTimestamp();
+          *params = mImplementation->getTimestamp();
           break;
       default:
         UNREACHABLE();
@@ -1570,29 +1570,19 @@
 Error Context::drawArrays(GLenum mode, GLint first, GLsizei count)
 {
     syncRendererState();
-    Error error = mRenderer->drawArrays(getData(), mode, first, count);
-    if (error.isError())
-    {
-        return error;
-    }
-
+    ANGLE_TRY(mImplementation->drawArrays(mode, first, count));
     MarkTransformFeedbackBufferUsage(mState.getCurrentTransformFeedback());
 
-    return Error(GL_NO_ERROR);
+    return NoError();
 }
 
 Error Context::drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
 {
     syncRendererState();
-    Error error = mRenderer->drawArraysInstanced(getData(), mode, first, count, instanceCount);
-    if (error.isError())
-    {
-        return error;
-    }
-
+    ANGLE_TRY(mImplementation->drawArraysInstanced(mode, first, count, instanceCount));
     MarkTransformFeedbackBufferUsage(mState.getCurrentTransformFeedback());
 
-    return Error(GL_NO_ERROR);
+    return NoError();
 }
 
 Error Context::drawElements(GLenum mode,
@@ -1602,7 +1592,7 @@
                             const IndexRange &indexRange)
 {
     syncRendererState();
-    return mRenderer->drawElements(getData(), mode, count, type, indices, indexRange);
+    return mImplementation->drawElements(mode, count, type, indices, indexRange);
 }
 
 Error Context::drawElementsInstanced(GLenum mode,
@@ -1613,8 +1603,8 @@
                                      const IndexRange &indexRange)
 {
     syncRendererState();
-    return mRenderer->drawElementsInstanced(getData(), mode, count, type, indices, instances,
-                                            indexRange);
+    return mImplementation->drawElementsInstanced(mode, count, type, indices, instances,
+                                                  indexRange);
 }
 
 Error Context::drawRangeElements(GLenum mode,
@@ -1626,36 +1616,35 @@
                                  const IndexRange &indexRange)
 {
     syncRendererState();
-    return mRenderer->drawRangeElements(getData(), mode, start, end, count, type, indices,
-                                        indexRange);
+    return mImplementation->drawRangeElements(mode, start, end, count, type, indices, indexRange);
 }
 
 Error Context::flush()
 {
-    return mRenderer->flush();
+    return mImplementation->flush();
 }
 
 Error Context::finish()
 {
-    return mRenderer->finish();
+    return mImplementation->finish();
 }
 
 void Context::insertEventMarker(GLsizei length, const char *marker)
 {
-    ASSERT(mRenderer);
-    mRenderer->insertEventMarker(length, marker);
+    ASSERT(mImplementation);
+    mImplementation->insertEventMarker(length, marker);
 }
 
 void Context::pushGroupMarker(GLsizei length, const char *marker)
 {
-    ASSERT(mRenderer);
-    mRenderer->pushGroupMarker(length, marker);
+    ASSERT(mImplementation);
+    mImplementation->pushGroupMarker(length, marker);
 }
 
 void Context::popGroupMarker()
 {
-    ASSERT(mRenderer);
-    mRenderer->popGroupMarker();
+    ASSERT(mImplementation);
+    mImplementation->popGroupMarker();
 }
 
 void Context::bindUniformLocation(GLuint program, GLint location, const GLchar *name)
@@ -1704,9 +1693,9 @@
     {
         // mResetStatus will be set by the markContextLost callback
         // in the case a notification is sent
-        if (mRenderer->testDeviceLost())
+        if (mImplementation->testDeviceLost())
         {
-            mRenderer->notifyDeviceLost();
+            mImplementation->notifyDeviceLost();
         }
     }
 
@@ -1716,7 +1705,7 @@
     {
         ASSERT(mContextLost);
 
-        if (mRenderer->testDeviceResettable())
+        if (mImplementation->testDeviceResettable())
         {
             mResetStatus = GL_NO_ERROR;
         }
@@ -1763,7 +1752,8 @@
     VertexArray *vertexArray = getVertexArray(vertexArrayHandle);
     if (!vertexArray)
     {
-        vertexArray                        = new VertexArray(mRenderer, vertexArrayHandle, MAX_VERTEX_ATTRIBS);
+        vertexArray = new VertexArray(mImplementation.get(), vertexArrayHandle, MAX_VERTEX_ATTRIBS);
+
         mVertexArrayMap[vertexArrayHandle] = vertexArray;
     }
 
@@ -1776,7 +1766,8 @@
     TransformFeedback *transformFeedback = getTransformFeedback(transformFeedbackHandle);
     if (!transformFeedback)
     {
-        transformFeedback = new TransformFeedback(mRenderer, transformFeedbackHandle, mCaps);
+        transformFeedback =
+            new TransformFeedback(mImplementation.get(), transformFeedbackHandle, mCaps);
         transformFeedback->addRef();
         mTransformFeedbackMap[transformFeedbackHandle] = transformFeedback;
     }
@@ -1791,7 +1782,7 @@
     bool neverCreated = framebufferIt == mFramebufferMap.end();
     if (neverCreated || framebufferIt->second == nullptr)
     {
-        Framebuffer *newFBO = new Framebuffer(mCaps, mRenderer, framebuffer);
+        Framebuffer *newFBO = new Framebuffer(mCaps, mImplementation.get(), framebuffer);
         if (neverCreated)
         {
             mFramebufferHandleAllocator.reserve(framebuffer);
@@ -2016,7 +2007,7 @@
 {
     std::ostringstream rendererString;
     rendererString << "ANGLE (";
-    rendererString << mRenderer->getRendererDescription();
+    rendererString << mImplementation->getRendererDescription();
     rendererString << ")";
 
     mRendererString = MakeStaticString(rendererString.str());
@@ -2074,11 +2065,11 @@
 
 void Context::initCaps(GLuint clientVersion)
 {
-    mCaps = mRenderer->getRendererCaps();
+    mCaps = mImplementation->getNativeCaps();
 
-    mExtensions = mRenderer->getRendererExtensions();
+    mExtensions = mImplementation->getNativeExtensions();
 
-    mLimitations = mRenderer->getRendererLimitations();
+    mLimitations = mImplementation->getNativeLimitations();
 
     if (clientVersion < 3)
     {
@@ -2108,7 +2099,7 @@
 
     mCaps.compressedTextureFormats.clear();
 
-    const TextureCapsMap &rendererFormats = mRenderer->getRendererTextureCaps();
+    const TextureCapsMap &rendererFormats = mImplementation->getNativeTextureCaps();
     for (TextureCapsMap::const_iterator i = rendererFormats.begin(); i != rendererFormats.end(); i++)
     {
         GLenum format = i->first;
@@ -2144,7 +2135,7 @@
 void Context::syncRendererState()
 {
     const State::DirtyBits &dirtyBits = mState.getDirtyBits();
-    mRenderer->syncState(mState, dirtyBits);
+    mImplementation->syncState(mState, dirtyBits);
     mState.clearDirtyBits();
     mState.syncDirtyObjects();
 }
@@ -2153,7 +2144,7 @@
                                 const State::DirtyObjects &objectMask)
 {
     const State::DirtyBits &dirtyBits = (mState.getDirtyBits() & bitMask);
-    mRenderer->syncState(mState, dirtyBits);
+    mImplementation->syncState(mState, dirtyBits);
     mState.clearDirtyBits(dirtyBits);
 
     mState.syncDirtyObjects(objectMask);