loader: Add support for NV device extension
authorMark Lobodzinski <mark@lunarg.com>
Mon, 29 Aug 2016 21:36:23 +0000 (15:36 -0600)
committerMark Lobodzinski <mark@lunarg.com>
Wed, 31 Aug 2016 19:27:14 +0000 (13:27 -0600)
Added vkGetMemoryWin32HandleNV from the VK_NV_external_memory_win32
extension to the loader.

Change-Id: If6a959f126cc48ebf2608ed6e113e2883deae871

loader/extensions.c
loader/table_ops.h
vk-generate.py

index 3ba4b77..17190a4 100644 (file)
@@ -105,6 +105,28 @@ VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexedIndirectCountAMD(
                                          maxDrawCount, stride);
 }
 
+#ifdef VK_USE_PLATFORM_WIN32_KHR
+
+// Definitions for the VK_NV_external_memory_win32 extension
+
+static const VkExtensionProperties nv_external_memory_win32_extension_info = {
+    .extensionName = VK_NV_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME,
+    .specVersion = VK_NV_EXTERNAL_MEMORY_WIN32_SPEC_VERSION,
+};
+
+VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryWin32HandleNV(
+    VkDevice device, VkDeviceMemory memory,
+    VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE *pHandle) {
+    const VkLayerDispatchTable *disp;
+
+    disp = loader_get_dispatch(device);
+    return disp->GetMemoryWin32HandleNV(device, memory, handleType, pHandle);
+}
+
+#endif // VK_USE_PLATFORM_WIN32_KHR
+
+// GPA helpers for non-KHR extensions
+
 bool extension_instance_gpa(struct loader_instance *ptr_instance,
                             const char *name, void **addr) {
     *addr = NULL;
@@ -128,6 +150,17 @@ bool extension_instance_gpa(struct loader_instance *ptr_instance,
         return true;
     }
 
+#ifdef VK_USE_PLATFORM_WIN32_KHR
+
+    // Functions for the VK_NV_external_memory_win32 extension
+
+    if (!strcmp("vkGetMemoryWin32HandleNV", name)) {
+        *addr = (void *)vkGetMemoryWin32HandleNV;
+        return true;
+    }
+
+#endif // VK_USE_PLATFORM_WIN32_KHR
+
     return false;
 }
 
@@ -146,5 +179,13 @@ void extensions_create_instance(struct loader_instance *ptr_instance,
             // Nothing to do;
             return;
         }
+
+#ifdef VK_USE_PLATFORM_WIN32_KHR
+        if (strcmp(pCreateInfo->ppEnabledExtensionNames[i],
+                   VK_NV_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME) == 0) {
+            // Nothing to do;
+            return;
+        }
+#endif // VK_USE_PLATFORM_WIN32_KHR
     }
 }
index 014607a..5a9abf1 100644 (file)
@@ -272,6 +272,10 @@ static inline void loader_init_device_extension_dispatch_table(
     table->CmdDrawIndexedIndirectCountAMD =
         (PFN_vkCmdDrawIndexedIndirectCountAMD)gpa(
             dev, "vkCmdDrawIndexedIndirectCountAMD");
+#ifdef VK_USE_PLATFORM_WIN32_KHR
+    table->GetMemoryWin32HandleNV =
+        (PFN_vkGetMemoryWin32HandleNV)gpa(dev, "vkGetMemoryWin32HandleNV");
+#endif // VK_USE_PLATFORM_WIN32_KHR
 }
 
 static inline void *
index c136c49..e8fcead 100755 (executable)
@@ -131,69 +131,19 @@ class DispatchTableOpsSubcommand(Subcommand):
             stmts.append("    // Core device function pointers")
             stmts.append("    table->GetDeviceProcAddr = (PFN_vkGetDeviceProcAddr) gpa(device, \"vkGetDeviceProcAddr\");")
 
