OpenGL: factor out Adapter (GL) into its own file.

Bug: dawn:810
Change-Id: I579e5c7cd610fc660b7480673a93cffdf725ef41
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/93200
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Austin Eng <enga@chromium.org>
Commit-Queue: Stephen White <senorblanco@chromium.org>
diff --git a/src/dawn/native/BUILD.gn b/src/dawn/native/BUILD.gn
index 5b9d5f5..4294b26 100644
--- a/src/dawn/native/BUILD.gn
+++ b/src/dawn/native/BUILD.gn
@@ -523,6 +523,8 @@
     ]
     sources += get_target_outputs(":opengl_loader_gen")
     sources += [
+      "opengl/AdapterGL.cpp",
+      "opengl/AdapterGL.h",
       "opengl/BackendGL.cpp",
       "opengl/BackendGL.h",
       "opengl/BindGroupGL.cpp",
diff --git a/src/dawn/native/CMakeLists.txt b/src/dawn/native/CMakeLists.txt
index 5c9c24a..bbb50a0 100644
--- a/src/dawn/native/CMakeLists.txt
+++ b/src/dawn/native/CMakeLists.txt
@@ -401,6 +401,8 @@
     target_sources(dawn_native PRIVATE
         "${DAWN_INCLUDE_DIR}/dawn/native/OpenGLBackend.h"
         ${DAWN_NATIVE_OPENGL_AUTOGEN_SOURCES}
+        "opengl/AdapterGL.cpp"
+        "opengl/AdapterGL.h"
         "opengl/BackendGL.cpp"
         "opengl/BackendGL.h"
         "opengl/BindGroupGL.cpp"
diff --git a/src/dawn/native/opengl/AdapterGL.cpp b/src/dawn/native/opengl/AdapterGL.cpp
new file mode 100644
index 0000000..b3be547
--- /dev/null
+++ b/src/dawn/native/opengl/AdapterGL.cpp
@@ -0,0 +1,260 @@
+// Copyright 2022 The Dawn Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "dawn/native/opengl/AdapterGL.h"
+
+#include <string>
+
+#include "dawn/common/GPUInfo.h"
+#include "dawn/common/Log.h"
+#include "dawn/native/Instance.h"
+#include "dawn/native/opengl/DeviceGL.h"
+
+namespace dawn::native::opengl {
+
+namespace {
+
+struct Vendor {
+    const char* vendorName;
+    uint32_t vendorId;
+};
+
+const Vendor kVendors[] = {{"ATI", gpu_info::kVendorID_AMD},
+                           {"ARM", gpu_info::kVendorID_ARM},
+                           {"Imagination", gpu_info::kVendorID_ImgTec},
+                           {"Intel", gpu_info::kVendorID_Intel},
+                           {"NVIDIA", gpu_info::kVendorID_Nvidia},
+                           {"Qualcomm", gpu_info::kVendorID_Qualcomm}};
+
+uint32_t GetVendorIdFromVendors(const char* vendor) {
+    uint32_t vendorId = 0;
+    for (const auto& it : kVendors) {
+        // Matching vendor name with vendor string
+        if (strstr(vendor, it.vendorName) != nullptr) {
+            vendorId = it.vendorId;
+            break;
+        }
+    }
+    return vendorId;
+}
+
+void KHRONOS_APIENTRY OnGLDebugMessage(GLenum source,
+                                       GLenum type,
+                                       GLuint id,
+                                       GLenum severity,
+                                       GLsizei length,
+                                       const GLchar* message,
+                                       const void* userParam) {
+    const char* sourceText;
+    switch (source) {
+        case GL_DEBUG_SOURCE_API:
+            sourceText = "OpenGL";
+            break;
+        case GL_DEBUG_SOURCE_WINDOW_SYSTEM:
+            sourceText = "Window System";
+            break;
+        case GL_DEBUG_SOURCE_SHADER_COMPILER:
+            sourceText = "Shader Compiler";
+            break;
+        case GL_DEBUG_SOURCE_THIRD_PARTY:
+            sourceText = "Third Party";
+            break;
+        case GL_DEBUG_SOURCE_APPLICATION:
+            sourceText = "Application";
+            break;
+        case GL_DEBUG_SOURCE_OTHER:
+            sourceText = "Other";
+            break;
+        default:
+            sourceText = "UNKNOWN";
+            break;
+    }
+
+    const char* severityText;
+    switch (severity) {
+        case GL_DEBUG_SEVERITY_HIGH:
+            severityText = "High";
+            break;
+        case GL_DEBUG_SEVERITY_MEDIUM:
+            severityText = "Medium";
+            break;
+        case GL_DEBUG_SEVERITY_LOW:
+            severityText = "Low";
+            break;
+        case GL_DEBUG_SEVERITY_NOTIFICATION:
+            severityText = "Notification";
+            break;
+        default:
+            severityText = "UNKNOWN";
+            break;
+    }
+
+    if (type == GL_DEBUG_TYPE_ERROR) {
+        dawn::WarningLog() << "OpenGL error:"
+                           << "\n    Source: " << sourceText      //
+                           << "\n    ID: " << id                  //
+                           << "\n    Severity: " << severityText  //
+                           << "\n    Message: " << message;
+
+        // Abort on an error when in Debug mode.
+        UNREACHABLE();
+    }
+}
+
+}  // anonymous namespace
+
+Adapter::Adapter(InstanceBase* instance, wgpu::BackendType backendType)
+    : AdapterBase(instance, backendType) {}
+
+MaybeError Adapter::InitializeGLFunctions(void* (*getProc)(const char*)) {
+    // Use getProc to populate the dispatch table
+    return mFunctions.Initialize(getProc);
+}
+
+bool Adapter::SupportsExternalImages() const {
+    // Via dawn::native::opengl::WrapExternalEGLImage
+    return GetBackendType() == wgpu::BackendType::OpenGLES;
+}
+
+MaybeError Adapter::InitializeImpl() {
+    if (mFunctions.GetVersion().IsES()) {
+        ASSERT(GetBackendType() == wgpu::BackendType::OpenGLES);
+    } else {
+        ASSERT(GetBackendType() == wgpu::BackendType::OpenGL);
+    }
+
+    // Use the debug output functionality to get notified about GL errors
+    // TODO(cwallez@chromium.org): add support for the KHR_debug and ARB_debug_output
+    // extensions
+    bool hasDebugOutput = mFunctions.IsAtLeastGL(4, 3) || mFunctions.IsAtLeastGLES(3, 2);
+
+    if (GetInstance()->IsBackendValidationEnabled() && hasDebugOutput) {
+        mFunctions.Enable(GL_DEBUG_OUTPUT);
+        mFunctions.Enable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
+
+        // Any GL error; dangerous undefined behavior; any shader compiler and linker errors
+        mFunctions.DebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_HIGH, 0,
+                                       nullptr, GL_TRUE);
+
+        // Severe performance warnings; GLSL or other shader compiler and linker warnings;
+        // use of currently deprecated behavior
+        mFunctions.DebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_MEDIUM, 0,
+                                       nullptr, GL_TRUE);
+
+        // Performance warnings from redundant state changes; trivial undefined behavior
+        // This is disabled because we do an incredible amount of redundant state changes.
+        mFunctions.DebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_LOW, 0,
+                                       nullptr, GL_FALSE);
+
+        // Any message which is not an error or performance concern
+        mFunctions.DebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_NOTIFICATION,
+                                       0, nullptr, GL_FALSE);
+        mFunctions.DebugMessageCallback(&OnGLDebugMessage, nullptr);
+    }
+
+    // Set state that never changes between devices.
+    mFunctions.Enable(GL_DEPTH_TEST);
+    mFunctions.Enable(GL_SCISSOR_TEST);
+    mFunctions.Enable(GL_PRIMITIVE_RESTART_FIXED_INDEX);
+    if (mFunctions.GetVersion().IsDesktop()) {
+        // These are not necessary on GLES. The functionality is enabled by default, and
+        // works by specifying sample counts and SRGB textures, respectively.
+        mFunctions.Enable(GL_MULTISAMPLE);
+        mFunctions.Enable(GL_FRAMEBUFFER_SRGB);
+    }
+    mFunctions.Enable(GL_SAMPLE_MASK);
+
+    mName = reinterpret_cast<const char*>(mFunctions.GetString(GL_RENDERER));
+
+    // Workaroud to find vendor id from vendor name
+    const char* vendor = reinterpret_cast<const char*>(mFunctions.GetString(GL_VENDOR));
+    mVendorId = GetVendorIdFromVendors(vendor);
+
+    mDriverDescription = std::string("OpenGL version ") +
+                         reinterpret_cast<const char*>(mFunctions.GetString(GL_VERSION));
+
+    if (mName.find("SwiftShader") != std::string::npos) {
+        mAdapterType = wgpu::AdapterType::CPU;
+    }
+
+    return {};
+}
+
+MaybeError Adapter::InitializeSupportedFeaturesImpl() {
+    // TextureCompressionBC
+    {
+        // BC1, BC2 and BC3 are not supported in OpenGL or OpenGL ES core features.
+        bool supportsS3TC =
+            mFunctions.IsGLExtensionSupported("GL_EXT_texture_compression_s3tc") ||
+            (mFunctions.IsGLExtensionSupported("GL_EXT_texture_compression_dxt1") &&
+             mFunctions.IsGLExtensionSupported("GL_ANGLE_texture_compression_dxt3") &&
+             mFunctions.IsGLExtensionSupported("GL_ANGLE_texture_compression_dxt5"));
+
+        // COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT and
+        // COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT requires both GL_EXT_texture_sRGB and
+        // GL_EXT_texture_compression_s3tc on desktop OpenGL drivers.
+        // (https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_sRGB.txt)
+        bool supportsTextureSRGB = mFunctions.IsGLExtensionSupported("GL_EXT_texture_sRGB");
+
+        // GL_EXT_texture_compression_s3tc_srgb is an extension in OpenGL ES.
+        // NVidia GLES drivers don't support this extension, but they do support
+        // GL_NV_sRGB_formats. (Note that GL_EXT_texture_sRGB does not exist on ES.
+        // GL_EXT_sRGB does (core in ES 3.0), but it does not automatically provide S3TC
+        // SRGB support even if S3TC is supported; see
+        // https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_sRGB.txt.)
+        bool supportsS3TCSRGB =
+            mFunctions.IsGLExtensionSupported("GL_EXT_texture_compression_s3tc_srgb") ||
+            mFunctions.IsGLExtensionSupported("GL_NV_sRGB_formats");
+
+        // BC4 and BC5
+        bool supportsRGTC = mFunctions.IsAtLeastGL(3, 0) ||
+                            mFunctions.IsGLExtensionSupported("GL_ARB_texture_compression_rgtc") ||
+                            mFunctions.IsGLExtensionSupported("GL_EXT_texture_compression_rgtc");
+
+        // BC6 and BC7
+        bool supportsBPTC = mFunctions.IsAtLeastGL(4, 2) ||
+                            mFunctions.IsGLExtensionSupported("GL_ARB_texture_compression_bptc") ||
+                            mFunctions.IsGLExtensionSupported("GL_EXT_texture_compression_bptc");
+
+        if (supportsS3TC && (supportsTextureSRGB || supportsS3TCSRGB) && supportsRGTC &&
+            supportsBPTC) {
+            mSupportedFeatures.EnableFeature(dawn::native::Feature::TextureCompressionBC);
+        }
+        mSupportedFeatures.EnableFeature(Feature::Depth24UnormStencil8);
+    }
+
+    // Non-zero baseInstance requires at least desktop OpenGL 4.2, and it is not supported in
+    // OpenGL ES OpenGL:
+    // https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawElementsIndirect.xhtml
+    // OpenGL ES:
+    // https://www.khronos.org/registry/OpenGL-Refpages/es3/html/glDrawElementsIndirect.xhtml
+    if (mFunctions.IsAtLeastGL(4, 2)) {
+        mSupportedFeatures.EnableFeature(Feature::IndirectFirstInstance);
+    }
+
+    return {};
+}
+
+MaybeError Adapter::InitializeSupportedLimitsImpl(CombinedLimits* limits) {
+    GetDefaultLimits(&limits->v1);
+    return {};
+}
+
+ResultOrError<Ref<DeviceBase>> Adapter::CreateDeviceImpl(const DeviceDescriptor* descriptor) {
+    // There is no limit on the number of devices created from this adapter because they can
+    // all share the same backing OpenGL context.
+    return Device::Create(this, descriptor, mFunctions);
+}
+
+}  // namespace dawn::native::opengl
diff --git a/src/dawn/native/opengl/AdapterGL.h b/src/dawn/native/opengl/AdapterGL.h
new file mode 100644
index 0000000..4101887
--- /dev/null
+++ b/src/dawn/native/opengl/AdapterGL.h
@@ -0,0 +1,45 @@
+// Copyright 2022 The Dawn Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef SRC_DAWN_NATIVE_OPENGL_ADAPTERGL_H_
+#define SRC_DAWN_NATIVE_OPENGL_ADAPTERGL_H_
+
+#include "dawn/native/Adapter.h"
+#include "dawn/native/opengl/OpenGLFunctions.h"
+
+namespace dawn::native::opengl {
+
+class Adapter : public AdapterBase {
+  public:
+    Adapter(InstanceBase* instance, wgpu::BackendType backendType);
+
+    MaybeError InitializeGLFunctions(void* (*getProc)(const char*));
+
+    ~Adapter() override = default;
+
+    // AdapterBase Implementation
+    bool SupportsExternalImages() const override;
+
+  private:
+    MaybeError InitializeImpl() override;
+    MaybeError InitializeSupportedFeaturesImpl() override;
+    MaybeError InitializeSupportedLimitsImpl(CombinedLimits* limits) override;
+    ResultOrError<Ref<DeviceBase>> CreateDeviceImpl(const DeviceDescriptor* descriptor) override;
+
+    OpenGLFunctions mFunctions;
+};
+
+}  // namespace dawn::native::opengl
+
+#endif  // SRC_DAWN_NATIVE_OPENGL_ADAPTERGL_H_
diff --git a/src/dawn/native/opengl/BackendGL.cpp b/src/dawn/native/opengl/BackendGL.cpp
index 8143eda..c4b8776 100644
--- a/src/dawn/native/opengl/BackendGL.cpp
+++ b/src/dawn/native/opengl/BackendGL.cpp
@@ -14,265 +14,13 @@
 
 #include "dawn/native/opengl/BackendGL.h"
 
