diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index 73e1797ea29..15a509af261 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -5106,18 +5106,12 @@ VkResult radv_EnumerateInstanceExtensionProperties( uint32_t* pPropertyCount, VkExtensionProperties* pProperties) { - VK_OUTARRAY_MAKE_TYPED(VkExtensionProperties, out, pProperties, - pPropertyCount); + if (pLayerName) + return vk_error(NULL, VK_ERROR_LAYER_NOT_PRESENT); - for (int i = 0; i < VK_INSTANCE_EXTENSION_COUNT; i++) { - if (radv_instance_extensions_supported.extensions[i]) { - vk_outarray_append_typed(VkExtensionProperties, &out, prop) { - *prop = vk_instance_extensions[i]; - } - } - } - - return vk_outarray_status(&out); + return vk_enumerate_instance_extension_properties( + &radv_instance_extensions_supported, + pPropertyCount, pProperties); } PFN_vkVoidFunction radv_GetInstanceProcAddr( diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c index 9cc5b190454..6cc52d68baf 100644 --- a/src/broadcom/vulkan/v3dv_device.c +++ b/src/broadcom/vulkan/v3dv_device.c @@ -97,17 +97,8 @@ v3dv_EnumerateInstanceExtensionProperties(const char *pLayerName, if (pLayerName) return vk_error(NULL, VK_ERROR_LAYER_NOT_PRESENT); - VK_OUTARRAY_MAKE(out, pProperties, pPropertyCount); - - for (int i = 0; i < VK_INSTANCE_EXTENSION_COUNT; i++) { - if (v3dv_instance_extensions_supported.extensions[i]) { - vk_outarray_append(&out, prop) { - *prop = vk_instance_extensions[i]; - } - } - } - - return vk_outarray_status(&out); + return vk_enumerate_instance_extension_properties( + &v3dv_instance_extensions_supported, pPropertyCount, pProperties); } VkResult diff --git a/src/freedreno/vulkan/tu_device.c b/src/freedreno/vulkan/tu_device.c index df13ab0514f..0f7ef2a31aa 100644 --- a/src/freedreno/vulkan/tu_device.c +++ b/src/freedreno/vulkan/tu_device.c @@ -1380,19 +1380,11 @@ tu_EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pPropertyCount, VkExtensionProperties *pProperties) { - VK_OUTARRAY_MAKE(out, pProperties, pPropertyCount); - - /* We spport no lyaers */ if (pLayerName) return vk_error(NULL, VK_ERROR_LAYER_NOT_PRESENT); - for (int i = 0; i < VK_INSTANCE_EXTENSION_COUNT; i++) { - if (tu_instance_extensions_supported.extensions[i]) { - vk_outarray_append(&out, prop) { *prop = vk_instance_extensions[i]; } - } - } - - return vk_outarray_status(&out); + return vk_enumerate_instance_extension_properties( + &tu_instance_extensions_supported, pPropertyCount, pProperties); } PFN_vkVoidFunction diff --git a/src/gallium/frontends/lavapipe/lvp_device.c b/src/gallium/frontends/lavapipe/lvp_device.c index 09f3cded595..5458f19c1dc 100644 --- a/src/gallium/frontends/lavapipe/lvp_device.c +++ b/src/gallium/frontends/lavapipe/lvp_device.c @@ -846,17 +846,11 @@ VkResult lvp_EnumerateInstanceExtensionProperties( uint32_t* pPropertyCount, VkExtensionProperties* pProperties) { - VK_OUTARRAY_MAKE(out, pProperties, pPropertyCount); + if (pLayerName) + return vk_error(NULL, VK_ERROR_LAYER_NOT_PRESENT); - for (int i = 0; i < VK_INSTANCE_EXTENSION_COUNT; i++) { - if (lvp_instance_extensions_supported.extensions[i]) { - vk_outarray_append(&out, prop) { - *prop = vk_instance_extensions[i]; - } - } - } - - return vk_outarray_status(&out); + return vk_enumerate_instance_extension_properties( + &lvp_instance_extensions_supported, pPropertyCount, pProperties); } VkResult lvp_EnumerateInstanceLayerProperties( diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index 356d5f8ed55..4349f8f79ea 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -681,17 +681,11 @@ VkResult anv_EnumerateInstanceExtensionProperties( uint32_t* pPropertyCount, VkExtensionProperties* pProperties) { - VK_OUTARRAY_MAKE(out, pProperties, pPropertyCount); + if (pLayerName) + return vk_error(VK_ERROR_LAYER_NOT_PRESENT); - for (int i = 0; i < VK_INSTANCE_EXTENSION_COUNT; i++) { - if (anv_instance_extensions_supported.extensions[i]) { - vk_outarray_append(&out, prop) { - *prop = vk_instance_extensions[i]; - } - } - } - - return vk_outarray_status(&out); + return vk_enumerate_instance_extension_properties( + &anv_instance_extensions_supported, pPropertyCount, pProperties); } static void diff --git a/src/vulkan/util/vk_instance.c b/src/vulkan/util/vk_instance.c index 952deed5156..8978f55c6d7 100644 --- a/src/vulkan/util/vk_instance.c +++ b/src/vulkan/util/vk_instance.c @@ -25,6 +25,7 @@ #include "vk_alloc.h" #include "vk_common_entrypoints.h" +#include "vk_util.h" VkResult vk_instance_init(struct vk_instance *instance, @@ -97,6 +98,26 @@ vk_instance_finish(struct vk_instance *instance) vk_object_base_finish(&instance->base); } +VkResult +vk_enumerate_instance_extension_properties( + const struct vk_instance_extension_table *supported_extensions, + uint32_t *pPropertyCount, + VkExtensionProperties *pProperties) +{ + VK_OUTARRAY_MAKE(out, pProperties, pPropertyCount); + + for (int i = 0; i < VK_INSTANCE_EXTENSION_COUNT; i++) { + if (!supported_extensions->extensions[i]) + continue; + + vk_outarray_append(&out, prop) { + *prop = vk_instance_extensions[i]; + } + } + + return vk_outarray_status(&out); +} + PFN_vkVoidFunction vk_instance_get_proc_addr(const struct vk_instance *instance, const struct vk_instance_entrypoint_table *entrypoints, diff --git a/src/vulkan/util/vk_instance.h b/src/vulkan/util/vk_instance.h index cbea4489383..5f195ca0d8e 100644 --- a/src/vulkan/util/vk_instance.h +++ b/src/vulkan/util/vk_instance.h @@ -71,6 +71,12 @@ vk_instance_init(struct vk_instance *instance, void vk_instance_finish(struct vk_instance *instance); +VkResult +vk_enumerate_instance_extension_properties( + const struct vk_instance_extension_table *supported_extensions, + uint32_t *pPropertyCount, + VkExtensionProperties *pProperties); + PFN_vkVoidFunction vk_instance_get_proc_addr(const struct vk_instance *instance, const struct vk_instance_entrypoint_table *entrypoints,