[Mesa-dev] [PATCH v3 01/15] anv: anv_entrypoints_gen.py: use a main function
Lionel Landwerlin
lionel.g.landwerlin at intel.com
Tue Feb 28 10:53:53 UTC 2017
Patches 1-6 are :
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Thanks!
On 24/02/17 18:21, Dylan Baker wrote:
> This is just good practice.
>
> Signed-off-by: Dylan Baker <dylanx.c.baker at intel.com>
> ---
> src/intel/vulkan/anv_entrypoints_gen.py | 458 ++++++++++++-------------
> 1 file changed, 233 insertions(+), 225 deletions(-)
>
> diff --git a/src/intel/vulkan/anv_entrypoints_gen.py b/src/intel/vulkan/anv_entrypoints_gen.py
> index 93511ec..3f7a1ce 100644
> --- a/src/intel/vulkan/anv_entrypoints_gen.py
> +++ b/src/intel/vulkan/anv_entrypoints_gen.py
> @@ -1,6 +1,6 @@
> # coding=utf-8
> #
> -# Copyright © 2015 Intel Corporation
> +# Copyright © 2015, 2017 Intel Corporation
> #
> # Permission is hereby granted, free of charge, to any person obtaining a
> # copy of this software and associated documentation files (the "Software"),
> @@ -23,6 +23,7 @@
> #
>
> import sys
> +import textwrap
> import xml.etree.ElementTree as ET
>
> max_api_version = 1.0
> @@ -130,235 +131,242 @@ def get_entrypoints_defines(doc):
> entrypoints_to_defines[fullname] = define
> return entrypoints_to_defines
>
> -doc = ET.parse(sys.stdin)
> -entrypoints = get_entrypoints(doc, get_entrypoints_defines(doc))
> -
> -# Manually add CreateDmaBufImageINTEL for which we don't have an extension
> -# defined.
> -entrypoints.append(('VkResult', 'CreateDmaBufImageINTEL',
> - 'VkDevice device, ' +
> - 'const VkDmaBufImageCreateInfo* pCreateInfo, ' +
> - 'const VkAllocationCallbacks* pAllocator,' +
> - 'VkDeviceMemory* pMem,' +
> - 'VkImage* pImage', len(entrypoints),
> - hash('vkCreateDmaBufImageINTEL'), None))
> -
> -# For outputting entrypoints.h we generate a anv_EntryPoint() prototype
> -# per entry point.
> -
> -if opt_header:
> - print "/* This file generated from vk_gen.py, don't edit directly. */\n"
> -
> - print "struct anv_dispatch_table {"
> - print " union {"
> - print " void *entrypoints[%d];" % len(entrypoints)
> - print " struct {"
>
> +def main():
> + doc = ET.parse(sys.stdin)
> + entrypoints = get_entrypoints(doc, get_entrypoints_defines(doc))
> +
> + # Manually add CreateDmaBufImageINTEL for which we don't have an extension
> + # defined.
> + entrypoints.append(('VkResult', 'CreateDmaBufImageINTEL',
> + 'VkDevice device, ' +
> + 'const VkDmaBufImageCreateInfo* pCreateInfo, ' +
> + 'const VkAllocationCallbacks* pAllocator,' +
> + 'VkDeviceMemory* pMem,' +
> + 'VkImage* pImage', len(entrypoints),
> + hash('vkCreateDmaBufImageINTEL'), None))
> +
> + # For outputting entrypoints.h we generate a anv_EntryPoint() prototype
> + # per entry point.
> +
> + if opt_header:
> + print "/* This file generated from vk_gen.py, don't edit directly. */\n"
> +
> + print "struct anv_dispatch_table {"
> + print " union {"
> + print " void *entrypoints[%d];" % len(entrypoints)
> + print " struct {"
> +
> + for type, name, args, num, h, guard in entrypoints:
> + if guard is not None:
> + print "#ifdef {0}".format(guard)
> + print " PFN_vk{0} {0};".format(name)
> + print "#else"
> + print " void *{0};".format(name)
> + print "#endif"
> + else:
> + print " PFN_vk{0} {0};".format(name)
> + print " };\n"
> + print " };\n"
> + print "};\n"
> +
> + print "void anv_set_dispatch_devinfo(const struct gen_device_info *info);\n"
> +
> + for type, name, args, num, h, guard in entrypoints:
> + print_guard_start(guard)
> + print "%s anv_%s(%s);" % (type, name, args)
> + print "%s gen7_%s(%s);" % (type, name, args)
> + print "%s gen75_%s(%s);" % (type, name, args)
> + print "%s gen8_%s(%s);" % (type, name, args)
> + print "%s gen9_%s(%s);" % (type, name, args)
> + print_guard_end(guard)
> + exit()
> +
> +
> +
> + print textwrap.dedent("""\
> + /*
> + * Copyright © 2015 Intel 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 (including the next
> + * paragraph) 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.
> + */
> +
> + /* DO NOT EDIT! This is a generated file. */
> +
> + #include "anv_private.h"
> +
> + struct anv_entrypoint {
> + uint32_t name;
> + uint32_t hash;
> + };
> +
> + /* We use a big string constant to avoid lots of reloctions from the entry
> + * point table to lots of little strings. The entries in the entry point table
> + * store the index into this big string.
> + */
> +
> + static const char strings[] =""")
> +
> + offsets = []
> + i = 0;
> for type, name, args, num, h, guard in entrypoints:
> - if guard is not None:
> - print "#ifdef {0}".format(guard)
> - print " PFN_vk{0} {0};".format(name)
> - print "#else"
> - print " void *{0};".format(name)
> - print "#endif"
> - else:
> - print " PFN_vk{0} {0};".format(name)
> - print " };\n"
> - print " };\n"
> - print "};\n"
> + print " \"vk%s\\0\"" % name
> + offsets.append(i)
> + i += 2 + len(name) + 1
> + print " ;"
>
> - print "void anv_set_dispatch_devinfo(const struct gen_device_info *info);\n"
> + # Now generate the table of all entry points
>
> + print "\nstatic const struct anv_entrypoint entrypoints[] = {"
> for type, name, args, num, h, guard in entrypoints:
> - print_guard_start(guard)
> - print "%s anv_%s(%s);" % (type, name, args)
> - print "%s gen7_%s(%s);" % (type, name, args)
> - print "%s gen75_%s(%s);" % (type, name, args)
> - print "%s gen8_%s(%s);" % (type, name, args)
> - print "%s gen9_%s(%s);" % (type, name, args)
> - print_guard_end(guard)
> - exit()
> -
> -
> -
> -print """/*
> - * Copyright © 2015 Intel 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 (including the next
> - * paragraph) 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.
> - */
> -
> -/* DO NOT EDIT! This is a generated file. */
> -
> -#include "anv_private.h"
> -
> -struct anv_entrypoint {
> - uint32_t name;
> - uint32_t hash;
> -};
> -
> -/* We use a big string constant to avoid lots of reloctions from the entry
> - * point table to lots of little strings. The entries in the entry point table
> - * store the index into this big string.
> - */
> -
> -static const char strings[] ="""
> -
> -offsets = []
> -i = 0;
> -for type, name, args, num, h, guard in entrypoints:
> - print " \"vk%s\\0\"" % name
> - offsets.append(i)
> - i += 2 + len(name) + 1
> -print " ;"
> -
> -# Now generate the table of all entry points
> -
> -print "\nstatic const struct anv_entrypoint entrypoints[] = {"
> -for type, name, args, num, h, guard in entrypoints:
> - print " { %5d, 0x%08x }," % (offsets[num], h)
> -print "};\n"
> -
> -print """
> -
> -/* Weak aliases for all potential implementations. These will resolve to
> - * NULL if they're not defined, which lets the resolve_entrypoint() function
> - * either pick the correct entry point.
> - */
> -"""
> -
> -for layer in [ "anv", "gen7", "gen75", "gen8", "gen9" ]:
> - for type, name, args, num, h, guard in entrypoints:
> - print_guard_start(guard)
> - print "%s %s_%s(%s) __attribute__ ((weak));" % (type, layer, name, args)
> - print_guard_end(guard)
> - print "\nconst struct anv_dispatch_table %s_layer = {" % layer
> - for type, name, args, num, h, guard in entrypoints:
> - print_guard_start(guard)
> - print " .%s = %s_%s," % (name, layer, name)
> - print_guard_end(guard)
> + print " { %5d, 0x%08x }," % (offsets[num], h)
> print "};\n"
>
> -print """
> -static void * __attribute__ ((noinline))
> -anv_resolve_entrypoint(const struct gen_device_info *devinfo, uint32_t index)
> -{
> - if (devinfo == NULL) {
> - return anv_layer.entrypoints[index];
> - }
> -
> - switch (devinfo->gen) {
> - case 9:
> - if (gen9_layer.entrypoints[index])
> - return gen9_layer.entrypoints[index];
> - /* fall through */
> - case 8:
> - if (gen8_layer.entrypoints[index])
> - return gen8_layer.entrypoints[index];
> - /* fall through */
> - case 7:
> - if (devinfo->is_haswell && gen75_layer.entrypoints[index])
> - return gen75_layer.entrypoints[index];
> -
> - if (gen7_layer.entrypoints[index])
> - return gen7_layer.entrypoints[index];
> - /* fall through */
> - case 0:
> - return anv_layer.entrypoints[index];
> - default:
> - unreachable("unsupported gen\\n");
> - }
> -}
> -"""
> -
> -# Now generate the hash table used for entry point look up. This is a
> -# uint16_t table of entry point indices. We use 0xffff to indicate an entry
> -# in the hash table is empty.
> -
> -map = [none for f in xrange(hash_size)]
> -collisions = [0 for f in xrange(10)]
> -for type, name, args, num, h, guard in entrypoints:
> - level = 0
> - while map[h & hash_mask] != none:
> - h = h + prime_step
> - level = level + 1
> - if level > 9:
> - collisions[9] += 1
> - else:
> - collisions[level] += 1
> - map[h & hash_mask] = num
> -
> -print "/* Hash table stats:"
> -print " * size %d entries" % hash_size
> -print " * collisions entries"
> -for i in xrange(10):
> - if (i == 9):
> - plus = "+"
> - else:
> - plus = " "
> -
> - print " * %2d%s %4d" % (i, plus, collisions[i])
> -print " */\n"
> -
> -print "#define none 0x%04x\n" % none
> -
> -print "static const uint16_t map[] = {"
> -for i in xrange(0, hash_size, 8):
> - print " ",
> - for j in xrange(i, i + 8):
> - if map[j] & 0xffff == 0xffff:
> - print " none,",
> + print textwrap.dedent("""
> +
> + /* Weak aliases for all potential implementations. These will resolve to
> + * NULL if they're not defined, which lets the resolve_entrypoint() function
> + * either pick the correct entry point.
> + */
> + """)
> +
> + for layer in [ "anv", "gen7", "gen75", "gen8", "gen9" ]:
> + for type, name, args, num, h, guard in entrypoints:
> + print_guard_start(guard)
> + print "%s %s_%s(%s) __attribute__ ((weak));" % (type, layer, name, args)
> + print_guard_end(guard)
> + print "\nconst struct anv_dispatch_table %s_layer = {" % layer
> + for type, name, args, num, h, guard in entrypoints:
> + print_guard_start(guard)
> + print " .%s = %s_%s," % (name, layer, name)
> + print_guard_end(guard)
> + print "};\n"
> +
> + print textwrap.dedent("""
> + static void * __attribute__ ((noinline))
> + anv_resolve_entrypoint(const struct gen_device_info *devinfo, uint32_t index)
> + {
> + if (devinfo == NULL) {
> + return anv_layer.entrypoints[index];
> + }
> +
> + switch (devinfo->gen) {
> + case 9:
> + if (gen9_layer.entrypoints[index])
> + return gen9_layer.entrypoints[index];
> + /* fall through */
> + case 8:
> + if (gen8_layer.entrypoints[index])
> + return gen8_layer.entrypoints[index];
> + /* fall through */
> + case 7:
> + if (devinfo->is_haswell && gen75_layer.entrypoints[index])
> + return gen75_layer.entrypoints[index];
> +
> + if (gen7_layer.entrypoints[index])
> + return gen7_layer.entrypoints[index];
> + /* fall through */
> + case 0:
> + return anv_layer.entrypoints[index];
> + default:
> + unreachable("unsupported gen\\n");
> + }
> + }
> + """)
> +
> + # Now generate the hash table used for entry point look up. This is a
> + # uint16_t table of entry point indices. We use 0xffff to indicate an entry
> + # in the hash table is empty.
> +
> + map = [none for f in xrange(hash_size)]
> + collisions = [0 for f in xrange(10)]
> + for type, name, args, num, h, guard in entrypoints:
> + level = 0
> + while map[h & hash_mask] != none:
> + h = h + prime_step
> + level = level + 1
> + if level > 9:
> + collisions[9] += 1
> + else:
> + collisions[level] += 1
> + map[h & hash_mask] = num
> +
> + print "/* Hash table stats:"
> + print " * size %d entries" % hash_size
> + print " * collisions entries"
> + for i in xrange(10):
> + if (i == 9):
> + plus = "+"
> else:
> - print "0x%04x," % (map[j] & 0xffff),
> - print
> -
> -print "};"
> -
> -# Finally we generate the hash table lookup function. The hash function and
> -# linear probing algorithm matches the hash table generated above.
> -
> -print """
> -void *
> -anv_lookup_entrypoint(const struct gen_device_info *devinfo, const char *name)
> -{
> - static const uint32_t prime_factor = %d;
> - static const uint32_t prime_step = %d;
> - const struct anv_entrypoint *e;
> - uint32_t hash, h, i;
> - const char *p;
> -
> - hash = 0;
> - for (p = name; *p; p++)
> - hash = hash * prime_factor + *p;
> -
> - h = hash;
> - do {
> - i = map[h & %d];
> - if (i == none)
> - return NULL;
> - e = &entrypoints[i];
> - h += prime_step;
> - } while (e->hash != hash);
> -
> - if (strcmp(name, strings + e->name) != 0)
> - return NULL;
> -
> - return anv_resolve_entrypoint(devinfo, i);
> -}
> -""" % (prime_factor, prime_step, hash_mask)
> + plus = " "
> +
> + print " * %2d%s %4d" % (i, plus, collisions[i])
> + print " */\n"
> +
> + print "#define none 0x%04x\n" % none
> +
> + print "static const uint16_t map[] = {"
> + for i in xrange(0, hash_size, 8):
> + print " ",
> + for j in xrange(i, i + 8):
> + if map[j] & 0xffff == 0xffff:
> + print " none,",
> + else:
> + print "0x%04x," % (map[j] & 0xffff),
> + print
> +
> + print "};"
> +
> + # Finally we generate the hash table lookup function. The hash function and
> + # linear probing algorithm matches the hash table generated above.
> +
> + print textwrap.dedent("""
> + void *
> + anv_lookup_entrypoint(const struct gen_device_info *devinfo, const char *name)
> + {
> + static const uint32_t prime_factor = %d;
> + static const uint32_t prime_step = %d;
> + const struct anv_entrypoint *e;
> + uint32_t hash, h, i;
> + const char *p;
> +
> + hash = 0;
> + for (p = name; *p; p++)
> + hash = hash * prime_factor + *p;
> +
> + h = hash;
> + do {
> + i = map[h & %d];
> + if (i == none)
> + return NULL;
> + e = &entrypoints[i];
> + h += prime_step;
> + } while (e->hash != hash);
> +
> + if (strcmp(name, strings + e->name) != 0)
> + return NULL;
> +
> + return anv_resolve_entrypoint(devinfo, i);
> + }
> + """) % (prime_factor, prime_step, hash_mask)
> +
> +
> +if __name__ == '__main__':
> + main()
>
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170228/efe45b72/attachment-0001.html>
More information about the mesa-dev
mailing list