xref: /aosp_15_r20/external/virglrenderer/src/venus/vkr_device.c (revision bbecb9d118dfdb95f99bd754f8fa9be01f189df3)
1*bbecb9d1SAndroid Build Coastguard Worker /*
2*bbecb9d1SAndroid Build Coastguard Worker  * Copyright 2020 Google LLC
3*bbecb9d1SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*bbecb9d1SAndroid Build Coastguard Worker  */
5*bbecb9d1SAndroid Build Coastguard Worker 
6*bbecb9d1SAndroid Build Coastguard Worker #include "vkr_device.h"
7*bbecb9d1SAndroid Build Coastguard Worker 
8*bbecb9d1SAndroid Build Coastguard Worker #include "venus-protocol/vn_protocol_renderer_device.h"
9*bbecb9d1SAndroid Build Coastguard Worker 
10*bbecb9d1SAndroid Build Coastguard Worker #include "vkr_command_buffer.h"
11*bbecb9d1SAndroid Build Coastguard Worker #include "vkr_context.h"
12*bbecb9d1SAndroid Build Coastguard Worker #include "vkr_descriptor_set.h"
13*bbecb9d1SAndroid Build Coastguard Worker #include "vkr_device_memory.h"
14*bbecb9d1SAndroid Build Coastguard Worker #include "vkr_physical_device.h"
15*bbecb9d1SAndroid Build Coastguard Worker #include "vkr_queue.h"
16*bbecb9d1SAndroid Build Coastguard Worker 
17*bbecb9d1SAndroid Build Coastguard Worker static VkResult
vkr_device_create_queues(struct vkr_context * ctx,struct vkr_device * dev,uint32_t create_info_count,const VkDeviceQueueCreateInfo * create_infos)18*bbecb9d1SAndroid Build Coastguard Worker vkr_device_create_queues(struct vkr_context *ctx,
19*bbecb9d1SAndroid Build Coastguard Worker                          struct vkr_device *dev,
20*bbecb9d1SAndroid Build Coastguard Worker                          uint32_t create_info_count,
21*bbecb9d1SAndroid Build Coastguard Worker                          const VkDeviceQueueCreateInfo *create_infos)
22*bbecb9d1SAndroid Build Coastguard Worker {
23*bbecb9d1SAndroid Build Coastguard Worker    struct vn_device_proc_table *vk = &dev->proc_table;
24*bbecb9d1SAndroid Build Coastguard Worker    list_inithead(&dev->queues);
25*bbecb9d1SAndroid Build Coastguard Worker 
26*bbecb9d1SAndroid Build Coastguard Worker    for (uint32_t i = 0; i < create_info_count; i++) {
27*bbecb9d1SAndroid Build Coastguard Worker       for (uint32_t j = 0; j < create_infos[i].queueCount; j++) {
28*bbecb9d1SAndroid Build Coastguard Worker          const VkDeviceQueueInfo2 info = {
29*bbecb9d1SAndroid Build Coastguard Worker             .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_INFO_2,
30*bbecb9d1SAndroid Build Coastguard Worker             .pNext = NULL,
31*bbecb9d1SAndroid Build Coastguard Worker             .flags = create_infos[i].flags,
32*bbecb9d1SAndroid Build Coastguard Worker             .queueFamilyIndex = create_infos[i].queueFamilyIndex,
33*bbecb9d1SAndroid Build Coastguard Worker             .queueIndex = j,
34*bbecb9d1SAndroid Build Coastguard Worker          };
35*bbecb9d1SAndroid Build Coastguard Worker          VkQueue handle = VK_NULL_HANDLE;
36*bbecb9d1SAndroid Build Coastguard Worker          /* There was a bug in spec which forbids usage of vkGetDeviceQueue2
37*bbecb9d1SAndroid Build Coastguard Worker           * with flags set to zero. It was fixed in spec version 1.1.130.
38*bbecb9d1SAndroid Build Coastguard Worker           * Work around drivers that are implementing this buggy behavior
39*bbecb9d1SAndroid Build Coastguard Worker           */
40*bbecb9d1SAndroid Build Coastguard Worker          if (info.flags) {
41*bbecb9d1SAndroid Build Coastguard Worker             vk->GetDeviceQueue2(dev->base.handle.device, &info, &handle);
42*bbecb9d1SAndroid Build Coastguard Worker          } else {
43*bbecb9d1SAndroid Build Coastguard Worker             vk->GetDeviceQueue(dev->base.handle.device, info.queueFamilyIndex,
44*bbecb9d1SAndroid Build Coastguard Worker                                info.queueIndex, &handle);
45*bbecb9d1SAndroid Build Coastguard Worker          }
46*bbecb9d1SAndroid Build Coastguard Worker 
47*bbecb9d1SAndroid Build Coastguard Worker          struct vkr_queue *queue = vkr_queue_create(
48*bbecb9d1SAndroid Build Coastguard Worker             ctx, dev, info.flags, info.queueFamilyIndex, info.queueIndex, handle);
49*bbecb9d1SAndroid Build Coastguard Worker          if (!queue) {
50*bbecb9d1SAndroid Build Coastguard Worker             struct vkr_queue *entry, *tmp;
51*bbecb9d1SAndroid Build Coastguard Worker             LIST_FOR_EACH_ENTRY_SAFE (entry, tmp, &dev->queues, base.track_head)
52*bbecb9d1SAndroid Build Coastguard Worker                vkr_queue_destroy(ctx, entry);
53*bbecb9d1SAndroid Build Coastguard Worker 
54*bbecb9d1SAndroid Build Coastguard Worker             return VK_ERROR_OUT_OF_HOST_MEMORY;
55*bbecb9d1SAndroid Build Coastguard Worker          }
56*bbecb9d1SAndroid Build Coastguard Worker 
57*bbecb9d1SAndroid Build Coastguard Worker          /* queues are not tracked as device objects */
58*bbecb9d1SAndroid Build Coastguard Worker          list_add(&queue->base.track_head, &dev->queues);
59*bbecb9d1SAndroid Build Coastguard Worker       }
60*bbecb9d1SAndroid Build Coastguard Worker    }
61*bbecb9d1SAndroid Build Coastguard Worker 
62*bbecb9d1SAndroid Build Coastguard Worker    return VK_SUCCESS;
63*bbecb9d1SAndroid Build Coastguard Worker }
64*bbecb9d1SAndroid Build Coastguard Worker 
65*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_device_init_proc_table(struct vkr_device * dev,uint32_t api_version,const char * const * exts,uint32_t count)66*bbecb9d1SAndroid Build Coastguard Worker vkr_device_init_proc_table(struct vkr_device *dev,
67*bbecb9d1SAndroid Build Coastguard Worker                            uint32_t api_version,
68*bbecb9d1SAndroid Build Coastguard Worker                            const char *const *exts,
69*bbecb9d1SAndroid Build Coastguard Worker                            uint32_t count)
70*bbecb9d1SAndroid Build Coastguard Worker {
71*bbecb9d1SAndroid Build Coastguard Worker    struct vn_info_extension_table ext_table;
72*bbecb9d1SAndroid Build Coastguard Worker    vkr_extension_table_init(&ext_table, exts, count);
73*bbecb9d1SAndroid Build Coastguard Worker 
74*bbecb9d1SAndroid Build Coastguard Worker    vn_util_init_device_proc_table(dev->base.handle.device, api_version, &ext_table,
75*bbecb9d1SAndroid Build Coastguard Worker                                   &dev->proc_table);
76*bbecb9d1SAndroid Build Coastguard Worker }
77*bbecb9d1SAndroid Build Coastguard Worker 
78*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkCreateDevice(struct vn_dispatch_context * dispatch,struct vn_command_vkCreateDevice * args)79*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkCreateDevice(struct vn_dispatch_context *dispatch,
80*bbecb9d1SAndroid Build Coastguard Worker                             struct vn_command_vkCreateDevice *args)
81*bbecb9d1SAndroid Build Coastguard Worker {
82*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_context *ctx = dispatch->data;
83*bbecb9d1SAndroid Build Coastguard Worker 
84*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_physical_device *physical_dev =
85*bbecb9d1SAndroid Build Coastguard Worker       vkr_physical_device_from_handle(args->physicalDevice);
86*bbecb9d1SAndroid Build Coastguard Worker 
87*bbecb9d1SAndroid Build Coastguard Worker    /* append extensions for our own use */
88*bbecb9d1SAndroid Build Coastguard Worker    const char **exts = NULL;
89*bbecb9d1SAndroid Build Coastguard Worker    uint32_t ext_count = args->pCreateInfo->enabledExtensionCount;
90*bbecb9d1SAndroid Build Coastguard Worker    ext_count += physical_dev->KHR_external_memory_fd;
91*bbecb9d1SAndroid Build Coastguard Worker    ext_count += physical_dev->EXT_external_memory_dma_buf;
92*bbecb9d1SAndroid Build Coastguard Worker    ext_count += physical_dev->KHR_external_fence_fd;
93*bbecb9d1SAndroid Build Coastguard Worker    if (ext_count > args->pCreateInfo->enabledExtensionCount) {
94*bbecb9d1SAndroid Build Coastguard Worker       exts = malloc(sizeof(*exts) * ext_count);
95*bbecb9d1SAndroid Build Coastguard Worker       if (!exts) {
96*bbecb9d1SAndroid Build Coastguard Worker          args->ret = VK_ERROR_OUT_OF_HOST_MEMORY;
97*bbecb9d1SAndroid Build Coastguard Worker          return;
98*bbecb9d1SAndroid Build Coastguard Worker       }
99*bbecb9d1SAndroid Build Coastguard Worker       for (uint32_t i = 0; i < args->pCreateInfo->enabledExtensionCount; i++)
100*bbecb9d1SAndroid Build Coastguard Worker          exts[i] = args->pCreateInfo->ppEnabledExtensionNames[i];
101*bbecb9d1SAndroid Build Coastguard Worker 
102*bbecb9d1SAndroid Build Coastguard Worker       ext_count = args->pCreateInfo->enabledExtensionCount;
103*bbecb9d1SAndroid Build Coastguard Worker       if (physical_dev->KHR_external_memory_fd)
104*bbecb9d1SAndroid Build Coastguard Worker          exts[ext_count++] = "VK_KHR_external_memory_fd";
105*bbecb9d1SAndroid Build Coastguard Worker       if (physical_dev->EXT_external_memory_dma_buf)
106*bbecb9d1SAndroid Build Coastguard Worker          exts[ext_count++] = "VK_EXT_external_memory_dma_buf";
107*bbecb9d1SAndroid Build Coastguard Worker       if (physical_dev->KHR_external_fence_fd)
108*bbecb9d1SAndroid Build Coastguard Worker          exts[ext_count++] = "VK_KHR_external_fence_fd";
109*bbecb9d1SAndroid Build Coastguard Worker 
110*bbecb9d1SAndroid Build Coastguard Worker       ((VkDeviceCreateInfo *)args->pCreateInfo)->ppEnabledExtensionNames = exts;
111*bbecb9d1SAndroid Build Coastguard Worker       ((VkDeviceCreateInfo *)args->pCreateInfo)->enabledExtensionCount = ext_count;
112*bbecb9d1SAndroid Build Coastguard Worker    }
113*bbecb9d1SAndroid Build Coastguard Worker 
114*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_device *dev =
115*bbecb9d1SAndroid Build Coastguard Worker       vkr_context_alloc_object(ctx, sizeof(*dev), VK_OBJECT_TYPE_DEVICE, args->pDevice);
116*bbecb9d1SAndroid Build Coastguard Worker    if (!dev) {
117*bbecb9d1SAndroid Build Coastguard Worker       args->ret = VK_ERROR_OUT_OF_HOST_MEMORY;
118*bbecb9d1SAndroid Build Coastguard Worker       free(exts);
119*bbecb9d1SAndroid Build Coastguard Worker       return;
120*bbecb9d1SAndroid Build Coastguard Worker    }
121*bbecb9d1SAndroid Build Coastguard Worker 
122*bbecb9d1SAndroid Build Coastguard Worker    vn_replace_vkCreateDevice_args_handle(args);
123*bbecb9d1SAndroid Build Coastguard Worker    args->ret = vkCreateDevice(args->physicalDevice, args->pCreateInfo, NULL,
124*bbecb9d1SAndroid Build Coastguard Worker                               &dev->base.handle.device);
125*bbecb9d1SAndroid Build Coastguard Worker    if (args->ret != VK_SUCCESS) {
126*bbecb9d1SAndroid Build Coastguard Worker       free(exts);
127*bbecb9d1SAndroid Build Coastguard Worker       free(dev);
128*bbecb9d1SAndroid Build Coastguard Worker       return;
129*bbecb9d1SAndroid Build Coastguard Worker    }
130*bbecb9d1SAndroid Build Coastguard Worker 
131*bbecb9d1SAndroid Build Coastguard Worker    dev->physical_device = physical_dev;
132*bbecb9d1SAndroid Build Coastguard Worker 
133*bbecb9d1SAndroid Build Coastguard Worker    vkr_device_init_proc_table(dev, physical_dev->api_version,
134*bbecb9d1SAndroid Build Coastguard Worker                               args->pCreateInfo->ppEnabledExtensionNames,
135*bbecb9d1SAndroid Build Coastguard Worker                               args->pCreateInfo->enabledExtensionCount);
136*bbecb9d1SAndroid Build Coastguard Worker 
137*bbecb9d1SAndroid Build Coastguard Worker    free(exts);
138*bbecb9d1SAndroid Build Coastguard Worker 
139*bbecb9d1SAndroid Build Coastguard Worker    args->ret = vkr_device_create_queues(ctx, dev, args->pCreateInfo->queueCreateInfoCount,
140*bbecb9d1SAndroid Build Coastguard Worker                                         args->pCreateInfo->pQueueCreateInfos);
141*bbecb9d1SAndroid Build Coastguard Worker    if (args->ret != VK_SUCCESS) {
142*bbecb9d1SAndroid Build Coastguard Worker       vkDestroyDevice(dev->base.handle.device, NULL);
143*bbecb9d1SAndroid Build Coastguard Worker       free(dev);
144*bbecb9d1SAndroid Build Coastguard Worker       return;
145*bbecb9d1SAndroid Build Coastguard Worker    }
146*bbecb9d1SAndroid Build Coastguard Worker 
147*bbecb9d1SAndroid Build Coastguard Worker    mtx_init(&dev->free_sync_mutex, mtx_plain);
148*bbecb9d1SAndroid Build Coastguard Worker    list_inithead(&dev->free_syncs);
149*bbecb9d1SAndroid Build Coastguard Worker 
150*bbecb9d1SAndroid Build Coastguard Worker    list_inithead(&dev->objects);
151*bbecb9d1SAndroid Build Coastguard Worker 
152*bbecb9d1SAndroid Build Coastguard Worker    list_add(&dev->base.track_head, &physical_dev->devices);
153*bbecb9d1SAndroid Build Coastguard Worker 
154*bbecb9d1SAndroid Build Coastguard Worker    vkr_context_add_object(ctx, &dev->base);
155*bbecb9d1SAndroid Build Coastguard Worker }
156*bbecb9d1SAndroid Build Coastguard Worker 
157*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_device_object_destroy(struct vkr_context * ctx,struct vkr_device * dev,struct vkr_object * obj)158*bbecb9d1SAndroid Build Coastguard Worker vkr_device_object_destroy(struct vkr_context *ctx,
159*bbecb9d1SAndroid Build Coastguard Worker                           struct vkr_device *dev,
160*bbecb9d1SAndroid Build Coastguard Worker                           struct vkr_object *obj)
161*bbecb9d1SAndroid Build Coastguard Worker {
162*bbecb9d1SAndroid Build Coastguard Worker    struct vn_device_proc_table *vk = &dev->proc_table;
163*bbecb9d1SAndroid Build Coastguard Worker    VkDevice device = dev->base.handle.device;
164*bbecb9d1SAndroid Build Coastguard Worker 
165*bbecb9d1SAndroid Build Coastguard Worker    assert(vkr_device_should_track_object(obj));
166*bbecb9d1SAndroid Build Coastguard Worker 
167*bbecb9d1SAndroid Build Coastguard Worker    switch (obj->type) {
168*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_SEMAPHORE:
169*bbecb9d1SAndroid Build Coastguard Worker       vk->DestroySemaphore(device, obj->handle.semaphore, NULL);
170*bbecb9d1SAndroid Build Coastguard Worker       break;
171*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_FENCE:
172*bbecb9d1SAndroid Build Coastguard Worker       vk->DestroyFence(device, obj->handle.fence, NULL);
173*bbecb9d1SAndroid Build Coastguard Worker       break;
174*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_DEVICE_MEMORY:
175*bbecb9d1SAndroid Build Coastguard Worker       vk->FreeMemory(device, obj->handle.device_memory, NULL);
176*bbecb9d1SAndroid Build Coastguard Worker       vkr_device_memory_release((struct vkr_device_memory *)obj);
177*bbecb9d1SAndroid Build Coastguard Worker       break;
178*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_BUFFER:
179*bbecb9d1SAndroid Build Coastguard Worker       vk->DestroyBuffer(device, obj->handle.buffer, NULL);
180*bbecb9d1SAndroid Build Coastguard Worker       break;
181*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_IMAGE:
182*bbecb9d1SAndroid Build Coastguard Worker       vk->DestroyImage(device, obj->handle.image, NULL);
183*bbecb9d1SAndroid Build Coastguard Worker       break;
184*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_EVENT:
185*bbecb9d1SAndroid Build Coastguard Worker       vk->DestroyEvent(device, obj->handle.event, NULL);
186*bbecb9d1SAndroid Build Coastguard Worker       break;
187*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_QUERY_POOL:
188*bbecb9d1SAndroid Build Coastguard Worker       vk->DestroyQueryPool(device, obj->handle.query_pool, NULL);
189*bbecb9d1SAndroid Build Coastguard Worker       break;
190*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_BUFFER_VIEW:
191*bbecb9d1SAndroid Build Coastguard Worker       vk->DestroyBufferView(device, obj->handle.buffer_view, NULL);
192*bbecb9d1SAndroid Build Coastguard Worker       break;
193*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_IMAGE_VIEW:
194*bbecb9d1SAndroid Build Coastguard Worker       vk->DestroyImageView(device, obj->handle.image_view, NULL);
195*bbecb9d1SAndroid Build Coastguard Worker       break;
196*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_SHADER_MODULE:
197*bbecb9d1SAndroid Build Coastguard Worker       vk->DestroyShaderModule(device, obj->handle.shader_module, NULL);
198*bbecb9d1SAndroid Build Coastguard Worker       break;
199*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_PIPELINE_CACHE:
200*bbecb9d1SAndroid Build Coastguard Worker       vk->DestroyPipelineCache(device, obj->handle.pipeline_cache, NULL);
201*bbecb9d1SAndroid Build Coastguard Worker       break;
202*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_PIPELINE_LAYOUT:
203*bbecb9d1SAndroid Build Coastguard Worker       vk->DestroyPipelineLayout(device, obj->handle.pipeline_layout, NULL);
204*bbecb9d1SAndroid Build Coastguard Worker       break;
205*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_RENDER_PASS:
206*bbecb9d1SAndroid Build Coastguard Worker       vk->DestroyRenderPass(device, obj->handle.render_pass, NULL);
207*bbecb9d1SAndroid Build Coastguard Worker       break;
208*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_PIPELINE:
209*bbecb9d1SAndroid Build Coastguard Worker       vk->DestroyPipeline(device, obj->handle.pipeline, NULL);
210*bbecb9d1SAndroid Build Coastguard Worker       break;
211*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT:
212*bbecb9d1SAndroid Build Coastguard Worker       vk->DestroyDescriptorSetLayout(device, obj->handle.descriptor_set_layout, NULL);
213*bbecb9d1SAndroid Build Coastguard Worker       break;
214*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_SAMPLER:
215*bbecb9d1SAndroid Build Coastguard Worker       vk->DestroySampler(device, obj->handle.sampler, NULL);
216*bbecb9d1SAndroid Build Coastguard Worker       break;
217*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_DESCRIPTOR_POOL: {
218*bbecb9d1SAndroid Build Coastguard Worker       /* Destroying VkDescriptorPool frees all VkDescriptorSet allocated inside. */
219*bbecb9d1SAndroid Build Coastguard Worker       vk->DestroyDescriptorPool(device, obj->handle.descriptor_pool, NULL);
220*bbecb9d1SAndroid Build Coastguard Worker       vkr_descriptor_pool_release(ctx, (struct vkr_descriptor_pool *)obj);
221*bbecb9d1SAndroid Build Coastguard Worker       break;
222*bbecb9d1SAndroid Build Coastguard Worker    }
223*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_FRAMEBUFFER:
224*bbecb9d1SAndroid Build Coastguard Worker       vk->DestroyFramebuffer(device, obj->handle.framebuffer, NULL);
225*bbecb9d1SAndroid Build Coastguard Worker       break;
226*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_COMMAND_POOL: {
227*bbecb9d1SAndroid Build Coastguard Worker       /* Destroying VkCommandPool frees all VkCommandBuffer allocated inside. */
228*bbecb9d1SAndroid Build Coastguard Worker       vk->DestroyCommandPool(device, obj->handle.command_pool, NULL);
229*bbecb9d1SAndroid Build Coastguard Worker       vkr_command_pool_release(ctx, (struct vkr_command_pool *)obj);
230*bbecb9d1SAndroid Build Coastguard Worker       break;
231*bbecb9d1SAndroid Build Coastguard Worker    }
232*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION:
233*bbecb9d1SAndroid Build Coastguard Worker       vk->DestroySamplerYcbcrConversion(device, obj->handle.sampler_ycbcr_conversion,
234*bbecb9d1SAndroid Build Coastguard Worker                                         NULL);
235*bbecb9d1SAndroid Build Coastguard Worker       break;
236*bbecb9d1SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE:
237*bbecb9d1SAndroid Build Coastguard Worker       vk->DestroyDescriptorUpdateTemplate(device, obj->handle.descriptor_update_template,
238*bbecb9d1SAndroid Build Coastguard Worker                                           NULL);
239*bbecb9d1SAndroid Build Coastguard Worker       break;
240*bbecb9d1SAndroid Build Coastguard Worker    default:
241*bbecb9d1SAndroid Build Coastguard Worker       vkr_log("Unhandled vkr_object(%p) with VkObjectType(%u)", obj, (uint32_t)obj->type);
242*bbecb9d1SAndroid Build Coastguard Worker       assert(false);
243*bbecb9d1SAndroid Build Coastguard Worker       break;
244*bbecb9d1SAndroid Build Coastguard Worker    };
245*bbecb9d1SAndroid Build Coastguard Worker 
246*bbecb9d1SAndroid Build Coastguard Worker    vkr_device_remove_object(ctx, dev, obj);
247*bbecb9d1SAndroid Build Coastguard Worker }
248*bbecb9d1SAndroid Build Coastguard Worker 
249*bbecb9d1SAndroid Build Coastguard Worker void
vkr_device_destroy(struct vkr_context * ctx,struct vkr_device * dev)250*bbecb9d1SAndroid Build Coastguard Worker vkr_device_destroy(struct vkr_context *ctx, struct vkr_device *dev)
251*bbecb9d1SAndroid Build Coastguard Worker {
252*bbecb9d1SAndroid Build Coastguard Worker    struct vn_device_proc_table *vk = &dev->proc_table;
253*bbecb9d1SAndroid Build Coastguard Worker    VkDevice device = dev->base.handle.device;
254*bbecb9d1SAndroid Build Coastguard Worker 
255*bbecb9d1SAndroid Build Coastguard Worker    if (!LIST_IS_EMPTY(&dev->objects))
256*bbecb9d1SAndroid Build Coastguard Worker       vkr_log("destroying device with valid objects");
257*bbecb9d1SAndroid Build Coastguard Worker 
258*bbecb9d1SAndroid Build Coastguard Worker    VkResult result = vk->DeviceWaitIdle(device);
259*bbecb9d1SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
260*bbecb9d1SAndroid Build Coastguard Worker       vkr_log("vkDeviceWaitIdle(%p) failed(%d)", dev, (int32_t)result);
261*bbecb9d1SAndroid Build Coastguard Worker 
262*bbecb9d1SAndroid Build Coastguard Worker    if (!LIST_IS_EMPTY(&dev->objects)) {
263*bbecb9d1SAndroid Build Coastguard Worker       struct vkr_object *obj, *obj_tmp;
264*bbecb9d1SAndroid Build Coastguard Worker       LIST_FOR_EACH_ENTRY_SAFE (obj, obj_tmp, &dev->objects, track_head)
265*bbecb9d1SAndroid Build Coastguard Worker          vkr_device_object_destroy(ctx, dev, obj);
266*bbecb9d1SAndroid Build Coastguard Worker    }
267*bbecb9d1SAndroid Build Coastguard Worker 
268*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_queue *queue, *queue_tmp;
269*bbecb9d1SAndroid Build Coastguard Worker    LIST_FOR_EACH_ENTRY_SAFE (queue, queue_tmp, &dev->queues, base.track_head)
270*bbecb9d1SAndroid Build Coastguard Worker       vkr_queue_destroy(ctx, queue);
271*bbecb9d1SAndroid Build Coastguard Worker 
272*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_queue_sync *sync, *sync_tmp;
273*bbecb9d1SAndroid Build Coastguard Worker    LIST_FOR_EACH_ENTRY_SAFE (sync, sync_tmp, &dev->free_syncs, head) {
274*bbecb9d1SAndroid Build Coastguard Worker       vk->DestroyFence(dev->base.handle.device, sync->fence, NULL);
275*bbecb9d1SAndroid Build Coastguard Worker       free(sync);
276*bbecb9d1SAndroid Build Coastguard Worker    }
277*bbecb9d1SAndroid Build Coastguard Worker 
278*bbecb9d1SAndroid Build Coastguard Worker    mtx_destroy(&dev->free_sync_mutex);
279*bbecb9d1SAndroid Build Coastguard Worker 
280*bbecb9d1SAndroid Build Coastguard Worker    vk->DestroyDevice(device, NULL);
281*bbecb9d1SAndroid Build Coastguard Worker 
282*bbecb9d1SAndroid Build Coastguard Worker    list_del(&dev->base.track_head);
283*bbecb9d1SAndroid Build Coastguard Worker 
284*bbecb9d1SAndroid Build Coastguard Worker    vkr_context_remove_object(ctx, &dev->base);
285*bbecb9d1SAndroid Build Coastguard Worker }
286*bbecb9d1SAndroid Build Coastguard Worker 
287*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkDestroyDevice(struct vn_dispatch_context * dispatch,struct vn_command_vkDestroyDevice * args)288*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkDestroyDevice(struct vn_dispatch_context *dispatch,
289*bbecb9d1SAndroid Build Coastguard Worker                              struct vn_command_vkDestroyDevice *args)
290*bbecb9d1SAndroid Build Coastguard Worker {
291*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_context *ctx = dispatch->data;
292*bbecb9d1SAndroid Build Coastguard Worker 
293*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_device *dev = vkr_device_from_handle(args->device);
294*bbecb9d1SAndroid Build Coastguard Worker    /* this never happens */
295*bbecb9d1SAndroid Build Coastguard Worker    if (!dev)
296*bbecb9d1SAndroid Build Coastguard Worker       return;
297*bbecb9d1SAndroid Build Coastguard Worker 
298*bbecb9d1SAndroid Build Coastguard Worker    vkr_device_destroy(ctx, dev);
299*bbecb9d1SAndroid Build Coastguard Worker }
300*bbecb9d1SAndroid Build Coastguard Worker 
301*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkGetDeviceGroupPeerMemoryFeatures(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkGetDeviceGroupPeerMemoryFeatures * args)302*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkGetDeviceGroupPeerMemoryFeatures(
303*bbecb9d1SAndroid Build Coastguard Worker    UNUSED struct vn_dispatch_context *dispatch,
304*bbecb9d1SAndroid Build Coastguard Worker    struct vn_command_vkGetDeviceGroupPeerMemoryFeatures *args)
305*bbecb9d1SAndroid Build Coastguard Worker {
306*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_device *dev = vkr_device_from_handle(args->device);
307*bbecb9d1SAndroid Build Coastguard Worker    struct vn_device_proc_table *vk = &dev->proc_table;
308*bbecb9d1SAndroid Build Coastguard Worker 
309*bbecb9d1SAndroid Build Coastguard Worker    vn_replace_vkGetDeviceGroupPeerMemoryFeatures_args_handle(args);
310*bbecb9d1SAndroid Build Coastguard Worker    vk->GetDeviceGroupPeerMemoryFeatures(args->device, args->heapIndex,
311*bbecb9d1SAndroid Build Coastguard Worker                                         args->localDeviceIndex, args->remoteDeviceIndex,
312*bbecb9d1SAndroid Build Coastguard Worker                                         args->pPeerMemoryFeatures);
313*bbecb9d1SAndroid Build Coastguard Worker }
314*bbecb9d1SAndroid Build Coastguard Worker 
315*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkDeviceWaitIdle(struct vn_dispatch_context * dispatch,UNUSED struct vn_command_vkDeviceWaitIdle * args)316*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkDeviceWaitIdle(struct vn_dispatch_context *dispatch,
317*bbecb9d1SAndroid Build Coastguard Worker                               UNUSED struct vn_command_vkDeviceWaitIdle *args)
318*bbecb9d1SAndroid Build Coastguard Worker {
319*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_context *ctx = dispatch->data;
320*bbecb9d1SAndroid Build Coastguard Worker    /* no blocking call */
321*bbecb9d1SAndroid Build Coastguard Worker    vkr_cs_decoder_set_fatal(&ctx->decoder);
322*bbecb9d1SAndroid Build Coastguard Worker }
323*bbecb9d1SAndroid Build Coastguard Worker 
324*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkGetCalibratedTimestampsEXT(UNUSED struct vn_dispatch_context * ctx,struct vn_command_vkGetCalibratedTimestampsEXT * args)325*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkGetCalibratedTimestampsEXT(
326*bbecb9d1SAndroid Build Coastguard Worker    UNUSED struct vn_dispatch_context *ctx,
327*bbecb9d1SAndroid Build Coastguard Worker    struct vn_command_vkGetCalibratedTimestampsEXT *args)
328*bbecb9d1SAndroid Build Coastguard Worker {
329*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_device *dev = vkr_device_from_handle(args->device);
330*bbecb9d1SAndroid Build Coastguard Worker    struct vn_device_proc_table *vk = &dev->proc_table;
331*bbecb9d1SAndroid Build Coastguard Worker 
332*bbecb9d1SAndroid Build Coastguard Worker    vn_replace_vkGetCalibratedTimestampsEXT_args_handle(args);
333*bbecb9d1SAndroid Build Coastguard Worker    args->ret = vk->GetCalibratedTimestampsEXT(args->device, args->timestampCount,
334*bbecb9d1SAndroid Build Coastguard Worker                                               args->pTimestampInfos, args->pTimestamps,
335*bbecb9d1SAndroid Build Coastguard Worker                                               args->pMaxDeviation);
336*bbecb9d1SAndroid Build Coastguard Worker }
337*bbecb9d1SAndroid Build Coastguard Worker 
338*bbecb9d1SAndroid Build Coastguard Worker void
vkr_context_init_device_dispatch(struct vkr_context * ctx)339*bbecb9d1SAndroid Build Coastguard Worker vkr_context_init_device_dispatch(struct vkr_context *ctx)
340*bbecb9d1SAndroid Build Coastguard Worker {
341*bbecb9d1SAndroid Build Coastguard Worker    struct vn_dispatch_context *dispatch = &ctx->dispatch;
342*bbecb9d1SAndroid Build Coastguard Worker 
343*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkCreateDevice = vkr_dispatch_vkCreateDevice;
344*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkDestroyDevice = vkr_dispatch_vkDestroyDevice;
345*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkGetDeviceProcAddr = NULL;
346*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkGetDeviceGroupPeerMemoryFeatures =
347*bbecb9d1SAndroid Build Coastguard Worker       vkr_dispatch_vkGetDeviceGroupPeerMemoryFeatures;
348*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkDeviceWaitIdle = vkr_dispatch_vkDeviceWaitIdle;
349*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkGetCalibratedTimestampsEXT =
350*bbecb9d1SAndroid Build Coastguard Worker       vkr_dispatch_vkGetCalibratedTimestampsEXT;
351*bbecb9d1SAndroid Build Coastguard Worker }
352