From 01b9701a5cd7a7607dbfa17f6037a7e46924dec1 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Tue, 16 Jan 2018 16:15:13 -0800 Subject: [PATCH] anv: Use tables for device extension wrangling MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Reviewed-by: Samuel Iglesias Gonsálvez --- src/intel/vulkan/anv_device.c | 37 +++++++++++++++++++++-- src/intel/vulkan/anv_extensions_gen.py | 42 ++++++++------------------ src/intel/vulkan/anv_private.h | 2 ++ 3 files changed, 49 insertions(+), 32 deletions(-) diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index 9fd324ba351..2abf73dd95e 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -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); } diff --git a/src/intel/vulkan/anv_extensions_gen.py b/src/intel/vulkan/anv_extensions_gen.py index b86d76326a4..33827ecd015 100644 --- a/src/intel/vulkan/anv_extensions_gen.py +++ b/src/intel/vulkan/anv_extensions_gen.py @@ -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); + }; } """) diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index e4ffdf2845b..a1f34aa22db 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -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; -- 2.30.2