3 # Copyright (C) 2010 LunarG Inc.
4 # (C) Copyright 2015, NVIDIA CORPORATION.
6 # Permission is hereby granted, free of charge, to any person obtaining a
7 # copy of this software and associated documentation files (the "Software"),
8 # to deal in the Software without restriction, including without limitation
9 # the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 # and/or sell copies of the Software, and to permit persons to whom the
11 # Software is furnished to do so, subject to the following conditions:
13 # The above copyright notice and this permission notice shall be included
14 # in all copies or substantial portions of the Software.
16 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 # DEALINGS IN THE SOFTWARE.
25 # Kyle Brenneman <kbrenneman@nvidia.com>
27 # Based on code ogiginally by:
28 # Chia-I Wu <olv@lunarg.com>
32 Generates the glapi_mapi_tmp.h header file from Khronos's XML file.
36 import xml
.etree
.cElementTree
as etree
42 xmlFiles
= sys
.argv
[2:]
44 roots
= [ etree
.parse(filename
).getroot() for filename
in xmlFiles
]
45 allFunctions
= genCommon
.getFunctionsFromRoots(roots
)
47 names
= genCommon
.getExportNamesFromRoots(target
, roots
)
48 functions
= [f
for f
in allFunctions
if(f
.name
in names
)]
50 if (target
in ("gl", "gldispatch")):
51 assert(len(functions
) == len(allFunctions
))
52 assert(all(functions
[i
] == allFunctions
[i
] for i
in range(len(functions
))))
53 assert(all(functions
[i
].slot
== i
for i
in range(len(functions
))))
56 /* This file is automatically generated by mapi_abi.py. Do not modify. */
61 typedef void (APIENTRY *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);
62 #endif /* _GLAPI_TMP_H_ */
65 print(generate_defines(functions
))
66 print(generate_table(functions
, allFunctions
))
67 print(generate_noop_array(functions
))
68 print(generate_public_stubs(functions
))
69 print(generate_public_entries(functions
))
70 print(generate_stub_asm_gcc(functions
))
72 def generate_defines(functions
):
74 #ifdef MAPI_TMP_DEFINES
75 #define GL_GLEXT_PROTOTYPES
80 for func
in functions
:
81 text
+= "GLAPI {f.rt} APIENTRY {f.name}({f.decArgs});\n".format(f
=func
)
82 text
+= "#undef MAPI_TMP_DEFINES\n"
83 text
+= "#endif /* MAPI_TMP_DEFINES */\n"
86 def generate_table(functions
, allFunctions
):
87 text
= "#ifdef MAPI_TMP_TABLE\n"
88 text
+= "#define MAPI_TABLE_NUM_STATIC %d\n" % (len(allFunctions
))
89 text
+= "#define MAPI_TABLE_NUM_DYNAMIC %d\n" % (genCommon
.MAPI_TABLE_NUM_DYNAMIC
,)
90 text
+= "#undef MAPI_TMP_TABLE\n"
91 text
+= "#endif /* MAPI_TMP_TABLE */\n"
94 def generate_noop_array(functions
):
95 text
= "#ifdef MAPI_TMP_NOOP_ARRAY\n"
96 text
+= "#ifdef DEBUG\n\n"
98 for func
in functions
:
99 text
+= "static {f.rt} APIENTRY noop{f.basename}({f.decArgs})\n".format(f
=func
)
101 if (len(func
.args
) > 0):
103 for arg
in func
.args
:
104 text
+= " (void) {a.name};".format(a
=arg
)
106 text
+= " noop_warn(\"{f.name}\");\n".format(f
=func
)
107 if (func
.hasReturn()):
108 text
+= " return ({f.rt}) 0;\n".format(f
=func
)
111 text
+= "const mapi_func table_noop_array[] = {\n"
112 for func
in functions
:
113 text
+= " (mapi_func) noop{f.basename},\n".format(f
=func
)
114 for i
in range(genCommon
.MAPI_TABLE_NUM_DYNAMIC
- 1):
115 text
+= " (mapi_func) noop_generic,\n"
116 text
+= " (mapi_func) noop_generic\n"
118 text
+= "#else /* DEBUG */\n\n"
119 text
+= "const mapi_func table_noop_array[] = {\n"
120 for i
in range(len(functions
) + genCommon
.MAPI_TABLE_NUM_DYNAMIC
- 1):
121 text
+= " (mapi_func) noop_generic,\n"
122 text
+= " (mapi_func) noop_generic\n"
125 text
+= "#endif /* DEBUG */\n"
126 text
+= "#undef MAPI_TMP_NOOP_ARRAY\n"
127 text
+= "#endif /* MAPI_TMP_NOOP_ARRAY */\n"
130 def generate_public_stubs(functions
):
131 text
= "#ifdef MAPI_TMP_PUBLIC_STUBS\n"
133 text
+= "static const struct mapi_stub public_stubs[] = {\n"
134 for func
in functions
:
135 text
+= " { \"%s\", %d, NULL },\n" % (func
.name
, func
.slot
)
137 text
+= "#undef MAPI_TMP_PUBLIC_STUBS\n"
138 text
+= "#endif /* MAPI_TMP_PUBLIC_STUBS */\n"
141 def generate_public_entries(functions
):
142 text
= "#ifdef MAPI_TMP_PUBLIC_ENTRIES_NO_HIDDEN\n"
144 for func
in functions
:
145 retStr
= ("return " if func
.hasReturn() else "")
147 GLAPI {f.rt} APIENTRY {f.name}({f.decArgs})
149 const struct _glapi_table *_tbl = entry_current_get();
150 mapi_func _func = ((const mapi_func *) _tbl)[{f.slot}];
151 {retStr}(({f.rt} (APIENTRY *)({f.decArgs})) _func)({f.callArgs});
154 """.lstrip("\n").format(f
=func
, retStr
=retStr
)
157 text
+= "static const mapi_func public_entries[] = {\n"
158 for func
in functions
:
159 text
+= " (mapi_func) %s,\n" % (func
.name
,)
161 text
+= "#undef MAPI_TMP_PUBLIC_ENTRIES_NO_HIDDEN\n"
162 text
+= "#endif /* MAPI_TMP_PUBLIC_ENTRIES_NO_HIDDEN */\n"
165 def generate_stub_asm_gcc(functions
):
166 text
= "#ifdef MAPI_TMP_STUB_ASM_GCC_NO_HIDDEN\n"
169 for func
in functions
:
170 text
+= 'STUB_ASM_ENTRY("%s")"\\n"\n' % (func
.name
,)
171 text
+= '"\\t"STUB_ASM_CODE("%d")"\\n"\n\n' % (func
.slot
,)
174 text
+= "#undef MAPI_TMP_STUB_ASM_GCC_NO_HIDDEN\n"
175 text
+= "#endif /* MAPI_TMP_STUB_ASM_GCC_NO_HIDDEN */\n"
178 if (__name__
== "__main__"):