diff --git a/src/vulkan/runtime/vk_meta.c b/src/vulkan/runtime/vk_meta.c index b9b66c16ce7..a6ccbf6574f 100644 --- a/src/vulkan/runtime/vk_meta.c +++ b/src/vulkan/runtime/vk_meta.c @@ -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"); } @@ -195,6 +198,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, diff --git a/src/vulkan/runtime/vk_meta.h b/src/vulkan/runtime/vk_meta.h index 14786997b71..6d59c049f3e 100644 --- a/src/vulkan/runtime/vk_meta.h +++ b/src/vulkan/runtime/vk_meta.h @@ -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; };