Module: Mesa Branch: master Commit: 328a3503875c30123108bedd949e34c06831584e URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=328a3503875c30123108bedd949e34c06831584e
Author: James Park <[email protected]> Date: Thu Aug 6 20:57:10 2020 -0700 vulkan/util,vulkan/wsi,radv: Add typed outarray API MSVC cannot perform GCC __typeof__ for C code. (C++ has decltype.) Add adjacent functions to allow specifying types manually. Reviewed-by: Samuel Pitoiset <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7270> --- src/amd/vulkan/radv_device.c | 27 ++++++++++++++++----------- src/vulkan/util/vk_util.h | 12 +++++++++--- src/vulkan/wsi/wsi_common.c | 4 ++-- 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index ce58e994b6e..c6bdf4f392a 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -887,7 +887,8 @@ VkResult radv_EnumeratePhysicalDevices( VkPhysicalDevice* pPhysicalDevices) { RADV_FROM_HANDLE(radv_instance, instance, _instance); - VK_OUTARRAY_MAKE(out, pPhysicalDevices, pPhysicalDeviceCount); + VK_OUTARRAY_MAKE_TYPED(VkPhysicalDevice, out, pPhysicalDevices, + pPhysicalDeviceCount); VkResult result = radv_enumerate_physical_devices(instance); if (result != VK_SUCCESS) @@ -895,7 +896,7 @@ VkResult radv_EnumeratePhysicalDevices( list_for_each_entry(struct radv_physical_device, pdevice, &instance->physical_devices, link) { - vk_outarray_append(&out, i) { + vk_outarray_append_typed(VkPhysicalDevice , &out, i) { *i = radv_physical_device_to_handle(pdevice); } } @@ -909,8 +910,9 @@ VkResult radv_EnumeratePhysicalDeviceGroups( VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties) { RADV_FROM_HANDLE(radv_instance, instance, _instance); - VK_OUTARRAY_MAKE(out, pPhysicalDeviceGroupProperties, - pPhysicalDeviceGroupCount); + VK_OUTARRAY_MAKE_TYPED(VkPhysicalDeviceGroupProperties, out, + pPhysicalDeviceGroupProperties, + pPhysicalDeviceGroupCount); VkResult result = radv_enumerate_physical_devices(instance); if (result != VK_SUCCESS) @@ -918,7 +920,7 @@ VkResult radv_EnumeratePhysicalDeviceGroups( list_for_each_entry(struct radv_physical_device, pdevice, &instance->physical_devices, link) { - vk_outarray_append(&out, p) { + vk_outarray_append_typed(VkPhysicalDeviceGroupProperties, &out, p) { p->physicalDeviceCount = 1; memset(p->physicalDevices, 0, sizeof(p->physicalDevices)); p->physicalDevices[0] = radv_physical_device_to_handle(pdevice); @@ -4977,11 +4979,12 @@ VkResult radv_EnumerateInstanceExtensionProperties( uint32_t* pPropertyCount, VkExtensionProperties* pProperties) { - VK_OUTARRAY_MAKE(out, pProperties, pPropertyCount); + VK_OUTARRAY_MAKE_TYPED(VkExtensionProperties, out, pProperties, + pPropertyCount); for (int i = 0; i < RADV_INSTANCE_EXTENSION_COUNT; i++) { if (radv_instance_extensions_supported.extensions[i]) { - vk_outarray_append(&out, prop) { + vk_outarray_append_typed(VkExtensionProperties, &out, prop) { *prop = radv_instance_extensions[i]; } } @@ -4997,11 +5000,12 @@ VkResult radv_EnumerateDeviceExtensionProperties( VkExtensionProperties* pProperties) { RADV_FROM_HANDLE(radv_physical_device, device, physicalDevice); - VK_OUTARRAY_MAKE(out, pProperties, pPropertyCount); + VK_OUTARRAY_MAKE_TYPED(VkExtensionProperties, out, pProperties, + pPropertyCount); for (int i = 0; i < RADV_DEVICE_EXTENSION_COUNT; i++) { if (device->supported_extensions.extensions[i]) { - vk_outarray_append(&out, prop) { + vk_outarray_append_typed(VkExtensionProperties, &out, prop) { *prop = radv_device_extensions[i]; } } @@ -7967,10 +7971,11 @@ VkResult radv_GetPhysicalDeviceCalibrateableTimeDomainsEXT( VkTimeDomainEXT *pTimeDomains) { int d; - VK_OUTARRAY_MAKE(out, pTimeDomains, pTimeDomainCount); + VK_OUTARRAY_MAKE_TYPED(VkTimeDomainEXT, out, pTimeDomains, + pTimeDomainCount); for (d = 0; d < ARRAY_SIZE(radv_time_domains); d++) { - vk_outarray_append(&out, i) { + vk_outarray_append_typed(VkTimeDomainEXT, &out, i) { *i = radv_time_domains[d]; } } diff --git a/src/vulkan/util/vk_util.h b/src/vulkan/util/vk_util.h index 1b846b4bed3..17c5fb88f53 100644 --- a/src/vulkan/util/vk_util.h +++ b/src/vulkan/util/vk_util.h @@ -146,14 +146,18 @@ __vk_outarray_next(struct __vk_outarray *a, size_t elem_size) __vk_outarray_init(&(a)->base, (data), (len)) #define VK_OUTARRAY_MAKE(name, data, len) \ - vk_outarray(__typeof__((data)[0])) name; \ + VK_OUTARRAY_MAKE_TYPED(__typeof__((data)[0]), name, data, len) +#define VK_OUTARRAY_MAKE_TYPED(type, name, data, len) \ + vk_outarray(type) name; \ vk_outarray_init(&name, (data), (len)) #define vk_outarray_status(a) \ __vk_outarray_status(&(a)->base) #define vk_outarray_next(a) \ - ((vk_outarray_typeof_elem(a) *) \ + vk_outarray_next_typed(vk_outarray_typeof_elem(a), a) +#define vk_outarray_next_typed(type, a) \ + ((type *) \ __vk_outarray_next(&(a)->base, vk_outarray_sizeof_elem(a))) /** @@ -176,7 +180,9 @@ __vk_outarray_next(struct __vk_outarray *a, size_t elem_size) * points to the newly appended element. */ #define vk_outarray_append(a, elem) \ - for (vk_outarray_typeof_elem(a) *elem = vk_outarray_next(a); \ + vk_outarray_append_typed(vk_outarray_typeof_elem(a), a, elem) +#define vk_outarray_append_typed(type, a, elem) \ + for (type *elem = vk_outarray_next_typed(type, a); \ elem != NULL; elem = NULL) static inline void * diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c index a80d7ba0bb7..9e53fa6cb18 100644 --- a/src/vulkan/wsi/wsi_common.c +++ b/src/vulkan/wsi/wsi_common.c @@ -1088,10 +1088,10 @@ wsi_common_get_images(VkSwapchainKHR _swapchain, VkImage *pSwapchainImages) { VK_FROM_HANDLE(wsi_swapchain, swapchain, _swapchain); - VK_OUTARRAY_MAKE(images, pSwapchainImages, pSwapchainImageCount); + VK_OUTARRAY_MAKE_TYPED(VkImage, images, pSwapchainImages, pSwapchainImageCount); for (uint32_t i = 0; i < swapchain->image_count; i++) { - vk_outarray_append(&images, image) { + vk_outarray_append_typed(VkImage, &images, image) { *image = swapchain->get_wsi_image(swapchain, i)->image; } } _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
