OpenGL: add support for GL_ANGLE_base_vertex_base_instance.

Change-Id: Ib327cb2e66bd5f02cce9c5321207483e16b40a40
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/121500
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Stephen White <senorblanco@chromium.org>
diff --git a/generator/opengl_loader_generator.py b/generator/opengl_loader_generator.py
index db253e2..ba2d47c 100644
--- a/generator/opengl_loader_generator.py
+++ b/generator/opengl_loader_generator.py
@@ -240,6 +240,10 @@
                             required=True,
                             type=str,
                             help='The Khronos gl.xml to use.')
+        parser.add_argument('--gl-angle-ext-xml',
+                            required=True,
+                            type=str,
+                            help='The ANGLE gl_angle_ext.xml to use.')
         parser.add_argument(
             '--supported-extensions',
             required=True,
@@ -250,14 +254,24 @@
 
     def get_file_renders(self, args):
         supported_extensions = []
+        supported_angle_extensions = []
         with open(args.supported_extensions) as f:
             supported_extensions_json = json.loads(f.read())
             supported_extensions = supported_extensions_json[
                 'supported_extensions']
+            supported_angle_extensions = supported_extensions_json[
+                'supported_angle_extensions']
 
         params = compute_params(
             etree.parse(args.gl_xml).getroot(), supported_extensions)
 
+        angle_params = compute_params(
+            etree.parse(args.gl_angle_ext_xml).getroot(),
+            supported_angle_extensions)
+
+        for key, value in params.items():
+            params[key] += angle_params[key]
+
         return [
             FileRender(
                 'opengl/OpenGLFunctionsBase.cpp',
@@ -274,6 +288,7 @@
     def get_dependencies(self, args):
         return [
             os.path.abspath(args.gl_xml),
+            os.path.abspath(args.gl_angle_ext_xml),
             os.path.abspath(args.supported_extensions)
         ]
 
diff --git a/src/dawn/native/BUILD.gn b/src/dawn/native/BUILD.gn
index 4f30273..9f8f713 100644
--- a/src/dawn/native/BUILD.gn
+++ b/src/dawn/native/BUILD.gn
@@ -112,6 +112,8 @@
     args = [
       "--gl-xml",
       rebase_path("${dawn_root}/third_party/khronos/gl.xml", root_build_dir),
+      "--gl-angle-ext-xml",
+      rebase_path("${dawn_angle_dir}/scripts/gl_angle_ext.xml", root_build_dir),
       "--supported-extensions",
       rebase_path("opengl/supported_extensions.json", root_build_dir),
     ]
diff --git a/src/dawn/native/CMakeLists.txt b/src/dawn/native/CMakeLists.txt
index 0ce0af4..7452b9e 100644
--- a/src/dawn/native/CMakeLists.txt
+++ b/src/dawn/native/CMakeLists.txt
@@ -413,6 +413,8 @@
         PRINT_NAME "OpenGL function loader"
         ARGS "--gl-xml"
              "${Dawn_SOURCE_DIR}/third_party/khronos/gl.xml"
+             "--gl-angle-ext-xml"
+             "${Dawn_SOURCE_DIR}/third_party/angle/scripts/gl_angle_ext.xml"
              "--supported-extensions"
              "${Dawn_SOURCE_DIR}/src/dawn/native/opengl/supported_extensions.json"
         RESULT_VARIABLE "DAWN_NATIVE_OPENGL_AUTOGEN_SOURCES"
diff --git a/src/dawn/native/opengl/AdapterGL.cpp b/src/dawn/native/opengl/AdapterGL.cpp
index ef41c53..b965e42 100644
--- a/src/dawn/native/opengl/AdapterGL.cpp
+++ b/src/dawn/native/opengl/AdapterGL.cpp
@@ -194,6 +194,11 @@
     //     (gl.IsAtLeastGLES(3, 1) && gl.IsGLExtensionSupported("EXT_base_instance")) ||
     //     (gl.IsAtLeastGL(3, 1) && gl.IsGLExtensionSupported("ARB_base_instance"));
 
+    if (gl.IsAtLeastGLES(3, 1) && gl.IsGLExtensionSupported("GL_ANGLE_base_vertex_base_instance")) {
+        supportsBaseVertex = true;
+        supportsBaseInstance = true;
+    }
+
     // TODO(crbug.com/dawn/343): Investigate emulation.
     deviceToggles->Default(Toggle::DisableBaseVertex, !supportsBaseVertex);
     deviceToggles->Default(Toggle::DisableBaseInstance, !supportsBaseInstance);
diff --git a/src/dawn/native/opengl/CommandBufferGL.cpp b/src/dawn/native/opengl/CommandBufferGL.cpp
index d8a32e4..99d219b 100644
--- a/src/dawn/native/opengl/CommandBufferGL.cpp
+++ b/src/dawn/native/opengl/CommandBufferGL.cpp
@@ -1007,7 +1007,11 @@
                 vertexStateBufferBindingTracker.Apply(gl);
                 bindGroupTracker.Apply(gl);
 
-                if (draw->firstInstance > 0) {
+                if (gl.DrawArraysInstancedBaseInstanceANGLE) {
+                    gl.DrawArraysInstancedBaseInstanceANGLE(
+                        lastPipeline->GetGLPrimitiveTopology(), draw->firstVertex,
+                        draw->vertexCount, draw->instanceCount, draw->firstInstance);
+                } else if (draw->firstInstance > 0) {
                     gl.DrawArraysInstancedBaseInstance(lastPipeline->GetGLPrimitiveTopology(),
                                                        draw->firstVertex, draw->vertexCount,
                                                        draw->instanceCount, draw->firstInstance);
@@ -1025,7 +1029,13 @@
                 vertexStateBufferBindingTracker.Apply(gl);
                 bindGroupTracker.Apply(gl);
 
-                if (draw->firstInstance > 0) {
+                if (gl.DrawElementsInstancedBaseVertexBaseInstanceANGLE) {
+                    gl.DrawElementsInstancedBaseVertexBaseInstanceANGLE(
+                        lastPipeline->GetGLPrimitiveTopology(), draw->indexCount, indexBufferFormat,
+                        reinterpret_cast<void*>(draw->firstIndex * indexFormatSize +
+                                                indexBufferBaseOffset),
+                        draw->instanceCount, draw->baseVertex, draw->firstInstance);
+                } else if (draw->firstInstance > 0) {
                     gl.DrawElementsInstancedBaseVertexBaseInstance(
                         lastPipeline->GetGLPrimitiveTopology(), draw->indexCount, indexBufferFormat,
                         reinterpret_cast<void*>(draw->firstIndex * indexFormatSize +
diff --git a/src/dawn/native/opengl/supported_extensions.json b/src/dawn/native/opengl/supported_extensions.json
index 8c110d0..f0da1f6 100644
--- a/src/dawn/native/opengl/supported_extensions.json
+++ b/src/dawn/native/opengl/supported_extensions.json
@@ -21,5 +21,9 @@
         "GL_OES_EGL_image",
         "GL_EXT_texture_format_BGRA8888",
         "GL_APPLE_texture_format_BGRA8888"
+    ],
+
+    "supported_angle_extensions": [
+        "GL_ANGLE_base_vertex_base_instance"
     ]
 }