1 /*
2 * Copyright 2022 Collabora Ltd
3 * Copyright 2024 Google LLC
4 * SPDX-License-Identifier: MIT
5 */
6
7 #include "vk_meta_object_list.h"
8 #include "vk_device.h"
9
10 void
vk_meta_destroy_object(struct vk_device * device,struct vk_object_base * obj)11 vk_meta_destroy_object(struct vk_device *device, struct vk_object_base *obj)
12 {
13 const struct vk_device_dispatch_table *disp = &device->dispatch_table;
14 VkDevice _device = vk_device_to_handle(device);
15
16 switch (obj->type) {
17 case VK_OBJECT_TYPE_BUFFER:
18 disp->DestroyBuffer(_device, (VkBuffer)(uintptr_t)obj, NULL);
19 break;
20 case VK_OBJECT_TYPE_BUFFER_VIEW:
21 disp->DestroyBufferView(_device, (VkBufferView)(uintptr_t)obj, NULL);
22 break;
23 case VK_OBJECT_TYPE_IMAGE_VIEW:
24 disp->DestroyImageView(_device, (VkImageView)(uintptr_t)obj, NULL);
25 break;
26 case VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT:
27 disp->DestroyDescriptorSetLayout(_device, (VkDescriptorSetLayout)(uintptr_t)obj, NULL);
28 break;
29 case VK_OBJECT_TYPE_PIPELINE_LAYOUT:
30 disp->DestroyPipelineLayout(_device, (VkPipelineLayout)(uintptr_t)obj, NULL);
31 break;
32 case VK_OBJECT_TYPE_PIPELINE:
33 disp->DestroyPipeline(_device, (VkPipeline)(uintptr_t)obj, NULL);
34 break;
35 case VK_OBJECT_TYPE_SAMPLER:
36 disp->DestroySampler(_device, (VkSampler)(uintptr_t)obj, NULL);
37 break;
38 default:
39 unreachable("Unsupported object type");
40 }
41 }
42
43
44 void
vk_meta_object_list_init(struct vk_meta_object_list * mol)45 vk_meta_object_list_init(struct vk_meta_object_list *mol)
46 {
47 util_dynarray_init(&mol->arr, NULL);
48 }
49
50 void
vk_meta_object_list_reset(struct vk_device * device,struct vk_meta_object_list * mol)51 vk_meta_object_list_reset(struct vk_device *device,
52 struct vk_meta_object_list *mol)
53 {
54 util_dynarray_foreach(&mol->arr, struct vk_object_base *, obj)
55 vk_meta_destroy_object(device, *obj);
56
57 util_dynarray_clear(&mol->arr);
58 }
59
60 void
vk_meta_object_list_finish(struct vk_device * device,struct vk_meta_object_list * mol)61 vk_meta_object_list_finish(struct vk_device *device,
62 struct vk_meta_object_list *mol)
63 {
64 vk_meta_object_list_reset(device, mol);
65 util_dynarray_fini(&mol->arr);
66 }
67