summaryrefslogtreecommitdiffstats
path: root/src/mapi/glapi/gen
diff options
context:
space:
mode:
authorPaul Berry <[email protected]>2012-10-30 16:21:18 -0700
committerPaul Berry <[email protected]>2012-11-06 12:57:44 -0800
commit679df028e757613ddc5a9e84f3c5289c941369da (patch)
tree020622400aca9439b5e5a3a0793f45d1090844c6 /src/mapi/glapi/gen
parent91b5a741f6788412799324ca11ff28f0d6afa066 (diff)
glapi/gen: handle new XML attributes.
This patch updates gl_XML.py to parse the new XML attributes "exec", "desktop", "deprecated", and "mesa_name", which will be needed to code generate _mesa_create_exec_table(). Reviewed-by: Jordan Justen <[email protected]> Reviewed-by: Matt Turner <[email protected]>
Diffstat (limited to 'src/mapi/glapi/gen')
-rw-r--r--src/mapi/glapi/gen/gl_XML.py65
1 files changed, 63 insertions, 2 deletions
diff --git a/src/mapi/glapi/gen/gl_XML.py b/src/mapi/glapi/gen/gl_XML.py
index 92bbb86ee79..47f8dd5b962 100644
--- a/src/mapi/glapi/gen/gl_XML.py
+++ b/src/mapi/glapi/gen/gl_XML.py
@@ -594,6 +594,46 @@ class gl_parameter(object):
return self.type_expr.format_string()
+# Regular expression used to parse "mesa_name" attributes. A
+# mesa_name attribute describes how to adjust a GL function name
+# suffix to obtain the name of the function in Mesa that implements
+# the functionality. The attribute string consists of a part preceded
+# by a "-", indicating the suffix to remove, and a part preceded by a
+# "+" indicating the suffix to add. Either part is optional.
+#
+# For example:
+#
+# <function name="EnableIndexedEXT" mesa_name="-EXT">...</function>
+# <function name="IsProgramNV" mesa_name="-NV+ARB">...</function>
+#
+# means that EnableIndexedEXT is implemented by a Mesa function called
+# _mesa_EnableIndexed, and IsProgramNV is implemented by a Mesa function
+# called _mesa_IsProgramARB.
+#
+# Note: the prefix "_mesa_" is handled separately, by the "exec"
+# attribute.
+name_modification_regexp = re.compile(
+ r'^(-(?P<minus>[a-zA-Z0-9_]+))?(\+(?P<plus>[a-zA-Z0-9_]+))?$')
+
+
+# Interpret a "mesa_name" attribute (see above) to determine the
+# appropriate suffix for the Mesa function implementing a piece of GL
+# functionality, and return the properly suffixed name.
+def interpret_name_modification(name, mod):
+ m = name_modification_regexp.match(mod)
+ if m is None:
+ raise Exception('Unintelligible mesa_name property: {0!r}'.format(mod))
+ new_name = name
+ if m.group('minus'):
+ if not new_name.endswith(m.group('minus')):
+ raise Exception(
+ 'Cannot subtract suffix {0!r} from function {1}'.format(
+ m.group('minus'), name))
+ new_name = new_name[:-len(m.group('minus'))]
+ if m.group('plus'):
+ new_name += m.group('plus')
+ return new_name
+
class gl_function( gl_item ):
def __init__(self, element, context):
@@ -606,6 +646,10 @@ class gl_function( gl_item ):
self.offset = -1
self.initialized = 0
self.images = []
+ self.exec_flavor = 'mesa'
+ self.desktop = True
+ self.deprecated = None
+ self.mesa_name = None
# self.entry_point_api_map[name][api] is a decimal value
# indicating the earliest version of the given API in which
@@ -665,13 +709,24 @@ class gl_function( gl_item ):
version_decimal < self.api_map[api]:
self.api_map[api] = version_decimal
+ exec_flavor = element.nsProp('exec', None)
+ if exec_flavor:
+ self.exec_flavor = exec_flavor
+
+ deprecated = element.nsProp('deprecated', None)
+ if deprecated != 'none':
+ self.deprecated = Decimal(deprecated)
+
+ if not is_attr_true(element, 'desktop'):
+ self.desktop = False
+
if alias:
true_name = alias
else:
true_name = name
- # Only try to set the offset when a non-alias
- # entry-point is being processes.
+ # Only try to set the offset and mesa_name when a
+ # non-alias entry-point is being processed.
offset = element.nsProp( "offset", None )
if offset:
@@ -683,6 +738,12 @@ class gl_function( gl_item ):
if offset == "assign":
self.assign_offset = 1
+ mesa_name = element.nsProp('mesa_name', None)
+ if mesa_name is None:
+ self.mesa_name = name
+ else:
+ self.mesa_name = interpret_name_modification(name, mesa_name)
+
if not self.name:
self.name = true_name