1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright 2019 Google LLC
3*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker *
5*61046927SAndroid Build Coastguard Worker * based in part on anv and radv which are:
6*61046927SAndroid Build Coastguard Worker * Copyright © 2015 Intel Corporation
7*61046927SAndroid Build Coastguard Worker * Copyright © 2016 Red Hat.
8*61046927SAndroid Build Coastguard Worker * Copyright © 2016 Bas Nieuwenhuizen
9*61046927SAndroid Build Coastguard Worker */
10*61046927SAndroid Build Coastguard Worker
11*61046927SAndroid Build Coastguard Worker #include "vn_device.h"
12*61046927SAndroid Build Coastguard Worker
13*61046927SAndroid Build Coastguard Worker #include "util/disk_cache.h"
14*61046927SAndroid Build Coastguard Worker #include "util/hex.h"
15*61046927SAndroid Build Coastguard Worker #include "venus-protocol/vn_protocol_driver_device.h"
16*61046927SAndroid Build Coastguard Worker
17*61046927SAndroid Build Coastguard Worker #include "vn_android.h"
18*61046927SAndroid Build Coastguard Worker #include "vn_instance.h"
19*61046927SAndroid Build Coastguard Worker #include "vn_physical_device.h"
20*61046927SAndroid Build Coastguard Worker #include "vn_queue.h"
21*61046927SAndroid Build Coastguard Worker
22*61046927SAndroid Build Coastguard Worker /* device commands */
23*61046927SAndroid Build Coastguard Worker
24*61046927SAndroid Build Coastguard Worker static void
vn_queue_fini(struct vn_queue * queue)25*61046927SAndroid Build Coastguard Worker vn_queue_fini(struct vn_queue *queue)
26*61046927SAndroid Build Coastguard Worker {
27*61046927SAndroid Build Coastguard Worker VkDevice dev_handle = vk_device_to_handle(queue->base.base.base.device);
28*61046927SAndroid Build Coastguard Worker
29*61046927SAndroid Build Coastguard Worker if (queue->wait_fence != VK_NULL_HANDLE) {
30*61046927SAndroid Build Coastguard Worker vn_DestroyFence(dev_handle, queue->wait_fence, NULL);
31*61046927SAndroid Build Coastguard Worker }
32*61046927SAndroid Build Coastguard Worker if (queue->sparse_semaphore != VK_NULL_HANDLE) {
33*61046927SAndroid Build Coastguard Worker vn_DestroySemaphore(dev_handle, queue->sparse_semaphore, NULL);
34*61046927SAndroid Build Coastguard Worker }
35*61046927SAndroid Build Coastguard Worker vn_cached_storage_fini(&queue->storage);
36*61046927SAndroid Build Coastguard Worker vn_queue_base_fini(&queue->base);
37*61046927SAndroid Build Coastguard Worker }
38*61046927SAndroid Build Coastguard Worker
39*61046927SAndroid Build Coastguard Worker static VkResult
vn_queue_init(struct vn_device * dev,struct vn_queue * queue,const VkDeviceQueueCreateInfo * queue_info,uint32_t queue_index)40*61046927SAndroid Build Coastguard Worker vn_queue_init(struct vn_device *dev,
41*61046927SAndroid Build Coastguard Worker struct vn_queue *queue,
42*61046927SAndroid Build Coastguard Worker const VkDeviceQueueCreateInfo *queue_info,
43*61046927SAndroid Build Coastguard Worker uint32_t queue_index)
44*61046927SAndroid Build Coastguard Worker {
45*61046927SAndroid Build Coastguard Worker VkResult result =
46*61046927SAndroid Build Coastguard Worker vn_queue_base_init(&queue->base, &dev->base, queue_info, queue_index);
47*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
48*61046927SAndroid Build Coastguard Worker return result;
49*61046927SAndroid Build Coastguard Worker
50*61046927SAndroid Build Coastguard Worker vn_cached_storage_init(&queue->storage, &dev->base.base.alloc);
51*61046927SAndroid Build Coastguard Worker
52*61046927SAndroid Build Coastguard Worker const int ring_idx = vn_instance_acquire_ring_idx(dev->instance);
53*61046927SAndroid Build Coastguard Worker if (ring_idx < 0) {
54*61046927SAndroid Build Coastguard Worker vn_log(dev->instance, "failed binding VkQueue to renderer timeline");
55*61046927SAndroid Build Coastguard Worker return VK_ERROR_INITIALIZATION_FAILED;
56*61046927SAndroid Build Coastguard Worker }
57*61046927SAndroid Build Coastguard Worker queue->ring_idx = (uint32_t)ring_idx;
58*61046927SAndroid Build Coastguard Worker
59*61046927SAndroid Build Coastguard Worker const VkDeviceQueueTimelineInfoMESA timeline_info = {
60*61046927SAndroid Build Coastguard Worker .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_TIMELINE_INFO_MESA,
61*61046927SAndroid Build Coastguard Worker .ringIdx = queue->ring_idx,
62*61046927SAndroid Build Coastguard Worker };
63*61046927SAndroid Build Coastguard Worker const VkDeviceQueueInfo2 device_queue_info = {
64*61046927SAndroid Build Coastguard Worker .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_INFO_2,
65*61046927SAndroid Build Coastguard Worker .pNext = &timeline_info,
66*61046927SAndroid Build Coastguard Worker .flags = queue_info->flags,
67*61046927SAndroid Build Coastguard Worker .queueFamilyIndex = queue_info->queueFamilyIndex,
68*61046927SAndroid Build Coastguard Worker .queueIndex = queue_index,
69*61046927SAndroid Build Coastguard Worker };
70*61046927SAndroid Build Coastguard Worker
71*61046927SAndroid Build Coastguard Worker VkQueue queue_handle = vn_queue_to_handle(queue);
72*61046927SAndroid Build Coastguard Worker vn_async_vkGetDeviceQueue2(dev->primary_ring, vn_device_to_handle(dev),
73*61046927SAndroid Build Coastguard Worker &device_queue_info, &queue_handle);
74*61046927SAndroid Build Coastguard Worker
75*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
76*61046927SAndroid Build Coastguard Worker }
77*61046927SAndroid Build Coastguard Worker
78*61046927SAndroid Build Coastguard Worker static VkResult
vn_device_init_queues(struct vn_device * dev,const VkDeviceCreateInfo * create_info)79*61046927SAndroid Build Coastguard Worker vn_device_init_queues(struct vn_device *dev,
80*61046927SAndroid Build Coastguard Worker const VkDeviceCreateInfo *create_info)
81*61046927SAndroid Build Coastguard Worker {
82*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *alloc = &dev->base.base.alloc;
83*61046927SAndroid Build Coastguard Worker
84*61046927SAndroid Build Coastguard Worker uint32_t count = 0;
85*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < create_info->queueCreateInfoCount; i++)
86*61046927SAndroid Build Coastguard Worker count += create_info->pQueueCreateInfos[i].queueCount;
87*61046927SAndroid Build Coastguard Worker
88*61046927SAndroid Build Coastguard Worker struct vn_queue *queues =
89*61046927SAndroid Build Coastguard Worker vk_zalloc(alloc, sizeof(*queues) * count, VN_DEFAULT_ALIGN,
90*61046927SAndroid Build Coastguard Worker VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
91*61046927SAndroid Build Coastguard Worker if (!queues)
92*61046927SAndroid Build Coastguard Worker return VK_ERROR_OUT_OF_HOST_MEMORY;
93*61046927SAndroid Build Coastguard Worker
94*61046927SAndroid Build Coastguard Worker count = 0;
95*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < create_info->queueCreateInfoCount; i++) {
96*61046927SAndroid Build Coastguard Worker VkResult result;
97*61046927SAndroid Build Coastguard Worker
98*61046927SAndroid Build Coastguard Worker const VkDeviceQueueCreateInfo *queue_info =
99*61046927SAndroid Build Coastguard Worker &create_info->pQueueCreateInfos[i];
100*61046927SAndroid Build Coastguard Worker for (uint32_t j = 0; j < queue_info->queueCount; j++) {
101*61046927SAndroid Build Coastguard Worker result = vn_queue_init(dev, &queues[count], queue_info, j);
102*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS) {
103*61046927SAndroid Build Coastguard Worker for (uint32_t k = 0; k < count; k++)
104*61046927SAndroid Build Coastguard Worker vn_queue_fini(&queues[k]);
105*61046927SAndroid Build Coastguard Worker vk_free(alloc, queues);
106*61046927SAndroid Build Coastguard Worker
107*61046927SAndroid Build Coastguard Worker return result;
108*61046927SAndroid Build Coastguard Worker }
109*61046927SAndroid Build Coastguard Worker
110*61046927SAndroid Build Coastguard Worker count++;
111*61046927SAndroid Build Coastguard Worker }
112*61046927SAndroid Build Coastguard Worker }
113*61046927SAndroid Build Coastguard Worker
114*61046927SAndroid Build Coastguard Worker dev->queues = queues;
115*61046927SAndroid Build Coastguard Worker dev->queue_count = count;
116*61046927SAndroid Build Coastguard Worker
117*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
118*61046927SAndroid Build Coastguard Worker }
119*61046927SAndroid Build Coastguard Worker
120*61046927SAndroid Build Coastguard Worker static bool
vn_device_queue_family_init(struct vn_device * dev,const VkDeviceCreateInfo * create_info)121*61046927SAndroid Build Coastguard Worker vn_device_queue_family_init(struct vn_device *dev,
122*61046927SAndroid Build Coastguard Worker const VkDeviceCreateInfo *create_info)
123*61046927SAndroid Build Coastguard Worker {
124*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *alloc = &dev->base.base.alloc;
125*61046927SAndroid Build Coastguard Worker uint32_t *queue_families = NULL;
126*61046927SAndroid Build Coastguard Worker uint32_t count = 0;
127*61046927SAndroid Build Coastguard Worker
128*61046927SAndroid Build Coastguard Worker queue_families = vk_zalloc(
129*61046927SAndroid Build Coastguard Worker alloc, sizeof(*queue_families) * create_info->queueCreateInfoCount,
130*61046927SAndroid Build Coastguard Worker VN_DEFAULT_ALIGN, VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
131*61046927SAndroid Build Coastguard Worker if (!queue_families)
132*61046927SAndroid Build Coastguard Worker return false;
133*61046927SAndroid Build Coastguard Worker
134*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < create_info->queueCreateInfoCount; i++) {
135*61046927SAndroid Build Coastguard Worker const uint32_t index =
136*61046927SAndroid Build Coastguard Worker create_info->pQueueCreateInfos[i].queueFamilyIndex;
137*61046927SAndroid Build Coastguard Worker bool new_index = true;
138*61046927SAndroid Build Coastguard Worker
139*61046927SAndroid Build Coastguard Worker for (uint32_t j = 0; j < count; j++) {
140*61046927SAndroid Build Coastguard Worker if (queue_families[j] == index) {
141*61046927SAndroid Build Coastguard Worker new_index = false;
142*61046927SAndroid Build Coastguard Worker break;
143*61046927SAndroid Build Coastguard Worker }
144*61046927SAndroid Build Coastguard Worker }
145*61046927SAndroid Build Coastguard Worker if (new_index)
146*61046927SAndroid Build Coastguard Worker queue_families[count++] = index;
147*61046927SAndroid Build Coastguard Worker }
148*61046927SAndroid Build Coastguard Worker
149*61046927SAndroid Build Coastguard Worker dev->queue_families = queue_families;
150*61046927SAndroid Build Coastguard Worker dev->queue_family_count = count;
151*61046927SAndroid Build Coastguard Worker
152*61046927SAndroid Build Coastguard Worker return true;
153*61046927SAndroid Build Coastguard Worker }
154*61046927SAndroid Build Coastguard Worker
155*61046927SAndroid Build Coastguard Worker static inline void
vn_device_queue_family_fini(struct vn_device * dev)156*61046927SAndroid Build Coastguard Worker vn_device_queue_family_fini(struct vn_device *dev)
157*61046927SAndroid Build Coastguard Worker {
158*61046927SAndroid Build Coastguard Worker vk_free(&dev->base.base.alloc, dev->queue_families);
159*61046927SAndroid Build Coastguard Worker }
160*61046927SAndroid Build Coastguard Worker
161*61046927SAndroid Build Coastguard Worker static VkResult
vn_device_memory_report_init(struct vn_device * dev,const VkDeviceCreateInfo * create_info)162*61046927SAndroid Build Coastguard Worker vn_device_memory_report_init(struct vn_device *dev,
163*61046927SAndroid Build Coastguard Worker const VkDeviceCreateInfo *create_info)
164*61046927SAndroid Build Coastguard Worker {
165*61046927SAndroid Build Coastguard Worker const struct vk_features *app_feats = &dev->base.base.enabled_features;
166*61046927SAndroid Build Coastguard Worker if (!app_feats->deviceMemoryReport)
167*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
168*61046927SAndroid Build Coastguard Worker
169*61046927SAndroid Build Coastguard Worker uint32_t count = 0;
170*61046927SAndroid Build Coastguard Worker vk_foreach_struct_const(pnext, create_info->pNext) {
171*61046927SAndroid Build Coastguard Worker if (pnext->sType ==
172*61046927SAndroid Build Coastguard Worker VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT)
173*61046927SAndroid Build Coastguard Worker count++;
174*61046927SAndroid Build Coastguard Worker }
175*61046927SAndroid Build Coastguard Worker
176*61046927SAndroid Build Coastguard Worker struct vn_device_memory_report *mem_reports = NULL;
177*61046927SAndroid Build Coastguard Worker if (count) {
178*61046927SAndroid Build Coastguard Worker mem_reports =
179*61046927SAndroid Build Coastguard Worker vk_alloc(&dev->base.base.alloc, sizeof(*mem_reports) * count,
180*61046927SAndroid Build Coastguard Worker VN_DEFAULT_ALIGN, VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
181*61046927SAndroid Build Coastguard Worker if (!mem_reports)
182*61046927SAndroid Build Coastguard Worker return VK_ERROR_OUT_OF_HOST_MEMORY;
183*61046927SAndroid Build Coastguard Worker }
184*61046927SAndroid Build Coastguard Worker
185*61046927SAndroid Build Coastguard Worker count = 0;
186*61046927SAndroid Build Coastguard Worker vk_foreach_struct_const(pnext, create_info->pNext) {
187*61046927SAndroid Build Coastguard Worker if (pnext->sType ==
188*61046927SAndroid Build Coastguard Worker VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT) {
189*61046927SAndroid Build Coastguard Worker const struct VkDeviceDeviceMemoryReportCreateInfoEXT *report =
190*61046927SAndroid Build Coastguard Worker (void *)pnext;
191*61046927SAndroid Build Coastguard Worker mem_reports[count].callback = report->pfnUserCallback;
192*61046927SAndroid Build Coastguard Worker mem_reports[count].data = report->pUserData;
193*61046927SAndroid Build Coastguard Worker count++;
194*61046927SAndroid Build Coastguard Worker }
195*61046927SAndroid Build Coastguard Worker }
196*61046927SAndroid Build Coastguard Worker
197*61046927SAndroid Build Coastguard Worker dev->memory_report_count = count;
198*61046927SAndroid Build Coastguard Worker dev->memory_reports = mem_reports;
199*61046927SAndroid Build Coastguard Worker
200*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
201*61046927SAndroid Build Coastguard Worker }
202*61046927SAndroid Build Coastguard Worker
203*61046927SAndroid Build Coastguard Worker static inline void
vn_device_memory_report_fini(struct vn_device * dev)204*61046927SAndroid Build Coastguard Worker vn_device_memory_report_fini(struct vn_device *dev)
205*61046927SAndroid Build Coastguard Worker {
206*61046927SAndroid Build Coastguard Worker vk_free(&dev->base.base.alloc, dev->memory_reports);
207*61046927SAndroid Build Coastguard Worker }
208*61046927SAndroid Build Coastguard Worker
209*61046927SAndroid Build Coastguard Worker static bool
find_extension_names(const char * const * exts,uint32_t ext_count,const char * name)210*61046927SAndroid Build Coastguard Worker find_extension_names(const char *const *exts,
211*61046927SAndroid Build Coastguard Worker uint32_t ext_count,
212*61046927SAndroid Build Coastguard Worker const char *name)
213*61046927SAndroid Build Coastguard Worker {
214*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < ext_count; i++) {
215*61046927SAndroid Build Coastguard Worker if (!strcmp(exts[i], name))
216*61046927SAndroid Build Coastguard Worker return true;
217*61046927SAndroid Build Coastguard Worker }
218*61046927SAndroid Build Coastguard Worker return false;
219*61046927SAndroid Build Coastguard Worker }
220*61046927SAndroid Build Coastguard Worker
221*61046927SAndroid Build Coastguard Worker static bool
merge_extension_names(const char * const * exts,uint32_t ext_count,const char * const * extra_exts,uint32_t extra_count,const char * const * block_exts,uint32_t block_count,const VkAllocationCallbacks * alloc,const char * const ** out_exts,uint32_t * out_count)222*61046927SAndroid Build Coastguard Worker merge_extension_names(const char *const *exts,
223*61046927SAndroid Build Coastguard Worker uint32_t ext_count,
224*61046927SAndroid Build Coastguard Worker const char *const *extra_exts,
225*61046927SAndroid Build Coastguard Worker uint32_t extra_count,
226*61046927SAndroid Build Coastguard Worker const char *const *block_exts,
227*61046927SAndroid Build Coastguard Worker uint32_t block_count,
228*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *alloc,
229*61046927SAndroid Build Coastguard Worker const char *const **out_exts,
230*61046927SAndroid Build Coastguard Worker uint32_t *out_count)
231*61046927SAndroid Build Coastguard Worker {
232*61046927SAndroid Build Coastguard Worker const char **merged =
233*61046927SAndroid Build Coastguard Worker vk_alloc(alloc, sizeof(*merged) * (ext_count + extra_count),
234*61046927SAndroid Build Coastguard Worker VN_DEFAULT_ALIGN, VK_SYSTEM_ALLOCATION_SCOPE_COMMAND);
235*61046927SAndroid Build Coastguard Worker if (!merged)
236*61046927SAndroid Build Coastguard Worker return false;
237*61046927SAndroid Build Coastguard Worker
238*61046927SAndroid Build Coastguard Worker uint32_t count = 0;
239*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < ext_count; i++) {
240*61046927SAndroid Build Coastguard Worker if (!find_extension_names(block_exts, block_count, exts[i]))
241*61046927SAndroid Build Coastguard Worker merged[count++] = exts[i];
242*61046927SAndroid Build Coastguard Worker }
243*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < extra_count; i++) {
244*61046927SAndroid Build Coastguard Worker if (!find_extension_names(exts, ext_count, extra_exts[i]))
245*61046927SAndroid Build Coastguard Worker merged[count++] = extra_exts[i];
246*61046927SAndroid Build Coastguard Worker }
247*61046927SAndroid Build Coastguard Worker
248*61046927SAndroid Build Coastguard Worker *out_exts = merged;
249*61046927SAndroid Build Coastguard Worker *out_count = count;
250*61046927SAndroid Build Coastguard Worker return true;
251*61046927SAndroid Build Coastguard Worker }
252*61046927SAndroid Build Coastguard Worker
253*61046927SAndroid Build Coastguard Worker static const VkDeviceCreateInfo *
vn_device_fix_create_info(const struct vn_device * dev,const VkDeviceCreateInfo * dev_info,const VkAllocationCallbacks * alloc,VkDeviceCreateInfo * local_info)254*61046927SAndroid Build Coastguard Worker vn_device_fix_create_info(const struct vn_device *dev,
255*61046927SAndroid Build Coastguard Worker const VkDeviceCreateInfo *dev_info,
256*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *alloc,
257*61046927SAndroid Build Coastguard Worker VkDeviceCreateInfo *local_info)
258*61046927SAndroid Build Coastguard Worker {
259*61046927SAndroid Build Coastguard Worker const struct vn_physical_device *physical_dev = dev->physical_device;
260*61046927SAndroid Build Coastguard Worker const struct vk_device_extension_table *app_exts =
261*61046927SAndroid Build Coastguard Worker &dev->base.base.enabled_extensions;
262*61046927SAndroid Build Coastguard Worker /* extra_exts and block_exts must not overlap */
263*61046927SAndroid Build Coastguard Worker const char *extra_exts[16];
264*61046927SAndroid Build Coastguard Worker const char *block_exts[16];
265*61046927SAndroid Build Coastguard Worker uint32_t extra_count = 0;
266*61046927SAndroid Build Coastguard Worker uint32_t block_count = 0;
267*61046927SAndroid Build Coastguard Worker
268*61046927SAndroid Build Coastguard Worker /* fix for WSI (treat AHB as WSI extension for simplicity) */
269*61046927SAndroid Build Coastguard Worker const bool has_wsi =
270*61046927SAndroid Build Coastguard Worker app_exts->KHR_swapchain || app_exts->ANDROID_native_buffer ||
271*61046927SAndroid Build Coastguard Worker app_exts->ANDROID_external_memory_android_hardware_buffer;
272*61046927SAndroid Build Coastguard Worker if (has_wsi) {
273*61046927SAndroid Build Coastguard Worker if (!app_exts->EXT_image_drm_format_modifier) {
274*61046927SAndroid Build Coastguard Worker extra_exts[extra_count++] =
275*61046927SAndroid Build Coastguard Worker VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME;
276*61046927SAndroid Build Coastguard Worker
277*61046927SAndroid Build Coastguard Worker if (physical_dev->renderer_version < VK_API_VERSION_1_2 &&
278*61046927SAndroid Build Coastguard Worker !app_exts->KHR_image_format_list) {
279*61046927SAndroid Build Coastguard Worker extra_exts[extra_count++] =
280*61046927SAndroid Build Coastguard Worker VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME;
281*61046927SAndroid Build Coastguard Worker }
282*61046927SAndroid Build Coastguard Worker }
283*61046927SAndroid Build Coastguard Worker
284*61046927SAndroid Build Coastguard Worker if (!app_exts->EXT_queue_family_foreign) {
285*61046927SAndroid Build Coastguard Worker extra_exts[extra_count++] =
286*61046927SAndroid Build Coastguard Worker VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME;
287*61046927SAndroid Build Coastguard Worker }
288*61046927SAndroid Build Coastguard Worker
289*61046927SAndroid Build Coastguard Worker if (app_exts->KHR_swapchain) {
290*61046927SAndroid Build Coastguard Worker /* see vn_physical_device_get_native_extensions */
291*61046927SAndroid Build Coastguard Worker block_exts[block_count++] = VK_KHR_SWAPCHAIN_EXTENSION_NAME;
292*61046927SAndroid Build Coastguard Worker block_exts[block_count++] =
293*61046927SAndroid Build Coastguard Worker VK_KHR_SWAPCHAIN_MUTABLE_FORMAT_EXTENSION_NAME;
294*61046927SAndroid Build Coastguard Worker block_exts[block_count++] =
295*61046927SAndroid Build Coastguard Worker VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME;
296*61046927SAndroid Build Coastguard Worker }
297*61046927SAndroid Build Coastguard Worker
298*61046927SAndroid Build Coastguard Worker if (app_exts->ANDROID_native_buffer) {
299*61046927SAndroid Build Coastguard Worker /* see vn_QueueSignalReleaseImageANDROID */
300*61046927SAndroid Build Coastguard Worker if (!app_exts->KHR_external_fence_fd) {
301*61046927SAndroid Build Coastguard Worker assert(physical_dev->renderer_sync_fd.fence_exportable);
302*61046927SAndroid Build Coastguard Worker extra_exts[extra_count++] =
303*61046927SAndroid Build Coastguard Worker VK_KHR_EXTERNAL_FENCE_FD_EXTENSION_NAME;
304*61046927SAndroid Build Coastguard Worker }
305*61046927SAndroid Build Coastguard Worker
306*61046927SAndroid Build Coastguard Worker block_exts[block_count++] = VK_ANDROID_NATIVE_BUFFER_EXTENSION_NAME;
307*61046927SAndroid Build Coastguard Worker }
308*61046927SAndroid Build Coastguard Worker
309*61046927SAndroid Build Coastguard Worker if (app_exts->ANDROID_external_memory_android_hardware_buffer) {
310*61046927SAndroid Build Coastguard Worker block_exts[block_count++] =
311*61046927SAndroid Build Coastguard Worker VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME;
312*61046927SAndroid Build Coastguard Worker }
313*61046927SAndroid Build Coastguard Worker }
314*61046927SAndroid Build Coastguard Worker
315*61046927SAndroid Build Coastguard Worker if (app_exts->KHR_external_memory_fd ||
316*61046927SAndroid Build Coastguard Worker app_exts->EXT_external_memory_dma_buf || has_wsi) {
317*61046927SAndroid Build Coastguard Worker if (physical_dev->external_memory.renderer_handle_type ==
318*61046927SAndroid Build Coastguard Worker VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT) {
319*61046927SAndroid Build Coastguard Worker if (!app_exts->EXT_external_memory_dma_buf) {
320*61046927SAndroid Build Coastguard Worker extra_exts[extra_count++] =
321*61046927SAndroid Build Coastguard Worker VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME;
322*61046927SAndroid Build Coastguard Worker }
323*61046927SAndroid Build Coastguard Worker if (!app_exts->KHR_external_memory_fd) {
324*61046927SAndroid Build Coastguard Worker extra_exts[extra_count++] =
325*61046927SAndroid Build Coastguard Worker VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME;
326*61046927SAndroid Build Coastguard Worker }
327*61046927SAndroid Build Coastguard Worker }
328*61046927SAndroid Build Coastguard Worker }
329*61046927SAndroid Build Coastguard Worker
330*61046927SAndroid Build Coastguard Worker /* see vn_queue_submission_count_batch_semaphores */
331*61046927SAndroid Build Coastguard Worker if (!app_exts->KHR_external_semaphore_fd && has_wsi) {
332*61046927SAndroid Build Coastguard Worker assert(physical_dev->renderer_sync_fd.semaphore_importable);
333*61046927SAndroid Build Coastguard Worker extra_exts[extra_count++] = VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME;
334*61046927SAndroid Build Coastguard Worker }
335*61046927SAndroid Build Coastguard Worker
336*61046927SAndroid Build Coastguard Worker if (app_exts->EXT_device_memory_report) {
337*61046927SAndroid Build Coastguard Worker /* see vn_physical_device_get_native_extensions */
338*61046927SAndroid Build Coastguard Worker block_exts[block_count++] = VK_EXT_DEVICE_MEMORY_REPORT_EXTENSION_NAME;
339*61046927SAndroid Build Coastguard Worker }
340*61046927SAndroid Build Coastguard Worker
341*61046927SAndroid Build Coastguard Worker if (app_exts->EXT_physical_device_drm) {
342*61046927SAndroid Build Coastguard Worker /* see vn_physical_device_get_native_extensions */
343*61046927SAndroid Build Coastguard Worker block_exts[block_count++] = VK_EXT_PHYSICAL_DEVICE_DRM_EXTENSION_NAME;
344*61046927SAndroid Build Coastguard Worker }
345*61046927SAndroid Build Coastguard Worker
346*61046927SAndroid Build Coastguard Worker if (app_exts->EXT_tooling_info) {
347*61046927SAndroid Build Coastguard Worker /* see vn_physical_device_get_native_extensions */
348*61046927SAndroid Build Coastguard Worker block_exts[block_count++] = VK_EXT_TOOLING_INFO_EXTENSION_NAME;
349*61046927SAndroid Build Coastguard Worker }
350*61046927SAndroid Build Coastguard Worker
351*61046927SAndroid Build Coastguard Worker if (app_exts->EXT_pci_bus_info) {
352*61046927SAndroid Build Coastguard Worker /* always filter for simplicity */
353*61046927SAndroid Build Coastguard Worker block_exts[block_count++] = VK_EXT_PCI_BUS_INFO_EXTENSION_NAME;
354*61046927SAndroid Build Coastguard Worker }
355*61046927SAndroid Build Coastguard Worker
356*61046927SAndroid Build Coastguard Worker assert(extra_count <= ARRAY_SIZE(extra_exts));
357*61046927SAndroid Build Coastguard Worker assert(block_count <= ARRAY_SIZE(block_exts));
358*61046927SAndroid Build Coastguard Worker
359*61046927SAndroid Build Coastguard Worker if (!extra_count && (!block_count || !dev_info->enabledExtensionCount))
360*61046927SAndroid Build Coastguard Worker return dev_info;
361*61046927SAndroid Build Coastguard Worker
362*61046927SAndroid Build Coastguard Worker *local_info = *dev_info;
363*61046927SAndroid Build Coastguard Worker if (!merge_extension_names(dev_info->ppEnabledExtensionNames,
364*61046927SAndroid Build Coastguard Worker dev_info->enabledExtensionCount, extra_exts,
365*61046927SAndroid Build Coastguard Worker extra_count, block_exts, block_count, alloc,
366*61046927SAndroid Build Coastguard Worker &local_info->ppEnabledExtensionNames,
367*61046927SAndroid Build Coastguard Worker &local_info->enabledExtensionCount))
368*61046927SAndroid Build Coastguard Worker return NULL;
369*61046927SAndroid Build Coastguard Worker
370*61046927SAndroid Build Coastguard Worker return local_info;
371*61046927SAndroid Build Coastguard Worker }
372*61046927SAndroid Build Coastguard Worker
373*61046927SAndroid Build Coastguard Worker static inline VkResult
vn_device_feedback_pool_init(struct vn_device * dev)374*61046927SAndroid Build Coastguard Worker vn_device_feedback_pool_init(struct vn_device *dev)
375*61046927SAndroid Build Coastguard Worker {
376*61046927SAndroid Build Coastguard Worker /* The feedback pool defaults to suballocate slots of 8 bytes each. Initial
377*61046927SAndroid Build Coastguard Worker * pool size of 4096 corresponds to a total of 512 fences, semaphores and
378*61046927SAndroid Build Coastguard Worker * events, which well covers the common scenarios. Pool can grow anyway.
379*61046927SAndroid Build Coastguard Worker */
380*61046927SAndroid Build Coastguard Worker static const uint32_t pool_size = 4096;
381*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *alloc = &dev->base.base.alloc;
382*61046927SAndroid Build Coastguard Worker
383*61046927SAndroid Build Coastguard Worker if (VN_PERF(NO_EVENT_FEEDBACK) && VN_PERF(NO_FENCE_FEEDBACK) &&
384*61046927SAndroid Build Coastguard Worker VN_PERF(NO_SEMAPHORE_FEEDBACK))
385*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
386*61046927SAndroid Build Coastguard Worker
387*61046927SAndroid Build Coastguard Worker return vn_feedback_pool_init(dev, &dev->feedback_pool, pool_size, alloc);
388*61046927SAndroid Build Coastguard Worker }
389*61046927SAndroid Build Coastguard Worker
390*61046927SAndroid Build Coastguard Worker static inline void
vn_device_feedback_pool_fini(struct vn_device * dev)391*61046927SAndroid Build Coastguard Worker vn_device_feedback_pool_fini(struct vn_device *dev)
392*61046927SAndroid Build Coastguard Worker {
393*61046927SAndroid Build Coastguard Worker if (VN_PERF(NO_EVENT_FEEDBACK) && VN_PERF(NO_FENCE_FEEDBACK) &&
394*61046927SAndroid Build Coastguard Worker VN_PERF(NO_SEMAPHORE_FEEDBACK))
395*61046927SAndroid Build Coastguard Worker return;
396*61046927SAndroid Build Coastguard Worker
397*61046927SAndroid Build Coastguard Worker vn_feedback_pool_fini(&dev->feedback_pool);
398*61046927SAndroid Build Coastguard Worker }
399*61046927SAndroid Build Coastguard Worker
400*61046927SAndroid Build Coastguard Worker static void
vn_device_update_shader_cache_id(struct vn_device * dev)401*61046927SAndroid Build Coastguard Worker vn_device_update_shader_cache_id(struct vn_device *dev)
402*61046927SAndroid Build Coastguard Worker {
403*61046927SAndroid Build Coastguard Worker /* venus utilizes the host side shader cache.
404*61046927SAndroid Build Coastguard Worker * This is a WA to generate shader cache files containing headers
405*61046927SAndroid Build Coastguard Worker * with a unique cache id that will change based on host driver
406*61046927SAndroid Build Coastguard Worker * identifiers. This allows fossilize replay to detect if the host
407*61046927SAndroid Build Coastguard Worker * side shader cach is no longer up to date.
408*61046927SAndroid Build Coastguard Worker * The shader cache is destroyed after creating the necessary files
409*61046927SAndroid Build Coastguard Worker * and not utilized by venus.
410*61046927SAndroid Build Coastguard Worker */
411*61046927SAndroid Build Coastguard Worker #if !DETECT_OS_ANDROID && defined(ENABLE_SHADER_CACHE)
412*61046927SAndroid Build Coastguard Worker const uint8_t *device_uuid =
413*61046927SAndroid Build Coastguard Worker dev->physical_device->base.base.properties.pipelineCacheUUID;
414*61046927SAndroid Build Coastguard Worker
415*61046927SAndroid Build Coastguard Worker char uuid[VK_UUID_SIZE * 2 + 1];
416*61046927SAndroid Build Coastguard Worker mesa_bytes_to_hex(uuid, device_uuid, VK_UUID_SIZE);
417*61046927SAndroid Build Coastguard Worker
418*61046927SAndroid Build Coastguard Worker struct disk_cache *cache = disk_cache_create("venus", uuid, 0);
419*61046927SAndroid Build Coastguard Worker if (!cache)
420*61046927SAndroid Build Coastguard Worker return;
421*61046927SAndroid Build Coastguard Worker
422*61046927SAndroid Build Coastguard Worker /* The entry header is what contains the cache id / timestamp so we
423*61046927SAndroid Build Coastguard Worker * need to create a fake entry.
424*61046927SAndroid Build Coastguard Worker */
425*61046927SAndroid Build Coastguard Worker uint8_t key[20];
426*61046927SAndroid Build Coastguard Worker char data[] = "Fake Shader";
427*61046927SAndroid Build Coastguard Worker
428*61046927SAndroid Build Coastguard Worker disk_cache_compute_key(cache, data, sizeof(data), key);
429*61046927SAndroid Build Coastguard Worker disk_cache_put(cache, key, data, sizeof(data), NULL);
430*61046927SAndroid Build Coastguard Worker
431*61046927SAndroid Build Coastguard Worker disk_cache_destroy(cache);
432*61046927SAndroid Build Coastguard Worker #endif
433*61046927SAndroid Build Coastguard Worker }
434*61046927SAndroid Build Coastguard Worker
435*61046927SAndroid Build Coastguard Worker static VkResult
vn_device_init(struct vn_device * dev,struct vn_physical_device * physical_dev,const VkDeviceCreateInfo * create_info,const VkAllocationCallbacks * alloc)436*61046927SAndroid Build Coastguard Worker vn_device_init(struct vn_device *dev,
437*61046927SAndroid Build Coastguard Worker struct vn_physical_device *physical_dev,
438*61046927SAndroid Build Coastguard Worker const VkDeviceCreateInfo *create_info,
439*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *alloc)
440*61046927SAndroid Build Coastguard Worker {
441*61046927SAndroid Build Coastguard Worker struct vn_instance *instance = physical_dev->instance;
442*61046927SAndroid Build Coastguard Worker VkPhysicalDevice physical_dev_handle =
443*61046927SAndroid Build Coastguard Worker vn_physical_device_to_handle(physical_dev);
444*61046927SAndroid Build Coastguard Worker VkDevice dev_handle = vn_device_to_handle(dev);
445*61046927SAndroid Build Coastguard Worker VkDeviceCreateInfo local_create_info;
446*61046927SAndroid Build Coastguard Worker VkResult result;
447*61046927SAndroid Build Coastguard Worker
448*61046927SAndroid Build Coastguard Worker dev->instance = instance;
449*61046927SAndroid Build Coastguard Worker dev->physical_device = physical_dev;
450*61046927SAndroid Build Coastguard Worker dev->device_mask = 1;
451*61046927SAndroid Build Coastguard Worker dev->renderer = instance->renderer;
452*61046927SAndroid Build Coastguard Worker dev->primary_ring = instance->ring.ring;
453*61046927SAndroid Build Coastguard Worker
454*61046927SAndroid Build Coastguard Worker create_info =
455*61046927SAndroid Build Coastguard Worker vn_device_fix_create_info(dev, create_info, alloc, &local_create_info);
456*61046927SAndroid Build Coastguard Worker if (!create_info)
457*61046927SAndroid Build Coastguard Worker return VK_ERROR_OUT_OF_HOST_MEMORY;
458*61046927SAndroid Build Coastguard Worker
459*61046927SAndroid Build Coastguard Worker const VkDeviceGroupDeviceCreateInfo *group = vk_find_struct_const(
460*61046927SAndroid Build Coastguard Worker create_info->pNext, DEVICE_GROUP_DEVICE_CREATE_INFO);
461*61046927SAndroid Build Coastguard Worker if (group && group->physicalDeviceCount)
462*61046927SAndroid Build Coastguard Worker dev->device_mask = (1 << group->physicalDeviceCount) - 1;
463*61046927SAndroid Build Coastguard Worker
464*61046927SAndroid Build Coastguard Worker result = vn_call_vkCreateDevice(dev->primary_ring, physical_dev_handle,
465*61046927SAndroid Build Coastguard Worker create_info, NULL, &dev_handle);
466*61046927SAndroid Build Coastguard Worker
467*61046927SAndroid Build Coastguard Worker /* free the fixed extensions here since no longer needed below */
468*61046927SAndroid Build Coastguard Worker if (create_info == &local_create_info)
469*61046927SAndroid Build Coastguard Worker vk_free(alloc, (void *)create_info->ppEnabledExtensionNames);
470*61046927SAndroid Build Coastguard Worker
471*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
472*61046927SAndroid Build Coastguard Worker return result;
473*61046927SAndroid Build Coastguard Worker
474*61046927SAndroid Build Coastguard Worker result = vn_device_memory_report_init(dev, create_info);
475*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
476*61046927SAndroid Build Coastguard Worker goto out_destroy_device;
477*61046927SAndroid Build Coastguard Worker
478*61046927SAndroid Build Coastguard Worker if (!vn_device_queue_family_init(dev, create_info)) {
479*61046927SAndroid Build Coastguard Worker result = VK_ERROR_OUT_OF_HOST_MEMORY;
480*61046927SAndroid Build Coastguard Worker goto out_memory_report_fini;
481*61046927SAndroid Build Coastguard Worker }
482*61046927SAndroid Build Coastguard Worker
483*61046927SAndroid Build Coastguard Worker result = vn_device_feedback_pool_init(dev);
484*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
485*61046927SAndroid Build Coastguard Worker goto out_queue_family_fini;
486*61046927SAndroid Build Coastguard Worker
487*61046927SAndroid Build Coastguard Worker result = vn_feedback_cmd_pools_init(dev);
488*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
489*61046927SAndroid Build Coastguard Worker goto out_feedback_pool_fini;
490*61046927SAndroid Build Coastguard Worker
491*61046927SAndroid Build Coastguard Worker result = vn_device_init_queues(dev, create_info);
492*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS)
493*61046927SAndroid Build Coastguard Worker goto out_feedback_cmd_pools_fini;
494*61046927SAndroid Build Coastguard Worker
495*61046927SAndroid Build Coastguard Worker vn_buffer_reqs_cache_init(dev);
496*61046927SAndroid Build Coastguard Worker vn_image_reqs_cache_init(dev);
497*61046927SAndroid Build Coastguard Worker
498*61046927SAndroid Build Coastguard Worker /* This is a WA to allow fossilize replay to detect if the host side shader
499*61046927SAndroid Build Coastguard Worker * cache is no longer up to date.
500*61046927SAndroid Build Coastguard Worker */
501*61046927SAndroid Build Coastguard Worker vn_device_update_shader_cache_id(dev);
502*61046927SAndroid Build Coastguard Worker
503*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
504*61046927SAndroid Build Coastguard Worker
505*61046927SAndroid Build Coastguard Worker out_feedback_cmd_pools_fini:
506*61046927SAndroid Build Coastguard Worker vn_feedback_cmd_pools_fini(dev);
507*61046927SAndroid Build Coastguard Worker
508*61046927SAndroid Build Coastguard Worker out_feedback_pool_fini:
509*61046927SAndroid Build Coastguard Worker vn_device_feedback_pool_fini(dev);
510*61046927SAndroid Build Coastguard Worker
511*61046927SAndroid Build Coastguard Worker out_queue_family_fini:
512*61046927SAndroid Build Coastguard Worker vn_device_queue_family_fini(dev);
513*61046927SAndroid Build Coastguard Worker
514*61046927SAndroid Build Coastguard Worker out_memory_report_fini:
515*61046927SAndroid Build Coastguard Worker vn_device_memory_report_fini(dev);
516*61046927SAndroid Build Coastguard Worker
517*61046927SAndroid Build Coastguard Worker out_destroy_device:
518*61046927SAndroid Build Coastguard Worker vn_call_vkDestroyDevice(dev->primary_ring, dev_handle, NULL);
519*61046927SAndroid Build Coastguard Worker
520*61046927SAndroid Build Coastguard Worker return result;
521*61046927SAndroid Build Coastguard Worker }
522*61046927SAndroid Build Coastguard Worker
523*61046927SAndroid Build Coastguard Worker VkResult
vn_CreateDevice(VkPhysicalDevice physicalDevice,const VkDeviceCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkDevice * pDevice)524*61046927SAndroid Build Coastguard Worker vn_CreateDevice(VkPhysicalDevice physicalDevice,
525*61046927SAndroid Build Coastguard Worker const VkDeviceCreateInfo *pCreateInfo,
526*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *pAllocator,
527*61046927SAndroid Build Coastguard Worker VkDevice *pDevice)
528*61046927SAndroid Build Coastguard Worker {
529*61046927SAndroid Build Coastguard Worker VN_TRACE_FUNC();
530*61046927SAndroid Build Coastguard Worker struct vn_physical_device *physical_dev =
531*61046927SAndroid Build Coastguard Worker vn_physical_device_from_handle(physicalDevice);
532*61046927SAndroid Build Coastguard Worker struct vn_instance *instance = physical_dev->instance;
533*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *alloc =
534*61046927SAndroid Build Coastguard Worker pAllocator ? pAllocator : &instance->base.base.alloc;
535*61046927SAndroid Build Coastguard Worker struct vn_device *dev;
536*61046927SAndroid Build Coastguard Worker VkResult result;
537*61046927SAndroid Build Coastguard Worker
538*61046927SAndroid Build Coastguard Worker dev = vk_zalloc(alloc, sizeof(*dev), VN_DEFAULT_ALIGN,
539*61046927SAndroid Build Coastguard Worker VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
540*61046927SAndroid Build Coastguard Worker if (!dev)
541*61046927SAndroid Build Coastguard Worker return vn_error(instance, VK_ERROR_OUT_OF_HOST_MEMORY);
542*61046927SAndroid Build Coastguard Worker
543*61046927SAndroid Build Coastguard Worker struct vk_device_dispatch_table dispatch_table;
544*61046927SAndroid Build Coastguard Worker vk_device_dispatch_table_from_entrypoints(&dispatch_table,
545*61046927SAndroid Build Coastguard Worker &vn_device_entrypoints, true);
546*61046927SAndroid Build Coastguard Worker vk_device_dispatch_table_from_entrypoints(&dispatch_table,
547*61046927SAndroid Build Coastguard Worker &wsi_device_entrypoints, false);
548*61046927SAndroid Build Coastguard Worker result = vn_device_base_init(&dev->base, &physical_dev->base,
549*61046927SAndroid Build Coastguard Worker &dispatch_table, pCreateInfo, alloc);
550*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS) {
551*61046927SAndroid Build Coastguard Worker vk_free(alloc, dev);
552*61046927SAndroid Build Coastguard Worker return vn_error(instance, result);
553*61046927SAndroid Build Coastguard Worker }
554*61046927SAndroid Build Coastguard Worker
555*61046927SAndroid Build Coastguard Worker result = vn_device_init(dev, physical_dev, pCreateInfo, alloc);
556*61046927SAndroid Build Coastguard Worker if (result != VK_SUCCESS) {
557*61046927SAndroid Build Coastguard Worker vn_device_base_fini(&dev->base);
558*61046927SAndroid Build Coastguard Worker vk_free(alloc, dev);
559*61046927SAndroid Build Coastguard Worker return vn_error(instance, result);
560*61046927SAndroid Build Coastguard Worker }
561*61046927SAndroid Build Coastguard Worker
562*61046927SAndroid Build Coastguard Worker if (VN_DEBUG(LOG_CTX_INFO)) {
563*61046927SAndroid Build Coastguard Worker vn_log(instance, "%s", physical_dev->base.base.properties.deviceName);
564*61046927SAndroid Build Coastguard Worker vn_log(instance, "%s", physical_dev->base.base.properties.driverInfo);
565*61046927SAndroid Build Coastguard Worker }
566*61046927SAndroid Build Coastguard Worker
567*61046927SAndroid Build Coastguard Worker vn_tls_set_async_pipeline_create();
568*61046927SAndroid Build Coastguard Worker
569*61046927SAndroid Build Coastguard Worker *pDevice = vn_device_to_handle(dev);
570*61046927SAndroid Build Coastguard Worker
571*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
572*61046927SAndroid Build Coastguard Worker }
573*61046927SAndroid Build Coastguard Worker
574*61046927SAndroid Build Coastguard Worker void
vn_DestroyDevice(VkDevice device,const VkAllocationCallbacks * pAllocator)575*61046927SAndroid Build Coastguard Worker vn_DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator)
576*61046927SAndroid Build Coastguard Worker {
577*61046927SAndroid Build Coastguard Worker VN_TRACE_FUNC();
578*61046927SAndroid Build Coastguard Worker struct vn_device *dev = vn_device_from_handle(device);
579*61046927SAndroid Build Coastguard Worker const VkAllocationCallbacks *alloc =
580*61046927SAndroid Build Coastguard Worker pAllocator ? pAllocator : &dev->base.base.alloc;
581*61046927SAndroid Build Coastguard Worker
582*61046927SAndroid Build Coastguard Worker if (!dev)
583*61046927SAndroid Build Coastguard Worker return;
584*61046927SAndroid Build Coastguard Worker
585*61046927SAndroid Build Coastguard Worker vn_image_reqs_cache_fini(dev);
586*61046927SAndroid Build Coastguard Worker vn_buffer_reqs_cache_fini(dev);
587*61046927SAndroid Build Coastguard Worker
588*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < dev->queue_count; i++)
589*61046927SAndroid Build Coastguard Worker vn_queue_fini(&dev->queues[i]);
590*61046927SAndroid Build Coastguard Worker
591*61046927SAndroid Build Coastguard Worker vn_feedback_cmd_pools_fini(dev);
592*61046927SAndroid Build Coastguard Worker
593*61046927SAndroid Build Coastguard Worker vn_device_feedback_pool_fini(dev);
594*61046927SAndroid Build Coastguard Worker
595*61046927SAndroid Build Coastguard Worker vn_device_queue_family_fini(dev);
596*61046927SAndroid Build Coastguard Worker
597*61046927SAndroid Build Coastguard Worker vn_device_memory_report_fini(dev);
598*61046927SAndroid Build Coastguard Worker
599*61046927SAndroid Build Coastguard Worker vn_async_vkDestroyDevice(dev->primary_ring, device, NULL);
600*61046927SAndroid Build Coastguard Worker
601*61046927SAndroid Build Coastguard Worker /* We must emit vn_call_vkDestroyDevice before releasing bound ring_idx.
602*61046927SAndroid Build Coastguard Worker * Otherwise, another thread might reuse their ring_idx while they
603*61046927SAndroid Build Coastguard Worker * are still bound to the queues in the renderer.
604*61046927SAndroid Build Coastguard Worker */
605*61046927SAndroid Build Coastguard Worker for (uint32_t i = 0; i < dev->queue_count; i++) {
606*61046927SAndroid Build Coastguard Worker vn_instance_release_ring_idx(dev->instance, dev->queues[i].ring_idx);
607*61046927SAndroid Build Coastguard Worker }
608*61046927SAndroid Build Coastguard Worker
609*61046927SAndroid Build Coastguard Worker vk_free(alloc, dev->queues);
610*61046927SAndroid Build Coastguard Worker
611*61046927SAndroid Build Coastguard Worker vn_device_base_fini(&dev->base);
612*61046927SAndroid Build Coastguard Worker vk_free(alloc, dev);
613*61046927SAndroid Build Coastguard Worker }
614*61046927SAndroid Build Coastguard Worker
615*61046927SAndroid Build Coastguard Worker PFN_vkVoidFunction
vn_GetDeviceProcAddr(VkDevice device,const char * pName)616*61046927SAndroid Build Coastguard Worker vn_GetDeviceProcAddr(VkDevice device, const char *pName)
617*61046927SAndroid Build Coastguard Worker {
618*61046927SAndroid Build Coastguard Worker struct vn_device *dev = vn_device_from_handle(device);
619*61046927SAndroid Build Coastguard Worker return vk_device_get_proc_addr(&dev->base.base, pName);
620*61046927SAndroid Build Coastguard Worker }
621*61046927SAndroid Build Coastguard Worker
622*61046927SAndroid Build Coastguard Worker void
vn_GetDeviceGroupPeerMemoryFeatures(VkDevice device,uint32_t heapIndex,uint32_t localDeviceIndex,uint32_t remoteDeviceIndex,VkPeerMemoryFeatureFlags * pPeerMemoryFeatures)623*61046927SAndroid Build Coastguard Worker vn_GetDeviceGroupPeerMemoryFeatures(
624*61046927SAndroid Build Coastguard Worker VkDevice device,
625*61046927SAndroid Build Coastguard Worker uint32_t heapIndex,
626*61046927SAndroid Build Coastguard Worker uint32_t localDeviceIndex,
627*61046927SAndroid Build Coastguard Worker uint32_t remoteDeviceIndex,
628*61046927SAndroid Build Coastguard Worker VkPeerMemoryFeatureFlags *pPeerMemoryFeatures)
629*61046927SAndroid Build Coastguard Worker {
630*61046927SAndroid Build Coastguard Worker struct vn_device *dev = vn_device_from_handle(device);
631*61046927SAndroid Build Coastguard Worker
632*61046927SAndroid Build Coastguard Worker /* TODO get and cache the values in vkCreateDevice */
633*61046927SAndroid Build Coastguard Worker vn_call_vkGetDeviceGroupPeerMemoryFeatures(
634*61046927SAndroid Build Coastguard Worker dev->primary_ring, device, heapIndex, localDeviceIndex,
635*61046927SAndroid Build Coastguard Worker remoteDeviceIndex, pPeerMemoryFeatures);
636*61046927SAndroid Build Coastguard Worker }
637*61046927SAndroid Build Coastguard Worker
638*61046927SAndroid Build Coastguard Worker VkResult
vn_GetCalibratedTimestampsEXT(VkDevice device,uint32_t timestampCount,const VkCalibratedTimestampInfoEXT * pTimestampInfos,uint64_t * pTimestamps,uint64_t * pMaxDeviation)639*61046927SAndroid Build Coastguard Worker vn_GetCalibratedTimestampsEXT(
640*61046927SAndroid Build Coastguard Worker VkDevice device,
641*61046927SAndroid Build Coastguard Worker uint32_t timestampCount,
642*61046927SAndroid Build Coastguard Worker const VkCalibratedTimestampInfoEXT *pTimestampInfos,
643*61046927SAndroid Build Coastguard Worker uint64_t *pTimestamps,
644*61046927SAndroid Build Coastguard Worker uint64_t *pMaxDeviation)
645*61046927SAndroid Build Coastguard Worker {
646*61046927SAndroid Build Coastguard Worker struct vn_device *dev = vn_device_from_handle(device);
647*61046927SAndroid Build Coastguard Worker uint64_t begin, end, max_clock_period = 0;
648*61046927SAndroid Build Coastguard Worker VkResult ret;
649*61046927SAndroid Build Coastguard Worker int domain;
650*61046927SAndroid Build Coastguard Worker
651*61046927SAndroid Build Coastguard Worker #ifdef CLOCK_MONOTONIC_RAW
652*61046927SAndroid Build Coastguard Worker begin = vk_clock_gettime(CLOCK_MONOTONIC_RAW);
653*61046927SAndroid Build Coastguard Worker #else
654*61046927SAndroid Build Coastguard Worker begin = vk_clock_gettime(CLOCK_MONOTONIC);
655*61046927SAndroid Build Coastguard Worker #endif
656*61046927SAndroid Build Coastguard Worker
657*61046927SAndroid Build Coastguard Worker for (domain = 0; domain < timestampCount; domain++) {
658*61046927SAndroid Build Coastguard Worker switch (pTimestampInfos[domain].timeDomain) {
659*61046927SAndroid Build Coastguard Worker case VK_TIME_DOMAIN_DEVICE_EXT: {
660*61046927SAndroid Build Coastguard Worker uint64_t device_max_deviation = 0;
661*61046927SAndroid Build Coastguard Worker
662*61046927SAndroid Build Coastguard Worker ret = vn_call_vkGetCalibratedTimestampsEXT(
663*61046927SAndroid Build Coastguard Worker dev->primary_ring, device, 1, &pTimestampInfos[domain],
664*61046927SAndroid Build Coastguard Worker &pTimestamps[domain], &device_max_deviation);
665*61046927SAndroid Build Coastguard Worker
666*61046927SAndroid Build Coastguard Worker if (ret != VK_SUCCESS)
667*61046927SAndroid Build Coastguard Worker return vn_error(dev->instance, ret);
668*61046927SAndroid Build Coastguard Worker
669*61046927SAndroid Build Coastguard Worker max_clock_period = MAX2(max_clock_period, device_max_deviation);
670*61046927SAndroid Build Coastguard Worker break;
671*61046927SAndroid Build Coastguard Worker }
672*61046927SAndroid Build Coastguard Worker case VK_TIME_DOMAIN_CLOCK_MONOTONIC_EXT:
673*61046927SAndroid Build Coastguard Worker pTimestamps[domain] = vk_clock_gettime(CLOCK_MONOTONIC);
674*61046927SAndroid Build Coastguard Worker max_clock_period = MAX2(max_clock_period, 1);
675*61046927SAndroid Build Coastguard Worker break;
676*61046927SAndroid Build Coastguard Worker #ifdef CLOCK_MONOTONIC_RAW
677*61046927SAndroid Build Coastguard Worker case VK_TIME_DOMAIN_CLOCK_MONOTONIC_RAW_EXT:
678*61046927SAndroid Build Coastguard Worker pTimestamps[domain] = begin;
679*61046927SAndroid Build Coastguard Worker break;
680*61046927SAndroid Build Coastguard Worker #endif
681*61046927SAndroid Build Coastguard Worker default:
682*61046927SAndroid Build Coastguard Worker pTimestamps[domain] = 0;
683*61046927SAndroid Build Coastguard Worker break;
684*61046927SAndroid Build Coastguard Worker }
685*61046927SAndroid Build Coastguard Worker }
686*61046927SAndroid Build Coastguard Worker
687*61046927SAndroid Build Coastguard Worker #ifdef CLOCK_MONOTONIC_RAW
688*61046927SAndroid Build Coastguard Worker end = vk_clock_gettime(CLOCK_MONOTONIC_RAW);
689*61046927SAndroid Build Coastguard Worker #else
690*61046927SAndroid Build Coastguard Worker end = vk_clock_gettime(CLOCK_MONOTONIC);
691*61046927SAndroid Build Coastguard Worker #endif
692*61046927SAndroid Build Coastguard Worker
693*61046927SAndroid Build Coastguard Worker *pMaxDeviation = vk_time_max_deviation(begin, end, max_clock_period);
694*61046927SAndroid Build Coastguard Worker
695*61046927SAndroid Build Coastguard Worker return VK_SUCCESS;
696*61046927SAndroid Build Coastguard Worker }
697