From: Mark Lobodzinski Date: Mon, 29 Aug 2016 21:36:23 +0000 (-0600) Subject: loader: Add support for NV device extension X-Git-Tag: upstream/1.1.92~2616 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a71dfb7eab11c7bb8d5308b2f9b607a4e043e763;p=platform%2Fupstream%2FVulkan-Tools.git loader: Add support for NV device extension Added vkGetMemoryWin32HandleNV from the VK_NV_external_memory_win32 extension to the loader. Change-Id: If6a959f126cc48ebf2608ed6e113e2883deae871 --- diff --git a/loader/extensions.c b/loader/extensions.c index 3ba4b77..17190a4 100644 --- a/loader/extensions.c +++ b/loader/extensions.c @@ -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 } } diff --git a/loader/table_ops.h b/loader/table_ops.h index 014607a..5a9abf1 100644 --- a/loader/table_ops.h +++ b/loader/table_ops.h @@ -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 * diff --git a/vk-generate.py b/vk-generate.py index c136c49..e8fcead 100755 --- a/vk-generate.py +++ b/vk-generate.py @@ -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,"