-            KHR_printed = False
-            EXT_printed = False
-            Win32_printed = False
-            XLIB_printed = False
-            XCB_printed = False
-            MIR_printed = False
-            WAY_printed = False
-            Android_printed = False
             for proto in self.protos:
                 if proto.name == "CreateInstance" or proto.name == "EnumerateInstanceExtensionProperties" or \
                   proto.name == "EnumerateInstanceLayerProperties" or proto.params[0].ty == "VkInstance" or \
                   proto.params[0].ty == "VkPhysicalDevice" or proto.name == "GetDeviceProcAddr":
                     continue
-                if Win32_printed and 'Win32' not in proto.name:
+                if proto.name == "GetMemoryWin32HandleNV":
+                    stmts.append("#ifdef VK_USE_PLATFORM_WIN32_KHR")
+                    stmts.append("    table->%s = (PFN_vk%s) gpa(device, \"vk%s\");" %
+                            (proto.name, proto.name, proto.name))
                     stmts.append("#endif // VK_USE_PLATFORM_WIN32_KHR")
-                    Win32_printed = False
-                if XLIB_printed and 'Xlib' not in proto.name:
-                    stmts.append("#endif // VK_USE_PLATFORM_XLIB_KHR")
-                    XLIB_printed = False
-                if XCB_printed and 'Xcb' not in proto.name:
-                    stmts.append("#endif // VK_USE_PLATFORM_XCB_KHR")
-                    XCB_printed = False
-                if MIR_printed and 'Mir' not in proto.name:
-                    stmts.append("#endif // VK_USE_PLATFORM_MIR_KHR")
-                    MIR_printed = False
-                if WAY_printed and 'Wayland' not in proto.name:
-                    stmts.append("#endif // VK_USE_PLATFORM_WAYLAND_KHR")
-                    WAY_printed = False
-                if Android_printed and 'Android' not in proto.name:
-                    stmts.append("#endif // VK_USE_PLATFORM_ANDROID_KHR")
-                    Android_printed = False
-                if 'KHR' in proto.name and 'Win32' in proto.name:
-                    if not Win32_printed:
-                        stmts.append("#ifdef VK_USE_PLATFORM_WIN32_KHR")
-                        Win32_printed = True
-                if 'KHR' in proto.name and 'Xlib' in proto.name:
-                    if not XLIB_printed:
-                        stmts.append("#ifdef VK_USE_PLATFORM_XLIB_KHR")
-                        XLIB_printed = True
-                if 'KHR' in proto.name and 'Xcb' in proto.name:
-                    if not XCB_printed:
-                        stmts.append("#ifdef VK_USE_PLATFORM_XCB_KHR")
-                        XCB_printed = True
-                if 'KHR' in proto.name and 'Mir' in proto.name:
-                    if not MIR_printed:
-                        stmts.append("#ifdef VK_USE_PLATFORM_MIR_KHR")
-                        MIR_printed = True
-                if 'KHR' in proto.name and 'Wayland' in proto.name:
-                    if not WAY_printed:
-                        stmts.append("#ifdef VK_USE_PLATFORM_WAYLAND_KHR")
-                        WAY_printed = True
-                if 'KHR' in proto.name and 'Android' in proto.name:
-                    if not Android_printed:
-                        stmts.append("#ifdef VK_USE_PLATFORM_ANDROID_KHR")
-                        Android_printed = True
-                if 'KHR' in proto.name and not KHR_printed:
-                    stmts.append("    // KHR device extension function pointers")
-                    KHR_printed = True
-                if 'EXT' in proto.name and not EXT_printed:
-                    stmts.append("    // EXT device extension function pointers")
-                    EXT_printed = True
-                stmts.append("    table->%s = (PFN_vk%s) gpa(device, \"vk%s\");" %
-                        (proto.name, proto.name, proto.name))
+                else:
+                    stmts.append("    table->%s = (PFN_vk%s) gpa(device, \"vk%s\");" %
+                            (proto.name, proto.name, proto.name))
             func.append("static inline void %s_init_device_dispatch_table(VkDevice device,"
                 % self.prefix)
             func.append("%s                                               VkLayerDispatchTable *table,"