-#include <cstring>
-#include <string>
 #include <utility>
 
-#include "dawn/common/GPUInfo.h"
-#include "dawn/common/Log.h"
-#include "dawn/native/Instance.h"
 #include "dawn/native/OpenGLBackend.h"
-#include "dawn/native/opengl/DeviceGL.h"
+#include "dawn/native/opengl/AdapterGL.h"
 
 namespace dawn::native::opengl {
 
-namespace {
-
-struct Vendor {
-    const char* vendorName;
-    uint32_t vendorId;
-};
-
-const Vendor kVendors[] = {{"ATI", gpu_info::kVendorID_AMD},
-                           {"ARM", gpu_info::kVendorID_ARM},
-                           {"Imagination", gpu_info::kVendorID_ImgTec},
-                           {"Intel", gpu_info::kVendorID_Intel},
-                           {"NVIDIA", gpu_info::kVendorID_Nvidia},
-                           {"Qualcomm", gpu_info::kVendorID_Qualcomm}};
-
-uint32_t GetVendorIdFromVendors(const char* vendor) {
-    uint32_t vendorId = 0;
-    for (const auto& it : kVendors) {
-        // Matching vendor name with vendor string
-        if (strstr(vendor, it.vendorName) != nullptr) {
-            vendorId = it.vendorId;
-            break;
-        }
-    }
-    return vendorId;
-}
-
-void KHRONOS_APIENTRY OnGLDebugMessage(GLenum source,
-                                       GLenum type,
-                                       GLuint id,
-                                       GLenum severity,
-                                       GLsizei length,
-                                       const GLchar* message,
-                                       const void* userParam) {
-    const char* sourceText;
-    switch (source) {
-        case GL_DEBUG_SOURCE_API:
-            sourceText = "OpenGL";
-            break;
-        case GL_DEBUG_SOURCE_WINDOW_SYSTEM:
-            sourceText = "Window System";
-            break;
-        case GL_DEBUG_SOURCE_SHADER_COMPILER:
-            sourceText = "Shader Compiler";
-            break;
-        case GL_DEBUG_SOURCE_THIRD_PARTY:
-            sourceText = "Third Party";
-            break;
-        case GL_DEBUG_SOURCE_APPLICATION:
-            sourceText = "Application";
-            break;
-        case GL_DEBUG_SOURCE_OTHER:
-            sourceText = "Other";
-            break;
-        default:
-            sourceText = "UNKNOWN";
-            break;
-    }
-
-    const char* severityText;
-    switch (severity) {
-        case GL_DEBUG_SEVERITY_HIGH:
-            severityText = "High";
-            break;
-        case GL_DEBUG_SEVERITY_MEDIUM:
-            severityText = "Medium";
-            break;
-        case GL_DEBUG_SEVERITY_LOW:
-            severityText = "Low";
-            break;
-        case GL_DEBUG_SEVERITY_NOTIFICATION:
-            severityText = "Notification";
-            break;
-        default:
-            severityText = "UNKNOWN";
-            break;
-    }
-
-    if (type == GL_DEBUG_TYPE_ERROR) {
-        dawn::WarningLog() << "OpenGL error:"
-                           << "\n    Source: " << sourceText      //
-                           << "\n    ID: " << id                  //
-                           << "\n    Severity: " << severityText  //
-                           << "\n    Message: " << message;
-
-        // Abort on an error when in Debug mode.
-        UNREACHABLE();
-    }
-}
-
-}  // anonymous namespace
-
-// The OpenGL backend's Adapter.
-
-class Adapter : public AdapterBase {
-  public:
-    Adapter(InstanceBase* instance, wgpu::BackendType backendType)
-        : AdapterBase(instance, backendType) {}
-
-    MaybeError InitializeGLFunctions(void* (*getProc)(const char*)) {
-        // Use getProc to populate the dispatch table
-        return mFunctions.Initialize(getProc);
-    }
-
-    ~Adapter() override = default;
-
-    // AdapterBase Implementation
-    bool SupportsExternalImages() const override {
-        // Via dawn::native::opengl::WrapExternalEGLImage
-        return GetBackendType() == wgpu::BackendType::OpenGLES;
-    }
-
-  private:
-    MaybeError InitializeImpl() override {
-        if (mFunctions.GetVersion().IsES()) {
-            ASSERT(GetBackendType() == wgpu::BackendType::OpenGLES);
-        } else {
-            ASSERT(GetBackendType() == wgpu::BackendType::OpenGL);
-        }
-
-        // Use the debug output functionality to get notified about GL errors
-        // TODO(cwallez@chromium.org): add support for the KHR_debug and ARB_debug_output
-        // extensions
-        bool hasDebugOutput = mFunctions.IsAtLeastGL(4, 3) || mFunctions.IsAtLeastGLES(3, 2);
-
-        if (GetInstance()->IsBackendValidationEnabled() && hasDebugOutput) {
-            mFunctions.Enable(GL_DEBUG_OUTPUT);
-            mFunctions.Enable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
-
-            // Any GL error; dangerous undefined behavior; any shader compiler and linker errors
-            mFunctions.DebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_HIGH, 0,
-                                           nullptr, GL_TRUE);
-
-            // Severe performance warnings; GLSL or other shader compiler and linker warnings;
-            // use of currently deprecated behavior
-            mFunctions.DebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_MEDIUM, 0,
-                                           nullptr, GL_TRUE);
-
-            // Performance warnings from redundant state changes; trivial undefined behavior
-            // This is disabled because we do an incredible amount of redundant state changes.
-            mFunctions.DebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_LOW, 0,
-                                           nullptr, GL_FALSE);
-
-            // Any message which is not an error or performance concern
-            mFunctions.DebugMessageControl(GL_DONT_CARE, GL_DONT_CARE,
-                                           GL_DEBUG_SEVERITY_NOTIFICATION, 0, nullptr, GL_FALSE);
-            mFunctions.DebugMessageCallback(&OnGLDebugMessage, nullptr);
-        }
-
-        // Set state that never changes between devices.
-        mFunctions.Enable(GL_DEPTH_TEST);
-        mFunctions.Enable(GL_SCISSOR_TEST);
-        mFunctions.Enable(GL_PRIMITIVE_RESTART_FIXED_INDEX);
-        if (mFunctions.GetVersion().IsDesktop()) {
-            // These are not necessary on GLES. The functionality is enabled by default, and
-            // works by specifying sample counts and SRGB textures, respectively.
-            mFunctions.Enable(GL_MULTISAMPLE);
-            mFunctions.Enable(GL_FRAMEBUFFER_SRGB);
-        }
-        mFunctions.Enable(GL_SAMPLE_MASK);
-
-        mName = reinterpret_cast<const char*>(mFunctions.GetString(GL_RENDERER));
-
-        // Workaroud to find vendor id from vendor name
-        const char* vendor = reinterpret_cast<const char*>(mFunctions.GetString(GL_VENDOR));
-        mVendorId = GetVendorIdFromVendors(vendor);
-
-        mDriverDescription = std::string("OpenGL version ") +
-                             reinterpret_cast<const char*>(mFunctions.GetString(GL_VERSION));
-
-        if (mName.find("SwiftShader") != std::string::npos) {
-            mAdapterType = wgpu::AdapterType::CPU;
-        }
-
-        return {};
-    }
-
-    MaybeError InitializeSupportedFeaturesImpl() override {
-        // TextureCompressionBC
-        {
-            // BC1, BC2 and BC3 are not supported in OpenGL or OpenGL ES core features.
-            bool supportsS3TC =
-                mFunctions.IsGLExtensionSupported("GL_EXT_texture_compression_s3tc") ||
-                (mFunctions.IsGLExtensionSupported("GL_EXT_texture_compression_dxt1") &&
-                 mFunctions.IsGLExtensionSupported("GL_ANGLE_texture_compression_dxt3") &&
-                 mFunctions.IsGLExtensionSupported("GL_ANGLE_texture_compression_dxt5"));
-
-            // COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT and
-            // COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT requires both GL_EXT_texture_sRGB and
-            // GL_EXT_texture_compression_s3tc on desktop OpenGL drivers.
-            // (https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_texture_sRGB.txt)
-            bool supportsTextureSRGB = mFunctions.IsGLExtensionSupported("GL_EXT_texture_sRGB");
-
-            // GL_EXT_texture_compression_s3tc_srgb is an extension in OpenGL ES.
-            // NVidia GLES drivers don't support this extension, but they do support
-            // GL_NV_sRGB_formats. (Note that GL_EXT_texture_sRGB does not exist on ES.
-            // GL_EXT_sRGB does (core in ES 3.0), but it does not automatically provide S3TC
-            // SRGB support even if S3TC is supported; see
-            // https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_sRGB.txt.)
-            bool supportsS3TCSRGB =
-                mFunctions.IsGLExtensionSupported("GL_EXT_texture_compression_s3tc_srgb") ||
-                mFunctions.IsGLExtensionSupported("GL_NV_sRGB_formats");
-
-            // BC4 and BC5
-            bool supportsRGTC =
-                mFunctions.IsAtLeastGL(3, 0) ||
-                mFunctions.IsGLExtensionSupported("GL_ARB_texture_compression_rgtc") ||
-                mFunctions.IsGLExtensionSupported("GL_EXT_texture_compression_rgtc");
-
-            // BC6 and BC7
-            bool supportsBPTC =
-                mFunctions.IsAtLeastGL(4, 2) ||
-                mFunctions.IsGLExtensionSupported("GL_ARB_texture_compression_bptc") ||
-                mFunctions.IsGLExtensionSupported("GL_EXT_texture_compression_bptc");
-
-            if (supportsS3TC && (supportsTextureSRGB || supportsS3TCSRGB) && supportsRGTC &&
-                supportsBPTC) {
-                mSupportedFeatures.EnableFeature(dawn::native::Feature::TextureCompressionBC);
-            }
-            mSupportedFeatures.EnableFeature(Feature::Depth24UnormStencil8);
-        }
-
-        // Non-zero baseInstance requires at least desktop OpenGL 4.2, and it is not supported in
-        // OpenGL ES OpenGL:
-        // https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawElementsIndirect.xhtml
-        // OpenGL ES:
-        // https://www.khronos.org/registry/OpenGL-Refpages/es3/html/glDrawElementsIndirect.xhtml
-        if (mFunctions.IsAtLeastGL(4, 2)) {
-            mSupportedFeatures.EnableFeature(Feature::IndirectFirstInstance);
-        }
-
-        return {};
-    }
-
-    MaybeError InitializeSupportedLimitsImpl(CombinedLimits* limits) override {
-        GetDefaultLimits(&limits->v1);
-        return {};
-    }
-
-    ResultOrError<Ref<DeviceBase>> CreateDeviceImpl(const DeviceDescriptor* descriptor) override {
-        // There is no limit on the number of devices created from this adapter because they can
-        // all share the same backing OpenGL context.
-        return Device::Create(this, descriptor, mFunctions);
-    }
-
-    OpenGLFunctions mFunctions;
-};
-
 // Implementation of the OpenGL backend's BackendConnection
 
 Backend::Backend(InstanceBase* instance, wgpu::BackendType backendType)