[Mesa-dev] [PATCH v2 08/24] mapi/new: import mapi scripts from glvnd

Erik Faye-Lund erik.faye-lund at collabora.com
Fri Dec 14 14:36:06 UTC 2018


On Fri, 2018-12-14 at 14:04 +0000, Emil Velikov wrote:
> From: Emil Velikov <emil.velikov at collabora.com>
> 
> Currently we have over 20 scripts that generate the libGL* dispatch
> and
> various other functionality. More importantly we're using local XML
> files instead of the Khronos provides one(s). Resulting in an
> increasing complexity of writing, maintaining and bugfixing.
> 
> One fairly annoying bug is handling of statically exported symbols.
> Today, if we enable a GL extension for GLES1/2, we add a special tag
> to
> the xml. Thus the ES dispatch gets generated, but also since we have
> no
> separate notion of GL/ES1/ES2 static functions it also gets exported
> statically.
> 
> This commit adds step one towards clearing and simplifying our setup.
> It imports the mapi generator from GLVND.
> 
>   012fe39 ("Remove a couple of duplicate typedefs.")
> 
> v2: use local genCommon.py
> 
> Signed-off-by: Emil Velikov <emil.velikov at collabora.com>
> ---
>  src/mapi/Makefile.am                |   1 +
>  src/mapi/new/gen_gldispatch_mapi.py | 180
> ++++++++++++++++++++++++++++
>  2 files changed, 181 insertions(+)
>  create mode 100755 src/mapi/new/gen_gldispatch_mapi.py
> 
> diff --git a/src/mapi/Makefile.am b/src/mapi/Makefile.am
> index b46ed814700..5a619bf049b 100644
> --- a/src/mapi/Makefile.am
> +++ b/src/mapi/Makefile.am
> @@ -32,6 +32,7 @@ pkgconfig_DATA =
>  
>  EXTRA_DIST = \
>  	new/genCommon.py \
> +	new/gen_gldispatch_mapi.py \
>  	es1api/ABI-check \
>  	es2api/ABI-check \
>  	mapi_abi.py \

Nit: I would add this in some later commit, when this actually becomes
used. Right now, I believe it's just cruft...

But regardless:

Reviewed-by: Erik Faye-Lund <erik.faye-lund at collabora.com>

