xref: /aosp_15_r20/external/mesa3d/src/vulkan/runtime/vk_meta_object_list.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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