• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python3
2
3# Copyright (C) 2010 LunarG Inc.
4# (C) Copyright 2015, NVIDIA CORPORATION.
5#
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:
12#
13# The above copyright notice and this permission notice shall be included
14# in all copies or substantial portions of the Software.
15#
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.
23#
24# Authors:
25#    Kyle Brenneman <kbrenneman@nvidia.com>
26#
27# Based on code ogiginally by:
28#    Chia-I Wu <olv@lunarg.com>
29
30
31"""
32Generates the glapi_mapi_tmp.h header file from Khronos's XML file.
33"""
34
35import sys
36import xml.etree.ElementTree as etree
37
38import genCommon
39
40def _main():
41    target = sys.argv[1]
42    xmlFiles = sys.argv[2:]
43
44    roots = [ etree.parse(filename).getroot() for filename in xmlFiles ]
45    allFunctions = genCommon.getFunctionsFromRoots(roots)
46
47    names = genCommon.getExportNamesFromRoots(target, roots)
48    functions = [f for f in allFunctions if(f.name in names)]
49
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))))
54
55    print(r"""
56/* This file is automatically generated by mapi_abi.py.  Do not modify. */
57
58#ifndef _GLAPI_TMP_H_
59#define _GLAPI_TMP_H_
60typedef int GLclampx;
61#endif /* _GLAPI_TMP_H_ */
62""".lstrip("\n"))
63
64    print(generate_defines(functions))
65    if target == "gldispatch":
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    if target == "gldispatch":
71        print(generate_public_entries_table(functions))
72    print(generate_undef_public_entries())
73    print(generate_stub_asm_gcc(functions))
74
75def generate_defines(functions):
76    text = r"""
77#ifdef MAPI_TMP_DEFINES
78#define GL_GLEXT_PROTOTYPES
79#include "GL/gl.h"
80#include "GL/glext.h"
81
82""".lstrip("\n")
83    for func in functions:
84        text += "GLAPI {f.rt} APIENTRY {f.name}({f.decArgs});\n".format(f=func)
85    text += "#undef MAPI_TMP_DEFINES\n"
86    text += "#endif /* MAPI_TMP_DEFINES */\n"
87    return text
88
89def generate_table(functions, allFunctions):
90    text = "#ifdef MAPI_TMP_TABLE\n"
91    text += "#define MAPI_TABLE_NUM_STATIC %d\n" % (len(allFunctions))
92    text += "#define MAPI_TABLE_NUM_DYNAMIC %d\n" % (genCommon.MAPI_TABLE_NUM_DYNAMIC,)
93    text += "#undef MAPI_TMP_TABLE\n"
94    text += "#endif /* MAPI_TMP_TABLE */\n"
95    return text
96
97def generate_noop_array(functions):
98    text = "#ifdef MAPI_TMP_NOOP_ARRAY\n"
99    text += "#ifdef DEBUG\n\n"
100
101    for func in functions:
102        text += "static {f.rt} APIENTRY noop{f.basename}({f.decArgs})\n".format(f=func)
103        text += "{\n"
104        if (len(func.args) > 0):
105            text += "  "
106            for arg in func.args:
107                text += " (void) {a.name};".format(a=arg)
108            text += "\n"
109        text += "   noop_warn(\"{f.name}\");\n".format(f=func)
110        if (func.hasReturn()):
111            text += "   return ({f.rt}) 0;\n".format(f=func)
112        text += "}\n\n"
113
114    text += "const mapi_func table_noop_array[] = {\n"
115    for func in functions:
116        text += "   (mapi_func) noop{f.basename},\n".format(f=func)
117    for i in range(genCommon.MAPI_TABLE_NUM_DYNAMIC - 1):
118        text += "   (mapi_func) noop_generic,\n"
119    text += "   (mapi_func) noop_generic\n"
120    text += "};\n\n"
121    text += "#else /* DEBUG */\n\n"
122    text += "const mapi_func table_noop_array[] = {\n"
123    for i in range(len(functions) + genCommon.MAPI_TABLE_NUM_DYNAMIC - 1):
124        text += "   (mapi_func) noop_generic,\n"
125    text += "   (mapi_func) noop_generic\n"
126
127    text += "};\n\n"
128    text += "#endif /* DEBUG */\n"
129    text += "#undef MAPI_TMP_NOOP_ARRAY\n"
130    text += "#endif /* MAPI_TMP_NOOP_ARRAY */\n"
131    return text
132
133def generate_public_stubs(functions):
134    text = "#ifdef MAPI_TMP_PUBLIC_STUBS\n"
135
136    text += "static const struct mapi_stub public_stubs[] = {\n"
137    for func in functions:
138        text += "   { \"%s\", %d, NULL },\n" % (func.name, func.slot)
139    text += "};\n"
140    text += "#undef MAPI_TMP_PUBLIC_STUBS\n"
141    text += "#endif /* MAPI_TMP_PUBLIC_STUBS */\n"
142    return text
143
144def generate_public_entries(functions):
145    text = "#ifdef MAPI_TMP_PUBLIC_ENTRIES_NO_HIDDEN\n"
146
147    for func in functions:
148        retStr = ("return " if func.hasReturn() else "")
149        text += r"""
150GLAPI {f.rt} APIENTRY {f.name}({f.decArgs})
151{{
152   const struct _glapi_table *_tbl = entry_current_get();
153   mapi_func _func = ((const mapi_func *) _tbl)[{f.slot}];
154   {retStr}(({f.rt} (APIENTRY *)({f.decArgs})) _func)({f.callArgs});
155}}
156
157""".lstrip("\n").format(f=func, retStr=retStr)
158
159    text += "\n"
160    text += "#endif /* MAPI_TMP_PUBLIC_ENTRIES_NO_HIDDEN */\n"
161    return text
162
163def generate_public_entries_table(functions):
164    text = "#ifdef MAPI_TMP_PUBLIC_ENTRIES_NO_HIDDEN\n"
165    text += "static const mapi_func public_entries[] = {\n"
166    for func in functions:
167        text += "   (mapi_func) %s,\n" % (func.name,)
168    text += "};\n"
169    text += "#endif /* MAPI_TMP_PUBLIC_ENTRIES_NO_HIDDEN */\n"
170    return text
171
172def generate_undef_public_entries():
173    text = "#ifdef MAPI_TMP_PUBLIC_ENTRIES_NO_HIDDEN\n"
174    text += "#undef MAPI_TMP_PUBLIC_ENTRIES_NO_HIDDEN\n"
175    text += "#endif /* MAPI_TMP_PUBLIC_ENTRIES_NO_HIDDEN */\n"
176    return text
177
178def generate_stub_asm_gcc(functions):
179    text = "#ifdef MAPI_TMP_STUB_ASM_GCC_NO_HIDDEN\n"
180    text += "__asm__(\n"
181
182    for func in functions:
183        text += 'STUB_ASM_ENTRY("%s")"\\n"\n' % (func.name,)
184        text += '"\\t"STUB_ASM_CODE("%d")"\\n"\n\n' % (func.slot,)
185
186    text += ");\n"
187    text += "#undef MAPI_TMP_STUB_ASM_GCC_NO_HIDDEN\n"
188    text += "#endif /* MAPI_TMP_STUB_ASM_GCC_NO_HIDDEN */\n"
189    return text
190
191if (__name__ == "__main__"):
192    _main()
193
194