> diff --git a/src/mapi/new/gen_gldispatch_mapi.py
> b/src/mapi/new/gen_gldispatch_mapi.py
> new file mode 100755
> index 00000000000..03fb49a7a29
> --- /dev/null
> +++ b/src/mapi/new/gen_gldispatch_mapi.py
> @@ -0,0 +1,180 @@
> +#!/usr/bin/env python
> +
> +# Copyright (C) 2010 LunarG Inc.
> +# (C) Copyright 2015, NVIDIA 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 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.
> +#
> +# Authors:
> +#    Kyle Brenneman <kbrenneman at nvidia.com>
> +#
> +# Based on code ogiginally by:
> +#    Chia-I Wu <olv at lunarg.com>
> +
> +
> +"""
> +Generates the glapi_mapi_tmp.h header file from Khronos's XML file.
> +"""
> +
> +import sys
> +import xml.etree.cElementTree as etree
> +
> +import genCommon
> +
> +def _main():
> +    target = sys.argv[1]
> +    xmlFiles = sys.argv[2:]
> +
> +    roots = [ etree.parse(filename).getroot() for filename in
> xmlFiles ]
> +    allFunctions = genCommon.getFunctionsFromRoots(roots)
> +
> +    names = genCommon.getExportNamesFromRoots(target, roots)
> +    functions = [f for f in allFunctions if(f.name in names)]
> +
> +    if (target in ("gl", "gldispatch")):
> +        assert(len(functions) == len(allFunctions))
> +        assert(all(functions[i] == allFunctions[i] for i in
> range(len(functions))))
> +        assert(all(functions[i].slot == i for i in
> range(len(functions))))
> +
> +    print(r"""
> +/* This file is automatically generated by mapi_abi.py.  Do not
> modify. */
> +
> +#ifndef _GLAPI_TMP_H_
> +#define _GLAPI_TMP_H_
> +typedef int GLclampx;
> +typedef void (APIENTRY  *GLDEBUGPROCKHR)(GLenum source,GLenum
> type,GLuint id,GLenum severity,GLsizei length,const GLchar
> *message,const void *userParam);
> +#endif /* _GLAPI_TMP_H_ */
> +""".lstrip("\n"))
> +
> +    print(generate_defines(functions))
> +    print(generate_table(functions, allFunctions))
> +    print(generate_noop_array(functions))
> +    print(generate_public_stubs(functions))
> +    print(generate_public_entries(functions))
> +    print(generate_stub_asm_gcc(functions))
> +
> +def generate_defines(functions):
> +    text = r"""
> +#ifdef MAPI_TMP_DEFINES
> +#define GL_GLEXT_PROTOTYPES
> +#include "GL/gl.h"
> +#include "GL/glext.h"
> +
> +""".lstrip("\n")
> +    for func in functions:
> +        text += "GLAPI {f.rt} APIENTRY
> {f.name}({f.decArgs});\n".format(f=func)
> +    text += "#undef MAPI_TMP_DEFINES\n"
> +    text += "#endif /* MAPI_TMP_DEFINES */\n"
> +    return text
> +
> +def generate_table(functions, allFunctions):
> +    text = "#ifdef MAPI_TMP_TABLE\n"
> +    text += "#define MAPI_TABLE_NUM_STATIC %d\n" %
> (len(allFunctions))
> +    text += "#define MAPI_TABLE_NUM_DYNAMIC %d\n" %
> (genCommon.MAPI_TABLE_NUM_DYNAMIC,)
> +    text += "#undef MAPI_TMP_TABLE\n"
> +    text += "#endif /* MAPI_TMP_TABLE */\n"
> +    return text
> +
> +def generate_noop_array(functions):
> +    text = "#ifdef MAPI_TMP_NOOP_ARRAY\n"
> +    text += "#ifdef DEBUG\n\n"
> +
> +    for func in functions:
> +        text += "static {f.rt} APIENTRY
> noop{f.basename}({f.decArgs})\n".format(f=func)
> +        text += "{\n"
> +        if (len(func.args) > 0):
> +            text += "  "
> +            for arg in func.args:
> +                text += " (void) {a.name};".format(a=arg)
> +            text += "\n"
> +        text += "   noop_warn(\"{f.name}\");\n".format(f=func)
> +        if (func.hasReturn()):
> +            text += "   return ({f.rt}) 0;\n".format(f=func)
> +        text += "}\n\n"
> +
> +    text += "const mapi_func table_noop_array[] = {\n"
> +    for func in functions:
> +        text += "   (mapi_func) noop{f.basename},\n".format(f=func)
> +    for i in range(genCommon.MAPI_TABLE_NUM_DYNAMIC - 1):
> +        text += "   (mapi_func) noop_generic,\n"
> +    text += "   (mapi_func) noop_generic\n"
> +    text += "};\n\n"
> +    text += "#else /* DEBUG */\n\n"
> +    text += "const mapi_func table_noop_array[] = {\n"
> +    for i in range(len(functions) + genCommon.MAPI_TABLE_NUM_DYNAMIC
> - 1):
> +        text += "   (mapi_func) noop_generic,\n"
> +    text += "   (mapi_func) noop_generic\n"
> +
> +    text += "};\n\n"
> +    text += "#endif /* DEBUG */\n"
> +    text += "#undef MAPI_TMP_NOOP_ARRAY\n"
> +    text += "#endif /* MAPI_TMP_NOOP_ARRAY */\n"
> +    return text
> +
> +def generate_public_stubs(functions):
> +    text = "#ifdef MAPI_TMP_PUBLIC_STUBS\n"
> +
> +    text += "static const struct mapi_stub public_stubs[] = {\n"
> +    for func in functions:
> +        text += "   { \"%s\", %d, NULL },\n" % (func.name,
> func.slot)
> +    text += "};\n"
> +    text += "#undef MAPI_TMP_PUBLIC_STUBS\n"
> +    text += "#endif /* MAPI_TMP_PUBLIC_STUBS */\n"
> +    return text
> +
> +def generate_public_entries(functions):
> +    text = "#ifdef MAPI_TMP_PUBLIC_ENTRIES\n"
> +
> +    for func in functions:
> +        retStr = ("return " if func.hasReturn() else "")
> +        text += r"""
> +GLAPI {f.rt} APIENTRY {f.name}({f.decArgs})
> +{{
> +   const struct _glapi_table *_tbl = entry_current_get();
> +   mapi_func _func = ((const mapi_func *) _tbl)[{f.slot}];
> +   {retStr}(({f.rt} (APIENTRY *)({f.decArgs})) _func)({f.callArgs});
> +}}
> +
> +""".lstrip("\n").format(f=func, retStr=retStr)
> +
> +    text += "\n"
> +    text += "static const mapi_func public_entries[] = {\n"
> +    for func in functions:
> +        text += "   (mapi_func) %s,\n" % (func.name,)
> +    text += "};\n"
> +    text += "#undef MAPI_TMP_PUBLIC_ENTRIES\n"
> +    text += "#endif /* MAPI_TMP_PUBLIC_ENTRIES */\n"
> +    return text
> +
> +def generate_stub_asm_gcc(functions):
> +    text = "#ifdef MAPI_TMP_STUB_ASM_GCC\n"
> +    text += "__asm__(\n"
> +
> +    for func in functions:
> +        text += 'STUB_ASM_ENTRY("%s")"\\n"\n' % (func.name,)
> +        text += '"\\t"STUB_ASM_CODE("%d")"\\n"\n\n' % (func.slot,)
> +
> +    text += ");\n"
> +    text += "#undef MAPI_TMP_STUB_ASM_GCC\n"
> +    text += "#endif /* MAPI_TMP_STUB_ASM_GCC */\n"
> +    return text
> +
> +if (__name__ == "__main__"):
> +    _main()
> +



More information about the mesa-dev mailing list