vulkan: add common entrypoints for sparse image requirements/properties
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Tue, 17 Aug 2021 15:44:32 +0000 (17:44 +0200)
committerMarge Bot <eric+marge@anholt.net>
Thu, 2 Sep 2021 10:56:39 +0000 (10:56 +0000)
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12416>

src/vulkan/util/vk_cmd_copy.c
src/vulkan/util/vk_device.c
src/vulkan/util/vk_physical_device.c
src/vulkan/util/vk_util.h

index 5c71dbb..9fcb0c2 100644 (file)
 
 #include "vk_common_entrypoints.h"
 #include "vk_device.h"
-
-#define STACK_ARRAY_SIZE 8
-
-#define STACK_ARRAY(type, name, size) \
-   type _stack_##name[STACK_ARRAY_SIZE], *const name = \
-      (size) <= STACK_ARRAY_SIZE ? _stack_##name : malloc((size) * sizeof(type))
-
-#define STACK_ARRAY_FINISH(name) \
-   if (name != _stack_##name) free(name)
+#include "vk_util.h"
 
 VKAPI_ATTR void VKAPI_CALL
 vk_common_CmdCopyBuffer(VkCommandBuffer commandBuffer,
index cfaebc5..42f571c 100644 (file)
@@ -26,6 +26,7 @@
 #include "vk_common_entrypoints.h"
 #include "vk_instance.h"
 #include "vk_physical_device.h"
+#include "vk_util.h"
 #include "util/hash_table.h"
 #include "util/ralloc.h"
 
@@ -219,3 +220,42 @@ vk_common_BindImageMemory(VkDevice _device,
 
    return device->dispatch_table.BindImageMemory2(_device, 1, &bind);
 }
+
+VKAPI_ATTR void VKAPI_CALL
+vk_common_GetImageSparseMemoryRequirements(VkDevice _device,
+                                           VkImage image,
+                                           uint32_t *pSparseMemoryRequirementCount,
+                                           VkSparseImageMemoryRequirements *pSparseMemoryRequirements)
+{
+   VK_FROM_HANDLE(vk_device, device, _device);
+
+   VkImageSparseMemoryRequirementsInfo2 info = {
+      .sType = VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2,
+      .image = image,
+   };
+
+   if (!pSparseMemoryRequirements) {
+      device->dispatch_table.GetImageSparseMemoryRequirements2(_device,
+                                                               &info,
+                                                               pSparseMemoryRequirementCount,
+                                                               NULL);
+      return;
+   }
+
+   STACK_ARRAY(VkSparseImageMemoryRequirements2, mem_reqs2, *pSparseMemoryRequirementCount);
+
+   for (unsigned i = 0; i < *pSparseMemoryRequirementCount; ++i) {
+      mem_reqs2[i].sType = VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2;
+      mem_reqs2[i].pNext = NULL;
+   }
+
+   device->dispatch_table.GetImageSparseMemoryRequirements2(_device,
+                                                            &info,
+                                                            pSparseMemoryRequirementCount,
+                                                            mem_reqs2);
+
+   for (unsigned i = 0; i < *pSparseMemoryRequirementCount; ++i)
+      pSparseMemoryRequirements[i] = mem_reqs2[i].memoryRequirements;
+
+   STACK_ARRAY_FINISH(mem_reqs2);
+}
index 868d2d1..e6504c8 100644 (file)
@@ -205,3 +205,50 @@ vk_common_GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice
 
    return result;
 }
+
+VKAPI_ATTR void VKAPI_CALL
+vk_common_GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice,
+                                                       VkFormat format,
+                                                       VkImageType type,
+                                                       uint32_t samples,
+                                                       VkImageUsageFlags usage,
+                                                       VkImageTiling tiling,
+                                                       uint32_t *pNumProperties,
+                                                       VkSparseImageFormatProperties *pProperties)
+{
+   VK_FROM_HANDLE(vk_physical_device, pdevice, physicalDevice);
+
+   VkPhysicalDeviceSparseImageFormatInfo2 info = {
+      .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2,
+      .format = format,
+      .type = type,
+      .samples = samples,
+      .usage = usage,
+      .tiling = tiling
+   };
+
+   if (!pProperties) {
+      pdevice->dispatch_table.GetPhysicalDeviceSparseImageFormatProperties2(physicalDevice,
+                                                                            &info,
+                                                                            pNumProperties,
+                                                                            NULL);
+      return;
+   }
+
+   STACK_ARRAY(VkSparseImageFormatProperties2, props2, *pNumProperties);
+
+   for (unsigned i = 0; i < *pNumProperties; ++i) {
+      props2[i].sType = VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2;
+      props2[i].pNext = NULL;
+   }
+
+   pdevice->dispatch_table.GetPhysicalDeviceSparseImageFormatProperties2(physicalDevice,
+                                                                         &info,
+                                                                         pNumProperties,
+                                                                         props2);
+
+   for (unsigned i = 0; i < *pNumProperties; ++i)
+      pProperties[i] = props2[i].properties;
+
+   STACK_ARRAY_FINISH(props2);
+}
index 5dbce23..0e98b71 100644 (file)
@@ -278,6 +278,15 @@ struct nir_spirv_specialization*
 vk_spec_info_to_nir_spirv(const VkSpecializationInfo *spec_info,
                           uint32_t *out_num_spec_entries);
 
+#define STACK_ARRAY_SIZE 8
+
+#define STACK_ARRAY(type, name, size) \
+   type _stack_##name[STACK_ARRAY_SIZE], *const name = \
+      (size) <= STACK_ARRAY_SIZE ? _stack_##name : malloc((size) * sizeof(type))
+
+#define STACK_ARRAY_FINISH(name) \
+   if (name != _stack_##name) free(name)
+
 #ifdef __cplusplus
 }
 #endif