xref: /aosp_15_r20/external/mesa3d/src/vulkan/runtime/vk_instance.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2021 Intel Corporation
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker  * Software.
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  */
23*61046927SAndroid Build Coastguard Worker #ifndef VK_INSTANCE_H
24*61046927SAndroid Build Coastguard Worker #define VK_INSTANCE_H
25*61046927SAndroid Build Coastguard Worker 
26*61046927SAndroid Build Coastguard Worker #include "vk_dispatch_table.h"
27*61046927SAndroid Build Coastguard Worker #include "vk_extensions.h"
28*61046927SAndroid Build Coastguard Worker #include "vk_object.h"
29*61046927SAndroid Build Coastguard Worker 
30*61046927SAndroid Build Coastguard Worker #include "c11/threads.h"
31*61046927SAndroid Build Coastguard Worker #include "util/list.h"
32*61046927SAndroid Build Coastguard Worker #include "util/u_debug.h"
33*61046927SAndroid Build Coastguard Worker 
34*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
35*61046927SAndroid Build Coastguard Worker extern "C" {
36*61046927SAndroid Build Coastguard Worker #endif
37*61046927SAndroid Build Coastguard Worker 
38*61046927SAndroid Build Coastguard Worker struct vk_app_info {
39*61046927SAndroid Build Coastguard Worker    /** VkApplicationInfo::pApplicationName */
40*61046927SAndroid Build Coastguard Worker    const char*        app_name;
41*61046927SAndroid Build Coastguard Worker 
42*61046927SAndroid Build Coastguard Worker    /** VkApplicationInfo::applicationVersion */
43*61046927SAndroid Build Coastguard Worker    uint32_t           app_version;
44*61046927SAndroid Build Coastguard Worker 
45*61046927SAndroid Build Coastguard Worker    /** VkApplicationInfo::pEngineName */
46*61046927SAndroid Build Coastguard Worker    const char*        engine_name;
47*61046927SAndroid Build Coastguard Worker 
48*61046927SAndroid Build Coastguard Worker    /** VkApplicationInfo::engineVersion */
49*61046927SAndroid Build Coastguard Worker    uint32_t           engine_version;
50*61046927SAndroid Build Coastguard Worker 
51*61046927SAndroid Build Coastguard Worker    /** VkApplicationInfo::apiVersion or `VK_API_VERSION_1_0`
52*61046927SAndroid Build Coastguard Worker     *
53*61046927SAndroid Build Coastguard Worker     * If the application does not provide a `pApplicationInfo` or the
54*61046927SAndroid Build Coastguard Worker     * `apiVersion` field is 0, this is set to `VK_API_VERSION_1_0`.
55*61046927SAndroid Build Coastguard Worker     */
56*61046927SAndroid Build Coastguard Worker    uint32_t           api_version;
57*61046927SAndroid Build Coastguard Worker };
58*61046927SAndroid Build Coastguard Worker 
59*61046927SAndroid Build Coastguard Worker struct _drmDevice;
60*61046927SAndroid Build Coastguard Worker struct vk_physical_device;
61*61046927SAndroid Build Coastguard Worker 
62*61046927SAndroid Build Coastguard Worker enum vk_trace_mode {
63*61046927SAndroid Build Coastguard Worker    /** Radeon Memory Visualizer */
64*61046927SAndroid Build Coastguard Worker    VK_TRACE_MODE_RMV = 1 << 0,
65*61046927SAndroid Build Coastguard Worker 
66*61046927SAndroid Build Coastguard Worker    /** Number of common trace modes. */
67*61046927SAndroid Build Coastguard Worker    VK_TRACE_MODE_COUNT = 1,
68*61046927SAndroid Build Coastguard Worker };
69*61046927SAndroid Build Coastguard Worker 
70*61046927SAndroid Build Coastguard Worker /** Base struct for all `VkInstance` implementations
71*61046927SAndroid Build Coastguard Worker  *
72*61046927SAndroid Build Coastguard Worker  * This contains data structures necessary for detecting enabled extensions,
73*61046927SAndroid Build Coastguard Worker  * handling entrypoint dispatch, and implementing `vkGetInstanceProcAddr()`.
74*61046927SAndroid Build Coastguard Worker  * It also contains data copied from the `VkInstanceCreateInfo` such as the
75*61046927SAndroid Build Coastguard Worker  * application information.
76*61046927SAndroid Build Coastguard Worker  */
77*61046927SAndroid Build Coastguard Worker struct vk_instance {
78*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
79*61046927SAndroid Build Coastguard Worker 
80*61046927SAndroid Build Coastguard Worker    /** Allocator used when creating this instance
81*61046927SAndroid Build Coastguard Worker     *
82*61046927SAndroid Build Coastguard Worker     * This is used as a fall-back for when a NULL pAllocator is passed into a
83*61046927SAndroid Build Coastguard Worker     * device-level create function such as vkCreateImage().
84*61046927SAndroid Build Coastguard Worker     */
85*61046927SAndroid Build Coastguard Worker    VkAllocationCallbacks alloc;
86*61046927SAndroid Build Coastguard Worker 
87*61046927SAndroid Build Coastguard Worker    /** VkInstanceCreateInfo::pApplicationInfo */
88*61046927SAndroid Build Coastguard Worker    struct vk_app_info app_info;
89*61046927SAndroid Build Coastguard Worker 
90*61046927SAndroid Build Coastguard Worker    /** Table of all supported instance extensions
91*61046927SAndroid Build Coastguard Worker     *
92*61046927SAndroid Build Coastguard Worker     * This is the static const struct passed by the driver as the
93*61046927SAndroid Build Coastguard Worker     * `supported_extensions` parameter to `vk_instance_init()`.
94*61046927SAndroid Build Coastguard Worker     */
95*61046927SAndroid Build Coastguard Worker    const struct vk_instance_extension_table *supported_extensions;
96*61046927SAndroid Build Coastguard Worker 
97*61046927SAndroid Build Coastguard Worker    /** Table of all enabled instance extensions
98*61046927SAndroid Build Coastguard Worker     *
99*61046927SAndroid Build Coastguard Worker     * This is generated automatically as part of `vk_instance_init()` from
100*61046927SAndroid Build Coastguard Worker     * VkInstanceCreateInfo::ppEnabledExtensionNames.
101*61046927SAndroid Build Coastguard Worker     */
102*61046927SAndroid Build Coastguard Worker    struct vk_instance_extension_table enabled_extensions;
103*61046927SAndroid Build Coastguard Worker 
104*61046927SAndroid Build Coastguard Worker    /** Instance-level dispatch table */
105*61046927SAndroid Build Coastguard Worker    struct vk_instance_dispatch_table dispatch_table;
106*61046927SAndroid Build Coastguard Worker 
107*61046927SAndroid Build Coastguard Worker    /* VK_EXT_debug_report debug callbacks */
108*61046927SAndroid Build Coastguard Worker    struct {
109*61046927SAndroid Build Coastguard Worker       mtx_t callbacks_mutex;
110*61046927SAndroid Build Coastguard Worker       struct list_head callbacks;
111*61046927SAndroid Build Coastguard Worker    } debug_report;
112*61046927SAndroid Build Coastguard Worker 
113*61046927SAndroid Build Coastguard Worker    /* VK_EXT_debug_utils */
114*61046927SAndroid Build Coastguard Worker    struct {
115*61046927SAndroid Build Coastguard Worker       /* These callbacks are only used while creating or destroying an
116*61046927SAndroid Build Coastguard Worker        * instance
117*61046927SAndroid Build Coastguard Worker        */
118*61046927SAndroid Build Coastguard Worker       struct list_head instance_callbacks;
119*61046927SAndroid Build Coastguard Worker       mtx_t callbacks_mutex;
120*61046927SAndroid Build Coastguard Worker       /* Persistent callbacks */
121*61046927SAndroid Build Coastguard Worker       struct list_head callbacks;
122*61046927SAndroid Build Coastguard Worker    } debug_utils;
123*61046927SAndroid Build Coastguard Worker 
124*61046927SAndroid Build Coastguard Worker    /** List of all physical devices and callbacks
125*61046927SAndroid Build Coastguard Worker    *
126*61046927SAndroid Build Coastguard Worker    * This is used for automatic physical device creation,
127*61046927SAndroid Build Coastguard Worker    * deletion and enumeration.
128*61046927SAndroid Build Coastguard Worker    */
129*61046927SAndroid Build Coastguard Worker    struct {
130*61046927SAndroid Build Coastguard Worker       struct list_head list;
131*61046927SAndroid Build Coastguard Worker       bool enumerated;
132*61046927SAndroid Build Coastguard Worker 
133*61046927SAndroid Build Coastguard Worker       /** Enumerate physical devices for this instance
134*61046927SAndroid Build Coastguard Worker        *
135*61046927SAndroid Build Coastguard Worker        * The driver can implement this callback for custom physical device
136*61046927SAndroid Build Coastguard Worker        * enumeration. The returned value must be a valid return code of
137*61046927SAndroid Build Coastguard Worker        * vkEnumeratePhysicalDevices.
138*61046927SAndroid Build Coastguard Worker        *
139*61046927SAndroid Build Coastguard Worker        * Note that the loader calls vkEnumeratePhysicalDevices of all
140*61046927SAndroid Build Coastguard Worker        * installed ICDs and fails device enumeration when any of the calls
141*61046927SAndroid Build Coastguard Worker        * fails. The driver should return VK_SUCCESS when it does not find any
142*61046927SAndroid Build Coastguard Worker        * compatible device.
143*61046927SAndroid Build Coastguard Worker        *
144*61046927SAndroid Build Coastguard Worker        * If this callback is not set, try_create_for_drm will be used for
145*61046927SAndroid Build Coastguard Worker        * enumeration.
146*61046927SAndroid Build Coastguard Worker        */
147*61046927SAndroid Build Coastguard Worker       VkResult (*enumerate)(struct vk_instance *instance);
148*61046927SAndroid Build Coastguard Worker 
149*61046927SAndroid Build Coastguard Worker       /** Try to create a physical device for a drm device
150*61046927SAndroid Build Coastguard Worker        *
151*61046927SAndroid Build Coastguard Worker        * The returned value must be a valid return code of
152*61046927SAndroid Build Coastguard Worker        * vkEnumeratePhysicalDevices, or VK_ERROR_INCOMPATIBLE_DRIVER. When
153*61046927SAndroid Build Coastguard Worker        * VK_ERROR_INCOMPATIBLE_DRIVER is returned, the error and the drm
154*61046927SAndroid Build Coastguard Worker        * device are silently ignored.
155*61046927SAndroid Build Coastguard Worker        */
156*61046927SAndroid Build Coastguard Worker       VkResult (*try_create_for_drm)(struct vk_instance *instance,
157*61046927SAndroid Build Coastguard Worker                                      struct _drmDevice *device,
158*61046927SAndroid Build Coastguard Worker                                      struct vk_physical_device **out);
159*61046927SAndroid Build Coastguard Worker 
160*61046927SAndroid Build Coastguard Worker       /** Handle the destruction of a physical device
161*61046927SAndroid Build Coastguard Worker        *
162*61046927SAndroid Build Coastguard Worker        * This callback has to be implemented when using common physical device
163*61046927SAndroid Build Coastguard Worker        * management. The device pointer and any resource allocated for the
164*61046927SAndroid Build Coastguard Worker        * device should be freed here.
165*61046927SAndroid Build Coastguard Worker        */
166*61046927SAndroid Build Coastguard Worker       void (*destroy)(struct vk_physical_device *pdevice);
167*61046927SAndroid Build Coastguard Worker 
168*61046927SAndroid Build Coastguard Worker       mtx_t mutex;
169*61046927SAndroid Build Coastguard Worker    } physical_devices;
170*61046927SAndroid Build Coastguard Worker 
171*61046927SAndroid Build Coastguard Worker    /** Enabled tracing modes */
172*61046927SAndroid Build Coastguard Worker    uint64_t trace_mode;
173*61046927SAndroid Build Coastguard Worker 
174*61046927SAndroid Build Coastguard Worker    uint32_t trace_frame;
175*61046927SAndroid Build Coastguard Worker    char *trace_trigger_file;
176*61046927SAndroid Build Coastguard Worker };
177*61046927SAndroid Build Coastguard Worker 
178*61046927SAndroid Build Coastguard Worker VK_DEFINE_HANDLE_CASTS(vk_instance, base, VkInstance,
179*61046927SAndroid Build Coastguard Worker                        VK_OBJECT_TYPE_INSTANCE);
180*61046927SAndroid Build Coastguard Worker 
181*61046927SAndroid Build Coastguard Worker /** Initialize a vk_instance
182*61046927SAndroid Build Coastguard Worker  *
183*61046927SAndroid Build Coastguard Worker  * Along with initializing the data structures in `vk_instance`, this function
184*61046927SAndroid Build Coastguard Worker  * validates the Vulkan version number provided by the client and checks that
185*61046927SAndroid Build Coastguard Worker  * every extension specified by
186*61046927SAndroid Build Coastguard Worker  * ``VkInstanceCreateInfo::ppEnabledExtensionNames`` is actually supported by
187*61046927SAndroid Build Coastguard Worker  * the implementation and returns `VK_ERROR_EXTENSION_NOT_PRESENT` if an
188*61046927SAndroid Build Coastguard Worker  * unsupported extension is requested.
189*61046927SAndroid Build Coastguard Worker  *
190*61046927SAndroid Build Coastguard Worker  * :param instance:             |out| The instance to initialize
191*61046927SAndroid Build Coastguard Worker  * :param supported_extensions: |in|  Table of all instance extensions supported
192*61046927SAndroid Build Coastguard Worker  *                                    by this instance
193*61046927SAndroid Build Coastguard Worker  * :param dispatch_table:       |in|  Instance-level dispatch table
194*61046927SAndroid Build Coastguard Worker  * :param pCreateInfo:          |in|  VkInstanceCreateInfo pointer passed to
195*61046927SAndroid Build Coastguard Worker  *                                    `vkCreateInstance()`
196*61046927SAndroid Build Coastguard Worker  * :param alloc:                |in|  Allocation callbacks used to create this
197*61046927SAndroid Build Coastguard Worker  *                                    instance; must not be `NULL`
198*61046927SAndroid Build Coastguard Worker  */
199*61046927SAndroid Build Coastguard Worker VkResult MUST_CHECK
200*61046927SAndroid Build Coastguard Worker vk_instance_init(struct vk_instance *instance,
201*61046927SAndroid Build Coastguard Worker                  const struct vk_instance_extension_table *supported_extensions,
202*61046927SAndroid Build Coastguard Worker                  const struct vk_instance_dispatch_table *dispatch_table,
203*61046927SAndroid Build Coastguard Worker                  const VkInstanceCreateInfo *pCreateInfo,
204*61046927SAndroid Build Coastguard Worker                  const VkAllocationCallbacks *alloc);
205*61046927SAndroid Build Coastguard Worker 
206*61046927SAndroid Build Coastguard Worker /** Tears down a vk_instance
207*61046927SAndroid Build Coastguard Worker  *
208*61046927SAndroid Build Coastguard Worker  * :param instance:     |out| The instance to tear down
209*61046927SAndroid Build Coastguard Worker  */
210*61046927SAndroid Build Coastguard Worker void
211*61046927SAndroid Build Coastguard Worker vk_instance_finish(struct vk_instance *instance);
212*61046927SAndroid Build Coastguard Worker 
213*61046927SAndroid Build Coastguard Worker /** Implementation of vkEnumerateInstanceExtensionProperties() */
214*61046927SAndroid Build Coastguard Worker VkResult
215*61046927SAndroid Build Coastguard Worker vk_enumerate_instance_extension_properties(
216*61046927SAndroid Build Coastguard Worker     const struct vk_instance_extension_table *supported_extensions,
217*61046927SAndroid Build Coastguard Worker     uint32_t *pPropertyCount,
218*61046927SAndroid Build Coastguard Worker     VkExtensionProperties *pProperties);
219*61046927SAndroid Build Coastguard Worker 
220*61046927SAndroid Build Coastguard Worker /** Implementation of vkGetInstanceProcAddr() */
221*61046927SAndroid Build Coastguard Worker PFN_vkVoidFunction
222*61046927SAndroid Build Coastguard Worker vk_instance_get_proc_addr(const struct vk_instance *instance,
223*61046927SAndroid Build Coastguard Worker                           const struct vk_instance_entrypoint_table *entrypoints,
224*61046927SAndroid Build Coastguard Worker                           const char *name);
225*61046927SAndroid Build Coastguard Worker 
226*61046927SAndroid Build Coastguard Worker /** Unchecked version of vk_instance_get_proc_addr
227*61046927SAndroid Build Coastguard Worker  *
228*61046927SAndroid Build Coastguard Worker  * This is identical to `vk_instance_get_proc_addr()` except that it doesn't
229*61046927SAndroid Build Coastguard Worker  * check whether extensions are enabled before returning function pointers.
230*61046927SAndroid Build Coastguard Worker  * This is useful in window-system code where we may use extensions without
231*61046927SAndroid Build Coastguard Worker  * the client explicitly enabling them.
232*61046927SAndroid Build Coastguard Worker  */
233*61046927SAndroid Build Coastguard Worker PFN_vkVoidFunction
234*61046927SAndroid Build Coastguard Worker vk_instance_get_proc_addr_unchecked(const struct vk_instance *instance,
235*61046927SAndroid Build Coastguard Worker                                     const char *name);
236*61046927SAndroid Build Coastguard Worker 
237*61046927SAndroid Build Coastguard Worker /** Implementation of vk_icdGetPhysicalDeviceProcAddr() */
238*61046927SAndroid Build Coastguard Worker PFN_vkVoidFunction
239*61046927SAndroid Build Coastguard Worker vk_instance_get_physical_device_proc_addr(const struct vk_instance *instance,
240*61046927SAndroid Build Coastguard Worker                                           const char *name);
241*61046927SAndroid Build Coastguard Worker 
242*61046927SAndroid Build Coastguard Worker void
243*61046927SAndroid Build Coastguard Worker vk_instance_add_driver_trace_modes(struct vk_instance *instance,
244*61046927SAndroid Build Coastguard Worker                                    const struct debug_control *modes);
245*61046927SAndroid Build Coastguard Worker 
246*61046927SAndroid Build Coastguard Worker uint32_t
247*61046927SAndroid Build Coastguard Worker vk_get_negotiated_icd_version(void);
248*61046927SAndroid Build Coastguard Worker 
249*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
250*61046927SAndroid Build Coastguard Worker }
251*61046927SAndroid Build Coastguard Worker #endif
252*61046927SAndroid Build Coastguard Worker 
253*61046927SAndroid Build Coastguard Worker #endif /* VK_INSTANCE_H */
254