vulkan/meta: Add a create_sampler helper
authorFaith Ekstrand <faith.ekstrand@collabora.com>
Tue, 31 Jan 2023 02:11:59 +0000 (20:11 -0600)
committerMarge Bot <emma+marge@anholt.net>
Fri, 4 Aug 2023 21:32:00 +0000 (21:32 +0000)
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24326>

src/vulkan/runtime/vk_meta.c
src/vulkan/runtime/vk_meta.h

index b9b66c1..a6ccbf6 100644 (file)
@@ -96,6 +96,9 @@ destroy_object(struct vk_device *device, struct vk_object_base *obj)
    case VK_OBJECT_TYPE_PIPELINE:
       disp->DestroyPipeline(_device, (VkPipeline)(uintptr_t)obj, NULL);
       break;
+   case VK_OBJECT_TYPE_SAMPLER:
+      disp->DestroySampler(_device, (VkSampler)(uintptr_t)obj, NULL);
+      break;
    default:
       unreachable("Unsupported object type");
    }
@@ -196,6 +199,28 @@ vk_meta_cache_object(struct vk_device *device,
 }
 
 VkResult
+vk_meta_create_sampler(struct vk_device *device,
+                       struct vk_meta_device *meta,
+                       const VkSamplerCreateInfo *info,
+                       const void *key_data, size_t key_size,
+                       VkSampler *sampler_out)
+{
+   const struct vk_device_dispatch_table *disp = &device->dispatch_table;
+   VkDevice _device = vk_device_to_handle(device);
+
+   VkSampler sampler;
+   VkResult result = disp->CreateSampler(_device, info, NULL, &sampler);
+   if (result != VK_SUCCESS)
+      return result;
+
+   *sampler_out = (VkSampler)
+      vk_meta_cache_object(device, meta, key_data, key_size,
+                           VK_OBJECT_TYPE_SAMPLER,
+                           (uint64_t)sampler);
+   return VK_SUCCESS;
+}
+
+VkResult
 vk_meta_create_descriptor_set_layout(struct vk_device *device,
                                      struct vk_meta_device *meta,
                                      const VkDescriptorSetLayoutCreateInfo *info,
index 1478699..6d59c04 100644 (file)
@@ -117,6 +117,14 @@ vk_meta_lookup_pipeline(struct vk_meta_device *meta,
                                             key_data, key_size);
 }
 
+static inline VkSampler
+vk_meta_lookup_sampler(struct vk_meta_device *meta,
+                       const void *key_data, size_t key_size)
+{
+   return (VkSampler)vk_meta_lookup_object(meta, VK_OBJECT_TYPE_SAMPLER,
+                                           key_data, key_size);
+}
+
 struct vk_meta_rendering_info {
    uint32_t view_mask;
    uint32_t samples;
@@ -155,6 +163,13 @@ vk_meta_create_compute_pipeline(struct vk_device *device,
                                 const void *key_data, size_t key_size,
                                 VkPipeline *pipeline_out);
 
+VkResult
+vk_meta_create_sampler(struct vk_device *device,
+                       struct vk_meta_device *meta,
+                       const VkSamplerCreateInfo *info,
+                       const void *key_data, size_t key_size,
+                       VkSampler *sampler_out);
+
 struct vk_meta_object_list {
    struct util_dynarray arr;
 };