anv: Use tables for device extension wrangling
Reviewed-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
This commit is contained in:
parent
920bd2c0bc
commit
01b9701a5c
|
@ -433,6 +433,9 @@ anv_physical_device_init(struct anv_physical_device *device,
|
|||
goto fail;
|
||||
}
|
||||
|
||||
anv_physical_device_get_supported_extensions(device,
|
||||
&device->supported_extensions);
|
||||
|
||||
device->local_fd = fd;
|
||||
return VK_SUCCESS;
|
||||
|
||||
|
@ -1205,6 +1208,27 @@ anv_device_init_trivial_batch(struct anv_device *device)
|
|||
anv_gem_munmap(map, device->trivial_batch_bo.size);
|
||||
}
|
||||
|
||||
VkResult anv_EnumerateDeviceExtensionProperties(
|
||||
VkPhysicalDevice physicalDevice,
|
||||
const char* pLayerName,
|
||||
uint32_t* pPropertyCount,
|
||||
VkExtensionProperties* pProperties)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_physical_device, device, physicalDevice);
|
||||
VK_OUTARRAY_MAKE(out, pProperties, pPropertyCount);
|
||||
(void)device;
|
||||
|
||||
for (int i = 0; i < ANV_DEVICE_EXTENSION_COUNT; i++) {
|
||||
if (device->supported_extensions.extensions[i]) {
|
||||
vk_outarray_append(&out, prop) {
|
||||
*prop = anv_device_extensions[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return vk_outarray_status(&out);
|
||||
}
|
||||
|
||||
VkResult anv_CreateDevice(
|
||||
VkPhysicalDevice physicalDevice,
|
||||
const VkDeviceCreateInfo* pCreateInfo,
|
||||
|
@ -1218,8 +1242,17 @@ VkResult anv_CreateDevice(
|
|||
assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO);
|
||||
|
||||
for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
|
||||
const char *ext_name = pCreateInfo->ppEnabledExtensionNames[i];
|
||||
if (!anv_physical_device_extension_supported(physical_device, ext_name))
|
||||
int idx;
|
||||
for (idx = 0; idx < ANV_DEVICE_EXTENSION_COUNT; idx++) {
|
||||
if (strcmp(pCreateInfo->ppEnabledExtensionNames[i],
|
||||
anv_device_extensions[idx].extensionName) == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
if (idx >= ANV_DEVICE_EXTENSION_COUNT)
|
||||
return vk_error(VK_ERROR_EXTENSION_NOT_PRESENT);
|
||||
|
||||
if (!physical_device->supported_extensions.extensions[idx])
|
||||
return vk_error(VK_ERROR_EXTENSION_NOT_PRESENT);
|
||||
}
|
||||
|
||||
|
|
|
@ -98,6 +98,12 @@ struct anv_device_extension_table {
|
|||
};
|
||||
};
|
||||
|
||||
struct anv_physical_device;
|
||||
|
||||
void
|
||||
anv_physical_device_get_supported_extensions(const struct anv_physical_device *device,
|
||||
struct anv_device_extension_table *extensions);
|
||||
|
||||
#endif /* ANV_EXTENSIONS_H */
|
||||
""")
|
||||
|
||||
|
@ -152,39 +158,15 @@ const VkExtensionProperties anv_device_extensions[ANV_DEVICE_EXTENSION_COUNT] =
|
|||
%endfor
|
||||
};
|
||||
|
||||
bool
|
||||
anv_physical_device_extension_supported(struct anv_physical_device *device,
|
||||
const char *name)
|
||||
void
|
||||
anv_physical_device_get_supported_extensions(const struct anv_physical_device *device,
|
||||
struct anv_device_extension_table *extensions)
|
||||
{
|
||||
*extensions = (struct anv_device_extension_table) {
|
||||
%for ext in device_extensions:
|
||||
if (strcmp(name, "${ext.name}") == 0)
|
||||
return ${ext.enable};
|
||||
.${ext.name[3:]} = ${ext.enable},
|
||||
%endfor
|
||||
return false;
|
||||
}
|
||||
|
||||
VkResult anv_EnumerateDeviceExtensionProperties(
|
||||
VkPhysicalDevice physicalDevice,
|
||||
const char* pLayerName,
|
||||
uint32_t* pPropertyCount,
|
||||
VkExtensionProperties* pProperties)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_physical_device, device, physicalDevice);
|
||||
VK_OUTARRAY_MAKE(out, pProperties, pPropertyCount);
|
||||
(void)device;
|
||||
|
||||
%for ext in device_extensions:
|
||||
if (${ext.enable}) {
|
||||
vk_outarray_append(&out, prop) {
|
||||
*prop = (VkExtensionProperties) {
|
||||
.extensionName = "${ext.name}",
|
||||
.specVersion = ${ext.ext_version},
|
||||
};
|
||||
}
|
||||
}
|
||||
%endfor
|
||||
|
||||
return vk_outarray_status(&out);
|
||||
};
|
||||
}
|
||||
""")
|
||||
|
||||
|
|
|
@ -770,6 +770,8 @@ struct anv_physical_device {
|
|||
bool has_syncobj;
|
||||
bool has_syncobj_wait;
|
||||
|
||||
struct anv_device_extension_table supported_extensions;
|
||||
|
||||
uint32_t eu_total;
|
||||
uint32_t subslice_total;
|
||||
|
||||
|
|
Loading…
Reference in New Issue