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>
This commit is contained in:
Stephen White 2023-02-27 21:43:57 +00:00 committed by Dawn LUCI CQ
parent 70e45a4263
commit 25e1f12228
6 changed files with 40 additions and 2 deletions

View File

@ -240,6 +240,10 @@ class OpenGLLoaderGenerator(Generator):
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 @@ class OpenGLLoaderGenerator(Generator):
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 @@ class OpenGLLoaderGenerator(Generator):
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)
]

View File

@ -112,6 +112,8 @@ if (dawn_enable_opengl) {
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),
]

View File

@ -413,6 +413,8 @@ if (DAWN_ENABLE_OPENGL)
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"

View File

@ -194,6 +194,11 @@ void Adapter::SetupBackendDeviceToggles(TogglesState* deviceToggles) const {
// (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);

View File

@ -1007,7 +1007,11 @@ MaybeError CommandBuffer::ExecuteRenderPass(BeginRenderPassCmd* renderPass) {
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 @@ MaybeError CommandBuffer::ExecuteRenderPass(BeginRenderPassCmd* renderPass) {
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 +

View File

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