From d6dfb2cf5029ae1601eb6792aabd971b1459899f Mon Sep 17 00:00:00 2001 From: Bas Nieuwenhuizen Date: Sat, 5 Jan 2019 13:46:53 +0100 Subject: [PATCH] radv: Add support for icd loader interface v4. Adds support for physical device functions unknown to the loader. Acked-by: Samuel Pitoiset --- src/amd/vulkan/radv_device.c | 19 +++++++++++++- src/amd/vulkan/radv_entrypoints_gen.py | 46 +++++++++++++++++++++++++++++++++- src/amd/vulkan/radv_private.h | 3 +++ 3 files changed, 66 insertions(+), 2 deletions(-) diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index 10956de..ebca4f5 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -3127,6 +3127,23 @@ VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vk_icdGetInstanceProcAddr( return radv_GetInstanceProcAddr(instance, pName); } +PUBLIC +VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vk_icdGetPhysicalDeviceProcAddr( + VkInstance _instance, + const char* pName); + +PUBLIC +VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vk_icdGetPhysicalDeviceProcAddr( + VkInstance _instance, + const char* pName) +{ + RADV_FROM_HANDLE(radv_instance, instance, _instance); + + return radv_lookup_physical_device_entrypoint_checked(pName, + instance ? instance->apiVersion : 0, + instance ? &instance->enabled_extensions : NULL); +} + PFN_vkVoidFunction radv_GetDeviceProcAddr( VkDevice _device, const char* pName) @@ -4920,7 +4937,7 @@ vk_icdNegotiateLoaderICDInterfaceVersion(uint32_t *pSupportedVersion) * vkDestroySurfaceKHR(), and other API which uses VKSurfaceKHR, * because the loader no longer does so. */ - *pSupportedVersion = MIN2(*pSupportedVersion, 3u); + *pSupportedVersion = MIN2(*pSupportedVersion, 4u); return VK_SUCCESS; } diff --git a/src/amd/vulkan/radv_entrypoints_gen.py b/src/amd/vulkan/radv_entrypoints_gen.py index 946b109..b64f2d9 100644 --- a/src/amd/vulkan/radv_entrypoints_gen.py +++ b/src/amd/vulkan/radv_entrypoints_gen.py @@ -227,6 +227,35 @@ radv_entrypoint_is_enabled(int index, uint32_t core_version, } } +static bool +radv_entrypoint_is_enabled_physical_device(int index, uint32_t core_version, + const struct radv_instance_extension_table *instance) +{ + switch (index) { +% for e in entrypoints: + %if e.physical_device_command: + case ${e.num}: + % if e.core_version: + return instance && ${e.core_version.c_vk_version()} <= core_version; + % elif e.extensions: + % for ext in e.extensions: + % if ext.type == 'instance': + if (instance && instance->${ext.name[3:]}) return true; + % else: + return true; + % endif + %endfor + return false; + % else: + return instance; + % endif + %endif +% endfor + default: + return false; + } +} + static int radv_lookup_entrypoint(const char *name) { @@ -274,7 +303,20 @@ radv_lookup_entrypoint_checked(const char *name, if (index < 0 || !radv_entrypoint_is_enabled(index, core_version, instance, device)) return NULL; return radv_resolve_entrypoint(index); -}""", output_encoding='utf-8') +} + +void * +radv_lookup_physical_device_entrypoint_checked(const char *name, + uint32_t core_version, + const struct radv_instance_extension_table *instance) +{ + int index = radv_lookup_entrypoint(name); + if (index < 0 || !radv_entrypoint_is_enabled_physical_device(index, core_version, instance)) + return NULL; + return radv_resolve_entrypoint(index); +} + +""", output_encoding='utf-8') U32_MASK = 2**32 - 1 @@ -353,6 +395,7 @@ class Entrypoint(EntrypointBase): self.params = params self.guard = guard self.device_command = len(params) > 0 and (params[0].type == 'VkDevice' or params[0].type == 'VkQueue' or params[0].type == 'VkCommandBuffer') + self.physical_device_command = len(params) > 0 and params[0].type == 'VkPhysicalDevice' def prefixed_name(self, prefix): assert self.name.startswith('vk') @@ -369,6 +412,7 @@ class EntrypointAlias(EntrypointBase): super(EntrypointAlias, self).__init__(name) self.alias = entrypoint self.device_command = entrypoint.device_command + self.physical_device_command = entrypoint.physical_device_command def prefixed_name(self, prefix): return self.alias.prefixed_name(prefix) diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index 7fa0b39..55c34d2 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -280,6 +280,9 @@ void *radv_lookup_entrypoint_checked(const char *name, uint32_t core_version, const struct radv_instance_extension_table *instance, const struct radv_device_extension_table *device); +void *radv_lookup_physical_device_entrypoint_checked(const char *name, + uint32_t core_version, + const struct radv_instance_extension_table *instance); struct radv_physical_device { VK_LOADER_DATA _loader_data; -- 2.7.4