[Mesa-dev] [PATCH 08/12] mesa: Switch to using the Khronos registry for generating enums.
Eric Anholt
eric at anholt.net
Wed Nov 25 19:10:51 PST 2015
I've used a bunch of python code to cut out new enums so that the two
generated files can be diffed. I'll remove all that hardcoding in the
following commits. All remaining differences between the generated code:
- GL_TEXTURE_BUFFER_FORMAT didn't appear in GL3 when TBOs got merged to
core, so it now gets an _ARB suffix instead.
- Blacklisting can't keep EXT_sso's GL_ACTIVE_PROGRAM_EXT from becoming
GL_ACTIVE_PROGRAM -- in our hash table, GL_ACTIVE_PROGRAM_EXT points at
the GLES2 enum's value (aka GL_CURRENT_PROGRAM). By not blacklisting
the core name, we get both enums translated.
- GL_DRAW_FRAMEBUFFER_BINDING and GL_FRAMEBUFFER_BINDING both appeared in
GL3 as synonyms, and the new code happens to choose
GL_FRAMEBUFFER_BINDING instead.
- GL_TEXTURE_COMPONENTS and GL_TEXTURE_INTERNAL_FORMAT both appear in 1.1,
and the new code chooses GL_TEXTURE_INTERNAL_FORMAT instead (which seems
better, to me)
---
src/mapi/glapi/gen/Makefile.am | 4 +-
src/mapi/glapi/gen/gl_enums.py | 405 +++++++++++++++++++++++++++++++++++++----
2 files changed, 370 insertions(+), 39 deletions(-)
diff --git a/src/mapi/glapi/gen/Makefile.am b/src/mapi/glapi/gen/Makefile.am
index a5a26a6..b52cb6f 100644
--- a/src/mapi/glapi/gen/Makefile.am
+++ b/src/mapi/glapi/gen/Makefile.am
@@ -271,8 +271,8 @@ $(MESA_GLAPI_DIR)/glapi_sparc.S: gl_SPARC_asm.py $(COMMON)
######################################################################
-$(MESA_DIR)/main/enums.c: gl_enums.py $(COMMON)
- $(PYTHON_GEN) $(srcdir)/gl_enums.py -f $(srcdir)/gl_and_es_API.xml > $@
+$(MESA_DIR)/main/enums.c: gl_enums.py $(srcdir)/../registry/gl.xml
+ $(PYTHON_GEN) $(srcdir)/gl_enums.py -f $(srcdir)/../registry/gl.xml > $@
$(MESA_DIR)/main/api_exec.c: gl_genexec.py apiexec.py $(COMMON)
$(PYTHON_GEN) $(srcdir)/gl_genexec.py -f $(srcdir)/gl_and_es_API.xml > $@
diff --git a/src/mapi/glapi/gen/gl_enums.py b/src/mapi/glapi/gen/gl_enums.py
index d61f260..c8199e2 100644
--- a/src/mapi/glapi/gen/gl_enums.py
+++ b/src/mapi/glapi/gen/gl_enums.py
@@ -2,6 +2,7 @@
# (C) Copyright Zack Rusin 2005. All Rights Reserved.
# Copyright (C) 2015 Intel Corporation
+# Copyright (C) 2015 Broadcom Corporation
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
@@ -29,7 +30,9 @@ import argparse
import license
import gl_XML
+import xml.etree.ElementTree as ET
import sys, getopt
+import re
class PrintGlEnums(gl_XML.gl_print_base):
@@ -39,7 +42,10 @@ class PrintGlEnums(gl_XML.gl_print_base):
self.name = "gl_enums.py (from Mesa)"
self.license = license.bsd_license_template % ( \
"""Copyright (C) 1999-2005 Brian Paul All Rights Reserved.""", "BRIAN PAUL")
+ # Mapping from enum value to (name, priority) tuples.
self.enum_table = {}
+ # Mapping from enum name to value
+ self.string_to_int = {}
def printRealHeader(self):
@@ -140,23 +146,10 @@ _mesa_lookup_prim_by_nr(GLuint nr)
return
- def printBody(self, api_list):
- self.enum_table = {}
- for api in api_list:
- self.process_enums( api )
-
- enum_table = []
-
- for enum in sorted(self.enum_table.keys()):
- low_pri = 9
- best_name = ''
- for [name, pri] in self.enum_table[ enum ]:
- if pri < low_pri:
- low_pri = pri
- best_name = name
-
- enum_table.append((enum, best_name))
+ def printBody(self, xml):
+ self.process_enums(xml)
+ sorted_enum_values = sorted(self.enum_table.keys())
string_offsets = {}
i = 0;
print '#if defined(__GNUC__)'
@@ -166,7 +159,8 @@ _mesa_lookup_prim_by_nr(GLuint nr)
print '#endif'
print ''
print 'LONGSTRING static const char enum_string_table[] = '
- for enum, name in enum_table:
+ for enum in sorted_enum_values:
+ (name, pri) = self.enum_table[enum]
print ' "%s\\0"' % (name)
string_offsets[ enum ] = i
i += len(name) + 1
@@ -175,9 +169,10 @@ _mesa_lookup_prim_by_nr(GLuint nr)
print ''
- print 'static const enum_elt enum_string_table_offsets[%u] =' % (len(enum_table))
+ print 'static const enum_elt enum_string_table_offsets[%u] =' % (len(self.enum_table))
print '{'
- for enum, name in enum_table:
+ for enum in sorted_enum_values:
+ (name, pri) = self.enum_table[enum]
print ' { %5u, 0x%08X }, /* %s */' % (string_offsets[enum], enum, name)
print '};'
print ''
@@ -185,22 +180,358 @@ _mesa_lookup_prim_by_nr(GLuint nr)
self.print_code()
return
-
- def process_enums(self, api):
- for obj in api.enumIterateByName():
- if obj.value not in self.enum_table:
- self.enum_table[ obj.value ] = []
-
-
- enum = self.enum_table[ obj.value ]
- name = "GL_" + obj.name
- priority = obj.priority()
- already_in = False;
- for n, p in enum:
- if n == name:
- already_in = True
- if not already_in:
- enum.append( [name, priority] )
+ def add_enum_provider(self, name, priority):
+ # Skip some enums, to reduce the diffs from this commit.
+ if name in ['GL_NEXT_BUFFER_NV',
+ # Mesa was choosing GL_LINES for this, which wasn't great.
+ 'GL_TRUE',
+ # Old names for things where Mesa was using the new names.
+ 'GL_VERTEX_PROGRAM_POINT_SIZE',
+ 'GL_MAX_VARYING_FLOATS',
+ 'GL_CLIP_PLANE0',
+ 'GL_CLIP_PLANE1',
+ 'GL_CLIP_PLANE2',
+ 'GL_CLIP_PLANE3',
+ 'GL_CLIP_PLANE4',
+ 'GL_CLIP_PLANE5',
+ 'GL_MAX_CLIP_PLANES',
+ 'GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS',
+ 'GL_FOG_COORDINATE',
+ 'GL_CURRENT_FOG_COORDINATE',
+ 'GL_COMPARE_R_TO_TEXTURE',
+ # GL 2.0 name when Mesa was using GLES 1.0.
+ 'GL_BLEND_EQUATION_RGB',
+ # GL3.x compat names that Mesa was missing.
+ 'GL_ALPHA_SNORM',
+ 'GL_LUMINANCE_SNORM',
+ 'GL_LUMINANCE_ALPHA_SNORM',
+ 'GL_INTENSITY_SNORM',
+ 'GL_ALPHA8_SNORM',
+ 'GL_LUMINANCE8_SNORM',
+ 'GL_LUMINANCE8_ALPHA8_SNORM',
+ 'GL_INTENSITY8_SNORM',
+ 'GL_ALPHA16_SNORM',
+ 'GL_LUMINANCE16_SNORM',
+ 'GL_LUMINANCE16_ALPHA16_SNORM',
+ 'GL_INTENSITY16_SNORM',
+ # ARB_imaging names that Mesa was missing.
+ 'GL_COLOR_INDEX1_EXT',
+ 'GL_COLOR_INDEX2_EXT',
+ 'GL_COLOR_INDEX4_EXT',
+ 'GL_COLOR_INDEX8_EXT',
+ 'GL_COLOR_INDEX12_EXT',
+ 'GL_COLOR_INDEX16_EXT',
+ 'GL_CONSTANT_BORDER',
+ 'GL_REPLICATE_BORDER',
+ 'GL_TABLE_TOO_LARGE',
+ # ARB_texture_view names that Mesa was missing.
+ 'GL_TEXTURE_VIEW_MIN_LEVEL',
+ 'GL_TEXTURE_VIEW_NUM_LEVELS',
+ 'GL_TEXTURE_VIEW_MIN_LAYER',
+ 'GL_TEXTURE_VIEW_NUM_LAYERS',
+ # GL4.2 BPTC names that Mesa was missing.
+ 'GL_COMPRESSED_RGBA_BPTC_UNORM',
+ 'GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM',
+ 'GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT',
+ 'GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT',
+ # Mesa was choosing the EXT names for these
+ # instead of core.
+ 'GL_ALPHA_INTEGER',
+ 'GL_PROGRAM_SEPARABLE',
+ 'GL_PROGRAM_PIPELINE_BINDING',
+ 'GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS',
+ # Mesa was choosing the ARB names for these instead of core.
+ 'GL_TEXTURE_CUBE_MAP_ARRAY',
+ 'GL_TEXTURE_BINDING_CUBE_MAP_ARRAY',
+ 'GL_PROXY_TEXTURE_CUBE_MAP_ARRAY',
+ 'GL_SAMPLER_CUBE_MAP_ARRAY',
+ 'GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW',
+ 'GL_INT_SAMPLER_CUBE_MAP_ARRAY',
+ 'GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY',
+ 'GL_TRANSFORM_FEEDBACK_PAUSED',
+ 'GL_TRANSFORM_FEEDBACK_ACTIVE',
+ 'GL_VERTEX_ATTRIB_ARRAY_DIVISOR',
+ # Mesa was choosing the ANGLE names for these
+ # instead of EXT.
+ 'GL_COMPRESSED_RGBA_S3TC_DXT3_EXT',
+ 'GL_COMPRESSED_RGBA_S3TC_DXT5_EXT',
+ ]:
+ return
+
+ # Mesa didn't know about the second half of this set of enums.
+ m = re.match('GL_COLOR_ATTACHMENT([0-9]*)', name)
+ if m and int(m.group(1)) >= 16:
+ return
+
+ value = self.string_to_int[name]
+
+ # We don't want the weird GL_SKIP_COMPONENTS1_NV enums.
+ if value < 0:
+ return
+ # We don't want the 64-bit GL_TIMEOUT_IGNORED "enums"
+ if value > 0xffffffff:
+ return
+
+ if name.endswith('_BIT'):
+ priority += 100
+
+ if value in self.enum_table:
+ (n, p) = self.enum_table[value]
+ if priority < p:
+ self.enum_table[value] = (name, priority)
+ else:
+ self.enum_table[value] = (name, priority)
+
+ def process_extension(self, extension):
+ # Skip some of the extensions, to reduce the diffs from this commit.
+ extension_name = extension.get('name')
+ whitelist = ['GL_ANGLE_texture_compression_dxt3',
+ 'GL_ANGLE_texture_compression_dxt5',
+ 'GL_APPLE_flush_buffer_range',
+ 'GL_APPLE_object_purgeable',
+ 'GL_APPLE_texture_range',
+ 'GL_SGIS_texture_color_mask',
+ 'GL_SGIX_clipmap',
+ 'GL_SGIX_texture_coordinate_clamp',
+ 'GL_SGIX_fog_offset',
+ 'GL_SGIX_texture_scale_bias',
+ 'GL_SGIX_texture_lod_bias',
+ 'GL_SGIX_shadow',
+ 'GL_APPLE_ycbcr_422']
+ whitelist_only_prefixes = ['GL_APPLE',
+ 'GL_ANGLE',
+ 'GL_ARM',
+ 'GL_DMP',
+ 'GL_FJ',
+ 'GL_INGR',
+ 'GL_IMG_',
+ 'GL_MESAX_',
+ 'GL_MALI_',
+ 'GL_NVX_',
+ 'GL_OML_',
+ 'GL_OVR_',
+ 'GL_PGI_',
+ 'GL_QCOM_',
+ 'GL_REND_',
+ 'GL_SGIS_',
+ 'GL_SGIX_',
+ 'GL_WIN_',
+ 'GL_VIV_']
+
+ for prefix in whitelist_only_prefixes:
+ if extension_name.startswith(prefix):
+ if extension_name not in whitelist:
+ return
+
+ if extension_name in ['GL_ATI_element_array',
+ 'GL_ATI_meminfo',
+ 'GL_ATI_text_fragment_shader',
+ 'GL_ATI_pixel_format_float',
+ 'GL_ATI_pn_triangles',
+ 'GL_ATI_vertex_array_object',
+ 'GL_ATI_vertex_streams',
+ 'GL_AMD_blend_minmax_factor',
+ 'GL_AMD_compressed_3DC_texture',
+ 'GL_AMD_compressed_ATC_texture',
+ 'GL_AMD_debug_output',
+ 'GL_AMD_depth_clamp_separate',
+ 'GL_AMD_gpu_shader_int64',
+ 'GL_AMD_query_buffer_object',
+ 'GL_AMD_interleaved_elements',
+ 'GL_AMD_name_gen_delete',
+ 'GL_AMD_occlusion_query_event',
+ 'GL_AMD_program_binary_Z400',
+ 'GL_AMD_sample_positions',
+ 'GL_AMD_sparse_texture',
+ 'GL_AMD_stencil_operation_extended',
+ 'GL_AMD_transform_feedback4',
+ 'GL_AMD_vertex_shader_tessellator',
+ 'GL_ARB_bindless_texture',
+ 'GL_ARB_cl_event',
+ 'GL_ARB_compute_variable_group_size',
+ 'GL_ARB_cull_distance',
+ 'GL_ARB_enhanced_layouts',
+ 'GL_ARB_indirect_parameters',
+ 'GL_ARB_internalformat_query2',
+ 'GL_ARB_query_buffer_object',
+ 'GL_ARB_shading_language_include',
+ 'GL_ARB_sparse_buffer',
+ 'GL_ARB_sparse_texture',
+ 'GL_ARB_texture_compression_bptc',
+ 'GL_ARB_texture_mirror_clamp_to_edge',
+ 'GL_ARB_texture_view',
+ 'GL_ARB_transform_feedback_overflow_query',
+ 'GL_EXT_422_pixels',
+ 'GL_EXT_bindable_uniform',
+ 'GL_EXT_cmyka',
+ 'GL_EXT_coordinate_frame',
+ 'GL_EXT_debug_label',
+ 'GL_EXT_direct_state_access',
+ 'GL_EXT_disjoint_timer_query',
+ 'GL_EXT_geometry_shader',
+ 'GL_EXT_light_texture',
+ 'GL_EXT_robustness',
+ 'GL_EXT_tessellation_shader',
+ 'GL_EXT_texture_compression_latc',
+ 'GL_EXT_texture_filter_minmax',
+ 'GL_EXT_texture_sRGB_R8',
+ 'GL_EXT_texture_sRGB_RG8',
+ 'GL_EXT_framebuffer_multisample_blit_scaled',
+ 'GL_EXT_multisample',
+ 'GL_EXT_multisampled_render_to_texture',
+ 'GL_EXT_multiview_draw_buffers',
+ 'GL_EXT_pixel_transform',
+ 'GL_EXT_primitive_bounding_box',
+ 'GL_EXT_pvrtc_sRGB',
+ 'GL_EXT_raster_multisample',
+ 'GL_EXT_shader_framebuffer_fetch',
+ 'GL_EXT_shader_pixel_local_storage',
+ 'GL_EXT_sparse_texture',
+ 'GL_EXT_stencil_clear_tag',
+ 'GL_EXT_tesselation_shader',
+ 'GL_EXT_texture_perturb_normal',
+ 'GL_EXT_texture_sRGB',
+ 'GL_EXT_texture_storage',
+ 'GL_EXT_texture_view',
+ 'GL_EXT_vertex_shader',
+ 'GL_EXT_vertex_weighting',
+ 'GL_EXT_x11_sync_object',
+ 'GL_EXT_YUV_target',
+ 'GL_IBM_cull_vertex',
+ 'GL_IBM_static_data',
+ 'GL_IBM_vertex_array_lists',
+ 'GL_INTEL_map_texture',
+ 'GL_INTEL_parallel_arrays',
+ 'GL_HP_image_transform',
+ 'GL_HP_texture_lighting',
+ 'GL_KHR_blend_equation_advanced',
+ 'GL_KHR_blend_equation_advanced_coherent',
+ 'GL_KHR_robustness',
+ 'GL_NV_blend_equation_advanced',
+ 'GL_NV_blend_equation_advanced_coherent',
+ 'GL_NV_command_list',
+ 'GL_NV_compute_program5',
+ 'GL_NV_conservative_raster',
+ 'GL_NV_coverage_sample',
+ 'GL_NV_deep_texture3D',
+ 'GL_NV_depth_buffer_float',
+ 'GL_NV_depth_nonlinear',
+ 'GL_NV_evaluators',
+ 'GL_NV_explicit_multisample',
+ 'GL_NV_fence',
+ 'GL_NV_fill_rectangle',
+ 'GL_NV_float_buffer',
+ 'GL_NV_fragment_coverage_to_color',
+ 'GL_NV_framebuffer_mixed_samples',
+ 'GL_NV_framebuffer_multisample_coverage',
+ 'GL_NV_geometry_program4',
+ 'GL_NV_gpu_program4',
+ 'GL_NV_gpu_program5',
+ 'GL_NV_gpu_shader5',
+ 'GL_NV_internalformat_sample_query',
+ 'GL_NV_multisample_coverage',
+ 'GL_NV_parameter_buffer_object',
+ 'GL_NV_path_rendering',
+ 'GL_NV_path_rendering_shared_edge',
+ 'GL_NV_pixel_data_range',
+ 'GL_NV_present_video',
+ 'GL_NV_register_combiners',
+ 'GL_NV_register_combiners2',
+ 'GL_NV_sample_locations',
+ 'GL_NV_shader_buffer_load',
+ 'GL_NV_shader_image_load_store',
+ 'GL_NV_shader_thread_group',
+ 'GL_NV_sRGB_formats',
+ 'GL_NV_tessellation_program5',
+ 'GL_NV_texgen_emboss',
+ 'GL_NV_texture_multisample',
+ 'GL_NV_texture_shader',
+ 'GL_NV_texture_shader2',
+ 'GL_NV_texture_shader3',
+ 'GL_NV_transform_feedback',
+ 'GL_NV_uniform_buffer_unified_memory',
+ 'GL_NV_vertex_array_range',
+ 'GL_NV_vertex_array_range2',
+ 'GL_NV_vertex_attrib_integer_64bit',
+ 'GL_NV_vertex_buffer_unified_memory',
+ 'GL_NV_video_capture',
+ 'GL_OES_geometry_shader',
+ 'GL_OES_primitive_bounding_box',
+ 'GL_OES_tessellation_shader',
+ 'GL_OES_texture_compression_astc',
+ 'GL_OES_texture_view',
+ 'GL_SGI_color_table',
+ 'GL_SUN_global_alpha',
+ 'GL_SUN_triangle_list',
+ 'GL_SUNX_constant_data',
+ 'GL_EXT_index_func',
+ 'GL_EXT_index_array_formats',
+ 'GL_EXT_index_material']:
+ return
+
+ if extension.get('name').startswith('GL_ARB_'):
+ extension_prio = 400
+ elif extension.get('name').startswith('GL_EXT_'):
+ extension_prio = 600
+ else:
+ extension_prio = 800
+
+ for enum in extension.findall('require/enum'):
+ self.add_enum_provider(enum.get('name'), extension_prio)
+
+ # Part of 4.4, but Mesa added it early.
+ self.add_enum_provider('GL_MAX_VERTEX_ATTRIB_STRIDE', 44)
+
+ def process_enums(self, xml):
+ # First, process the XML entries that define the hex values
+ # for all of the enum names.
+ for enum in xml.findall('enums/enum'):
+ name = enum.get('name')
+ value = int(enum.get('value'), base=16)
+
+ if name == 'GL_ALL_ATTRIB_BITS':
+ # Khronos XML defines this one as 0xffffffff, but Mesa
+ # has always had the original definition of
+ # 0x000fffff.
+ value = 0x000fffff
+
+ # If the same name ever maps to multiple values, that can
+ # confuse us. GL_ACTIVE_PROGRAM_EXT is OK to lose because
+ # we choose GL_ACTIVE PROGRAM instead.
+ if name in self.string_to_int and name != "GL_ACTIVE_PROGRAM_EXT":
+ print "#error Renumbering {0} from {1} to {2}".format(name, self.string_to_int[name], value)
+
+ self.string_to_int[name] = value
+
+ # Now, process all of the API versions and extensions that
+ # provide enums, so we can decide what name to call any hex
+ # value.
+ for feature in xml.findall('feature'):
+ feature_name = feature.get('name')
+ # Skip some of the extensions, to reduce the diffs from this commit.
+ if feature_name in ['GL_VERSION_4_3',
+ 'GL_VERSION_4_4',
+ 'GL_VERSION_4_5',
+ 'GL_ES_VERSION_3_1']:
+ continue
+
+ # Give priority to the older versions of various symbol
+ # names, since Mesa tended to have the older ones.
+ m = re.match('GL_VERSION_([0-9])_([0-9])', feature_name)
+ if m:
+ feature_prio = int(m.group(1) + m.group(2))
+ else:
+ m = re.match('GL_ES_VERSION_([0-9])_([0-9])', feature_name)
+ if m:
+ feature_prio = int(m.group(1) + m.group(2))
+ else:
+ feature_prio = 200
+
+ for enum in feature.findall('require/enum'):
+ self.add_enum_provider(enum.get('name'), feature_prio)
+
+ for extension in xml.findall('extensions/extension'):
+ self.process_extension(extension)
def _parser():
@@ -213,10 +544,10 @@ def _parser():
def main():
args = _parser()
- api_list = [gl_XML.parse_GL_API(args.input_file)]
+ xml = ET.parse(args.input_file)
printer = PrintGlEnums()
- printer.Print(api_list)
+ printer.Print(xml)
if __name__ == '__main__':
--
2.6.2
More information about the mesa-dev
mailing list