I made a quick comment below. With that, this patch is Reviewed-by: Jason Ekstrand <[email protected]>
Assuming you pulled 1 and 2 from master of the public github repo for Khronos, they are Acked-by: Jason Ekstrand <[email protected]> On Thu, Jan 12, 2017 at 1:43 PM, Lionel Landwerlin < [email protected]> wrote: > Signed-off-by: Lionel Landwerlin <[email protected]> > --- > src/intel/vulkan/Makefile.am | 15 ++-- > src/intel/vulkan/anv_entrypoints_gen.py | 125 > +++++++++++++++++--------------- > 2 files changed, 71 insertions(+), 69 deletions(-) > > diff --git a/src/intel/vulkan/Makefile.am b/src/intel/vulkan/Makefile.am > index df7645fb13..d32b57f267 100644 > --- a/src/intel/vulkan/Makefile.am > +++ b/src/intel/vulkan/Makefile.am > @@ -23,11 +23,6 @@ include Makefile.sources > > vulkan_includedir = $(includedir)/vulkan > > -vulkan_include_HEADERS = \ > - $(top_srcdir)/include/vulkan/vk_platform.h \ > - $(top_srcdir)/include/vulkan/vulkan.h \ > - $(top_srcdir)/include/vulkan/vulkan_intel.h > - > lib_LTLIBRARIES = libvulkan_intel.la > > check_LTLIBRARIES = libvulkan-test.la > @@ -138,12 +133,14 @@ VULKAN_LIB_DEPS += \ > nodist_EXTRA_libvulkan_intel_la_SOURCES = dummy.cpp > libvulkan_intel_la_SOURCES = $(VULKAN_GEM_FILES) > > -anv_entrypoints.h : anv_entrypoints_gen.py $(vulkan_include_HEADERS) > - $(AM_V_GEN) cat $(vulkan_include_HEADERS) |\ > +vulkan_api_xml = $(top_srcdir)/src/vulkan/registry/vk.xml > + > +anv_entrypoints.h : anv_entrypoints_gen.py $(vulkan_api_xml) > + $(AM_V_GEN) cat $(vulkan_api_xml) |\ > $(PYTHON2) $(srcdir)/anv_entrypoints_gen.py header > $@ > > -anv_entrypoints.c : anv_entrypoints_gen.py $(vulkan_include_HEADERS) > - $(AM_V_GEN) cat $(vulkan_include_HEADERS) |\ > +anv_entrypoints.c : anv_entrypoints_gen.py $(vulkan_api_xml) > + $(AM_V_GEN) cat $(vulkan_api_xml) |\ > $(PYTHON2) $(srcdir)/anv_entrypoints_gen.py code > $@ > > BUILT_SOURCES = $(VULKAN_GENERATED_FILES) > diff --git a/src/intel/vulkan/anv_entrypoints_gen.py > b/src/intel/vulkan/anv_entrypoints_gen.py > index 9d23dbb358..e303b7e8e8 100644 > --- a/src/intel/vulkan/anv_entrypoints_gen.py > +++ b/src/intel/vulkan/anv_entrypoints_gen.py > @@ -23,13 +23,7 @@ > # > > import fileinput, re, sys > - > -# Each function typedef in the vulkan.h header is all on one line and > matches > -# this regepx. We hope that won't change. > - > -p = re.compile('typedef ([^ ]*) *\((?:VKAPI_PTR)? > *\*PFN_vk([^(]*)\)(.*);') > - > -entrypoints = [] > +import xml.etree.ElementTree as ET > > # We generate a static hash table for entry point lookup > # (vkGetProcAddress). We use a linear congruential generator for our hash > @@ -51,29 +45,11 @@ def hash(name): > > return h > > -def get_platform_guard_macro(name): > - if "Xlib" in name: > - return "VK_USE_PLATFORM_XLIB_KHR" > - elif "Xcb" in name: > - return "VK_USE_PLATFORM_XCB_KHR" > - elif "Wayland" in name: > - return "VK_USE_PLATFORM_WAYLAND_KHR" > - elif "Mir" in name: > - return "VK_USE_PLATFORM_MIR_KHR" > - elif "Android" in name: > - return "VK_USE_PLATFORM_ANDROID_KHR" > - elif "Win32" in name: > - return "VK_USE_PLATFORM_WIN32_KHR" > - else: > - return None > - > -def print_guard_start(name): > - guard = get_platform_guard_macro(name) > +def print_guard_start(guard): > if guard is not None: > print "#ifdef {0}".format(guard) > > -def print_guard_end(name): > - guard = get_platform_guard_macro(name) > +def print_guard_end(guard): > if guard is not None: > print "#endif // {0}".format(guard) > > @@ -87,18 +63,48 @@ elif (sys.argv[1] == "code"): > opt_code = True > sys.argv.pop() > > -# Parse the entry points in the header > - > -i = 0 > -for line in fileinput.input(): > - m = p.match(line) > - if (m): > - if m.group(2) == 'VoidFunction': > - continue > - fullname = "vk" + m.group(2) > - h = hash(fullname) > - entrypoints.append((m.group(1), m.group(2), m.group(3), i, h)) > - i = i + 1 > +# Extract the entry points from the registry > +def get_entrypoints(doc, entrypoints_to_defines): > + i = 0 > + entrypoints = [] > + commands = doc.findall('./commands/command') > + for command in commands: > If you use python's "itertools", you can avoid incrementing "i". Just do for i, command in itertools.iterate(commands): > + type = command.find('./proto/type').text > + name = command.find('./proto/name').text[2:] > + params = map(lambda p: "".join(p.itertext()), > command.findall('./param')) > + params = ', '.join(params) > + if name in entrypoints_to_defines: > + guard = entrypoints_to_defines[name] > + else: > + guard = None > + entrypoints.append((type, name, params, i, hash(name), guard)) > + i += 1 > + return entrypoints > + > +# Maps entry points to extension defines > +def get_entrypoints_defines(doc): > + entrypoints_to_defines = {} > + extensions = doc.findall('./extensions/extension') > + for extension in extensions: > + define = extension.get('protect') > + entrypoints = extension.findall('./require/command') > + for entrypoint in entrypoints: > + name = entrypoint.get('name')[2:] > + entrypoints_to_defines[name] = 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('CreateDmaBufImageINTEL'), None)) > > # For outputting entrypoints.h we generate a anv_EntryPoint() prototype > # per entry point. > @@ -111,8 +117,7 @@ if opt_header: > print " void *entrypoints[%d];" % len(entrypoints) > print " struct {" > > - for type, name, args, num, h in entrypoints: > - guard = get_platform_guard_macro(name) > + 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) > @@ -127,14 +132,14 @@ if opt_header: > > print "void anv_set_dispatch_devinfo(const struct gen_device_info > *info);\n" > > - for type, name, args, num, h in entrypoints: > - print_guard_start(name) > - 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(name) > + 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() > > > @@ -180,7 +185,7 @@ static const char strings[] =""" > > offsets = [] > i = 0; > -for type, name, args, num, h in entrypoints: > +for type, name, args, num, h, guard in entrypoints: > print " \"vk%s\\0\"" % name > offsets.append(i) > i += 2 + len(name) + 1 > @@ -189,7 +194,7 @@ print " ;" > # Now generate the table of all entry points > > print "\nstatic const struct anv_entrypoint entrypoints[] = {" > -for type, name, args, num, h in entrypoints: > +for type, name, args, num, h, guard in entrypoints: > print " { %5d, 0x%08x }," % (offsets[num], h) > print "};\n" > > @@ -202,15 +207,15 @@ print """ > """ > > for layer in [ "anv", "gen7", "gen75", "gen8", "gen9" ]: > - for type, name, args, num, h in entrypoints: > - print_guard_start(name) > - print "%s %s_%s%s __attribute__ ((weak));" % (type, layer, name, > args) > - print_guard_end(name) > + 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 in entrypoints: > - print_guard_start(name) > + for type, name, args, num, h, guard in entrypoints: > + print_guard_start(guard) > print " .%s = %s_%s," % (name, layer, name) > - print_guard_end(name) > + print_guard_end(guard) > print "};\n" > > print """ > @@ -251,7 +256,7 @@ anv_resolve_entrypoint(const struct gen_device_info > *devinfo, uint32_t index) > > map = [none for f in xrange(hash_size)] > collisions = [0 for f in xrange(10)] > -for type, name, args, num, h in entrypoints: > +for type, name, args, num, h, guard in entrypoints: > level = 0 > while map[h & hash_mask] != none: > h = h + prime_step > @@ -286,7 +291,7 @@ for i in xrange(0, hash_size, 8): > print "0x%04x," % (map[j] & 0xffff), > print > > -print "};" > +print "};" > > # Finally we generate the hash table lookup function. The hash function > and > # linear probing algorithm matches the hash table generated above. > -- > 2.11.0 > > _______________________________________________ > mesa-dev mailing list > [email protected] > https://lists.freedesktop.org/mailman/listinfo/mesa-dev >
_______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
