Initialize gl::Context state on the first call to MakeCurrent.

The constructor of gl::Context creates a bunch of zero and helper objects
but it is not current at this time.  If the backend if not using virtualized
contexts this causes the created objects to be created on the wrong native
context.

BUG=angleproject:2464

Change-Id: I9718df87d0afeb08729920363d362d5f891061ed
Reviewed-on: https://chromium-review.googlesource.com/1048114
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Luc Ferron <lucferron@chromium.org>
Commit-Queue: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp
index 5bc64e2..e5e9112 100644
--- a/src/libANGLE/Context.cpp
+++ b/src/libANGLE/Context.cpp
@@ -294,6 +294,8 @@
       mContextLostForced(false),
       mResetStrategy(GetResetStrategy(attribs)),
       mRobustAccess(GetRobustAccess(attribs)),
+      mSurfacelessSupported(displayExtensions.surfacelessContext),
+      mExplicitContextAvailable(clientExtensions.explicitContext),
       mCurrentSurface(static_cast<egl::Surface *>(EGL_NO_SURFACE)),
       mCurrentDisplay(static_cast<egl::Display *>(EGL_NO_DISPLAY)),
       mWebGLContext(GetWebGLContext(attribs)),
@@ -305,11 +307,13 @@
     // Needed to solve a Clang warning of unused variables.
     ANGLE_UNUSED_VARIABLE(mSavedArgsType);
     ANGLE_UNUSED_VARIABLE(mParamsBuffer);
+}
 
-    mImplementation->setMemoryProgramCache(memoryProgramCache);
+void Context::initialize()
+{
+    mImplementation->setMemoryProgramCache(mMemoryProgramCache);
 
-    bool robustResourceInit = GetRobustResourceInit(attribs);
-    initCaps(displayExtensions, clientExtensions, robustResourceInit);
+    initCaps();
     initWorkarounds();
 
     mGLState.initialize(this);
@@ -520,6 +524,7 @@
 
     if (!mHasBeenCurrent)
     {
+        initialize();
         initRendererString();
         initVersionStrings();
         initExtensionStrings();
@@ -3019,9 +3024,7 @@
     return false;
 }
 
-Extensions Context::generateSupportedExtensions(const egl::DisplayExtensions &displayExtensions,
-                                                const egl::ClientExtensions &clientExtensions,
-                                                bool robustResourceInit) const
+Extensions Context::generateSupportedExtensions() const
 {
     Extensions supportedExtensions = mImplementation->getNativeExtensions();
 
@@ -3065,7 +3068,7 @@
     supportedExtensions.noError = mSkipValidation;
 
     // Enable surfaceless to advertise we'll have the correct behavior when there is no default FBO
-    supportedExtensions.surfacelessContext = displayExtensions.surfacelessContext;
+    supportedExtensions.surfacelessContext = mSurfacelessSupported;
 
     // Explicitly enable GL_KHR_debug
     supportedExtensions.debug                   = true;
@@ -3078,7 +3081,7 @@
     supportedExtensions.robustClientMemory = true;
 
     // Determine robust resource init availability from EGL.
-    supportedExtensions.robustResourceInitialization = robustResourceInit;
+    supportedExtensions.robustResourceInitialization = mGLState.isRobustResourceInitEnabled();
 
     // mExtensions.robustBufferAccessBehavior is true only if robust access is true and the backend
     // supports it.
@@ -3089,7 +3092,7 @@
     supportedExtensions.programCacheControl = true;
 
     // Enable EGL_ANGLE_explicit_context subextensions
-    if (clientExtensions.explicitContext)
+    if (mExplicitContextAvailable)
     {
         // GL_ANGLE_explicit_context_gles1
         supportedExtensions.explicitContextGles1 = true;
@@ -3100,15 +3103,12 @@
     return supportedExtensions;
 }
 
-void Context::initCaps(const egl::DisplayExtensions &displayExtensions,
-                       const egl::ClientExtensions &clientExtensions,
-                       bool robustResourceInit)
+void Context::initCaps()
 {
     mCaps = mImplementation->getNativeCaps();
 
-    mSupportedExtensions =
-        generateSupportedExtensions(displayExtensions, clientExtensions, robustResourceInit);
-    mExtensions = mSupportedExtensions;
+    mSupportedExtensions = generateSupportedExtensions();
+    mExtensions          = mSupportedExtensions;
 
     mLimitations = mImplementation->getNativeLimitations();