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.landwer...@intel.com>

On 24/01/17 01:17, Dave Airlie wrote:
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.
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..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.


_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to