mapi: Rewrite mapi_abi.py to get rid of preprocessor magic.
The preprocessor magic in mapi was nothing but obfuscation. Rewrite
mapi_abi.py to generate real C code.
This commit removes the hack added in
43121f2086
.
This commit is contained in:
parent
5ae4b6693a
commit
8f2a974cf2
|
@ -0,0 +1 @@
|
||||||
|
api_tmp.h
|
|
@ -42,4 +42,10 @@ C_SOURCES = \
|
||||||
shader.c \
|
shader.c \
|
||||||
shaders_cache.c
|
shaders_cache.c
|
||||||
|
|
||||||
|
GENERATED_SOURCES := api_tmp.h
|
||||||
|
|
||||||
include ../../Makefile.template
|
include ../../Makefile.template
|
||||||
|
|
||||||
|
MAPI := $(TOP)/src/mapi
|
||||||
|
api_tmp.h: $(MAPI)/mapi/mapi_abi.py $(MAPI)/vgapi/vgapi.csv
|
||||||
|
$(PYTHON2) $< --printer vgapi --mode app $(MAPI)/vgapi/vgapi.csv > $@
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
|
|
||||||
Import('*')
|
Import('*')
|
||||||
|
|
||||||
|
from sys import executable as python_cmd
|
||||||
|
|
||||||
env = env.Clone()
|
env = env.Clone()
|
||||||
|
|
||||||
env.Append(CPPPATH = [
|
env.Append(CPPPATH = [
|
||||||
|
@ -40,10 +42,16 @@ vega_sources = [
|
||||||
'mask.c',
|
'mask.c',
|
||||||
'shader.c',
|
'shader.c',
|
||||||
'shaders_cache.c',
|
'shaders_cache.c',
|
||||||
|
'text.c',
|
||||||
]
|
]
|
||||||
|
|
||||||
# vgapi_header must be generated first
|
api_tmp = env.CodeGenerate(
|
||||||
env.Depends(vega_sources, vgapi_header)
|
target = '#/src/gallium/state_trackers/vega/api_tmp.h',
|
||||||
|
script = '#src/mapi/mapi/mapi_abi.py',
|
||||||
|
source = '#src/mapi/vgapi/vgapi.csv',
|
||||||
|
command = python_cmd + ' $SCRIPT --printer vgapi --mode app $SOURCE > $TARGET'
|
||||||
|
)
|
||||||
|
env.Depends(vega_sources, api_tmp)
|
||||||
|
|
||||||
st_vega = env.ConvenienceLibrary(
|
st_vega = env.ConvenienceLibrary(
|
||||||
target = 'st_vega',
|
target = 'st_vega',
|
||||||
|
|
|
@ -28,23 +28,10 @@
|
||||||
|
|
||||||
#include "mapi/mapi.h"
|
#include "mapi/mapi.h"
|
||||||
|
|
||||||
|
/* define vega_spec and vega_procs for use with mapi */
|
||||||
|
#define API_TMP_DEFINE_SPEC
|
||||||
#include "api.h"
|
#include "api.h"
|
||||||
|
|
||||||
static const char vega_spec[] =
|
|
||||||
"1"
|
|
||||||
#define MAPI_ABI_ENTRY(ret, name, params) \
|
|
||||||
"\0" #name "\0"
|
|
||||||
#define MAPI_ALIAS_ENTRY(alias, ret, name, params) \
|
|
||||||
#name "\0"
|
|
||||||
#include "vgapi/vgapi_tmp.h"
|
|
||||||
"\0";
|
|
||||||
|
|
||||||
static const mapi_proc vega_procs[] = {
|
|
||||||
#define MAPI_ABI_ENTRY(ret, name, params) \
|
|
||||||
(mapi_proc) vega ## name,
|
|
||||||
#include "vgapi/vgapi_tmp.h"
|
|
||||||
};
|
|
||||||
|
|
||||||
static void api_init(void)
|
static void api_init(void)
|
||||||
{
|
{
|
||||||
static boolean initialized = FALSE;
|
static boolean initialized = FALSE;
|
||||||
|
|
|
@ -33,10 +33,7 @@
|
||||||
#include "VG/vgext.h"
|
#include "VG/vgext.h"
|
||||||
#include "vg_manager.h"
|
#include "vg_manager.h"
|
||||||
|
|
||||||
/* declare the prototypes */
|
#include "api_tmp.h"
|
||||||
#define MAPI_ABI_ENTRY(ret, name, params) \
|
|
||||||
ret VG_API_ENTRY vega ## name params;
|
|
||||||
#include "vgapi/vgapi_tmp.h"
|
|
||||||
|
|
||||||
struct mapi_table;
|
struct mapi_table;
|
||||||
|
|
||||||
|
|
|
@ -36,8 +36,7 @@
|
||||||
#include "table.h"
|
#include "table.h"
|
||||||
|
|
||||||
/* dynamic stubs will run out before this array */
|
/* dynamic stubs will run out before this array */
|
||||||
#define MAPI_MAX_STUBS (sizeof(struct mapi_table) / sizeof(mapi_func))
|
static const struct mapi_stub *mapi_stub_map[MAPI_TABLE_NUM_SLOTS];
|
||||||
static const struct mapi_stub *mapi_stub_map[MAPI_MAX_STUBS];
|
|
||||||
static int mapi_num_stubs;
|
static int mapi_num_stubs;
|
||||||
|
|
||||||
static const struct mapi_stub *
|
static const struct mapi_stub *
|
||||||
|
@ -145,9 +144,9 @@ mapi_table_create(void)
|
||||||
const struct mapi_table *noop = table_get_noop();
|
const struct mapi_table *noop = table_get_noop();
|
||||||
struct mapi_table *tbl;
|
struct mapi_table *tbl;
|
||||||
|
|
||||||
tbl = malloc(sizeof(*tbl));
|
tbl = malloc(MAPI_TABLE_SIZE);
|
||||||
if (tbl)
|
if (tbl)
|
||||||
memcpy(tbl, noop, sizeof(*tbl));
|
memcpy(tbl, noop, MAPI_TABLE_SIZE);
|
||||||
|
|
||||||
return tbl;
|
return tbl;
|
||||||
}
|
}
|
||||||
|
|
|
@ -202,201 +202,360 @@ def abi_parse(filename):
|
||||||
|
|
||||||
return entries
|
return entries
|
||||||
|
|
||||||
def abi_dynamics():
|
|
||||||
"""Return the dynamic entries."""
|
|
||||||
entries = []
|
|
||||||
for i in xrange(ABI_NUM_DYNAMIC_ENTRIES):
|
|
||||||
cols = ['void', 'dynamic%d' % (i), 'void']
|
|
||||||
attrs = { 'slot': -1, 'hidden': False, 'alias': None }
|
|
||||||
entries.append(ABIEntry(cols, attrs))
|
|
||||||
return entries
|
|
||||||
|
|
||||||
class ABIPrinter(object):
|
class ABIPrinter(object):
|
||||||
"""ABIEntry Printer"""
|
"""MAPI Printer"""
|
||||||
|
|
||||||
def __init__(self, entries, options):
|
def __init__(self, entries):
|
||||||
self.entries = entries
|
self.entries = entries
|
||||||
self.options = options
|
|
||||||
self._undefs = []
|
|
||||||
|
|
||||||
def _add_undefs(self, undefs):
|
# sort entries by their names
|
||||||
self._undefs.extend(undefs)
|
self.entries_sorted_by_names = self.entries[:]
|
||||||
|
self.entries_sorted_by_names.sort(lambda x, y: cmp(x.name, y.name))
|
||||||
|
|
||||||
def output_header(self):
|
self.indent = ' ' * 3
|
||||||
print '/* This file is automatically generated. Do not modify. */'
|
self.noop_warn = 'noop_warn'
|
||||||
print
|
self.noop_generic = 'noop_generic'
|
||||||
|
|
||||||
def output_footer(self):
|
self.api_defines = []
|
||||||
print '/* clean up */'
|
self.api_headers = ['"KHR/khrplatform.h"']
|
||||||
for m in self._undefs:
|
self.api_call = 'KHRONOS_APICALL'
|
||||||
print '#undef %s' % (m)
|
self.api_entry = 'KHRONOS_APIENTRY'
|
||||||
|
self.api_attrs = 'KHRONOS_APIATTRIBUTES'
|
||||||
|
|
||||||
def output_entry(self, ent):
|
def c_header(self):
|
||||||
if ent.slot < 0:
|
return '/* This file is automatically generated by mapi_abi.py. Do not modify. */'
|
||||||
out_ent = 'MAPI_DYNAMIC_ENTRY(%s, %s, (%s))' % \
|
|
||||||
(ent.c_return(), ent.name, ent.c_params())
|
|
||||||
out_code = ''
|
|
||||||
else:
|
|
||||||
if ent.alias:
|
|
||||||
macro_ent = 'MAPI_ALIAS_ENTRY'
|
|
||||||
macro_code = 'MAPI_ALIAS_CODE'
|
|
||||||
else:
|
|
||||||
macro_ent = 'MAPI_ABI_ENTRY'
|
|
||||||
macro_code = 'MAPI_ABI_CODE'
|
|
||||||
|
|
||||||
if ent.ret:
|
def c_includes(self):
|
||||||
macro_code += '_RETURN'
|
"""Return includes of the client API headers."""
|
||||||
|
defines = ['#define ' + d for d in self.api_defines]
|
||||||
|
includes = ['#include ' + h for h in self.api_headers]
|
||||||
|
return "\n".join(defines + includes)
|
||||||
|
|
||||||
|
def c_mapi_table(self):
|
||||||
|
"""Return defines of the dispatch table size."""
|
||||||
|
num_static_entries = 0
|
||||||
|
for ent in self.entries:
|
||||||
|
if not ent.alias:
|
||||||
|
num_static_entries += 1
|
||||||
|
|
||||||
|
return ('#define MAPI_TABLE_NUM_STATIC %d\n' + \
|
||||||
|
'#define MAPI_TABLE_NUM_DYNAMIC %d') % (
|
||||||
|
num_static_entries, ABI_NUM_DYNAMIC_ENTRIES)
|
||||||
|
|
||||||
|
def c_mapi_table_initializer(self, prefix):
|
||||||
|
"""Return the array initializer for mapi_table_fill."""
|
||||||
|
entries = [ent.name for ent in self.entries if not ent.alias]
|
||||||
|
pre = self.indent + '(mapi_proc) ' + prefix
|
||||||
|
return pre + (',\n' + pre).join(entries)
|
||||||
|
|
||||||
|
def c_mapi_table_spec(self):
|
||||||
|
"""Return the spec for mapi_init."""
|
||||||
|
specv1 = []
|
||||||
|
line = '"1'
|
||||||
|
for ent in self.entries:
|
||||||
|
if not ent.alias:
|
||||||
|
line += '\\0"\n'
|
||||||
|
specv1.append(line)
|
||||||
|
line = '"'
|
||||||
|
line += '%s\\0' % ent.name
|
||||||
|
line += '";'
|
||||||
|
specv1.append(line)
|
||||||
|
|
||||||
|
return self.indent + self.indent.join(specv1)
|
||||||
|
|
||||||
|
def _c_decl(self, ent, prefix, need_attr=True):
|
||||||
|
"""Return the C declaration for the entry."""
|
||||||
|
decl = '%s %s %s%s(%s)' % (ent.c_return(), self.api_entry,
|
||||||
|
prefix, ent.name, ent.c_params())
|
||||||
|
if need_attr and self.api_attrs:
|
||||||
|
decl += ' ' + self.api_attrs
|
||||||
|
|
||||||
|
return decl
|
||||||
|
|
||||||
|
def _c_cast(self, ent):
|
||||||
|
"""Return the C cast for the entry."""
|
||||||
|
cast = '%s (%s *)(%s)' % (
|
||||||
|
ent.c_return(), self.api_entry, ent.c_params())
|
||||||
|
|
||||||
|
return cast
|
||||||
|
|
||||||
|
def c_private_declarations(self, prefix):
|
||||||
|
"""Return the declarations of private functions."""
|
||||||
|
decls = [self._c_decl(ent, prefix)
|
||||||
|
for ent in self.entries if not ent.alias]
|
||||||
|
|
||||||
|
return ";\n".join(decls) + ";"
|
||||||
|
|
||||||
|
def c_public_dispatches(self, prefix):
|
||||||
|
"""Return the public dispatch functions."""
|
||||||
|
dispatches = []
|
||||||
|
for ent in self.entries:
|
||||||
if ent.hidden:
|
if ent.hidden:
|
||||||
macro_ent += '_HIDDEN'
|
continue
|
||||||
macro_code += '_HIDDEN'
|
|
||||||
|
|
||||||
if ent.alias:
|
proto = self.api_call + ' ' + self._c_decl(ent, prefix)
|
||||||
out_ent = '%s(%s, %s, %s, (%s))' % (macro_ent,
|
cast = self._c_cast(ent)
|
||||||
ent.alias, ent.c_return(), ent.name, ent.c_params())
|
|
||||||
out_code = '%s(%s, %s, %s, (%s))' % (macro_code,
|
|
||||||
ent.alias, ent.c_return(), ent.name, ent.c_args())
|
|
||||||
else:
|
|
||||||
out_ent = '%s(%s, %s, (%s))' % (macro_ent,
|
|
||||||
ent.c_return(), ent.name, ent.c_params())
|
|
||||||
out_code = '%s(%s, %s, (%s))' % (macro_code,
|
|
||||||
ent.c_return(), ent.name, ent.c_args())
|
|
||||||
|
|
||||||
print out_ent
|
ret = ''
|
||||||
if out_code:
|
if ent.ret:
|
||||||
print ' ' + out_code
|
ret = 'return '
|
||||||
|
stmt1 = self.indent
|
||||||
|
stmt1 += 'const struct mapi_table *tbl = u_current_get();'
|
||||||
|
stmt2 = self.indent
|
||||||
|
stmt2 += 'mapi_func func = ((const mapi_func *) tbl)[%d];' % (
|
||||||
|
ent.slot)
|
||||||
|
stmt3 = self.indent
|
||||||
|
stmt3 += '%s((%s) func)(%s);' % (ret, cast, ent.c_args())
|
||||||
|
|
||||||
def output_entries(self, pool_offsets):
|
disp = '%s\n{\n%s\n%s\n%s\n}' % (proto, stmt1, stmt2, stmt3)
|
||||||
defs = [
|
dispatches.append(disp)
|
||||||
# normal entries
|
|
||||||
('MAPI_ABI_ENTRY', '(ret, name, params)', ''),
|
|
||||||
('MAPI_ABI_CODE', '(ret, name, args)', ''),
|
|
||||||
('MAPI_ABI_CODE_RETURN', '', 'MAPI_ABI_CODE'),
|
|
||||||
# alias entries
|
|
||||||
('MAPI_ALIAS_ENTRY', '(alias, ret, name, params)', ''),
|
|
||||||
('MAPI_ALIAS_CODE', '(alias, ret, name, args)', ''),
|
|
||||||
('MAPI_ALIAS_CODE_RETURN', '', 'MAPI_ALIAS_CODE'),
|
|
||||||
# hidden normal entries
|
|
||||||
('MAPI_ABI_ENTRY_HIDDEN', '', 'MAPI_ABI_ENTRY'),
|
|
||||||
('MAPI_ABI_CODE_HIDDEN', '', 'MAPI_ABI_CODE'),
|
|
||||||
('MAPI_ABI_CODE_RETURN_HIDDEN', '', 'MAPI_ABI_CODE_RETURN'),
|
|
||||||
# hidden alias entries
|
|
||||||
('MAPI_ALIAS_ENTRY_HIDDEN', '', 'MAPI_ALIAS_ENTRY'),
|
|
||||||
('MAPI_ALIAS_CODE_HIDDEN', '', 'MAPI_ALIAS_CODE'),
|
|
||||||
('MAPI_ALIAS_CODE_RETURN_HIDDEN', '', 'MAPI_ALIAS_CODE_RETURN'),
|
|
||||||
# dynamic entries
|
|
||||||
('MAPI_DYNAMIC_ENTRY', '(ret, name, params)', ''),
|
|
||||||
]
|
|
||||||
undefs = [d[0] for d in defs]
|
|
||||||
|
|
||||||
print '#if defined(MAPI_ABI_ENTRY) || defined(MAPI_ABI_ENTRY_HIDDEN)'
|
return '\n\n'.join(dispatches)
|
||||||
print
|
|
||||||
for d in defs:
|
|
||||||
print '#ifndef %s' % (d[0])
|
|
||||||
if d[2]:
|
|
||||||
print '#define %s%s %s' % d
|
|
||||||
else:
|
|
||||||
print '#define %s%s' % d[:2]
|
|
||||||
|
|
||||||
print '#endif'
|
def c_stub_string_pool(self):
|
||||||
print
|
"""Return the string pool for use by stubs."""
|
||||||
|
# sort entries by their names
|
||||||
|
sorted_entries = self.entries[:]
|
||||||
|
sorted_entries.sort(lambda x, y: cmp(x.name, y.name))
|
||||||
|
|
||||||
print '/* see MAPI_TMP_TABLE */'
|
|
||||||
for ent in self.entries:
|
|
||||||
print '#define MAPI_SLOT_%s %d' % (ent.name, ent.slot)
|
|
||||||
print
|
|
||||||
print '/* see MAPI_TMP_PUBLIC_STUBS */'
|
|
||||||
for ent in self.entries:
|
|
||||||
print '#define MAPI_POOL_%s %d' % (ent.name, pool_offsets[ent])
|
|
||||||
print
|
|
||||||
|
|
||||||
# define macros that generate code
|
|
||||||
for ent in self.entries:
|
|
||||||
self.output_entry(ent)
|
|
||||||
print
|
|
||||||
dynamics = abi_dynamics()
|
|
||||||
for ent in dynamics:
|
|
||||||
self.output_entry(ent)
|
|
||||||
print
|
|
||||||
|
|
||||||
for ent in self.entries:
|
|
||||||
print '#undef MAPI_SLOT_%s' % (ent.name)
|
|
||||||
for ent in self.entries:
|
|
||||||
print '#undef MAPI_POOL_%s' % (ent.name)
|
|
||||||
print
|
|
||||||
print '#endif /* defined(MAPI_ABI_ENTRY) || defined(MAPI_ABI_ENTRY_HIDDEN) */'
|
|
||||||
print
|
|
||||||
|
|
||||||
self._add_undefs(undefs)
|
|
||||||
|
|
||||||
def _get_string_pool(self):
|
|
||||||
"""Get the string pool."""
|
|
||||||
pool = []
|
pool = []
|
||||||
offsets = {}
|
offsets = {}
|
||||||
|
|
||||||
count = 0
|
count = 0
|
||||||
for ent in self.entries:
|
for ent in sorted_entries:
|
||||||
offsets[ent] = count
|
offsets[ent] = count
|
||||||
pool.append(ent.name + '\\0')
|
pool.append('%s' % (ent.name))
|
||||||
count += len(ent.name) + 1
|
count += len(ent.name) + 1
|
||||||
|
|
||||||
return (pool, offsets)
|
pool_str = self.indent + '"' + \
|
||||||
|
('\\0"\n' + self.indent + '"').join(pool) + '";'
|
||||||
|
return (pool_str, offsets)
|
||||||
|
|
||||||
def output_sorted_indices(self):
|
def c_stub_initializer(self, prefix, pool_offsets):
|
||||||
entry_index_pairs = []
|
"""Return the initializer for struct mapi_stub array."""
|
||||||
for i in xrange(len(self.entries)):
|
stubs = []
|
||||||
entry_index_pairs.append((self.entries[i], i))
|
for ent in self.entries_sorted_by_names:
|
||||||
entry_index_pairs.sort(lambda x, y: cmp(x[0].name, y[0].name))
|
stubs.append('%s{ (mapi_func) %s%s, %d, (void *) %d }' % (
|
||||||
|
self.indent, prefix, ent.name, ent.slot, pool_offsets[ent]))
|
||||||
|
|
||||||
print '/* see MAPI_TMP_PUBLIC_STUBS */'
|
return ',\n'.join(stubs)
|
||||||
print '#ifdef MAPI_ABI_SORTED_INDICES'
|
|
||||||
|
def c_noop_functions(self, prefix, warn_prefix):
|
||||||
|
"""Return the noop functions."""
|
||||||
|
noops = []
|
||||||
|
for ent in self.entries:
|
||||||
|
if ent.alias:
|
||||||
|
continue
|
||||||
|
|
||||||
|
proto = 'static ' + self._c_decl(ent, prefix)
|
||||||
|
|
||||||
|
stmt1 = self.indent + '%s("%s%s");' % (
|
||||||
|
self.noop_warn, warn_prefix, ent.name)
|
||||||
|
|
||||||
|
if ent.ret:
|
||||||
|
stmt2 = self.indent + 'return (%s) 0;' % (ent.ret)
|
||||||
|
noop = '%s\n{\n%s\n%s\n}' % (proto, stmt1, stmt2)
|
||||||
|
else:
|
||||||
|
noop = '%s\n{\n%s\n}' % (proto, stmt1)
|
||||||
|
|
||||||
|
noops.append(noop)
|
||||||
|
|
||||||
|
return '\n\n'.join(noops)
|
||||||
|
|
||||||
|
def c_noop_initializer(self, prefix, use_generic):
|
||||||
|
"""Return an initializer for the noop dispatch table."""
|
||||||
|
entries = [prefix + ent.name for ent in self.entries if not ent.alias]
|
||||||
|
if use_generic:
|
||||||
|
entries = [self.noop_generic] * len(entries)
|
||||||
|
|
||||||
|
entries.extend([self.noop_generic] * ABI_NUM_DYNAMIC_ENTRIES)
|
||||||
|
|
||||||
|
pre = self.indent + '(mapi_func) '
|
||||||
|
return pre + (',\n' + pre).join(entries)
|
||||||
|
|
||||||
|
def c_asm_gcc(self, prefix):
|
||||||
|
asm = []
|
||||||
|
to_name = None
|
||||||
|
|
||||||
|
asm.append('__asm__(')
|
||||||
|
for ent in self.entries:
|
||||||
|
name = prefix + ent.name
|
||||||
|
|
||||||
|
if ent.hidden:
|
||||||
|
asm.append('".hidden %s\\n"' % (name))
|
||||||
|
|
||||||
|
if ent.alias:
|
||||||
|
asm.append('".globl %s\\n"' % (name))
|
||||||
|
asm.append('".set %s, %s\\n"' % (name, to_name))
|
||||||
|
else:
|
||||||
|
asm.append('STUB_ASM_ENTRY("%s")"\\n"' % (name))
|
||||||
|
asm.append('"\\t"STUB_ASM_CODE("%d")"\\n"' % (ent.slot))
|
||||||
|
to_name = name
|
||||||
|
asm.append(');')
|
||||||
|
|
||||||
|
return "\n".join(asm)
|
||||||
|
|
||||||
|
def output_for_lib(self):
|
||||||
|
print self.c_header()
|
||||||
print
|
print
|
||||||
print 'static const int MAPI_ABI_SORTED_INDICES[] = {'
|
print '#ifdef MAPI_TMP_DEFINES'
|
||||||
for ent, idx in entry_index_pairs:
|
print self.c_includes()
|
||||||
print ' %d, /* %s */' % (idx, ent.name)
|
print '#undef MAPI_TMP_DEFINES'
|
||||||
print ' -1'
|
print '#endif /* MAPI_TMP_DEFINES */'
|
||||||
|
print
|
||||||
|
print '#ifdef MAPI_TMP_TABLE'
|
||||||
|
print self.c_mapi_table()
|
||||||
|
print '#undef MAPI_TMP_TABLE'
|
||||||
|
print '#endif /* MAPI_TMP_TABLE */'
|
||||||
|
print
|
||||||
|
|
||||||
|
pool, pool_offsets = self.c_stub_string_pool()
|
||||||
|
print '#ifdef MAPI_TMP_PUBLIC_STUBS'
|
||||||
|
print 'static const char public_string_pool[] ='
|
||||||
|
print pool
|
||||||
|
print
|
||||||
|
print 'static const struct mapi_stub public_stubs[] = {'
|
||||||
|
print self.c_stub_initializer(self.prefix_lib, pool_offsets)
|
||||||
|
print '};'
|
||||||
|
print '#undef MAPI_TMP_PUBLIC_STUBS'
|
||||||
|
print '#endif /* MAPI_TMP_PUBLIC_STUBS */'
|
||||||
|
print
|
||||||
|
|
||||||
|
print '#ifdef MAPI_TMP_PUBLIC_ENTRIES'
|
||||||
|
print self.c_public_dispatches(self.prefix_lib)
|
||||||
|
print '#undef MAPI_TMP_PUBLIC_ENTRIES'
|
||||||
|
print '#endif /* MAPI_TMP_PUBLIC_ENTRIES */'
|
||||||
|
print
|
||||||
|
|
||||||
|
print '#ifdef MAPI_TMP_NOOP_ARRAY'
|
||||||
|
print '#ifdef DEBUG'
|
||||||
|
print
|
||||||
|
print self.c_noop_functions(self.prefix_noop, self.prefix_lib)
|
||||||
|
print
|
||||||
|
print 'const mapi_func table_%s_array[] = {' % (self.prefix_noop)
|
||||||
|
print self.c_noop_initializer(self.prefix_noop, False)
|
||||||
print '};'
|
print '};'
|
||||||
print
|
print
|
||||||
print '#endif /* MAPI_ABI_SORTED_INDICES */'
|
print '#else /* DEBUG */'
|
||||||
|
print
|
||||||
|
print 'const mapi_func table_%s_array[] = {' % (self.prefix_noop)
|
||||||
|
print self.c_noop_initializer(self.prefix_noop, True)
|
||||||
|
print '};'
|
||||||
|
print '#endif /* DEBUG */'
|
||||||
|
print '#undef MAPI_TMP_NOOP_ARRAY'
|
||||||
|
print '#endif /* MAPI_TMP_NOOP_ARRAY */'
|
||||||
print
|
print
|
||||||
|
|
||||||
self._add_undefs(['MAPI_ABI_SORTED_INDICES'])
|
print '#ifdef MAPI_TMP_STUB_ASM_GCC'
|
||||||
|
print self.c_asm_gcc(self.prefix_lib)
|
||||||
|
print '#undef MAPI_TMP_STUB_ASM_GCC'
|
||||||
|
print '#endif /* MAPI_TMP_STUB_ASM_GCC */'
|
||||||
|
|
||||||
def output_defines(self):
|
def output_for_app(self):
|
||||||
print '/* ABI defines */'
|
print self.c_header()
|
||||||
print '#ifdef MAPI_ABI_DEFINES'
|
|
||||||
print '#include "%s"' % (self.options.include)
|
|
||||||
print '#endif /* MAPI_ABI_DEFINES */'
|
|
||||||
print
|
print
|
||||||
|
print self.c_private_declarations(self.prefix_app)
|
||||||
|
print
|
||||||
|
print '#ifdef API_TMP_DEFINE_SPEC'
|
||||||
|
print
|
||||||
|
print 'static const char %s_spec[] =' % (self.prefix_app)
|
||||||
|
print self.c_mapi_table_spec()
|
||||||
|
print
|
||||||
|
print 'static const mapi_proc %s_procs[] = {' % (self.prefix_app)
|
||||||
|
print self.c_mapi_table_initializer(self.prefix_app)
|
||||||
|
print '};'
|
||||||
|
print
|
||||||
|
print '#endif /* API_TMP_DEFINE_SPEC */'
|
||||||
|
|
||||||
self._add_undefs(['MAPI_ABI_DEFINES'])
|
class GLAPIPrinter(ABIPrinter):
|
||||||
|
"""OpenGL API Printer"""
|
||||||
|
|
||||||
def output(self):
|
def __init__(self, entries):
|
||||||
pool, pool_offsets = self._get_string_pool()
|
super(GLAPIPrinter, self).__init__(entries)
|
||||||
|
|
||||||
self.output_header()
|
self.api_defines = ['GL_GLEXT_PROTOTYPES']
|
||||||
self.output_defines()
|
self.api_headers = ['"GL/gl.h"', '"GL/glext.h"']
|
||||||
self.output_entries(pool_offsets)
|
self.api_call = 'GLAPI'
|
||||||
self.output_sorted_indices()
|
self.api_entry = 'APIENTRY'
|
||||||
self.output_footer()
|
self.api_attrs = ''
|
||||||
|
|
||||||
|
self.prefix_lib = 'gl'
|
||||||
|
self.prefix_app = '_mesa_'
|
||||||
|
self.prefix_noop = 'noop'
|
||||||
|
|
||||||
|
def output_for_app(self):
|
||||||
|
# not used
|
||||||
|
pass
|
||||||
|
|
||||||
|
class ES1APIPrinter(GLAPIPrinter):
|
||||||
|
"""OpenGL ES 1.x API Printer"""
|
||||||
|
|
||||||
|
def __init__(self, entries):
|
||||||
|
super(ES1APIPrinter, self).__init__(entries)
|
||||||
|
|
||||||
|
self.api_headers = ['"GLES/gl.h"', '"GLES/glext.h"']
|
||||||
|
self.api_call = 'GL_API'
|
||||||
|
self.api_entry = 'GL_APIENTRY'
|
||||||
|
|
||||||
|
class ES2APIPrinter(GLAPIPrinter):
|
||||||
|
"""OpenGL ES 2.x API Printer"""
|
||||||
|
|
||||||
|
def __init__(self, entries):
|
||||||
|
super(ES2APIPrinter, self).__init__(entries)
|
||||||
|
|
||||||
|
self.api_headers = ['"GLES2/gl2.h"', '"GLES2/gl2ext.h"']
|
||||||
|
self.api_call = 'GL_APICALL'
|
||||||
|
self.api_entry = 'GL_APIENTRY'
|
||||||
|
|
||||||
|
class VGAPIPrinter(ABIPrinter):
|
||||||
|
"""OpenVG API Printer"""
|
||||||
|
|
||||||
|
def __init__(self, entries):
|
||||||
|
super(VGAPIPrinter, self).__init__(entries)
|
||||||
|
|
||||||
|
self.api_defines = ['VG_VGEXT_PROTOTYPES']
|
||||||
|
self.api_headers = ['"VG/openvg.h"', '"VG/vgext.h"']
|
||||||
|
self.api_call = 'VG_API_CALL'
|
||||||
|
self.api_entry = 'VG_API_ENTRY'
|
||||||
|
self.api_attrs = 'VG_API_EXIT'
|
||||||
|
|
||||||
|
self.prefix_lib = 'vg'
|
||||||
|
self.prefix_app = 'vega'
|
||||||
|
self.prefix_noop = 'noop'
|
||||||
|
|
||||||
def parse_args():
|
def parse_args():
|
||||||
|
printers = ['glapi', 'es1api', 'es2api', 'vgapi']
|
||||||
|
modes = ['lib', 'app']
|
||||||
|
|
||||||
parser = OptionParser(usage='usage: %prog [options] <filename>')
|
parser = OptionParser(usage='usage: %prog [options] <filename>')
|
||||||
parser.add_option('-i', '--include', dest='include',
|
parser.add_option('-p', '--printer', dest='printer',
|
||||||
help='include the header for API defines')
|
help='printer to use: %s' % (", ".join(printers)))
|
||||||
|
parser.add_option('-m', '--mode', dest='mode',
|
||||||
|
help='target user: %s' % (", ".join(modes)))
|
||||||
|
|
||||||
options, args = parser.parse_args()
|
options, args = parser.parse_args()
|
||||||
if not args or not options.include:
|
if not args or options.printer not in printers or \
|
||||||
|
options.mode not in modes:
|
||||||
parser.print_help()
|
parser.print_help()
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
return (args[0], options)
|
return (args[0], options)
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
printers = {
|
||||||
|
'vgapi': VGAPIPrinter,
|
||||||
|
'glapi': GLAPIPrinter,
|
||||||
|
'es1api': ES1APIPrinter,
|
||||||
|
'es2api': ES2APIPrinter
|
||||||
|
}
|
||||||
|
|
||||||
filename, options = parse_args()
|
filename, options = parse_args()
|
||||||
|
|
||||||
entries = abi_parse(filename)
|
entries = abi_parse(filename)
|
||||||
printer = ABIPrinter(entries, options)
|
printer = printers[options.printer](entries)
|
||||||
printer.output()
|
if options.mode == 'lib':
|
||||||
|
printer.output_for_lib()
|
||||||
|
else:
|
||||||
|
printer.output_for_app()
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
|
|
@ -26,186 +26,8 @@
|
||||||
* Chia-I Wu <olv@lunarg.com>
|
* Chia-I Wu <olv@lunarg.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "u_macros.h"
|
|
||||||
|
|
||||||
#ifndef MAPI_ABI_HEADER
|
#ifndef MAPI_ABI_HEADER
|
||||||
#error "MAPI_ABI_HEADER must be defined"
|
#error "MAPI_ABI_HEADER must be defined"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get API defines.
|
|
||||||
*/
|
|
||||||
#ifdef MAPI_TMP_DEFINES
|
|
||||||
# define MAPI_ABI_DEFINES
|
|
||||||
#include MAPI_ABI_HEADER
|
#include MAPI_ABI_HEADER
|
||||||
|
|
||||||
#ifndef MAPI_ABI_PREFIX
|
|
||||||
#error "MAPI_ABI_PREFIX must be defined"
|
|
||||||
#endif
|
|
||||||
#ifndef MAPI_ABI_PUBLIC
|
|
||||||
#error "MAPI_ABI_PUBLIC must be defined"
|
|
||||||
#endif
|
|
||||||
#ifndef MAPI_ABI_ATTR
|
|
||||||
#error "MAPI_ABI_ATTR must be defined"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#undef MAPI_TMP_DEFINES
|
|
||||||
#endif /* MAPI_TMP_DEFINES */
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate fields of struct mapi_table.
|
|
||||||
*/
|
|
||||||
#ifdef MAPI_TMP_TABLE
|
|
||||||
# define MAPI_ABI_ENTRY(ret, name, params) \
|
|
||||||
ret (MAPI_ABI_ATTR *name) params;
|
|
||||||
# define MAPI_DYNAMIC_ENTRY(ret, name, params) \
|
|
||||||
ret (MAPI_ABI_ATTR *name) params;
|
|
||||||
# include MAPI_ABI_HEADER
|
|
||||||
#undef MAPI_TMP_TABLE
|
|
||||||
#endif /* MAPI_TMP_TABLE */
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Declare public entries.
|
|
||||||
*/
|
|
||||||
#ifdef MAPI_TMP_PUBLIC_DECLARES
|
|
||||||
# define MAPI_ABI_ENTRY(ret, name, params) \
|
|
||||||
MAPI_ABI_PUBLIC ret MAPI_ABI_ATTR U_CONCAT(MAPI_ABI_PREFIX, name) params;
|
|
||||||
# define MAPI_ALIAS_ENTRY(alias, ret, name, params) \
|
|
||||||
MAPI_ABI_ENTRY(ret, name, params);
|
|
||||||
# define MAPI_ABI_ENTRY_HIDDEN(ret, name, params) \
|
|
||||||
HIDDEN ret MAPI_ABI_ATTR U_CONCAT(MAPI_ABI_PREFIX, name) params;
|
|
||||||
# define MAPI_ALIAS_ENTRY_HIDDEN(alias, ret, name, params) \
|
|
||||||
MAPI_ABI_ENTRY_HIDDEN(ret, name, params)
|
|
||||||
# include MAPI_ABI_HEADER
|
|
||||||
#undef MAPI_TMP_PUBLIC_DECLARES
|
|
||||||
#endif /* MAPI_TMP_PUBLIC_DECLARES */
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate string pool and public stubs.
|
|
||||||
*/
|
|
||||||
#ifdef MAPI_TMP_PUBLIC_STUBS
|
|
||||||
/* define the string pool */
|
|
||||||
static const char public_string_pool[] =
|
|
||||||
# define MAPI_ABI_ENTRY(ret, name, params) \
|
|
||||||
U_STRINGIFY(name) "\0"
|
|
||||||
# define MAPI_ALIAS_ENTRY(alias, ret, name, params) \
|
|
||||||
MAPI_ABI_ENTRY(ret, name, params)
|
|
||||||
# include MAPI_ABI_HEADER
|
|
||||||
;
|
|
||||||
/* define public_sorted_indices */
|
|
||||||
# define MAPI_ABI_SORTED_INDICES public_sorted_indices
|
|
||||||
# include MAPI_ABI_HEADER
|
|
||||||
|
|
||||||
/* define public_stubs */
|
|
||||||
static const struct mapi_stub public_stubs[] = {
|
|
||||||
# define MAPI_ABI_ENTRY(ret, name, params) \
|
|
||||||
{ (mapi_func) U_CONCAT(MAPI_ABI_PREFIX, name), \
|
|
||||||
MAPI_SLOT_ ## name, (void *) MAPI_POOL_ ## name },
|
|
||||||
# define MAPI_ALIAS_ENTRY(alias, ret, name, params) \
|
|
||||||
MAPI_ABI_ENTRY(ret, name, params)
|
|
||||||
# include MAPI_ABI_HEADER
|
|
||||||
{ NULL, -1, (void *) -1 }
|
|
||||||
};
|
|
||||||
|
|
||||||
#undef MAPI_TMP_PUBLIC_STUBS
|
|
||||||
#endif /* MAPI_TMP_PUBLIC_STUBS */
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate public entries.
|
|
||||||
*/
|
|
||||||
#ifdef MAPI_TMP_PUBLIC_ENTRIES
|
|
||||||
# define MAPI_ABI_ENTRY(ret, name, params) \
|
|
||||||
ret MAPI_ABI_ATTR U_CONCAT(MAPI_ABI_PREFIX, name) params
|
|
||||||
# define MAPI_ABI_CODE(ret, name, args) \
|
|
||||||
{ \
|
|
||||||
const struct mapi_table *tbl = u_current_get(); \
|
|
||||||
tbl->name args; \
|
|
||||||
}
|
|
||||||
# define MAPI_ABI_CODE_RETURN(ret, name, args) \
|
|
||||||
{ \
|
|
||||||
const struct mapi_table *tbl = u_current_get(); \
|
|
||||||
return tbl->name args; \
|
|
||||||
}
|
|
||||||
# define MAPI_ALIAS_ENTRY(alias, ret, name, params) \
|
|
||||||
MAPI_ABI_ENTRY(ret, name, params)
|
|
||||||
# define MAPI_ALIAS_CODE(alias, ret, name, args) \
|
|
||||||
MAPI_ABI_CODE(ret, alias, args)
|
|
||||||
# define MAPI_ALIAS_CODE_RETURN(alias, ret, name, args) \
|
|
||||||
MAPI_ABI_CODE_RETURN(ret, alias, args)
|
|
||||||
# include MAPI_ABI_HEADER
|
|
||||||
#undef MAPI_TMP_PUBLIC_ENTRIES
|
|
||||||
#endif /* MAPI_TMP_PUBLIC_ENTRIES */
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate noop entries.
|
|
||||||
*/
|
|
||||||
#ifdef MAPI_TMP_NOOP_ARRAY
|
|
||||||
#ifdef DEBUG
|
|
||||||
# define MAPI_ABI_ENTRY(ret, name, params) \
|
|
||||||
static ret MAPI_ABI_ATTR U_CONCAT(noop_, name) params
|
|
||||||
# define MAPI_ABI_CODE(ret, name, args) \
|
|
||||||
{ \
|
|
||||||
noop_warn(U_CONCAT_STR(MAPI_ABI_PREFIX, name)); \
|
|
||||||
}
|
|
||||||
# define MAPI_ABI_CODE_RETURN(ret, name, args) \
|
|
||||||
{ \
|
|
||||||
noop_warn(U_CONCAT_STR(MAPI_ABI_PREFIX, name)); \
|
|
||||||
return (ret) 0; \
|
|
||||||
}
|
|
||||||
# include MAPI_ABI_HEADER
|
|
||||||
|
|
||||||
/* define the noop function array that may be casted to mapi_table */
|
|
||||||
const mapi_func table_noop_array[] = {
|
|
||||||
# define MAPI_ABI_ENTRY(ret, name, params) \
|
|
||||||
(mapi_func) U_CONCAT(noop_, name),
|
|
||||||
# define MAPI_DYNAMIC_ENTRY(ret, name, params) \
|
|
||||||
(mapi_func) noop_generic,
|
|
||||||
# include MAPI_ABI_HEADER
|
|
||||||
(mapi_func) noop_generic
|
|
||||||
};
|
|
||||||
|
|
||||||
#else /* DEBUG */
|
|
||||||
|
|
||||||
const mapi_func table_noop_array[] = {
|
|
||||||
# define MAPI_ABI_ENTRY(ret, name, params) \
|
|
||||||
(mapi_func) noop_generic,
|
|
||||||
# define MAPI_DYNAMIC_ENTRY(ret, name, params) \
|
|
||||||
(mapi_func) noop_generic,
|
|
||||||
# include MAPI_ABI_HEADER
|
|
||||||
(mapi_func) noop_generic
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* DEBUG */
|
|
||||||
#undef MAPI_TMP_NOOP_ARRAY
|
|
||||||
#endif /* MAPI_TMP_NOOP_ARRAY */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef MAPI_TMP_STUB_ASM_GCC
|
|
||||||
# define STUB_ASM_ALIAS(func, to) \
|
|
||||||
".globl " func "\n" \
|
|
||||||
".set " func ", " to
|
|
||||||
# define STUB_ASM_HIDE(func) \
|
|
||||||
".hidden " func
|
|
||||||
|
|
||||||
# define MAPI_ABI_ENTRY(ret, name, params) \
|
|
||||||
__asm__(STUB_ASM_ENTRY(U_CONCAT_STR(MAPI_ABI_PREFIX, name)));
|
|
||||||
# define MAPI_ABI_CODE(ret, name, args) \
|
|
||||||
__asm__(STUB_ASM_CODE(U_STRINGIFY(MAPI_SLOT_ ## name)));
|
|
||||||
# define MAPI_ALIAS_ENTRY(alias, ret, name, params) \
|
|
||||||
__asm__(STUB_ASM_ALIAS(U_CONCAT_STR(MAPI_ABI_PREFIX, name), \
|
|
||||||
U_CONCAT_STR(MAPI_ABI_PREFIX, alias)));
|
|
||||||
# define MAPI_ABI_ENTRY_HIDDEN(ret, name, params) \
|
|
||||||
__asm__(STUB_ASM_HIDE(U_CONCAT_STR(MAPI_ABI_PREFIX, name))); \
|
|
||||||
MAPI_ABI_ENTRY(ret, name, params);
|
|
||||||
# define MAPI_ALIAS_ENTRY_HIDDEN(alias, ret, name, params) \
|
|
||||||
__asm__(STUB_ASM_HIDE(U_CONCAT_STR(MAPI_ABI_PREFIX, name))); \
|
|
||||||
MAPI_ALIAS_ENTRY(alias, ret, name, params);
|
|
||||||
# include MAPI_ABI_HEADER
|
|
||||||
#undef MAPI_TMP_STUB_ASM_GCC
|
|
||||||
#endif /* MAPI_TMP_STUB_ASM_GCC */
|
|
||||||
|
|
|
@ -37,26 +37,15 @@
|
||||||
#include "stub.h"
|
#include "stub.h"
|
||||||
#include "table.h"
|
#include "table.h"
|
||||||
|
|
||||||
/* XXX: Hack to avoid vgCreateFont being generated as vgCreateFontA */
|
|
||||||
#undef CreateFont
|
|
||||||
|
|
||||||
#define MAPI_TABLE_FIRST_DYNAMIC \
|
|
||||||
(offsetof(struct mapi_table, dynamic0) / sizeof(mapi_func))
|
|
||||||
#define MAPI_TABLE_NUM_DYNAMIC \
|
|
||||||
((offsetof(struct mapi_table, last) - \
|
|
||||||
offsetof(struct mapi_table, dynamic0)) / sizeof(mapi_func))
|
|
||||||
#define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0]))
|
#define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0]))
|
||||||
|
|
||||||
/*
|
/* define public_string_pool and public_stubs */
|
||||||
* This will define public_string_pool, public_sorted_indices, and
|
|
||||||
* public_stubs.
|
|
||||||
*/
|
|
||||||
#define MAPI_TMP_PUBLIC_STUBS
|
#define MAPI_TMP_PUBLIC_STUBS
|
||||||
#include "mapi_tmp.h"
|
#include "mapi_tmp.h"
|
||||||
|
|
||||||
static struct mapi_stub dynamic_stubs[MAPI_TABLE_NUM_DYNAMIC];
|
static struct mapi_stub dynamic_stubs[MAPI_TABLE_NUM_DYNAMIC];
|
||||||
static int num_dynamic_stubs;
|
static int num_dynamic_stubs;
|
||||||
static int next_dynamic_slot = MAPI_TABLE_FIRST_DYNAMIC;
|
static int next_dynamic_slot = MAPI_TABLE_NUM_STATIC;
|
||||||
|
|
||||||
void
|
void
|
||||||
stub_init_once(void)
|
stub_init_once(void)
|
||||||
|
@ -77,11 +66,9 @@ static int
|
||||||
stub_compare(const void *key, const void *elem)
|
stub_compare(const void *key, const void *elem)
|
||||||
{
|
{
|
||||||
const char *name = (const char *) key;
|
const char *name = (const char *) key;
|
||||||
const int *index = (const int *) elem;
|
const struct mapi_stub *stub = (const struct mapi_stub *) elem;
|
||||||
const struct mapi_stub *stub;
|
|
||||||
const char *stub_name;
|
const char *stub_name;
|
||||||
|
|
||||||
stub = &public_stubs[*index];
|
|
||||||
stub_name = &public_string_pool[(unsigned long) stub->name];
|
stub_name = &public_string_pool[(unsigned long) stub->name];
|
||||||
|
|
||||||
return strcmp(name, stub_name);
|
return strcmp(name, stub_name);
|
||||||
|
@ -93,13 +80,8 @@ stub_compare(const void *key, const void *elem)
|
||||||
const struct mapi_stub *
|
const struct mapi_stub *
|
||||||
stub_find_public(const char *name)
|
stub_find_public(const char *name)
|
||||||
{
|
{
|
||||||
const int *index;
|
return (const struct mapi_stub *) bsearch(name, public_stubs,
|
||||||
|
ARRAY_SIZE(public_stubs), sizeof(public_stubs[0]), stub_compare);
|
||||||
index = (const int *) bsearch(name, public_sorted_indices,
|
|
||||||
ARRAY_SIZE(public_sorted_indices) - 1,
|
|
||||||
sizeof(public_sorted_indices[0]), stub_compare);
|
|
||||||
|
|
||||||
return (index) ? &public_stubs[*index] : NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -112,14 +94,15 @@ stub_add_dynamic(const char *name)
|
||||||
int idx;
|
int idx;
|
||||||
|
|
||||||
idx = num_dynamic_stubs;
|
idx = num_dynamic_stubs;
|
||||||
if (idx >= MAPI_TABLE_NUM_DYNAMIC)
|
/* minus 1 to make sure we can never reach the last slot */
|
||||||
|
if (idx >= MAPI_TABLE_NUM_DYNAMIC - 1)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
stub = &dynamic_stubs[idx];
|
stub = &dynamic_stubs[idx];
|
||||||
|
|
||||||
/* dispatch to mapi_table->last, which is always no-op */
|
/* dispatch to the last slot, which is reserved for no-op */
|
||||||
stub->addr =
|
stub->addr = entry_generate(
|
||||||
entry_generate(MAPI_TABLE_FIRST_DYNAMIC + MAPI_TABLE_NUM_DYNAMIC);
|
MAPI_TABLE_NUM_STATIC + MAPI_TABLE_NUM_DYNAMIC - 1);
|
||||||
if (!stub->addr)
|
if (!stub->addr)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
|
|
@ -33,13 +33,11 @@
|
||||||
#include "stub.h"
|
#include "stub.h"
|
||||||
|
|
||||||
#define MAPI_TMP_DEFINES
|
#define MAPI_TMP_DEFINES
|
||||||
#include "mapi_tmp.h"
|
|
||||||
|
|
||||||
struct mapi_table {
|
|
||||||
#define MAPI_TMP_TABLE
|
#define MAPI_TMP_TABLE
|
||||||
#include "mapi_tmp.h"
|
#include "mapi_tmp.h"
|
||||||
mapi_func last;
|
|
||||||
};
|
#define MAPI_TABLE_NUM_SLOTS (MAPI_TABLE_NUM_STATIC + MAPI_TABLE_NUM_DYNAMIC)
|
||||||
|
#define MAPI_TABLE_SIZE (MAPI_TABLE_NUM_SLOTS * sizeof(mapi_func))
|
||||||
|
|
||||||
extern const mapi_func table_noop_array[];
|
extern const mapi_func table_noop_array[];
|
||||||
|
|
||||||
|
|
|
@ -44,7 +44,7 @@ $(VGAPI_OBJECTS): %.o: $(MAPI)/%.c
|
||||||
|
|
||||||
vgapi_tmp.h: vgapi.csv $(MAPI)/mapi_abi.py
|
vgapi_tmp.h: vgapi.csv $(MAPI)/mapi_abi.py
|
||||||
$(PYTHON2) $(PYTHON_FLAGS) $(MAPI)/mapi_abi.py \
|
$(PYTHON2) $(PYTHON_FLAGS) $(MAPI)/mapi_abi.py \
|
||||||
-i vgapi/vgapi_defines.h $< > $@
|
--printer vgapi --mode lib $< > $@
|
||||||
|
|
||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
clean:
|
clean:
|
||||||
|
@ -87,3 +87,5 @@ depend: $(VGAPI_SOURCES)
|
||||||
@$(MKDEP) $(MKDEP_OPTIONS) -f- $(DEFINES) $(INCLUDE_DIRS) \
|
@$(MKDEP) $(MKDEP_OPTIONS) -f- $(DEFINES) $(INCLUDE_DIRS) \
|
||||||
$(VGAPI_CPPFLAGS) $(VGAPI_SOURCES) 2>/dev/null | \
|
$(VGAPI_CPPFLAGS) $(VGAPI_SOURCES) 2>/dev/null | \
|
||||||
sed -e 's,^$(MAPI)/,,' > depend
|
sed -e 's,^$(MAPI)/,,' > depend
|
||||||
|
|
||||||
|
-include depend
|
||||||
|
|
|
@ -13,7 +13,7 @@ if env['platform'] != 'winddk':
|
||||||
target = '#src/mapi/vgapi/vgapi_tmp.h',
|
target = '#src/mapi/vgapi/vgapi_tmp.h',
|
||||||
script = '../mapi/mapi_abi.py',
|
script = '../mapi/mapi_abi.py',
|
||||||
source = 'vgapi.csv',
|
source = 'vgapi.csv',
|
||||||
command = python_cmd + ' $SCRIPT -i vgapi/vgapi_defines.h $SOURCE > $TARGET'
|
command = python_cmd + ' $SCRIPT --printer vgapi --mode lib $SOURCE > $TARGET'
|
||||||
)
|
)
|
||||||
|
|
||||||
env.Append(CPPDEFINES = [
|
env.Append(CPPDEFINES = [
|
||||||
|
@ -53,4 +53,4 @@ if env['platform'] != 'winddk':
|
||||||
|
|
||||||
vgapi = [env.FindIxes(openvg, 'LIBPREFIX', 'LIBSUFFIX')]
|
vgapi = [env.FindIxes(openvg, 'LIBPREFIX', 'LIBSUFFIX')]
|
||||||
|
|
||||||
Export(['vgapi', 'vgapi_header'])
|
Export(['vgapi'])
|
||||||
|
|
|
@ -1,11 +0,0 @@
|
||||||
#ifndef VGAPI_DEFINES_H
|
|
||||||
#define VGAPI_DEFINES_H
|
|
||||||
|
|
||||||
#include "VG/openvg.h"
|
|
||||||
#include "VG/vgext.h"
|
|
||||||
|
|
||||||
#define MAPI_ABI_PREFIX vg
|
|
||||||
#define MAPI_ABI_PUBLIC VG_API_CALL
|
|
||||||
#define MAPI_ABI_ATTR VG_API_ENTRY
|
|
||||||
|
|
||||||
#endif /* VGAPI_DEFINES_H */
|
|
Loading…
Reference in New Issue