xref: /aosp_15_r20/external/mesa3d/src/virtio/vulkan/vn_instance.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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_instance.h"
12*61046927SAndroid Build Coastguard Worker 
13*61046927SAndroid Build Coastguard Worker #include "util/driconf.h"
14*61046927SAndroid Build Coastguard Worker #include "venus-protocol/vn_protocol_driver_info.h"
15*61046927SAndroid Build Coastguard Worker #include "venus-protocol/vn_protocol_driver_instance.h"
16*61046927SAndroid Build Coastguard Worker #include "venus-protocol/vn_protocol_driver_transport.h"
17*61046927SAndroid Build Coastguard Worker 
18*61046927SAndroid Build Coastguard Worker #include "vn_icd.h"
19*61046927SAndroid Build Coastguard Worker #include "vn_physical_device.h"
20*61046927SAndroid Build Coastguard Worker #include "vn_renderer.h"
21*61046927SAndroid Build Coastguard Worker #include "vn_ring.h"
22*61046927SAndroid Build Coastguard Worker 
23*61046927SAndroid Build Coastguard Worker /*
24*61046927SAndroid Build Coastguard Worker  * Instance extensions add instance-level or physical-device-level
25*61046927SAndroid Build Coastguard Worker  * functionalities.  It seems renderer support is either unnecessary or
26*61046927SAndroid Build Coastguard Worker  * optional.  We should be able to advertise them or lie about them locally.
27*61046927SAndroid Build Coastguard Worker  */
28*61046927SAndroid Build Coastguard Worker static const struct vk_instance_extension_table
29*61046927SAndroid Build Coastguard Worker    vn_instance_supported_extensions = {
30*61046927SAndroid Build Coastguard Worker       /* promoted to VK_VERSION_1_1 */
31*61046927SAndroid Build Coastguard Worker       .KHR_device_group_creation = true,
32*61046927SAndroid Build Coastguard Worker       .KHR_external_fence_capabilities = true,
33*61046927SAndroid Build Coastguard Worker       .KHR_external_memory_capabilities = true,
34*61046927SAndroid Build Coastguard Worker       .KHR_external_semaphore_capabilities = true,
35*61046927SAndroid Build Coastguard Worker       .KHR_get_physical_device_properties2 = true,
36*61046927SAndroid Build Coastguard Worker 
37*61046927SAndroid Build Coastguard Worker #ifdef VN_USE_WSI_PLATFORM
38*61046927SAndroid Build Coastguard Worker       .KHR_get_surface_capabilities2 = true,
39*61046927SAndroid Build Coastguard Worker       .KHR_surface = true,
40*61046927SAndroid Build Coastguard Worker       .KHR_surface_protected_capabilities = true,
41*61046927SAndroid Build Coastguard Worker #endif
42*61046927SAndroid Build Coastguard Worker #ifdef VK_USE_PLATFORM_WAYLAND_KHR
43*61046927SAndroid Build Coastguard Worker       .KHR_wayland_surface = true,
44*61046927SAndroid Build Coastguard Worker #endif
45*61046927SAndroid Build Coastguard Worker #ifdef VK_USE_PLATFORM_XCB_KHR
46*61046927SAndroid Build Coastguard Worker       .KHR_xcb_surface = true,
47*61046927SAndroid Build Coastguard Worker #endif
48*61046927SAndroid Build Coastguard Worker #ifdef VK_USE_PLATFORM_XLIB_KHR
49*61046927SAndroid Build Coastguard Worker       .KHR_xlib_surface = true,
50*61046927SAndroid Build Coastguard Worker #endif
51*61046927SAndroid Build Coastguard Worker #ifndef VK_USE_PLATFORM_WIN32_KHR
52*61046927SAndroid Build Coastguard Worker       .EXT_headless_surface = true,
53*61046927SAndroid Build Coastguard Worker #endif
54*61046927SAndroid Build Coastguard Worker    };
55*61046927SAndroid Build Coastguard Worker 
56*61046927SAndroid Build Coastguard Worker static const driOptionDescription vn_dri_options[] = {
57*61046927SAndroid Build Coastguard Worker    /* clang-format off */
58*61046927SAndroid Build Coastguard Worker    DRI_CONF_SECTION_PERFORMANCE
59*61046927SAndroid Build Coastguard Worker       DRI_CONF_VK_X11_ENSURE_MIN_IMAGE_COUNT(false)
60*61046927SAndroid Build Coastguard Worker       DRI_CONF_VK_X11_OVERRIDE_MIN_IMAGE_COUNT(0)
61*61046927SAndroid Build Coastguard Worker       DRI_CONF_VK_X11_STRICT_IMAGE_COUNT(false)
62*61046927SAndroid Build Coastguard Worker       DRI_CONF_VK_XWAYLAND_WAIT_READY(true)
63*61046927SAndroid Build Coastguard Worker       DRI_CONF_VENUS_IMPLICIT_FENCING(false)
64*61046927SAndroid Build Coastguard Worker       DRI_CONF_VENUS_WSI_MULTI_PLANE_MODIFIERS(false)
65*61046927SAndroid Build Coastguard Worker    DRI_CONF_SECTION_END
66*61046927SAndroid Build Coastguard Worker    DRI_CONF_SECTION_DEBUG
67*61046927SAndroid Build Coastguard Worker       DRI_CONF_VK_WSI_FORCE_BGRA8_UNORM_FIRST(false)
68*61046927SAndroid Build Coastguard Worker       DRI_CONF_VK_WSI_FORCE_SWAPCHAIN_TO_CURRENT_EXTENT(false)
69*61046927SAndroid Build Coastguard Worker    DRI_CONF_SECTION_END
70*61046927SAndroid Build Coastguard Worker    /* clang-format on */
71*61046927SAndroid Build Coastguard Worker };
72*61046927SAndroid Build Coastguard Worker 
73*61046927SAndroid Build Coastguard Worker static VkResult
vn_instance_init_renderer_versions(struct vn_instance * instance)74*61046927SAndroid Build Coastguard Worker vn_instance_init_renderer_versions(struct vn_instance *instance)
75*61046927SAndroid Build Coastguard Worker {
76*61046927SAndroid Build Coastguard Worker    uint32_t instance_version = 0;
77*61046927SAndroid Build Coastguard Worker    VkResult result = vn_call_vkEnumerateInstanceVersion(instance->ring.ring,
78*61046927SAndroid Build Coastguard Worker                                                         &instance_version);
79*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS) {
80*61046927SAndroid Build Coastguard Worker       if (VN_DEBUG(INIT))
81*61046927SAndroid Build Coastguard Worker          vn_log(instance, "failed to enumerate renderer instance version");
82*61046927SAndroid Build Coastguard Worker       return result;
83*61046927SAndroid Build Coastguard Worker    }
84*61046927SAndroid Build Coastguard Worker 
85*61046927SAndroid Build Coastguard Worker    if (instance_version < VN_MIN_RENDERER_VERSION) {
86*61046927SAndroid Build Coastguard Worker       if (VN_DEBUG(INIT)) {
87*61046927SAndroid Build Coastguard Worker          vn_log(instance, "unsupported renderer instance version %d.%d",
88*61046927SAndroid Build Coastguard Worker                 VK_VERSION_MAJOR(instance_version),
89*61046927SAndroid Build Coastguard Worker                 VK_VERSION_MINOR(instance_version));
90*61046927SAndroid Build Coastguard Worker       }
91*61046927SAndroid Build Coastguard Worker       return VK_ERROR_INITIALIZATION_FAILED;
92*61046927SAndroid Build Coastguard Worker    }
93*61046927SAndroid Build Coastguard Worker 
94*61046927SAndroid Build Coastguard Worker    if (VN_DEBUG(INIT)) {
95*61046927SAndroid Build Coastguard Worker       vn_log(instance, "renderer instance version %d.%d.%d",
96*61046927SAndroid Build Coastguard Worker              VK_VERSION_MAJOR(instance_version),
97*61046927SAndroid Build Coastguard Worker              VK_VERSION_MINOR(instance_version),
98*61046927SAndroid Build Coastguard Worker              VK_VERSION_PATCH(instance_version));
99*61046927SAndroid Build Coastguard Worker    }
100*61046927SAndroid Build Coastguard Worker 
101*61046927SAndroid Build Coastguard Worker    /* request at least VN_MIN_RENDERER_VERSION internally */
102*61046927SAndroid Build Coastguard Worker    instance->renderer_api_version =
103*61046927SAndroid Build Coastguard Worker       MAX2(instance->base.base.app_info.api_version, VN_MIN_RENDERER_VERSION);
104*61046927SAndroid Build Coastguard Worker 
105*61046927SAndroid Build Coastguard Worker    /* instance version for internal use is capped */
106*61046927SAndroid Build Coastguard Worker    instance_version = MIN3(instance_version, instance->renderer_api_version,
107*61046927SAndroid Build Coastguard Worker                            instance->renderer->info.vk_xml_version);
108*61046927SAndroid Build Coastguard Worker    assert(instance_version >= VN_MIN_RENDERER_VERSION);
109*61046927SAndroid Build Coastguard Worker 
110*61046927SAndroid Build Coastguard Worker    instance->renderer_version = instance_version;
111*61046927SAndroid Build Coastguard Worker 
112*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
113*61046927SAndroid Build Coastguard Worker }
114*61046927SAndroid Build Coastguard Worker 
115*61046927SAndroid Build Coastguard Worker static inline void
vn_instance_fini_ring(struct vn_instance * instance)116*61046927SAndroid Build Coastguard Worker vn_instance_fini_ring(struct vn_instance *instance)
117*61046927SAndroid Build Coastguard Worker {
118*61046927SAndroid Build Coastguard Worker    vn_watchdog_fini(&instance->ring.watchdog);
119*61046927SAndroid Build Coastguard Worker 
120*61046927SAndroid Build Coastguard Worker    list_for_each_entry_safe(struct vn_tls_ring, tls_ring,
121*61046927SAndroid Build Coastguard Worker                             &instance->ring.tls_rings, vk_head)
122*61046927SAndroid Build Coastguard Worker       vn_tls_destroy_ring(tls_ring);
123*61046927SAndroid Build Coastguard Worker 
124*61046927SAndroid Build Coastguard Worker    vn_ring_destroy(instance->ring.ring);
125*61046927SAndroid Build Coastguard Worker }
126*61046927SAndroid Build Coastguard Worker 
127*61046927SAndroid Build Coastguard Worker static VkResult
vn_instance_init_ring(struct vn_instance * instance)128*61046927SAndroid Build Coastguard Worker vn_instance_init_ring(struct vn_instance *instance)
129*61046927SAndroid Build Coastguard Worker {
130*61046927SAndroid Build Coastguard Worker    /* 32-bit seqno for renderer roundtrips */
131*61046927SAndroid Build Coastguard Worker    static const size_t extra_size = sizeof(uint32_t);
132*61046927SAndroid Build Coastguard Worker 
133*61046927SAndroid Build Coastguard Worker    /* default instance ring size */
134*61046927SAndroid Build Coastguard Worker    static const size_t buf_size = 128 * 1024;
135*61046927SAndroid Build Coastguard Worker 
136*61046927SAndroid Build Coastguard Worker    /* order of 4 for performant async cmd enqueue */
137*61046927SAndroid Build Coastguard Worker    static const uint8_t direct_order = 4;
138*61046927SAndroid Build Coastguard Worker 
139*61046927SAndroid Build Coastguard Worker    struct vn_ring_layout layout;
140*61046927SAndroid Build Coastguard Worker    vn_ring_get_layout(buf_size, extra_size, &layout);
141*61046927SAndroid Build Coastguard Worker 
142*61046927SAndroid Build Coastguard Worker    instance->ring.ring = vn_ring_create(instance, &layout, direct_order,
143*61046927SAndroid Build Coastguard Worker                                         false /* is_tls_ring */);
144*61046927SAndroid Build Coastguard Worker    if (!instance->ring.ring)
145*61046927SAndroid Build Coastguard Worker       return VK_ERROR_OUT_OF_HOST_MEMORY;
146*61046927SAndroid Build Coastguard Worker 
147*61046927SAndroid Build Coastguard Worker    list_inithead(&instance->ring.tls_rings);
148*61046927SAndroid Build Coastguard Worker 
149*61046927SAndroid Build Coastguard Worker    vn_watchdog_init(&instance->ring.watchdog);
150*61046927SAndroid Build Coastguard Worker 
151*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
152*61046927SAndroid Build Coastguard Worker }
153*61046927SAndroid Build Coastguard Worker 
154*61046927SAndroid Build Coastguard Worker static VkResult
vn_instance_init_renderer(struct vn_instance * instance)155*61046927SAndroid Build Coastguard Worker vn_instance_init_renderer(struct vn_instance *instance)
156*61046927SAndroid Build Coastguard Worker {
157*61046927SAndroid Build Coastguard Worker    const VkAllocationCallbacks *alloc = &instance->base.base.alloc;
158*61046927SAndroid Build Coastguard Worker 
159*61046927SAndroid Build Coastguard Worker    VkResult result = vn_renderer_create(instance, alloc, &instance->renderer);
160*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
161*61046927SAndroid Build Coastguard Worker       return result;
162*61046927SAndroid Build Coastguard Worker 
163*61046927SAndroid Build Coastguard Worker    struct vn_renderer_info *renderer_info = &instance->renderer->info;
164*61046927SAndroid Build Coastguard Worker    uint32_t version = vn_info_wire_format_version();
165*61046927SAndroid Build Coastguard Worker    if (renderer_info->wire_format_version != version) {
166*61046927SAndroid Build Coastguard Worker       if (VN_DEBUG(INIT)) {
167*61046927SAndroid Build Coastguard Worker          vn_log(instance, "wire format version %d != %d",
168*61046927SAndroid Build Coastguard Worker                 renderer_info->wire_format_version, version);
169*61046927SAndroid Build Coastguard Worker       }
170*61046927SAndroid Build Coastguard Worker       return VK_ERROR_INITIALIZATION_FAILED;
171*61046927SAndroid Build Coastguard Worker    }
172*61046927SAndroid Build Coastguard Worker 
173*61046927SAndroid Build Coastguard Worker    version = vn_info_vk_xml_version();
174*61046927SAndroid Build Coastguard Worker    if (renderer_info->vk_xml_version > version)
175*61046927SAndroid Build Coastguard Worker       renderer_info->vk_xml_version = version;
176*61046927SAndroid Build Coastguard Worker    if (renderer_info->vk_xml_version < VN_MIN_RENDERER_VERSION) {
177*61046927SAndroid Build Coastguard Worker       if (VN_DEBUG(INIT)) {
178*61046927SAndroid Build Coastguard Worker          vn_log(instance, "vk xml version %d.%d.%d < %d.%d.%d",
179*61046927SAndroid Build Coastguard Worker                 VK_VERSION_MAJOR(renderer_info->vk_xml_version),
180*61046927SAndroid Build Coastguard Worker                 VK_VERSION_MINOR(renderer_info->vk_xml_version),
181*61046927SAndroid Build Coastguard Worker                 VK_VERSION_PATCH(renderer_info->vk_xml_version),
182*61046927SAndroid Build Coastguard Worker                 VK_VERSION_MAJOR(VN_MIN_RENDERER_VERSION),
183*61046927SAndroid Build Coastguard Worker                 VK_VERSION_MINOR(VN_MIN_RENDERER_VERSION),
184*61046927SAndroid Build Coastguard Worker                 VK_VERSION_PATCH(VN_MIN_RENDERER_VERSION));
185*61046927SAndroid Build Coastguard Worker       }
186*61046927SAndroid Build Coastguard Worker       return VK_ERROR_INITIALIZATION_FAILED;
187*61046927SAndroid Build Coastguard Worker    }
188*61046927SAndroid Build Coastguard Worker 
189*61046927SAndroid Build Coastguard Worker    uint32_t spec_version =
190*61046927SAndroid Build Coastguard Worker       vn_extension_get_spec_version("VK_EXT_command_serialization");
191*61046927SAndroid Build Coastguard Worker    if (renderer_info->vk_ext_command_serialization_spec_version >
192*61046927SAndroid Build Coastguard Worker        spec_version) {
193*61046927SAndroid Build Coastguard Worker       renderer_info->vk_ext_command_serialization_spec_version = spec_version;
194*61046927SAndroid Build Coastguard Worker    }
195*61046927SAndroid Build Coastguard Worker 
196*61046927SAndroid Build Coastguard Worker    spec_version = vn_extension_get_spec_version("VK_MESA_venus_protocol");
197*61046927SAndroid Build Coastguard Worker    if (renderer_info->vk_mesa_venus_protocol_spec_version > spec_version)
198*61046927SAndroid Build Coastguard Worker       renderer_info->vk_mesa_venus_protocol_spec_version = spec_version;
199*61046927SAndroid Build Coastguard Worker 
200*61046927SAndroid Build Coastguard Worker    if (VN_DEBUG(INIT)) {
201*61046927SAndroid Build Coastguard Worker       vn_log(instance, "connected to renderer");
202*61046927SAndroid Build Coastguard Worker       vn_log(instance, "wire format version %d",
203*61046927SAndroid Build Coastguard Worker              renderer_info->wire_format_version);
204*61046927SAndroid Build Coastguard Worker       vn_log(instance, "vk xml version %d.%d.%d",
205*61046927SAndroid Build Coastguard Worker              VK_VERSION_MAJOR(renderer_info->vk_xml_version),
206*61046927SAndroid Build Coastguard Worker              VK_VERSION_MINOR(renderer_info->vk_xml_version),
207*61046927SAndroid Build Coastguard Worker              VK_VERSION_PATCH(renderer_info->vk_xml_version));
208*61046927SAndroid Build Coastguard Worker       vn_log(instance, "VK_EXT_command_serialization spec version %d",
209*61046927SAndroid Build Coastguard Worker              renderer_info->vk_ext_command_serialization_spec_version);
210*61046927SAndroid Build Coastguard Worker       vn_log(instance, "VK_MESA_venus_protocol spec version %d",
211*61046927SAndroid Build Coastguard Worker              renderer_info->vk_mesa_venus_protocol_spec_version);
212*61046927SAndroid Build Coastguard Worker    }
213*61046927SAndroid Build Coastguard Worker 
214*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
215*61046927SAndroid Build Coastguard Worker }
216*61046927SAndroid Build Coastguard Worker 
217*61046927SAndroid Build Coastguard Worker /* instance commands */
218*61046927SAndroid Build Coastguard Worker 
219*61046927SAndroid Build Coastguard Worker VkResult
vn_EnumerateInstanceVersion(uint32_t * pApiVersion)220*61046927SAndroid Build Coastguard Worker vn_EnumerateInstanceVersion(uint32_t *pApiVersion)
221*61046927SAndroid Build Coastguard Worker {
222*61046927SAndroid Build Coastguard Worker    *pApiVersion = VN_MAX_API_VERSION;
223*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
224*61046927SAndroid Build Coastguard Worker }
225*61046927SAndroid Build Coastguard Worker 
226*61046927SAndroid Build Coastguard Worker VkResult
vn_EnumerateInstanceExtensionProperties(const char * pLayerName,uint32_t * pPropertyCount,VkExtensionProperties * pProperties)227*61046927SAndroid Build Coastguard Worker vn_EnumerateInstanceExtensionProperties(const char *pLayerName,
228*61046927SAndroid Build Coastguard Worker                                         uint32_t *pPropertyCount,
229*61046927SAndroid Build Coastguard Worker                                         VkExtensionProperties *pProperties)
230*61046927SAndroid Build Coastguard Worker {
231*61046927SAndroid Build Coastguard Worker    if (pLayerName)
232*61046927SAndroid Build Coastguard Worker       return vn_error(NULL, VK_ERROR_LAYER_NOT_PRESENT);
233*61046927SAndroid Build Coastguard Worker 
234*61046927SAndroid Build Coastguard Worker    return vk_enumerate_instance_extension_properties(
235*61046927SAndroid Build Coastguard Worker       &vn_instance_supported_extensions, pPropertyCount, pProperties);
236*61046927SAndroid Build Coastguard Worker }
237*61046927SAndroid Build Coastguard Worker 
238*61046927SAndroid Build Coastguard Worker VkResult
vn_EnumerateInstanceLayerProperties(uint32_t * pPropertyCount,VkLayerProperties * pProperties)239*61046927SAndroid Build Coastguard Worker vn_EnumerateInstanceLayerProperties(uint32_t *pPropertyCount,
240*61046927SAndroid Build Coastguard Worker                                     VkLayerProperties *pProperties)
241*61046927SAndroid Build Coastguard Worker {
242*61046927SAndroid Build Coastguard Worker    *pPropertyCount = 0;
243*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
244*61046927SAndroid Build Coastguard Worker }
245*61046927SAndroid Build Coastguard Worker 
246*61046927SAndroid Build Coastguard Worker VkResult
vn_CreateInstance(const VkInstanceCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkInstance * pInstance)247*61046927SAndroid Build Coastguard Worker vn_CreateInstance(const VkInstanceCreateInfo *pCreateInfo,
248*61046927SAndroid Build Coastguard Worker                   const VkAllocationCallbacks *pAllocator,
249*61046927SAndroid Build Coastguard Worker                   VkInstance *pInstance)
250*61046927SAndroid Build Coastguard Worker {
251*61046927SAndroid Build Coastguard Worker    vn_trace_init();
252*61046927SAndroid Build Coastguard Worker    VN_TRACE_FUNC();
253*61046927SAndroid Build Coastguard Worker 
254*61046927SAndroid Build Coastguard Worker    const VkAllocationCallbacks *alloc =
255*61046927SAndroid Build Coastguard Worker       pAllocator ? pAllocator : vk_default_allocator();
256*61046927SAndroid Build Coastguard Worker    struct vn_instance *instance;
257*61046927SAndroid Build Coastguard Worker    VkResult result;
258*61046927SAndroid Build Coastguard Worker 
259*61046927SAndroid Build Coastguard Worker    vn_env_init();
260*61046927SAndroid Build Coastguard Worker 
261*61046927SAndroid Build Coastguard Worker    instance = vk_zalloc(alloc, sizeof(*instance), VN_DEFAULT_ALIGN,
262*61046927SAndroid Build Coastguard Worker                         VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE);
263*61046927SAndroid Build Coastguard Worker    if (!instance)
264*61046927SAndroid Build Coastguard Worker       return vn_error(NULL, VK_ERROR_OUT_OF_HOST_MEMORY);
265*61046927SAndroid Build Coastguard Worker 
266*61046927SAndroid Build Coastguard Worker    struct vk_instance_dispatch_table dispatch_table;
267*61046927SAndroid Build Coastguard Worker    vk_instance_dispatch_table_from_entrypoints(
268*61046927SAndroid Build Coastguard Worker       &dispatch_table, &vn_instance_entrypoints, true);
269*61046927SAndroid Build Coastguard Worker    vk_instance_dispatch_table_from_entrypoints(
270*61046927SAndroid Build Coastguard Worker       &dispatch_table, &wsi_instance_entrypoints, false);
271*61046927SAndroid Build Coastguard Worker    result = vn_instance_base_init(&instance->base,
272*61046927SAndroid Build Coastguard Worker                                   &vn_instance_supported_extensions,
273*61046927SAndroid Build Coastguard Worker                                   &dispatch_table, pCreateInfo, alloc);
274*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS) {
275*61046927SAndroid Build Coastguard Worker       vk_free(alloc, instance);
276*61046927SAndroid Build Coastguard Worker       return vn_error(NULL, result);
277*61046927SAndroid Build Coastguard Worker    }
278*61046927SAndroid Build Coastguard Worker 
279*61046927SAndroid Build Coastguard Worker    /* ring_idx = 0 reserved for CPU timeline */
280*61046927SAndroid Build Coastguard Worker    instance->ring_idx_used_mask = 0x1;
281*61046927SAndroid Build Coastguard Worker 
282*61046927SAndroid Build Coastguard Worker    mtx_init(&instance->physical_device.mutex, mtx_plain);
283*61046927SAndroid Build Coastguard Worker    mtx_init(&instance->ring_idx_mutex, mtx_plain);
284*61046927SAndroid Build Coastguard Worker 
285*61046927SAndroid Build Coastguard Worker    if (!vn_icd_supports_api_version(
286*61046927SAndroid Build Coastguard Worker           instance->base.base.app_info.api_version)) {
287*61046927SAndroid Build Coastguard Worker       result = VK_ERROR_INCOMPATIBLE_DRIVER;
288*61046927SAndroid Build Coastguard Worker       goto out_mtx_destroy;
289*61046927SAndroid Build Coastguard Worker    }
290*61046927SAndroid Build Coastguard Worker 
291*61046927SAndroid Build Coastguard Worker    if (pCreateInfo->enabledLayerCount) {
292*61046927SAndroid Build Coastguard Worker       result = VK_ERROR_LAYER_NOT_PRESENT;
293*61046927SAndroid Build Coastguard Worker       goto out_mtx_destroy;
294*61046927SAndroid Build Coastguard Worker    }
295*61046927SAndroid Build Coastguard Worker 
296*61046927SAndroid Build Coastguard Worker    result = vn_instance_init_renderer(instance);
297*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
298*61046927SAndroid Build Coastguard Worker       goto out_mtx_destroy;
299*61046927SAndroid Build Coastguard Worker 
300*61046927SAndroid Build Coastguard Worker    vn_cs_renderer_protocol_info_init(instance);
301*61046927SAndroid Build Coastguard Worker 
302*61046927SAndroid Build Coastguard Worker    vn_renderer_shmem_pool_init(instance->renderer, &instance->cs_shmem_pool,
303*61046927SAndroid Build Coastguard Worker                                8u << 20);
304*61046927SAndroid Build Coastguard Worker 
305*61046927SAndroid Build Coastguard Worker    vn_renderer_shmem_pool_init(instance->renderer,
306*61046927SAndroid Build Coastguard Worker                                &instance->reply_shmem_pool, 1u << 20);
307*61046927SAndroid Build Coastguard Worker 
308*61046927SAndroid Build Coastguard Worker    result = vn_instance_init_ring(instance);
309*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
310*61046927SAndroid Build Coastguard Worker       goto out_shmem_pool_fini;
311*61046927SAndroid Build Coastguard Worker 
312*61046927SAndroid Build Coastguard Worker    result = vn_instance_init_renderer_versions(instance);
313*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
314*61046927SAndroid Build Coastguard Worker       goto out_ring_fini;
315*61046927SAndroid Build Coastguard Worker 
316*61046927SAndroid Build Coastguard Worker    VkInstanceCreateInfo local_create_info = *pCreateInfo;
317*61046927SAndroid Build Coastguard Worker    local_create_info.ppEnabledExtensionNames = NULL;
318*61046927SAndroid Build Coastguard Worker    local_create_info.enabledExtensionCount = 0;
319*61046927SAndroid Build Coastguard Worker    pCreateInfo = &local_create_info;
320*61046927SAndroid Build Coastguard Worker 
321*61046927SAndroid Build Coastguard Worker    VkApplicationInfo local_app_info;
322*61046927SAndroid Build Coastguard Worker    if (instance->base.base.app_info.api_version <
323*61046927SAndroid Build Coastguard Worker        instance->renderer_api_version) {
324*61046927SAndroid Build Coastguard Worker       if (pCreateInfo->pApplicationInfo) {
325*61046927SAndroid Build Coastguard Worker          local_app_info = *pCreateInfo->pApplicationInfo;
326*61046927SAndroid Build Coastguard Worker          local_app_info.apiVersion = instance->renderer_api_version;
327*61046927SAndroid Build Coastguard Worker       } else {
328*61046927SAndroid Build Coastguard Worker          local_app_info = (const VkApplicationInfo){
329*61046927SAndroid Build Coastguard Worker             .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
330*61046927SAndroid Build Coastguard Worker             .apiVersion = instance->renderer_api_version,
331*61046927SAndroid Build Coastguard Worker          };
332*61046927SAndroid Build Coastguard Worker       }
333*61046927SAndroid Build Coastguard Worker       local_create_info.pApplicationInfo = &local_app_info;
334*61046927SAndroid Build Coastguard Worker    }
335*61046927SAndroid Build Coastguard Worker 
336*61046927SAndroid Build Coastguard Worker    VkInstance instance_handle = vn_instance_to_handle(instance);
337*61046927SAndroid Build Coastguard Worker    result = vn_call_vkCreateInstance(instance->ring.ring, pCreateInfo, NULL,
338*61046927SAndroid Build Coastguard Worker                                      &instance_handle);
339*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
340*61046927SAndroid Build Coastguard Worker       goto out_ring_fini;
341*61046927SAndroid Build Coastguard Worker 
342*61046927SAndroid Build Coastguard Worker    driParseOptionInfo(&instance->available_dri_options, vn_dri_options,
343*61046927SAndroid Build Coastguard Worker                       ARRAY_SIZE(vn_dri_options));
344*61046927SAndroid Build Coastguard Worker    driParseConfigFiles(&instance->dri_options,
345*61046927SAndroid Build Coastguard Worker                        &instance->available_dri_options, 0, "venus", NULL,
346*61046927SAndroid Build Coastguard Worker                        NULL, instance->base.base.app_info.app_name,
347*61046927SAndroid Build Coastguard Worker                        instance->base.base.app_info.app_version,
348*61046927SAndroid Build Coastguard Worker                        instance->base.base.app_info.engine_name,
349*61046927SAndroid Build Coastguard Worker                        instance->base.base.app_info.engine_version);
350*61046927SAndroid Build Coastguard Worker 
351*61046927SAndroid Build Coastguard Worker    instance->renderer->info.has_implicit_fencing =
352*61046927SAndroid Build Coastguard Worker       driQueryOptionb(&instance->dri_options, "venus_implicit_fencing");
353*61046927SAndroid Build Coastguard Worker    instance->enable_wsi_multi_plane_modifiers = driQueryOptionb(
354*61046927SAndroid Build Coastguard Worker       &instance->dri_options, "venus_wsi_multi_plane_modifiers");
355*61046927SAndroid Build Coastguard Worker 
356*61046927SAndroid Build Coastguard Worker    if (VN_DEBUG(INIT)) {
357*61046927SAndroid Build Coastguard Worker       vn_log(instance, "supports multi-plane wsi format modifiers: %s",
358*61046927SAndroid Build Coastguard Worker              instance->enable_wsi_multi_plane_modifiers ? "yes" : "no");
359*61046927SAndroid Build Coastguard Worker    }
360*61046927SAndroid Build Coastguard Worker 
361*61046927SAndroid Build Coastguard Worker    const char *engine_name = instance->base.base.app_info.engine_name;
362*61046927SAndroid Build Coastguard Worker    if (engine_name) {
363*61046927SAndroid Build Coastguard Worker       instance->engine_is_zink = strcmp(engine_name, "mesa zink") == 0;
364*61046927SAndroid Build Coastguard Worker    }
365*61046927SAndroid Build Coastguard Worker 
366*61046927SAndroid Build Coastguard Worker    *pInstance = instance_handle;
367*61046927SAndroid Build Coastguard Worker 
368*61046927SAndroid Build Coastguard Worker    return VK_SUCCESS;
369*61046927SAndroid Build Coastguard Worker 
370*61046927SAndroid Build Coastguard Worker out_ring_fini:
371*61046927SAndroid Build Coastguard Worker    vn_instance_fini_ring(instance);
372*61046927SAndroid Build Coastguard Worker 
373*61046927SAndroid Build Coastguard Worker out_shmem_pool_fini:
374*61046927SAndroid Build Coastguard Worker    vn_renderer_shmem_pool_fini(instance->renderer,
375*61046927SAndroid Build Coastguard Worker                                &instance->reply_shmem_pool);
376*61046927SAndroid Build Coastguard Worker    vn_renderer_shmem_pool_fini(instance->renderer, &instance->cs_shmem_pool);
377*61046927SAndroid Build Coastguard Worker    vn_renderer_destroy(instance->renderer, alloc);
378*61046927SAndroid Build Coastguard Worker 
379*61046927SAndroid Build Coastguard Worker out_mtx_destroy:
380*61046927SAndroid Build Coastguard Worker    mtx_destroy(&instance->physical_device.mutex);
381*61046927SAndroid Build Coastguard Worker    mtx_destroy(&instance->ring_idx_mutex);
382*61046927SAndroid Build Coastguard Worker 
383*61046927SAndroid Build Coastguard Worker    vn_instance_base_fini(&instance->base);
384*61046927SAndroid Build Coastguard Worker    vk_free(alloc, instance);
385*61046927SAndroid Build Coastguard Worker 
386*61046927SAndroid Build Coastguard Worker    return vn_error(NULL, result);
387*61046927SAndroid Build Coastguard Worker }
388*61046927SAndroid Build Coastguard Worker 
389*61046927SAndroid Build Coastguard Worker void
vn_DestroyInstance(VkInstance _instance,const VkAllocationCallbacks * pAllocator)390*61046927SAndroid Build Coastguard Worker vn_DestroyInstance(VkInstance _instance,
391*61046927SAndroid Build Coastguard Worker                    const VkAllocationCallbacks *pAllocator)
392*61046927SAndroid Build Coastguard Worker {
393*61046927SAndroid Build Coastguard Worker    VN_TRACE_FUNC();
394*61046927SAndroid Build Coastguard Worker    struct vn_instance *instance = vn_instance_from_handle(_instance);
395*61046927SAndroid Build Coastguard Worker    const VkAllocationCallbacks *alloc =
396*61046927SAndroid Build Coastguard Worker       pAllocator ? pAllocator : &instance->base.base.alloc;
397*61046927SAndroid Build Coastguard Worker 
398*61046927SAndroid Build Coastguard Worker    if (!instance)
399*61046927SAndroid Build Coastguard Worker       return;
400*61046927SAndroid Build Coastguard Worker 
401*61046927SAndroid Build Coastguard Worker    if (instance->physical_device.initialized) {
402*61046927SAndroid Build Coastguard Worker       for (uint32_t i = 0; i < instance->physical_device.device_count; i++)
403*61046927SAndroid Build Coastguard Worker          vn_physical_device_fini(&instance->physical_device.devices[i]);
404*61046927SAndroid Build Coastguard Worker       vk_free(alloc, instance->physical_device.devices);
405*61046927SAndroid Build Coastguard Worker       vk_free(alloc, instance->physical_device.groups);
406*61046927SAndroid Build Coastguard Worker    }
407*61046927SAndroid Build Coastguard Worker    mtx_destroy(&instance->physical_device.mutex);
408*61046927SAndroid Build Coastguard Worker    mtx_destroy(&instance->ring_idx_mutex);
409*61046927SAndroid Build Coastguard Worker 
410*61046927SAndroid Build Coastguard Worker    vn_call_vkDestroyInstance(instance->ring.ring, _instance, NULL);
411*61046927SAndroid Build Coastguard Worker 
412*61046927SAndroid Build Coastguard Worker    vn_instance_fini_ring(instance);
413*61046927SAndroid Build Coastguard Worker 
414*61046927SAndroid Build Coastguard Worker    vn_renderer_shmem_pool_fini(instance->renderer,
415*61046927SAndroid Build Coastguard Worker                                &instance->reply_shmem_pool);
416*61046927SAndroid Build Coastguard Worker 
417*61046927SAndroid Build Coastguard Worker    vn_renderer_shmem_pool_fini(instance->renderer, &instance->cs_shmem_pool);
418*61046927SAndroid Build Coastguard Worker 
419*61046927SAndroid Build Coastguard Worker    vn_renderer_destroy(instance->renderer, alloc);
420*61046927SAndroid Build Coastguard Worker 
421*61046927SAndroid Build Coastguard Worker    driDestroyOptionCache(&instance->dri_options);
422*61046927SAndroid Build Coastguard Worker    driDestroyOptionInfo(&instance->available_dri_options);
423*61046927SAndroid Build Coastguard Worker 
424*61046927SAndroid Build Coastguard Worker    vn_instance_base_fini(&instance->base);
425*61046927SAndroid Build Coastguard Worker    vk_free(alloc, instance);
426*61046927SAndroid Build Coastguard Worker }
427*61046927SAndroid Build Coastguard Worker 
428*61046927SAndroid Build Coastguard Worker PFN_vkVoidFunction
vn_GetInstanceProcAddr(VkInstance _instance,const char * pName)429*61046927SAndroid Build Coastguard Worker vn_GetInstanceProcAddr(VkInstance _instance, const char *pName)
430*61046927SAndroid Build Coastguard Worker {
431*61046927SAndroid Build Coastguard Worker    struct vn_instance *instance = vn_instance_from_handle(_instance);
432*61046927SAndroid Build Coastguard Worker    return vk_instance_get_proc_addr(&instance->base.base,
433*61046927SAndroid Build Coastguard Worker                                     &vn_instance_entrypoints, pName);
434*61046927SAndroid Build Coastguard Worker }
435