diff --git a/src/MagnumExternal/Vulkan/flextVk.cpp b/src/MagnumExternal/Vulkan/flextVk.cpp index 9b41236d4..1cdab51ba 100644 --- a/src/MagnumExternal/Vulkan/flextVk.cpp +++ b/src/MagnumExternal/Vulkan/flextVk.cpp @@ -26,10 +26,16 @@ #include "flextVk.h" #include "flextVkGlobal.h" +VkResult(VKAPI_PTR *flextvkEnumerateInstanceVersion)(uint32_t*) = nullptr; + FlextVkInstance flextVkInstance{}; FlextVkDevice flextVkDevice{}; +void flextVkInit() { + flextvkEnumerateInstanceVersion = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkEnumerateInstanceVersion")); +} + void flextVkInitInstance(VkInstance instance, FlextVkInstance* data) { data->GetPhysicalDevicePresentRectanglesKHR = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkGetPhysicalDevicePresentRectanglesKHR")); data->EnumeratePhysicalDeviceGroupsKHR = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkEnumeratePhysicalDeviceGroupsKHR")); @@ -217,7 +223,6 @@ void flextVkInitDevice(VkDevice device, FlextVkDevice* data, PFN_vkVoidFunction( data->CreateSamplerYcbcrConversion = reinterpret_cast(getDeviceProcAddr(device, "vkCreateSamplerYcbcrConversion")); data->DestroyDescriptorUpdateTemplate = reinterpret_cast(getDeviceProcAddr(device, "vkDestroyDescriptorUpdateTemplate")); data->DestroySamplerYcbcrConversion = reinterpret_cast(getDeviceProcAddr(device, "vkDestroySamplerYcbcrConversion")); - data->EnumerateInstanceVersion = reinterpret_cast(getDeviceProcAddr(device, "vkEnumerateInstanceVersion")); data->GetBufferMemoryRequirements2 = reinterpret_cast(getDeviceProcAddr(device, "vkGetBufferMemoryRequirements2")); data->GetDescriptorSetLayoutSupport = reinterpret_cast(getDeviceProcAddr(device, "vkGetDescriptorSetLayoutSupport")); data->GetDeviceGroupPeerMemoryFeatures = reinterpret_cast(getDeviceProcAddr(device, "vkGetDeviceGroupPeerMemoryFeatures")); diff --git a/src/MagnumExternal/Vulkan/flextVk.cpp.template b/src/MagnumExternal/Vulkan/flextVk.cpp.template index 0ae549d80..f0973497b 100644 --- a/src/MagnumExternal/Vulkan/flextVk.cpp.template +++ b/src/MagnumExternal/Vulkan/flextVk.cpp.template @@ -27,10 +27,34 @@ #include "flextVk.h" #include "flextVkGlobal.h" +@for category,funcs in functions: +@if funcs: +@for f in funcs: +@if f.name in ['EnumerateInstanceVersion']: +@f.returntype\ +(VKAPI_PTR *flextvk@f.name)(@f.param_type_list_string()) = nullptr; +@end +@end +@end +@end + FlextVkInstance flextVkInstance{}; FlextVkDevice flextVkDevice{}; +void flextVkInit() { + @for category,funcs in functions: + @if funcs: + @for f in funcs: + @if f.name in ['EnumerateInstanceVersion']: + flextvk@f.name = reinterpret_cast<@f.returntype\ +(*)(@f.param_type_list_string())>(vkGetInstanceProcAddr(nullptr, "vk@f.name")); + @end + @end + @end + @end +} + void flextVkInitInstance(VkInstance instance, FlextVkInstance* data) { @for category,funcs in functions: @if funcs: @@ -47,7 +71,7 @@ void flextVkInitInstance(VkInstance instance, FlextVkInstance* data) { void flextVkInitDevice(VkDevice device, FlextVkDevice* data, PFN_vkVoidFunction(VKAPI_PTR *getDeviceProcAddr)(VkDevice, const char*)) { @for category,funcs in functions: @for f in funcs: - @if f.params[0][1] not in ['VkInstance', 'VkPhysicalDevice'] and f.name not in ['GetInstanceProcAddr', 'GetDeviceProcAddr', 'EnumerateInstanceExtensionProperties', 'EnumerateInstanceLayerProperties', 'CreateInstance']: + @if f.params[0][1] not in ['VkInstance', 'VkPhysicalDevice'] and f.name not in ['GetInstanceProcAddr', 'GetDeviceProcAddr', 'EnumerateInstanceVersion', 'EnumerateInstanceExtensionProperties', 'EnumerateInstanceLayerProperties', 'CreateInstance']: data->@f.name = reinterpret_cast<@f.returntype\ (VKAPI_PTR*)(@f.param_type_list_string())>(getDeviceProcAddr(device, "vk@f.name")); @end diff --git a/src/MagnumExternal/Vulkan/flextVk.h b/src/MagnumExternal/Vulkan/flextVk.h index 450af5db9..549aa646c 100644 --- a/src/MagnumExternal/Vulkan/flextVk.h +++ b/src/MagnumExternal/Vulkan/flextVk.h @@ -3292,6 +3292,14 @@ VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t*, VkLayerProperties*); VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance, const char*); +/* Global function pointers. These are not present in all Vulkan versions, so + they need to be loaded at runtime. */ +extern FLEXTVK_EXPORT VkResult(VKAPI_PTR *flextvkEnumerateInstanceVersion)(uint32_t*); +#define vkEnumerateInstanceVersion flextvkEnumerateInstanceVersion + +/* Global function pointer initialization */ +void FLEXTVK_EXPORT flextVkInit(); + /* Per-instance function pointers */ struct FlextVkInstance { @@ -3568,7 +3576,6 @@ struct FlextVkDevice { VkResult (VKAPI_PTR *CreateSamplerYcbcrConversion)(VkDevice, const VkSamplerYcbcrConversionCreateInfo*, const VkAllocationCallbacks*, VkSamplerYcbcrConversion*); void (VKAPI_PTR *DestroyDescriptorUpdateTemplate)(VkDevice, VkDescriptorUpdateTemplate, const VkAllocationCallbacks*); void (VKAPI_PTR *DestroySamplerYcbcrConversion)(VkDevice, VkSamplerYcbcrConversion, const VkAllocationCallbacks*); - VkResult (VKAPI_PTR *EnumerateInstanceVersion)(uint32_t*); void (VKAPI_PTR *GetBufferMemoryRequirements2)(VkDevice, const VkBufferMemoryRequirementsInfo2*, VkMemoryRequirements2*); void (VKAPI_PTR *GetDescriptorSetLayoutSupport)(VkDevice, const VkDescriptorSetLayoutCreateInfo*, VkDescriptorSetLayoutSupport*); void (VKAPI_PTR *GetDeviceGroupPeerMemoryFeatures)(VkDevice, uint32_t, uint32_t, uint32_t, VkPeerMemoryFeatureFlags*); diff --git a/src/MagnumExternal/Vulkan/flextVk.h.template b/src/MagnumExternal/Vulkan/flextVk.h.template index 3679610d2..a0f4f544c 100644 --- a/src/MagnumExternal/Vulkan/flextVk.h.template +++ b/src/MagnumExternal/Vulkan/flextVk.h.template @@ -106,6 +106,23 @@ VKAPI_ATTR @f.returntype VKAPI_CALL vk@f.name\ @end @end +/* Global function pointers. These are not present in all Vulkan versions, so + they need to be loaded at runtime. */ +@for cat,funcs in functions: +@if funcs: +@for f in funcs: +@if f.name in ['EnumerateInstanceVersion']: +extern FLEXTVK_EXPORT @f.returntype\ +(VKAPI_PTR *flextvk@f.name)(@f.param_type_list_string()); +#define vk@f.name flextvk@f.name +@end +@end +@end +@end + +/* Global function pointer initialization */ +void FLEXTVK_EXPORT flextVkInit(); + /* Per-instance function pointers */ struct FlextVkInstance { @for cat,funcs in functions: @@ -134,7 +151,7 @@ struct FlextVkDevice { /* VK_@cat */ @for f in funcs: - @if f.params[0][1] not in ['VkInstance', 'VkPhysicalDevice'] and f.name not in ['GetInstanceProcAddr', 'GetDeviceProcAddr', 'EnumerateInstanceExtensionProperties', 'EnumerateInstanceLayerProperties', 'CreateInstance']: + @if f.params[0][1] not in ['VkInstance', 'VkPhysicalDevice'] and f.name not in ['GetInstanceProcAddr', 'GetDeviceProcAddr', 'EnumerateInstanceVersion', 'EnumerateInstanceExtensionProperties', 'EnumerateInstanceLayerProperties', 'CreateInstance']: @f.returntype\ (VKAPI_PTR *@f.name)(@f.param_type_list_string()); @end diff --git a/src/MagnumExternal/Vulkan/flextVkGlobal.h b/src/MagnumExternal/Vulkan/flextVkGlobal.h index 168aea8a9..0175d82a5 100644 --- a/src/MagnumExternal/Vulkan/flextVkGlobal.h +++ b/src/MagnumExternal/Vulkan/flextVkGlobal.h @@ -305,7 +305,6 @@ extern FLEXTVK_EXPORT FlextVkDevice flextVkDevice; #define vkCreateSamplerYcbcrConversion flextVkDevice.CreateSamplerYcbcrConversion #define vkDestroyDescriptorUpdateTemplate flextVkDevice.DestroyDescriptorUpdateTemplate #define vkDestroySamplerYcbcrConversion flextVkDevice.DestroySamplerYcbcrConversion -#define vkEnumerateInstanceVersion flextVkDevice.EnumerateInstanceVersion #define vkGetBufferMemoryRequirements2 flextVkDevice.GetBufferMemoryRequirements2 #define vkGetDescriptorSetLayoutSupport flextVkDevice.GetDescriptorSetLayoutSupport #define vkGetDeviceGroupPeerMemoryFeatures flextVkDevice.GetDeviceGroupPeerMemoryFeatures diff --git a/src/MagnumExternal/Vulkan/flextVkGlobal.h.template b/src/MagnumExternal/Vulkan/flextVkGlobal.h.template index ef2431ec3..c7803db4d 100644 --- a/src/MagnumExternal/Vulkan/flextVkGlobal.h.template +++ b/src/MagnumExternal/Vulkan/flextVkGlobal.h.template @@ -57,7 +57,7 @@ extern FLEXTVK_EXPORT FlextVkDevice flextVkDevice; /* VK_@cat */ @for f in funcs: -@if f.params[0][1] not in ['VkInstance', 'VkPhysicalDevice'] and f.name not in ['GetInstanceProcAddr', 'GetDeviceProcAddr', 'EnumerateInstanceExtensionProperties', 'EnumerateInstanceLayerProperties', 'CreateInstance']: +@if f.params[0][1] not in ['VkInstance', 'VkPhysicalDevice'] and f.name not in ['GetInstanceProcAddr', 'GetDeviceProcAddr', 'EnumerateInstanceVersion', 'EnumerateInstanceExtensionProperties', 'EnumerateInstanceLayerProperties', 'CreateInstance']: #define vk@f.name flextVkDevice.@f.name @end @end