mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 00:58:05 +02:00
radv: Add support for icd loader interface v4.
Adds support for physical device functions unknown to the loader. Acked-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
This commit is contained in:
parent
726f0263e1
commit
d6dfb2cf50
3 changed files with 66 additions and 2 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue