[Mesa-dev] [PATCH] radv: add back ability to gen some entrypoints from optional headers (v2)

Lionel Landwerlin lionel.g.landwerlin at intel.com
Tue Jan 24 14:12:24 UTC 2017


Hi Dave,

I should mention that the motivation for switching to vk.xml is to deal 
with coming extensions (non public ones yet), which are being discuss by 
the Khronos group and have already proposed patches for vk.xml & headers.
In particular, some of them put entrypoints under flags which is not 
easily parsed by a regexp.

That being said :

Acked-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>

On 24/01/17 01:17, Dave Airlie wrote:
> From: Dave Airlie <airlied at 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.
> Cc: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
> Signed-off-by: Dave Airlie <airlied at 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..a4e72a7 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 = 0
> +    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.
>   




More information about the mesa-dev mailing list