diff options
| author | Chia-I Wu <olv@lunarg.com> | 2015-01-04 10:19:50 +0800 |
|---|---|---|
| committer | Courtney Goeltzenleuchter <courtney@LunarG.com> | 2015-02-04 17:58:04 -0700 |
| commit | 0e51f2aedf4c3122d6a9e7b25a4efbebaf47f3b7 (patch) | |
| tree | ae68f05bbf2f7a60541863705dff5ba42bf13400 | |
| parent | 21867ab7593e2f927ab01e2040ae660f235e9118 (diff) | |
| download | usermoji-0e51f2aedf4c3122d6a9e7b25a4efbebaf47f3b7.tar.xz | |
xgl-generate.py: add DispatchTableOpsSubcommand
It can generate functions to initialize and lookup a dispatch table.
| -rwxr-xr-x | xgl-generate.py | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/xgl-generate.py b/xgl-generate.py index 9af4202b..77015f69 100755 --- a/xgl-generate.py +++ b/xgl-generate.py @@ -175,6 +175,73 @@ class LoaderEntrypointsSubcommand(Subcommand): return "\n\n".join(body) +class DispatchTableOpsSubcommand(Subcommand): + def run(self): + if len(self.argv) != 1: + print("DispatchTableOpsSubcommand: <prefix> unspecified") + return + + self.prefix = self.argv[0] + super().run() + + def generate_header(self): + return "\n".join(["#include <xgl.h>", + "#include <xglLayer.h>", + "#include <string.h>"]) + + def _generate_init(self): + stmts = [] + for proto in self.protos: + if proto.name == "GetProcAddr": + stmts.append("table->%s = gpa; /* direct assignment */" % + proto.name) + else: + stmts.append("table->%s = (%sType) gpa(gpu, \"xgl%s\");" % + (proto.name, proto.name, proto.name)) + + func = [] + func.append("static inline void %s_initialize_dispatch_table(XGL_LAYER_DISPATCH_TABLE *table," + % self.prefix) + func.append("%s GetProcAddrType gpa," + % (" " * len(self.prefix))) + func.append("%s XGL_PHYSICAL_GPU gpu)" + % (" " * len(self.prefix))) + func.append("{") + func.append(" %s" % "\n ".join(stmts)) + func.append("}") + + return "\n".join(func) + + def _generate_lookup(self): + lookups = [] + for proto in self.protos: + lookups.append("if (!strcmp(name, \"%s\"))" % (proto.name)) + lookups.append(" return (void *) table->%s;" + % (proto.name)) + + func = [] + func.append("static inline void *%s_lookup_dispatch_table(const XGL_LAYER_DISPATCH_TABLE *table," + % self.prefix) + func.append("%s const char *name)" + % (" " * len(self.prefix))) + func.append("{") + func.append(" if (!name || name[0] != 'x' || name[1] != 'g' || name[2] != 'l')") + func.append(" return NULL;") + func.append("") + func.append(" name += 3;") + func.append(" %s" % "\n ".join(lookups)) + func.append("") + func.append(" return NULL;") + func.append("}") + + return "\n".join(func) + + def generate_body(self): + body = [self._generate_init(), + self._generate_lookup()] + + return "\n\n".join(body) + class IcdDummyEntrypointsSubcommand(Subcommand): def run(self): if len(self.argv) == 1: @@ -245,6 +312,7 @@ class IcdGetProcAddrSubcommand(IcdDummyEntrypointsSubcommand): def main(): subcommands = { "loader-entrypoints": LoaderEntrypointsSubcommand, + "dispatch-table-ops": DispatchTableOpsSubcommand, "icd-dummy-entrypoints": IcdDummyEntrypointsSubcommand, "icd-get-proc-addr": IcdGetProcAddrSubcommand, } |
