[Mesa-dev] [RFC 08/13] mapi/glapi/gen: Use new infastructure for gl_marshal_h.py

Dylan Baker dylan at pnwbakers.com
Fri Nov 23 22:27:57 UTC 2018


This is identical, except for 240 new entries that weren't generated. I
believe this is a bug in the current implementation because the mesa XML
is wrong (surprise!), namely that it lacks metadata for a number of
functions that take arrays about the length of those arrays.
---
 src/mapi/glapi/gen/Makefile.am     |  11 ++-
 src/mapi/glapi/gen/gl_marshal_h.py | 104 +++++++++++++++++++----------
 src/mapi/glapi/gen/meson.build     |  10 ++-
 src/mapi/glapi/meson.build         |   2 +
 src/mesa/main/meson.build          |  11 +--
 5 files changed, 97 insertions(+), 41 deletions(-)

diff --git a/src/mapi/glapi/gen/Makefile.am b/src/mapi/glapi/gen/Makefile.am
index 2e37060da95..d2c5eb71e8d 100644
--- a/src/mapi/glapi/gen/Makefile.am
+++ b/src/mapi/glapi/gen/Makefile.am
@@ -239,6 +239,13 @@ COMMON = $(API_XML) \
 COMMON_GLX = $(COMMON) glX_API.xml glX_XML.py glX_proto_common.py
 
 PYTHON_GEN = $(AM_V_GEN)$(PYTHON) $(PYTHON_FLAGS)
+COMMON_NEW = \
+	../registry/gl.xml \
+	helpers.py \
+	khr_xml.py \
+	mesa_data.py \
+	templates/copyright.mako \
+	templates/helpers.mako
 
 ######################################################################
 
@@ -307,8 +314,8 @@ $(MESA_DIR)/main/api_exec.c: gl_genexec.py apiexec.py $(COMMON)
 $(MESA_DIR)/main/marshal_generated.c: gl_marshal.py marshal_XML.py $(COMMON)
 	$(PYTHON_GEN) $(srcdir)/gl_marshal.py -f $(srcdir)/gl_and_es_API.xml > $@
 
-$(MESA_DIR)/main/marshal_generated.h: gl_marshal_h.py marshal_XML.py $(COMMON)
-	$(PYTHON_GEN) $(srcdir)/gl_marshal_h.py -f $(srcdir)/gl_and_es_API.xml > $@
+$(MESA_DIR)/main/marshal_generated.h: gl_marshal_h.py $(COMMON_NEW)
+	$(PYTHON_GEN) $(srcdir)/gl_marshal_h.py $(srcdir)/../registry/gl.xml $(srcdir)/templates $@
 
 $(MESA_DIR)/main/dispatch.h: gl_table.py $(COMMON)
 	$(PYTHON_GEN) $(srcdir)/gl_table.py -f $(srcdir)/gl_and_es_API.xml -m remap_table > $@
diff --git a/src/mapi/glapi/gen/gl_marshal_h.py b/src/mapi/glapi/gen/gl_marshal_h.py
index 619754e05c6..abc6afc4cdf 100644
--- a/src/mapi/glapi/gen/gl_marshal_h.py
+++ b/src/mapi/glapi/gen/gl_marshal_h.py
@@ -21,60 +21,96 @@
 # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 # IN THE SOFTWARE.
 
-from __future__ import print_function
+from __future__ import absolute_import, division, print_function, unicode_literals
 import argparse
+import io
+import os
+import xml.etree.cElementTree as et
 
-import gl_XML
-import license
-import marshal_XML
-import sys
+from mako.lookup import TemplateLookup
 
+from mesa_data import ExecType, MarshalType
+import khr_xml
 
-header = """
-#ifndef MARSHAL_GENERATABLE_H
-#define MARSHAL_GENERATABLE_H
-"""
 
-footer = """
-#endif /* MARSHAL_GENERATABLE_H */
+TEMPLATE = """\
+<%namespace name="helpers" file="helpers.mako"/>
+<%include file="copyright.mako"/>
+
+${helpers.start_guard(guard)}
+
+enum marshal_dispatch_cmd_id
+{
+% for func in functions:
+   DISPATCH_CMD_${func},
+% endfor
+};
+
+${helpers.end_guard(guard)}
 """
 
 
-class PrintCode(gl_XML.gl_print_base):
-    def __init__(self):
-        super(PrintCode, self).__init__()
+def gen_functions(xml):
+    """Generator that gets the name of each command in OpenGL and yeilds it.
 
