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 case VK_OBJECT_TYPE_SHADER_EXT:
39 disp->DestroyShaderEXT(_device, (VkShaderEXT)(uintptr_t)obj, NULL);
40 break;
41 default:
42 unreachable("Unsupported object type");
43 }
44 }
45
46
47 void
vk_meta_object_list_init(struct vk_meta_object_list * mol)48 vk_meta_object_list_init(struct vk_meta_object_list *mol)
49 {
50 util_dynarray_init(&mol->arr, NULL);
51 }
52
53 void
vk_meta_object_list_reset(struct vk_device * device,struct vk_meta_object_list * mol)54 vk_meta_object_list_reset(struct vk_device *device,
55 struct vk_meta_object_list *mol)
56 {
57 util_dynarray_foreach(&mol->arr, struct vk_object_base *, obj)
58 vk_meta_destroy_object(device, *obj);
59
60 util_dynarray_clear(&mol->arr);
61 }
62
63 void
vk_meta_object_list_finish(struct vk_device * device,struct vk_meta_object_list * mol)64 vk_meta_object_list_finish(struct vk_device *device,
65 struct vk_meta_object_list *mol)
66 {
67 vk_meta_object_list_reset(device, mol);
68 util_dynarray_fini(&mol->arr);
69 }
70