mesa: Switch to using the Khronos registry for generating enums.
authorEric Anholt <eric@anholt.net>
Thu, 17 Sep 2015 23:10:28 +0000 (19:10 -0400)
committerEric Anholt <eric@anholt.net>
Tue, 1 Dec 2015 18:24:34 +0000 (10:24 -0800)
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)

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/mapi/glapi/gen/Makefile.am
src/mapi/glapi/gen/gl_enums.py

index 40b0e6599f4d9d43c06fcf6e0c92e196a55823cf..2da8f7ddd9d4ef57d277f836ee6ef988cba28074 100644 (file)
@@ -270,8 +270,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 > $@
index d61f260f528bbe5710b56b16daa19b6ffd3fe2c9..c8199e29f5c14439dcf7d15866512f1559375a40 100644 (file)
@@ -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__':