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