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"
]
}