-        self.name = 'gl_marshal_h.py'
-        self.license = license.bsd_license_template % (
-            'Copyright (C) 2012 Intel Corporation', 'INTEL CORPORATION')
+    Ignores commands with special marshaling requirements.
+    """
+    for func in khr_xml.make_functions(xml):
+        # If the function is not in our records we don't implement it, at all,
+        # skip it
+        if not func.is_implemented():
+            continue
 
-    def printRealHeader(self):
-        print(header)
+        # Don't marshal aliases
+        if func.mesa.alias:
+            continue
 
-    def printRealFooter(self):
-        print(footer)
+        if func.mesa.marshal is MarshalType.SYNC:
+            continue
 
-    def printBody(self, api):
-        print('enum marshal_dispatch_cmd_id')
-        print('{')
-        for func in api.functionIterateAll():
-            flavor = func.marshal_flavor()
-            if flavor in ('skip', 'sync'):
-                continue
-            print('   DISPATCH_CMD_{0},'.format(func.name))
-        print('};')
+        if func.mesa.marshal not in [MarshalType.DEFAULT, MarshalType.DRAW]:
+            yield func.name
+            continue
 
+        if func.mesa.exectype is ExecType.SKIP:
+            continue
+
+        if func.return_type != 'void':
+            continue
+
+        if func.mesa.output:
+            continue
+
+        for param in func.params:
+            if (param.is_pointer() and param.len is None and not
+                    (func.mesa.marshal is MarshalType.DRAW and
+                     param.name == 'indices')):
+                break
+        else:
+            yield func.name
 
 
 def main():
     parser = argparse.ArgumentParser()
-    parser.add_argument('-f', '--filename', metavar='input_file_name', default='gl_API.xml')
+    parser.add_argument('registry')
+    parser.add_argument('templatedir')
+    parser.add_argument('outfile')
     args = parser.parse_args()
 
-    printer = PrintCode()
+    lookup = TemplateLookup(directories=[args.templatedir],
+                            input_encoding='utf-8',
+                            output_encoding='utf-8')
+    lookup.put_string('main', TEMPLATE)
+
+    tree = et.parse(args.registry)
+    root = tree.getroot()
 
-    api = gl_XML.parse_GL_API(args.filename, marshal_XML.marshal_item_factory())
-    printer.Print(api)
+    with io.open(args.outfile, 'wb') as f:
+        f.write(lookup.get_template('main').render(
+            functions=gen_functions(root),
+            guard='MARSHAL_GENERATABLE',
+            copyrights=['Copyright (C) 2012 Intel Corporation'],
+            script=os.path.basename(__file__)))
 
 
 if __name__ == '__main__':
diff --git a/src/mapi/glapi/gen/meson.build b/src/mapi/glapi/gen/meson.build
index f494e9707b6..97312596c9c 100644
--- a/src/mapi/glapi/gen/meson.build
+++ b/src/mapi/glapi/gen/meson.build
@@ -134,6 +134,14 @@ api_xml_files = files(
   'GL4x.xml',
 )
 
+glapi_new_gen_depends = files(
+  'helpers.py',
+  'khr_xml.py',
+  'mesa_data.py',
+  'templates/copyright.mako',
+  'templates/helpers.mako',
+)
+
 glapi_gen_depends = files(
   'gl_XML.py',
   'glX_XML.py',
@@ -195,7 +203,7 @@ glapi_gentable_c = custom_target(
 
 main_enums_c = custom_target(
   'enums.c',
-  input : ['gl_enums.py', files('../registry/gl.xml')],
+  input : ['gl_enums.py', files_gl_xml],
   output : 'enums.c',
   command : [prog_python, '@INPUT0@', '-f', '@INPUT1@'],
   capture : true,
diff --git a/src/mapi/glapi/meson.build b/src/mapi/glapi/meson.build
index 7e8bc38a817..2c9efeab917 100644
--- a/src/mapi/glapi/meson.build
+++ b/src/mapi/glapi/meson.build
@@ -18,6 +18,8 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
+files_gl_xml = files('registry/gl.xml')
+
 subdir('gen')
 
 inc_glapi = include_directories('.')
diff --git a/src/mesa/main/meson.build b/src/mesa/main/meson.build
index a5f0e02c6cd..56d070f224b 100644
--- a/src/mesa/main/meson.build
+++ b/src/mesa/main/meson.build
@@ -29,11 +29,14 @@ main_dispatch_h = custom_target(
 
 main_marshal_generated_h = custom_target(
   'marshal_generated.h',
-  input : [files('../../mapi/glapi/gen/gl_marshal_h.py'), gl_and_es_api_files],
+  input : ['../../mapi/glapi/gen/gl_marshal_h.py', files_gl_xml],
   output : 'marshal_generated.h',
-  command : [prog_python, '@INPUT0@', '-f', '@INPUT1@'],
-  depend_files : files('../../mapi/glapi/gen/marshal_XML.py') + glapi_gen_depends,
-  capture : true,
+  command : [
+    prog_python, '@INPUT0@', '@INPUT1@', 
+    join_paths(meson.current_source_dir(), '../../mapi/glapi/gen/templates'),
+    '@OUTPUT@',
+  ],
+  depend_files : glapi_new_gen_depends,
 )
 
 main_remap_helper_h = custom_target(
-- 
2.19.2



More information about the mesa-dev mailing list