2021-02-17 02:15:43 +03:00
|
|
|
#!/usr/bin/python3
|
2018-12-17 21:13:49 +03:00
|
|
|
#
|
|
|
|
# Copyright 2018 The ANGLE Project Authors. All rights reserved.
|
|
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
|
|
# found in the LICENSE file.
|
|
|
|
#
|
|
|
|
# registry_xml.py:
|
|
|
|
# Parses information from Khronos registry files..
|
|
|
|
|
|
|
|
# List of supported extensions. Add to this list to enable new extensions
|
|
|
|
# available in gl.xml.
|
|
|
|
|
2019-07-29 20:31:20 +03:00
|
|
|
import os
|
2021-02-17 02:15:43 +03:00
|
|
|
import sys
|
2018-12-17 21:13:49 +03:00
|
|
|
import xml.etree.ElementTree as etree
|
|
|
|
|
2021-02-17 02:15:43 +03:00
|
|
|
from enum import Enum
|
|
|
|
|
2019-06-14 23:02:17 +03:00
|
|
|
xml_inputs = [
|
2021-02-20 01:28:10 +03:00
|
|
|
'cl.xml',
|
2019-06-14 23:02:17 +03:00
|
|
|
'gl.xml',
|
|
|
|
'gl_angle_ext.xml',
|
|
|
|
'egl.xml',
|
|
|
|
'egl_angle_ext.xml',
|
2019-06-18 20:02:03 +03:00
|
|
|
'wgl.xml',
|
2019-06-14 23:02:17 +03:00
|
|
|
'registry_xml.py',
|
|
|
|
]
|
|
|
|
|
2018-12-17 21:13:49 +03:00
|
|
|
angle_extensions = [
|
|
|
|
# ANGLE extensions
|
|
|
|
"GL_CHROMIUM_bind_uniform_location",
|
|
|
|
"GL_CHROMIUM_framebuffer_mixed_samples",
|
|
|
|
"GL_CHROMIUM_path_rendering",
|
|
|
|
"GL_CHROMIUM_copy_texture",
|
|
|
|
"GL_CHROMIUM_copy_compressed_texture",
|
2019-04-12 21:48:59 +03:00
|
|
|
"GL_CHROMIUM_lose_context",
|
2019-08-27 18:35:30 +03:00
|
|
|
"GL_ANGLE_copy_texture_3d",
|
2019-10-25 01:29:15 +03:00
|
|
|
"GL_ANGLE_get_image",
|
2021-04-02 19:46:37 +03:00
|
|
|
"GL_ANGLE_get_serialized_context_string",
|
2020-10-14 18:31:56 +03:00
|
|
|
"GL_ANGLE_get_tex_level_parameter",
|
2019-08-27 18:35:30 +03:00
|
|
|
"GL_ANGLE_program_binary",
|
2018-12-17 21:13:49 +03:00
|
|
|
"GL_ANGLE_request_extension",
|
|
|
|
"GL_ANGLE_robust_client_memory",
|
2019-05-27 20:39:15 +03:00
|
|
|
"GL_ANGLE_texture_external_update",
|
2018-12-17 21:13:49 +03:00
|
|
|
]
|
|
|
|
|
|
|
|
gles1_extensions = [
|
|
|
|
# ES1 (Possibly the min set of extensions needed by Android)
|
|
|
|
"GL_OES_draw_texture",
|
|
|
|
"GL_OES_framebuffer_object",
|
|
|
|
"GL_OES_matrix_palette",
|
|
|
|
"GL_OES_point_size_array",
|
|
|
|
"GL_OES_query_matrix",
|
|
|
|
"GL_OES_texture_cube_map",
|
|
|
|
]
|
|
|
|
|
2019-06-13 18:29:06 +03:00
|
|
|
gles_extensions = [
|
2018-12-17 21:13:49 +03:00
|
|
|
# ES2+
|
2019-11-03 00:23:34 +03:00
|
|
|
"GL_ANGLE_base_vertex_base_instance",
|
2018-12-17 21:13:49 +03:00
|
|
|
"GL_ANGLE_framebuffer_blit",
|
|
|
|
"GL_ANGLE_framebuffer_multisample",
|
|
|
|
"GL_ANGLE_instanced_arrays",
|
2020-08-03 21:09:49 +03:00
|
|
|
"GL_ANGLE_memory_object_flags",
|
2019-04-03 22:51:28 +03:00
|
|
|
"GL_ANGLE_memory_object_fuchsia",
|
2019-11-03 00:23:34 +03:00
|
|
|
"GL_ANGLE_multi_draw",
|
2019-01-03 03:21:18 +03:00
|
|
|
"GL_ANGLE_provoking_vertex",
|
2019-04-03 22:51:28 +03:00
|
|
|
"GL_ANGLE_semaphore_fuchsia",
|
2018-12-17 21:13:49 +03:00
|
|
|
"GL_ANGLE_texture_multisample",
|
|
|
|
"GL_ANGLE_translated_shader_source",
|
2021-04-20 17:33:02 +03:00
|
|
|
"GL_KHR_blend_equation_advanced",
|
2018-12-17 21:13:49 +03:00
|
|
|
"GL_EXT_blend_func_extended",
|
2020-09-19 03:33:55 +03:00
|
|
|
"GL_EXT_buffer_storage",
|
2020-10-08 04:02:39 +03:00
|
|
|
"GL_EXT_copy_image",
|
2021-01-08 01:42:57 +03:00
|
|
|
"GL_EXT_clip_control",
|
2020-12-03 01:18:27 +03:00
|
|
|
"GL_EXT_debug_label",
|
2018-12-17 21:13:49 +03:00
|
|
|
"GL_EXT_debug_marker",
|
|
|
|
"GL_EXT_discard_framebuffer",
|
|
|
|
"GL_EXT_disjoint_timer_query",
|
|
|
|
"GL_EXT_draw_buffers",
|
2020-02-28 12:57:25 +03:00
|
|
|
"GL_EXT_draw_buffers_indexed",
|
2019-11-21 19:37:17 +03:00
|
|
|
"GL_EXT_draw_elements_base_vertex",
|
2020-05-06 00:24:26 +03:00
|
|
|
"GL_EXT_EGL_image_array",
|
2020-11-08 20:18:33 +03:00
|
|
|
"GL_EXT_external_buffer",
|
2018-12-17 21:13:49 +03:00
|
|
|
"GL_EXT_geometry_shader",
|
2019-02-08 18:07:21 +03:00
|
|
|
"GL_EXT_instanced_arrays",
|
2018-12-17 21:13:49 +03:00
|
|
|
"GL_EXT_map_buffer_range",
|
2019-04-03 21:49:57 +03:00
|
|
|
"GL_EXT_memory_object",
|
2019-04-03 23:23:40 +03:00
|
|
|
"GL_EXT_memory_object_fd",
|
2019-08-27 01:59:48 +03:00
|
|
|
"GL_EXT_multisampled_render_to_texture",
|
2020-07-31 18:44:38 +03:00
|
|
|
"GL_EXT_multisampled_render_to_texture2",
|
2018-12-17 21:13:49 +03:00
|
|
|
"GL_EXT_occlusion_query_boolean",
|
2021-04-24 19:50:31 +03:00
|
|
|
"GL_EXT_primitive_bounding_box",
|
2019-12-11 06:30:15 +03:00
|
|
|
"GL_EXT_read_format_bgra",
|
2018-12-17 21:13:49 +03:00
|
|
|
"GL_EXT_robustness",
|
2019-04-03 21:49:57 +03:00
|
|
|
"GL_EXT_semaphore",
|
2019-04-03 23:23:40 +03:00
|
|
|
"GL_EXT_semaphore_fd",
|
2020-11-16 19:38:54 +03:00
|
|
|
"GL_EXT_separate_shader_objects",
|
2020-12-15 01:42:58 +03:00
|
|
|
"GL_EXT_shader_framebuffer_fetch_non_coherent",
|
2020-12-01 19:39:25 +03:00
|
|
|
"GL_EXT_shader_io_blocks",
|
2019-12-11 06:30:15 +03:00
|
|
|
"GL_EXT_sRGB",
|
2020-11-18 18:58:53 +03:00
|
|
|
"GL_EXT_tessellation_shader",
|
2021-04-16 21:29:29 +03:00
|
|
|
"GL_EXT_texture_border_clamp",
|
2020-07-24 18:44:02 +03:00
|
|
|
"GL_EXT_texture_buffer",
|
2019-12-11 06:30:15 +03:00
|
|
|
"GL_EXT_texture_compression_bptc",
|
|
|
|
"GL_EXT_texture_compression_dxt1",
|
2020-01-31 18:03:12 +03:00
|
|
|
"GL_EXT_texture_compression_rgtc",
|
2019-12-11 06:30:15 +03:00
|
|
|
"GL_EXT_texture_compression_s3tc",
|
|
|
|
"GL_EXT_texture_compression_s3tc_srgb",
|
2020-05-25 22:33:44 +03:00
|
|
|
"GL_EXT_texture_cube_map_array",
|
2019-11-03 00:23:34 +03:00
|
|
|
"GL_EXT_texture_filter_anisotropic",
|
2019-12-11 06:30:15 +03:00
|
|
|
"GL_EXT_texture_format_BGRA8888",
|
2018-12-17 21:13:49 +03:00
|
|
|
"GL_EXT_texture_storage",
|
2020-03-20 18:12:34 +03:00
|
|
|
"GL_EXT_texture_sRGB_R8",
|
2021-05-09 14:09:45 +03:00
|
|
|
"GL_EXT_texture_sRGB_RG8",
|
2020-11-03 21:33:44 +03:00
|
|
|
"GL_EXT_YUV_target",
|
2018-12-17 21:13:49 +03:00
|
|
|
"GL_KHR_debug",
|
2019-11-03 00:23:34 +03:00
|
|
|
"GL_KHR_parallel_shader_compile",
|
2018-12-17 21:13:49 +03:00
|
|
|
"GL_NV_fence",
|
2020-12-23 22:53:55 +03:00
|
|
|
"GL_NV_framebuffer_blit",
|
2019-12-11 06:30:15 +03:00
|
|
|
"GL_OES_compressed_ETC1_RGB8_texture",
|
2020-03-27 02:40:25 +03:00
|
|
|
"GL_EXT_compressed_ETC1_RGB8_sub_texture",
|
2020-10-08 04:02:39 +03:00
|
|
|
"GL_OES_copy_image",
|
2019-12-11 06:30:15 +03:00
|
|
|
"GL_OES_depth32",
|
2020-02-28 12:57:25 +03:00
|
|
|
"GL_OES_draw_buffers_indexed",
|
2019-11-21 19:37:17 +03:00
|
|
|
"GL_OES_draw_elements_base_vertex",
|
2019-12-11 06:30:15 +03:00
|
|
|
"GL_OES_EGL_image",
|
2018-12-17 21:13:49 +03:00
|
|
|
"GL_OES_get_program_binary",
|
|
|
|
"GL_OES_mapbuffer",
|
2020-10-02 02:28:59 +03:00
|
|
|
"GL_OES_sample_shading",
|
2020-12-01 19:39:25 +03:00
|
|
|
"GL_OES_shader_io_blocks",
|
2019-06-28 23:04:50 +03:00
|
|
|
"GL_OES_texture_3D",
|
2018-12-17 21:13:49 +03:00
|
|
|
"GL_OES_texture_border_clamp",
|
2020-07-24 18:44:02 +03:00
|
|
|
"GL_OES_texture_buffer",
|
2020-05-25 22:33:44 +03:00
|
|
|
"GL_OES_texture_cube_map_array",
|
2019-12-11 06:30:15 +03:00
|
|
|
"GL_OES_texture_half_float",
|
2020-09-25 19:52:58 +03:00
|
|
|
"GL_OES_texture_stencil8",
|
2018-12-17 21:13:49 +03:00
|
|
|
"GL_OES_texture_storage_multisample_2d_array",
|
|
|
|
"GL_OES_vertex_array_object",
|
2019-03-13 00:27:40 +03:00
|
|
|
"GL_OVR_multiview",
|
|
|
|
"GL_OVR_multiview2",
|
2019-06-13 18:29:06 +03:00
|
|
|
]
|
|
|
|
|
|
|
|
supported_extensions = sorted(angle_extensions + gles1_extensions + gles_extensions)
|
2018-12-17 21:13:49 +03:00
|
|
|
|
|
|
|
supported_egl_extensions = [
|
|
|
|
"EGL_ANDROID_blob_cache",
|
2020-09-16 02:53:26 +03:00
|
|
|
"EGL_ANDROID_create_native_client_buffer",
|
2019-11-26 01:48:11 +03:00
|
|
|
"EGL_ANDROID_framebuffer_target",
|
2018-12-17 21:13:49 +03:00
|
|
|
"EGL_ANDROID_get_frame_timestamps",
|
2018-09-20 22:59:54 +03:00
|
|
|
"EGL_ANDROID_get_native_client_buffer",
|
2019-07-03 21:43:32 +03:00
|
|
|
"EGL_ANDROID_native_fence_sync",
|
2018-12-17 21:13:49 +03:00
|
|
|
"EGL_ANDROID_presentation_time",
|
|
|
|
"EGL_ANGLE_d3d_share_handle_client_buffer",
|
|
|
|
"EGL_ANGLE_device_creation",
|
|
|
|
"EGL_ANGLE_device_d3d",
|
2020-07-27 20:19:27 +03:00
|
|
|
"EGL_ANGLE_display_semaphore_share_group",
|
|
|
|
"EGL_ANGLE_display_texture_share_group",
|
2019-06-04 18:36:43 +03:00
|
|
|
"EGL_ANGLE_feature_control",
|
2019-11-04 23:20:18 +03:00
|
|
|
"EGL_ANGLE_ggp_stream_descriptor",
|
2020-06-11 07:55:43 +03:00
|
|
|
"EGL_ANGLE_power_preference",
|
2018-12-17 21:13:49 +03:00
|
|
|
"EGL_ANGLE_program_cache_control",
|
|
|
|
"EGL_ANGLE_query_surface_pointer",
|
|
|
|
"EGL_ANGLE_stream_producer_d3d_texture",
|
|
|
|
"EGL_ANGLE_surface_d3d_texture_2d_share_handle",
|
2019-11-04 23:20:18 +03:00
|
|
|
"EGL_ANGLE_swap_with_frame_token",
|
2018-12-17 21:13:49 +03:00
|
|
|
"EGL_ANGLE_window_fixed_size",
|
2020-01-23 21:57:21 +03:00
|
|
|
"EGL_CHROMIUM_sync_control",
|
2020-03-25 00:23:19 +03:00
|
|
|
"EGL_ANGLE_sync_control_rate",
|
2018-12-17 21:13:49 +03:00
|
|
|
"EGL_EXT_create_context_robustness",
|
|
|
|
"EGL_EXT_device_query",
|
2020-04-09 04:26:46 +03:00
|
|
|
"EGL_EXT_image_gl_colorspace",
|
2020-01-16 01:05:33 +03:00
|
|
|
"EGL_EXT_pixel_format_float",
|
2018-12-17 21:13:49 +03:00
|
|
|
"EGL_EXT_platform_base",
|
|
|
|
"EGL_EXT_platform_device",
|
2021-03-26 00:31:03 +03:00
|
|
|
"EGL_EXT_protected_content",
|
2019-11-23 02:46:02 +03:00
|
|
|
"EGL_IMG_context_priority",
|
2018-12-17 21:13:49 +03:00
|
|
|
"EGL_KHR_debug",
|
2019-01-15 01:02:52 +03:00
|
|
|
"EGL_KHR_fence_sync",
|
2019-12-24 02:31:52 +03:00
|
|
|
"EGL_KHR_gl_colorspace",
|
|
|
|
"EGL_EXT_gl_colorspace_display_p3",
|
|
|
|
"EGL_EXT_gl_colorspace_display_p3_linear",
|
|
|
|
"EGL_EXT_gl_colorspace_display_p3_passthrough",
|
|
|
|
"EGL_EXT_gl_colorspace_scrgb",
|
|
|
|
"EGL_EXT_gl_colorspace_scrgb_linear",
|
2018-12-17 21:13:49 +03:00
|
|
|
"EGL_KHR_image",
|
2019-07-19 20:43:34 +03:00
|
|
|
"EGL_KHR_no_config_context",
|
2020-10-14 20:20:20 +03:00
|
|
|
"EGL_KHR_reusable_sync",
|
2018-12-17 21:13:49 +03:00
|
|
|
"EGL_KHR_stream",
|
|
|
|
"EGL_KHR_stream_consumer_gltexture",
|
2019-10-25 18:53:06 +03:00
|
|
|
"EGL_KHR_surfaceless_context",
|
2018-12-17 21:13:49 +03:00
|
|
|
"EGL_KHR_swap_buffers_with_damage",
|
2019-01-15 01:02:52 +03:00
|
|
|
"EGL_KHR_wait_sync",
|
2018-12-17 21:13:49 +03:00
|
|
|
"EGL_NV_post_sub_buffer",
|
|
|
|
"EGL_NV_stream_consumer_gltexture_yuv",
|
|
|
|
]
|
|
|
|
|
2021-04-28 20:26:00 +03:00
|
|
|
supported_cl_extensions = [
|
|
|
|
"cl_khr_extended_versioning",
|
|
|
|
"cl_khr_icd",
|
|
|
|
]
|
|
|
|
|
2018-12-17 21:13:49 +03:00
|
|
|
# Strip these suffixes from Context entry point names. NV is excluded (for now).
|
|
|
|
strip_suffixes = ["ANGLE", "EXT", "KHR", "OES", "CHROMIUM"]
|
|
|
|
|
|
|
|
# The EGL_ANGLE_explicit_context extension is generated differently from other extensions.
|
|
|
|
# Toggle generation here.
|
|
|
|
support_EGL_ANGLE_explicit_context = True
|
|
|
|
|
2019-07-29 20:31:20 +03:00
|
|
|
# For ungrouped GLenum types
|
|
|
|
default_enum_group_name = "DefaultGroup"
|
|
|
|
|
|
|
|
# Group names that appear in command/param, but not present in groups/group
|
|
|
|
unsupported_enum_group_names = {
|
|
|
|
'GetMultisamplePNameNV',
|
|
|
|
'BufferPNameARB',
|
|
|
|
'BufferPointerNameARB',
|
|
|
|
'VertexAttribPointerPropertyARB',
|
|
|
|
'VertexAttribPropertyARB',
|
|
|
|
'FenceParameterNameNV',
|
|
|
|
'FenceConditionNV',
|
|
|
|
'BufferPointerNameARB',
|
|
|
|
'MatrixIndexPointerTypeARB',
|
2019-08-09 19:03:24 +03:00
|
|
|
'PointParameterNameARB',
|
|
|
|
'ClampColorTargetARB',
|
|
|
|
'ClampColorModeARB',
|
2019-07-29 20:31:20 +03:00
|
|
|
}
|
|
|
|
|
2020-12-01 00:03:45 +03:00
|
|
|
# Versions (major, minor). Note that GLES intentionally places 1.0 last.
|
|
|
|
DESKTOP_GL_VERSIONS = [(1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 0), (2, 1), (3, 0),
|
|
|
|
(3, 1), (3, 2), (3, 3), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5),
|
|
|
|
(4, 6)]
|
|
|
|
GLES_VERSIONS = [(2, 0), (3, 0), (3, 1), (3, 2), (1, 0)]
|
|
|
|
EGL_VERSIONS = [(1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5)]
|
|
|
|
WGL_VERSIONS = [(1, 0)]
|
2021-04-02 01:18:44 +03:00
|
|
|
CL_VERSIONS = [(1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2), (3, 0)]
|
2020-12-01 00:03:45 +03:00
|
|
|
|
2019-05-06 20:15:35 +03:00
|
|
|
|
2021-02-17 02:15:43 +03:00
|
|
|
# API types
|
|
|
|
class apis:
|
|
|
|
GL = 'GL'
|
|
|
|
GLES = 'GLES'
|
|
|
|
WGL = 'WGL'
|
|
|
|
EGL = 'EGL'
|
2021-02-20 01:28:10 +03:00
|
|
|
CL = 'CL'
|
2021-02-17 02:15:43 +03:00
|
|
|
|
|
|
|
|
2018-12-17 21:13:49 +03:00
|
|
|
def script_relative(path):
|
|
|
|
return os.path.join(os.path.dirname(sys.argv[0]), path)
|
|
|
|
|
2019-05-06 20:15:35 +03:00
|
|
|
|
2018-12-17 21:13:49 +03:00
|
|
|
def path_to(folder, file):
|
|
|
|
return os.path.join(script_relative(".."), "src", folder, file)
|
|
|
|
|
2019-05-06 20:15:35 +03:00
|
|
|
|
Clean up entry point generation script.
The main refactor from this change is to replace statements like this:
decls, defs, export_defs, _, _, _, _ = get_entry_points(
apis.EGL, eglxml.all_commands, egl_version_commands, False,
egl_param_types, cmd_packed_egl_enums, EGL_PACKED_TYPES,
egl_ep_to_object, TEMPLATE_EGL_ENTRY_POINT_EXPORT)
With statements like this:
eps = EGLEntryPoints(eglxml, egl_version_commands)
This will make the script easier to maintain and extend.
Bug: angleproject:5653
Change-Id: Ibd0930d45b8629702b7782f43a2d7ebfa4dac9b8
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2705156
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Cody Northrop <cnorthrop@google.com>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
2021-02-19 21:46:06 +03:00
|
|
|
def strip_api_prefix(cmd_name):
|
2021-02-20 01:28:10 +03:00
|
|
|
return cmd_name.lstrip("cwegl")
|
|
|
|
|
|
|
|
|
|
|
|
def get_cmd_name(command_node):
|
|
|
|
proto = command_node.find('proto')
|
|
|
|
cmd_name = proto.find('name').text
|
|
|
|
return cmd_name
|
Clean up entry point generation script.
The main refactor from this change is to replace statements like this:
decls, defs, export_defs, _, _, _, _ = get_entry_points(
apis.EGL, eglxml.all_commands, egl_version_commands, False,
egl_param_types, cmd_packed_egl_enums, EGL_PACKED_TYPES,
egl_ep_to_object, TEMPLATE_EGL_ENTRY_POINT_EXPORT)
With statements like this:
eps = EGLEntryPoints(eglxml, egl_version_commands)
This will make the script easier to maintain and extend.
Bug: angleproject:5653
Change-Id: Ibd0930d45b8629702b7782f43a2d7ebfa4dac9b8
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2705156
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Cody Northrop <cnorthrop@google.com>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
2021-02-19 21:46:06 +03:00
|
|
|
|
|
|
|
|
2021-02-17 02:15:43 +03:00
|
|
|
class CommandNames:
|
2019-05-06 20:15:35 +03:00
|
|
|
|
2018-12-17 21:13:49 +03:00
|
|
|
def __init__(self):
|
|
|
|
self.command_names = {}
|
|
|
|
|
|
|
|
def get_commands(self, version):
|
|
|
|
return self.command_names[version]
|
|
|
|
|
|
|
|
def get_all_commands(self):
|
|
|
|
cmd_names = []
|
|
|
|
# Combine all the version lists into a single list
|
2021-02-17 02:15:43 +03:00
|
|
|
for version, version_cmd_names in sorted(self.command_names.items()):
|
2018-12-17 21:13:49 +03:00
|
|
|
cmd_names += version_cmd_names
|
|
|
|
|
|
|
|
return cmd_names
|
|
|
|
|
|
|
|
def add_commands(self, version, commands):
|
|
|
|
# Add key if it doesn't exist
|
|
|
|
if version not in self.command_names:
|
|
|
|
self.command_names[version] = []
|
|
|
|
# Add the commands that aren't duplicates
|
|
|
|
self.command_names[version] += commands
|
|
|
|
|
2019-05-06 20:15:35 +03:00
|
|
|
|
2018-12-17 21:13:49 +03:00
|
|
|
class RegistryXML:
|
2019-05-06 20:15:35 +03:00
|
|
|
|
|
|
|
def __init__(self, xml_file, ext_file=None):
|
2018-12-17 21:13:49 +03:00
|
|
|
tree = etree.parse(script_relative(xml_file))
|
|
|
|
self.root = tree.getroot()
|
|
|
|
if (ext_file):
|
|
|
|
self._AppendANGLEExts(ext_file)
|
|
|
|
self.all_commands = self.root.findall('commands/command')
|
2021-02-17 02:15:43 +03:00
|
|
|
self.all_cmd_names = CommandNames()
|
2018-12-17 21:13:49 +03:00
|
|
|
self.commands = {}
|
|
|
|
|
|
|
|
def _AppendANGLEExts(self, ext_file):
|
|
|
|
angle_ext_tree = etree.parse(script_relative(ext_file))
|
|
|
|
angle_ext_root = angle_ext_tree.getroot()
|
|
|
|
|
|
|
|
insertion_point = self.root.findall("./commands")[0]
|
|
|
|
for command in angle_ext_root.iter('commands'):
|
|
|
|
insertion_point.extend(command)
|
|
|
|
|
|
|
|
insertion_point = self.root.findall("./extensions")[0]
|
|
|
|
for extension in angle_ext_root.iter('extensions'):
|
|
|
|
insertion_point.extend(extension)
|
|
|
|
|
2019-04-03 22:51:28 +03:00
|
|
|
insertion_point = self.root
|
|
|
|
for enums in angle_ext_root.iter('enums'):
|
|
|
|
insertion_point.append(enums)
|
|
|
|
|
2018-12-17 21:13:49 +03:00
|
|
|
def AddCommands(self, feature_name, annotation):
|
|
|
|
xpath = ".//feature[@name='%s']//command" % feature_name
|
|
|
|
commands = [cmd.attrib['name'] for cmd in self.root.findall(xpath)]
|
|
|
|
|
|
|
|
# Remove commands that have already been processed
|
|
|
|
current_cmds = self.all_cmd_names.get_all_commands()
|
|
|
|
commands = [cmd for cmd in commands if cmd not in current_cmds]
|
|
|
|
|
|
|
|
self.all_cmd_names.add_commands(annotation, commands)
|
|
|
|
self.commands[annotation] = commands
|
|
|
|
|
|
|
|
def _ClassifySupport(self, supported):
|
|
|
|
if 'gles2' in supported:
|
|
|
|
return 'gl2ext'
|
|
|
|
elif 'gles1' in supported:
|
|
|
|
return 'glext'
|
|
|
|
elif 'egl' in supported:
|
|
|
|
return 'eglext'
|
|
|
|
elif 'wgl' in supported:
|
|
|
|
return 'wglext'
|
2021-04-28 20:26:00 +03:00
|
|
|
elif 'cl' in supported:
|
|
|
|
return 'clext'
|
2018-12-17 21:13:49 +03:00
|
|
|
else:
|
|
|
|
assert False
|
|
|
|
return 'unknown'
|
|
|
|
|
|
|
|
def AddExtensionCommands(self, supported_extensions, apis):
|
|
|
|
# Use a first step to run through the extensions so we can generate them
|
|
|
|
# in sorted order.
|
|
|
|
self.ext_data = {}
|
|
|
|
self.ext_dupes = {}
|
|
|
|
ext_annotations = {}
|
|
|
|
|
|
|
|
for extension in self.root.findall("extensions/extension"):
|
|
|
|
extension_name = extension.attrib['name']
|
|
|
|
if not extension_name in supported_extensions:
|
|
|
|
continue
|
|
|
|
|
|
|
|
ext_annotations[extension_name] = self._ClassifySupport(extension.attrib['supported'])
|
|
|
|
|
|
|
|
ext_cmd_names = []
|
|
|
|
|
|
|
|
# There's an extra step here to filter out 'api=gl' extensions. This
|
|
|
|
# is necessary for handling KHR extensions, which have separate entry
|
|
|
|
# point signatures (without the suffix) for desktop GL. Note that this
|
|
|
|
# extra step is necessary because of Etree's limited Xpath support.
|
|
|
|
for require in extension.findall('require'):
|
|
|
|
if 'api' in require.attrib and require.attrib['api'] not in apis:
|
|
|
|
continue
|
|
|
|
|
|
|
|
# A special case for EXT_texture_storage
|
|
|
|
filter_out_comment = "Supported only if GL_EXT_direct_state_access is supported"
|
|
|
|
if 'comment' in require.attrib and require.attrib['comment'] == filter_out_comment:
|
|
|
|
continue
|
|
|
|
|
|
|
|
extension_commands = require.findall('command')
|
|
|
|
ext_cmd_names += [command.attrib['name'] for command in extension_commands]
|
|
|
|
|
|
|
|
self.ext_data[extension_name] = sorted(ext_cmd_names)
|
|
|
|
|
2021-02-17 02:15:43 +03:00
|
|
|
for extension_name, ext_cmd_names in sorted(self.ext_data.items()):
|
2018-12-17 21:13:49 +03:00
|
|
|
|
|
|
|
# Detect and filter duplicate extensions.
|
|
|
|
dupes = []
|
|
|
|
for ext_cmd in ext_cmd_names:
|
|
|
|
if ext_cmd in self.all_cmd_names.get_all_commands():
|
|
|
|
dupes.append(ext_cmd)
|
|
|
|
|
|
|
|
for dupe in dupes:
|
|
|
|
ext_cmd_names.remove(dupe)
|
|
|
|
|
|
|
|
self.ext_data[extension_name] = sorted(ext_cmd_names)
|
|
|
|
self.ext_dupes[extension_name] = dupes
|
|
|
|
self.all_cmd_names.add_commands(ext_annotations[extension_name], ext_cmd_names)
|
2021-02-17 02:15:43 +03:00
|
|
|
|
|
|
|
|
|
|
|
class EntryPoints:
|
|
|
|
|
Clean up entry point generation script.
The main refactor from this change is to replace statements like this:
decls, defs, export_defs, _, _, _, _ = get_entry_points(
apis.EGL, eglxml.all_commands, egl_version_commands, False,
egl_param_types, cmd_packed_egl_enums, EGL_PACKED_TYPES,
egl_ep_to_object, TEMPLATE_EGL_ENTRY_POINT_EXPORT)
With statements like this:
eps = EGLEntryPoints(eglxml, egl_version_commands)
This will make the script easier to maintain and extend.
Bug: angleproject:5653
Change-Id: Ibd0930d45b8629702b7782f43a2d7ebfa4dac9b8
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2705156
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Cody Northrop <cnorthrop@google.com>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
2021-02-19 21:46:06 +03:00
|
|
|
def __init__(self, api, xml, commands):
|
|
|
|
self.api = api
|
|
|
|
self._cmd_info = []
|
|
|
|
|
|
|
|
for command_node in xml.all_commands:
|
2021-02-20 01:28:10 +03:00
|
|
|
cmd_name = get_cmd_name(command_node)
|
Clean up entry point generation script.
The main refactor from this change is to replace statements like this:
decls, defs, export_defs, _, _, _, _ = get_entry_points(
apis.EGL, eglxml.all_commands, egl_version_commands, False,
egl_param_types, cmd_packed_egl_enums, EGL_PACKED_TYPES,
egl_ep_to_object, TEMPLATE_EGL_ENTRY_POINT_EXPORT)
With statements like this:
eps = EGLEntryPoints(eglxml, egl_version_commands)
This will make the script easier to maintain and extend.
Bug: angleproject:5653
Change-Id: Ibd0930d45b8629702b7782f43a2d7ebfa4dac9b8
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2705156
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Cody Northrop <cnorthrop@google.com>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
2021-02-19 21:46:06 +03:00
|
|
|
|
|
|
|
if api == apis.WGL:
|
|
|
|
cmd_name = cmd_name if cmd_name[:3] == 'wgl' else 'wgl' + cmd_name
|
|
|
|
|
|
|
|
if cmd_name not in commands:
|
|
|
|
continue
|
|
|
|
|
|
|
|
param_text = ["".join(param.itertext()) for param in command_node.findall('param')]
|
2021-02-20 01:28:10 +03:00
|
|
|
|
|
|
|
# Treat (void) as ()
|
|
|
|
if len(param_text) == 1 and param_text[0].strip() == 'void':
|
|
|
|
param_text = []
|
|
|
|
|
|
|
|
proto = command_node.find('proto')
|
Clean up entry point generation script.
The main refactor from this change is to replace statements like this:
decls, defs, export_defs, _, _, _, _ = get_entry_points(
apis.EGL, eglxml.all_commands, egl_version_commands, False,
egl_param_types, cmd_packed_egl_enums, EGL_PACKED_TYPES,
egl_ep_to_object, TEMPLATE_EGL_ENTRY_POINT_EXPORT)
With statements like this:
eps = EGLEntryPoints(eglxml, egl_version_commands)
This will make the script easier to maintain and extend.
Bug: angleproject:5653
Change-Id: Ibd0930d45b8629702b7782f43a2d7ebfa4dac9b8
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2705156
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Cody Northrop <cnorthrop@google.com>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
2021-02-19 21:46:06 +03:00
|
|
|
proto_text = "".join(proto.itertext())
|
|
|
|
|
|
|
|
self._cmd_info.append((cmd_name, command_node, param_text, proto_text))
|
|
|
|
|
|
|
|
def get_infos(self):
|
|
|
|
return self._cmd_info
|