summaryrefslogtreecommitdiff
path: root/tests/util/piglit-dispatch-gen.h.mako
diff options
context:
space:
mode:
authorChad Versace <chad.versace@linux.intel.com>2014-06-10 17:21:59 -0700
committerChad Versace <chad.versace@linux.intel.com>2014-06-23 02:37:36 -0700
commitac1f382db9d3ea5c69870a2bcd62a24bdb81ec5b (patch)
tree0daee8d6b4b854e3f776a812045e0f06f6036780 /tests/util/piglit-dispatch-gen.h.mako
parentdef993a75d909baa56142d51ee0f503f1d52f51a (diff)
dispatch: Generate piglit-dispatch from Khronos XML
Khronos now generates its headers from XML and no longer maintains the old, crufty *.spec files. Piglit should do the same. Otherwise, piglit-dispatch won't be able to pick up new extension functions. As a really really big bonus, after Piglit starts generating its GL dispatch code from gl.xml, it will be a small step to start generating EGL and GLX dispatch from egl.xml and glx.xml. This patch imports 'gl.xml' into a new toplevel "registry" directory, to follow the precedent of libepoxy. This patch follows the precedent of libepoxy by importing "gl.xml" into a new toplevel "registry" directory. I did *not* try to redesign piglit-dispatch in this patch. To the contrary, I attempted to keep the newly generated dispatch code to be as similar as possible as the old generated code. Despite wanting to clean up piglit-dispatch's design, I refrained because "a patch should do one thing, and do it well". I strove to keep separate concerns in separate files. File "registry/gl.py" parses "registry/gl.xml". File "tests/util/gen_dispatch.py" generates code from the that parsed result. This decision kept gen_dispatch.py small and focused. I hope everyone finds the rewritten gen_dispatch.py more maintainable and easy to read. The generated code has changed as following: - It now contains the GLES1 API, because gl.xml contains information on all OpenGL APIs. - The comment block for each function alias set now contains more information. For each function in the set, it now lists the complete set of providers. For example: /* glActiveTexture (GL_VERSION_1_3) (GL_VERSION_ES_CM_1_0) (GL_ES_VERSION_2_0) */ /* glActiveTextureARB (GL_ARB_multitexture) */ extern PFNGLACTIVETEXTUREPROC piglit_dispatch_glActiveTexture; #define glActiveTexture piglit_dispatch_glActiveTexture #define glActiveTextureARB piglit_dispatch_glActiveTexture - Enums are sorted by group then by value. Old dispatch sorted only by value. For example: /* Enum Group MapBufferUsageMask */ #define GL_MAP_READ_BIT 0x0001 #define GL_MAP_READ_BIT_EXT 0x0001 #define GL_MAP_WRITE_BIT 0x0002 #define GL_MAP_WRITE_BIT_EXT 0x0002 ... Tested for regressions with: piglit run -p x11_egl -x glx -x glean Mesa 10.2.1 Intel Ivybridge Fedora 20 v3, for Dylan: - Replace ElementTree with cElementTree, for speed. - Each method $foo in KeyedOrderedSet that returns a generator, rename it to iter${foo} to follow Python2 (not 3) naming conventions. - Python 2.6 lacks OrderedDict, so don't use it. - Remove unused import 'dedent'. - Python 2.6 does not recognize the syntax for set literals, so replace each set literal with a list literal or generator literal. - Replace sys.stderr.write with print(file=sys.stderr). - Remove hand-coded OrderedKeyedSet.copy and instead use copy module. - Prefer the 'lxml' module (it uses libxml2) over Python's builtin 'xml' module. - Replace methods ``def foo(x, y):`` with ``def foo(self, other):``. - Replace lists with generators in methods Command.c_*_param_list. - PEP8: Separate all toplevel items with 2 newlines. - PEP8: Fix minor whitespace issues. - PEP8: Replace some ``== None`` with ``is None``. - Replace None-check for --out-dir with add_argument(..., required=True) - Remove 'prog' assignment when calling ArgumentParser(prog=PROG_NAME). Instead, use default value Signed-off-by: Chad Versace <chad.versace@linux.intel.com>
Diffstat (limited to 'tests/util/piglit-dispatch-gen.h.mako')
-rw-r--r--tests/util/piglit-dispatch-gen.h.mako82
1 files changed, 82 insertions, 0 deletions
diff --git a/tests/util/piglit-dispatch-gen.h.mako b/tests/util/piglit-dispatch-gen.h.mako
new file mode 100644
index 000000000..feb4be848
--- /dev/null
+++ b/tests/util/piglit-dispatch-gen.h.mako
@@ -0,0 +1,82 @@
+/**
+ * ${warning}
+ *
+ * Copyright 2014 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+<%block filter='fake_whitespace'>\
+#pragma once
+
+#ifndef __PIGLIT_DISPATCH_GEN_H__
+#define __PIGLIT_DISPATCH_GEN_H__
+
+##
+## Define function pointer typedefs, such as PFNGLACCUMPROC.
+##
+% for f in sorted(gl_registry.commands):
+typedef ${f.c_return_type} (APIENTRY *PFN${f.name.upper()}PROC)(${f.c_named_param_list});
+% endfor
+
+##
+## Emit macro wrapper for each dispatch function. For example,
+##
+## #define glAttachObjectARB piglit_dispatch_glAttachShader
+##
+% for alias_set in gl_registry.command_alias_map:
+<% f0 = alias_set.primary_command %>\
+% for command in alias_set:
+/* ${command.name}
+% for requirement in command.requirements:
+.................. (${requirement.provider.name})
+% endfor
+................................................. */
+% endfor
+extern PFN${f0.name.upper()}PROC piglit_dispatch_${f0.name};
+% for command in alias_set:
+#define ${command.name} piglit_dispatch_${f0.name}
+% endfor
+
+% endfor
+##
+## Define enums.
+##
+% for enum_group in gl_registry.enum_groups:
+% if len(enum_group.enums) > 0:
+/* Enum Group ${enum_group.name} */
+% for enum in enum_group.enums:
+#define ${enum.name} ${enum.c_num_literal}
+% endfor
+
+% endif
+% endfor
+/* Extensions */
+% for extension in gl_registry.extensions:
+#define ${extension.name} 1
+% endfor
+
+/* Versions */
+% for feature in gl_registry.features:
+#define ${feature.name} 1
+% endfor
+
+#endif /* __PIGLIT_DISPATCH_GEN_H__ */
+</%block>\