Enable always-available extensions in gl::Context.

We can consolidate exposing these extensions in initCaps. Otherwise
we have to maintain the lists in every Renderer back-end.

Also do the same treatment for select egl::Display extensions.

BUG=angleproject:1319

Change-Id: I529dd120c6d2cdbb789bd9dd20491e796e97f3f6
Reviewed-on: https://chromium-review.googlesource.com/345914
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 ab25be8..72ff2a5 100644
--- a/src/libANGLE/Context.cpp
+++ b/src/libANGLE/Context.cpp
@@ -149,7 +149,7 @@
 {
     ASSERT(!mRobustAccess);  // Unimplemented
 
-    initCaps(mClientVersion);
+    initCaps();
 
     mState.initialize(mCaps, mExtensions, mClientVersion, GetDebug(attribs));
 
@@ -2077,7 +2077,7 @@
     return false;
 }
 
-void Context::initCaps(GLuint clientVersion)
+void Context::initCaps()
 {
     mCaps = mImplementation->getNativeCaps();
 
@@ -2085,19 +2085,26 @@
 
     mLimitations = mImplementation->getNativeLimitations();
 
-    if (clientVersion < 3)
+    if (mClientVersion < 3)
     {
         // Disable ES3+ extensions
         mExtensions.colorBufferFloat = false;
         mExtensions.eglImageExternalEssl3 = false;
     }
 
-    if (clientVersion > 2)
+    if (mClientVersion > 2)
     {
         // FIXME(geofflang): Don't support EXT_sRGB in non-ES2 contexts
         //mExtensions.sRGB = false;
     }
 
+    // Some extensions are always available because they are implemented in the GL layer.
+    mExtensions.bindUniformLocation = true;
+    mExtensions.vertexArrayObject   = true;
+
+    // Enable the no error extension if the context was created with the flag.
+    mExtensions.noError = mSkipValidation;
+
     // Explicitly enable GL_KHR_debug
     mExtensions.debug                   = true;
     mExtensions.maxDebugMessageLength   = 1024;
@@ -2126,11 +2133,11 @@
         // Caps are AND'd with the renderer caps because some core formats are still unsupported in
         // ES3.
         formatCaps.texturable =
-            formatCaps.texturable && formatInfo.textureSupport(clientVersion, mExtensions);
+            formatCaps.texturable && formatInfo.textureSupport(mClientVersion, mExtensions);
         formatCaps.renderable =
-            formatCaps.renderable && formatInfo.renderSupport(clientVersion, mExtensions);
+            formatCaps.renderable && formatInfo.renderSupport(mClientVersion, mExtensions);
         formatCaps.filterable =
-            formatCaps.filterable && formatInfo.filterSupport(clientVersion, mExtensions);
+            formatCaps.filterable && formatInfo.filterSupport(mClientVersion, mExtensions);
 
         // OpenGL ES does not support multisampling with integer formats
         if (!formatInfo.renderSupport || formatInfo.componentType == GL_INT || formatInfo.componentType == GL_UNSIGNED_INT)
diff --git a/src/libANGLE/Context.h b/src/libANGLE/Context.h
index b876709..668e01e 100644
--- a/src/libANGLE/Context.h
+++ b/src/libANGLE/Context.h
@@ -435,7 +435,7 @@
     void initRendererString();
     void initExtensionStrings();
 
-    void initCaps(GLuint clientVersion);
+    void initCaps();
 
     std::unique_ptr<rx::ContextImpl> mImplementation;
 
diff --git a/src/libANGLE/Display.cpp b/src/libANGLE/Display.cpp
index 1f86d8f..d52f68a 100644
--- a/src/libANGLE/Display.cpp
+++ b/src/libANGLE/Display.cpp
@@ -892,6 +892,10 @@
 {
     mDisplayExtensions = mImplementation->getExtensions();
 
+    // Some extensions are always available because they are implemented in the EGL layer.
+    mDisplayExtensions.createContext        = true;
+    mDisplayExtensions.createContextNoError = true;
+
     // Force EGL_KHR_get_all_proc_addresses on.
     mDisplayExtensions.getAllProcAddresses = true;
 
diff --git a/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp b/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
index fbc3ccb..4ad6327 100644
--- a/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
@@ -1055,12 +1055,8 @@
     // D3D11 does not support present with dirty rectangles until DXGI 1.2.
     outExtensions->postSubBuffer = mRenderer11DeviceCaps.supportsDXGI1_2;
 
-    outExtensions->createContext = true;
-
     outExtensions->deviceQuery = true;
 
-    outExtensions->createContextNoError = true;
-
     outExtensions->image                 = true;
     outExtensions->imageBase             = true;
     outExtensions->glTexture2DImage      = true;
diff --git a/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp b/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp
index b6a8a02..84c5c77 100644
--- a/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/renderer11_utils.cpp
@@ -1240,10 +1240,7 @@
     extensions->eglStreamConsumerExternal = true;
     extensions->unpackSubimage           = true;
     extensions->packSubimage             = true;
-    extensions->vertexArrayObject        = true;
-    extensions->noError                  = true;
     extensions->lossyETCDecode           = true;
-    extensions->bindUniformLocation      = true;
     extensions->syncQuery                 = GetEventQuerySupport(featureLevel);
 
     // D3D11 Feature Level 10_0+ uses SV_IsFrontFace in HLSL to emulate gl_FrontFacing.
diff --git a/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp b/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp
index a8cfe5d..f2d0927 100644
--- a/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp
+++ b/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp
@@ -530,9 +530,7 @@
     outExtensions->querySurfacePointer = true;
     outExtensions->windowFixedSize     = true;
     outExtensions->postSubBuffer       = true;
-    outExtensions->createContext       = true;
     outExtensions->deviceQuery         = true;
-    outExtensions->createContextNoError = true;
 
     outExtensions->image               = true;
     outExtensions->imageBase           = true;
diff --git a/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.cpp b/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.cpp
index 2c06295..bc1abe7 100644
--- a/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.cpp
+++ b/src/libANGLE/renderer/d3d/d3d9/renderer9_utils.cpp
@@ -593,9 +593,6 @@
     extensions->eglImageExternal       = true;
     extensions->unpackSubimage         = true;
     extensions->packSubimage           = true;
-    extensions->vertexArrayObject      = true;
-    extensions->noError                = true;
-    extensions->bindUniformLocation    = true;
     extensions->syncQuery              = extensions->fence;
 
     // D3D9 has no concept of separate masks and refs for front and back faces in the depth stencil
diff --git a/src/libANGLE/renderer/gl/cgl/DisplayCGL.mm b/src/libANGLE/renderer/gl/cgl/DisplayCGL.mm
index 47dbede..c3ccdda 100644
--- a/src/libANGLE/renderer/gl/cgl/DisplayCGL.mm
+++ b/src/libANGLE/renderer/gl/cgl/DisplayCGL.mm
@@ -251,8 +251,6 @@
 
 void DisplayCGL::generateExtensions(egl::DisplayExtensions *outExtensions) const
 {
-    outExtensions->createContext = true;
-    outExtensions->createContextNoError = true;
 }
 
 void DisplayCGL::generateCaps(egl::Caps *outCaps) const
diff --git a/src/libANGLE/renderer/gl/egl/ozone/DisplayOzone.cpp b/src/libANGLE/renderer/gl/egl/ozone/DisplayOzone.cpp
index 207f5e8..a5beaaa 100644
--- a/src/libANGLE/renderer/gl/egl/ozone/DisplayOzone.cpp
+++ b/src/libANGLE/renderer/gl/egl/ozone/DisplayOzone.cpp
@@ -1000,8 +1000,6 @@
 
 void DisplayOzone::generateExtensions(egl::DisplayExtensions *outExtensions) const
 {
-    outExtensions->createContext        = true;
-    outExtensions->createContextNoError = true;
 }
 
 void DisplayOzone::generateCaps(egl::Caps *outCaps) const
diff --git a/src/libANGLE/renderer/gl/glx/DisplayGLX.cpp b/src/libANGLE/renderer/gl/glx/DisplayGLX.cpp
index 556071f..bc2e6b3 100644
--- a/src/libANGLE/renderer/gl/glx/DisplayGLX.cpp
+++ b/src/libANGLE/renderer/gl/glx/DisplayGLX.cpp
@@ -887,8 +887,6 @@
 
 void DisplayGLX::generateExtensions(egl::DisplayExtensions *outExtensions) const
 {
-    outExtensions->createContext = true;
-    outExtensions->createContextNoError = true;
 }
 
 void DisplayGLX::generateCaps(egl::Caps *outCaps) const
diff --git a/src/libANGLE/renderer/gl/renderergl_utils.cpp b/src/libANGLE/renderer/gl/renderergl_utils.cpp
index 20037ec..df4d3cf 100644
--- a/src/libANGLE/renderer/gl/renderergl_utils.cpp
+++ b/src/libANGLE/renderer/gl/renderergl_utils.cpp
@@ -665,13 +665,6 @@
 
     extensions->framebufferMixedSamples = functions->hasGLExtension("GL_NV_framebuffer_mixed_samples") ||
         functions->hasGLESExtension("GL_NV_framebuffer_mixed_samples");
-
-    // ANGLE emulates vertex array objects in its GL layer
-    extensions->vertexArrayObject = true;
-
-    extensions->noError = true;
-
-    extensions->bindUniformLocation = true;
 }
 
 void GenerateWorkarounds(const FunctionsGL *functions, WorkaroundsGL *workarounds)
diff --git a/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp b/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp
index 4c0fa46..57d2114 100644
--- a/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp
+++ b/src/libANGLE/renderer/gl/wgl/DisplayWGL.cpp
@@ -621,12 +621,8 @@
 
 void DisplayWGL::generateExtensions(egl::DisplayExtensions *outExtensions) const
 {
-    outExtensions->createContext = true;
-    outExtensions->createContextNoError = true;
-
     // Only enable the surface orientation  and post sub buffer for DXGI swap chain surfaces, they
-    // prefer to swap with
-    // inverted Y.
+    // prefer to swap with inverted Y.
     outExtensions->postSubBuffer      = mUseDXGISwapChains;
     outExtensions->surfaceOrientation = mUseDXGISwapChains;
 }