From: Dave Airlie <airl...@redhat.com> bf8e1f9e7 radv: generate entrypoints from vk.xml ripped out the ability to add extra header files (and writing extra xml files is a bit messier). For some non-public development or even developing future EXT/MESA extensions, it would be nice to allow this option before things land in the registry.
This reintroduces this functionality on top of the registry. I think anv might also be interested in having this work. v2: add back include files which I think install needs. v3: fix bug with adding entrypoints in wrong place. Cc: Lionel Landwerlin <lionel.g.landwer...@intel.com> Signed-off-by: Dave Airlie <airl...@redhat.com> --- src/amd/vulkan/Makefile.am | 14 +++++++----- src/amd/vulkan/radv_entrypoints_gen.py | 39 ++++++++++++++++++++++++++++++++-- 2 files changed, 46 insertions(+), 7 deletions(-) diff --git a/src/amd/vulkan/Makefile.am b/src/amd/vulkan/Makefile.am index b47109b..a25c5b8 100644 --- a/src/amd/vulkan/Makefile.am +++ b/src/amd/vulkan/Makefile.am @@ -23,10 +23,14 @@ include Makefile.sources vulkan_includedir = $(includedir)/vulkan -vulkan_include_HEADERS = \ +vulkan_include_HEADERS = $(top_srcdir)/include/vulkan/vk_platform.h \ $(top_srcdir)/include/vulkan/vulkan.h +# Unused in-tree but used for out of tree development (KHR internal or otherwise) +vulkan_extra_includedir = $(includedir)/vulkan +vulkan_extra_include_HEADERS = + lib_LTLIBRARIES = libvulkan_radeon.la # The gallium includes are for the util/u_math.h include from main/macros.h @@ -113,13 +117,13 @@ libvulkan_radeon_la_SOURCES = $(VULKAN_GEM_FILES) vulkan_api_xml = $(top_srcdir)/src/vulkan/registry/vk.xml -radv_entrypoints.h : radv_entrypoints_gen.py $(vulkan_api_xml) +radv_entrypoints.h : radv_entrypoints_gen.py $(vulkan_api_xml) $(vulkan_extra_include_HEADERS) $(AM_V_GEN) cat $(vulkan_api_xml) |\ - $(PYTHON2) $(srcdir)/radv_entrypoints_gen.py header > $@ + $(PYTHON2) $(srcdir)/radv_entrypoints_gen.py header $(vulkan_extra_include_HEADERS) > $@ -radv_entrypoints.c : radv_entrypoints_gen.py $(vulkan_api_xml) +radv_entrypoints.c : radv_entrypoints_gen.py $(vulkan_api_xml) $(vulkan_extra_include_HEADERS) $(AM_V_GEN) cat $(vulkan_api_xml) |\ - $(PYTHON2) $(srcdir)/radv_entrypoints_gen.py code > $@ + $(PYTHON2) $(srcdir)/radv_entrypoints_gen.py code $(vulkan_extra_include_HEADERS) > $@ vk_format_table.c: vk_format_table.py \ vk_format_parse.py \ diff --git a/src/amd/vulkan/radv_entrypoints_gen.py b/src/amd/vulkan/radv_entrypoints_gen.py index adab91a..8cf556b 100644 --- a/src/amd/vulkan/radv_entrypoints_gen.py +++ b/src/amd/vulkan/radv_entrypoints_gen.py @@ -24,6 +24,13 @@ import sys import xml.etree.ElementTree as ET +import fileinput +import re + +# 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([^(]*)\)(.*);') # We generate a static hash table for entry point lookup # (vkGetProcAddress). We use a linear congruential generator for our hash @@ -58,10 +65,10 @@ opt_code = False if (sys.argv[1] == "header"): opt_header = True - sys.argv.pop() + sys.argv.pop(1) elif (sys.argv[1] == "code"): opt_code = True - sys.argv.pop() + sys.argv.pop(1) # Extract the entry points from the registry def get_entrypoints(doc, entrypoints_to_defines): @@ -92,9 +99,37 @@ def get_entrypoints_defines(doc): entrypoints_to_defines[fullname] = define return entrypoints_to_defines +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 + doc = ET.parse(sys.stdin) entrypoints = get_entrypoints(doc, get_entrypoints_defines(doc)) +# See if we got any other files +if (len(sys.argv) > 1): + i = len(entrypoints) + for line in fileinput.input(sys.argv[1:]): + m = p.match(line) + if (m): + if m.group(2) == 'VoidFunction': + continue + fullname = "vk" + m.group(2) + entrypoints.append((m.group(1), m.group(2), m.group(3).strip("()"), i, hash(fullname), get_platform_guard_macro(fullname))) + i = i + 1 + # For outputting entrypoints.h we generate a radv_EntryPoint() prototype # per entry point. -- 2.9.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev