15db71995Sopenharmony_ci/* 25db71995Sopenharmony_ci * 35db71995Sopenharmony_ci * Copyright (c) 2014-2022 The Khronos Group Inc. 45db71995Sopenharmony_ci * Copyright (c) 2014-2022 Valve Corporation 55db71995Sopenharmony_ci * Copyright (c) 2014-2022 LunarG, Inc. 65db71995Sopenharmony_ci * Copyright (C) 2015 Google Inc. 75db71995Sopenharmony_ci * 85db71995Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 95db71995Sopenharmony_ci * you may not use this file except in compliance with the License. 105db71995Sopenharmony_ci * You may obtain a copy of the License at 115db71995Sopenharmony_ci * 125db71995Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 135db71995Sopenharmony_ci * 145db71995Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 155db71995Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 165db71995Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 175db71995Sopenharmony_ci * See the License for the specific language governing permissions and 185db71995Sopenharmony_ci * limitations under the License. 195db71995Sopenharmony_ci * 205db71995Sopenharmony_ci * Author: Jon Ashburn <jon@lunarg.com> 215db71995Sopenharmony_ci * Author: Courtney Goeltzenleuchter <courtney@LunarG.com> 225db71995Sopenharmony_ci * Author: Chia-I Wu <olvaffe@gmail.com> 235db71995Sopenharmony_ci * Author: Chia-I Wu <olv@lunarg.com> 245db71995Sopenharmony_ci * Author: Mark Lobodzinski <mark@LunarG.com> 255db71995Sopenharmony_ci * Author: Lenny Komow <lenny@lunarg.com> 265db71995Sopenharmony_ci * Author: Charles Giessen <charles@lunarg.com> 275db71995Sopenharmony_ci * 285db71995Sopenharmony_ci */ 295db71995Sopenharmony_ci 305db71995Sopenharmony_ci#pragma once 315db71995Sopenharmony_ci 325db71995Sopenharmony_ci#include "vulkan/vk_platform.h" 335db71995Sopenharmony_ci#include <vulkan/vulkan.h> 345db71995Sopenharmony_ci#include <vulkan/vk_layer.h> 355db71995Sopenharmony_ci#include <vulkan/vk_icd.h> 365db71995Sopenharmony_ci 375db71995Sopenharmony_ci#include "vk_loader_platform.h" 385db71995Sopenharmony_ci#include "vk_loader_layer.h" 395db71995Sopenharmony_ci#include "vk_layer_dispatch_table.h" 405db71995Sopenharmony_ci#include "vk_loader_extensions.h" 415db71995Sopenharmony_ci 425db71995Sopenharmony_ci#include "settings.h" 435db71995Sopenharmony_ci 445db71995Sopenharmony_citypedef enum VkStringErrorFlagBits { 455db71995Sopenharmony_ci VK_STRING_ERROR_NONE = 0x00000000, 465db71995Sopenharmony_ci VK_STRING_ERROR_LENGTH = 0x00000001, 475db71995Sopenharmony_ci VK_STRING_ERROR_BAD_DATA = 0x00000002, 485db71995Sopenharmony_ci VK_STRING_ERROR_NULL_PTR = 0x00000004, 495db71995Sopenharmony_ci} VkStringErrorFlagBits; 505db71995Sopenharmony_citypedef VkFlags VkStringErrorFlags; 515db71995Sopenharmony_ci 525db71995Sopenharmony_cistatic const int MaxLoaderStringLength = 256; // 0xFF; 535db71995Sopenharmony_cistatic const unsigned char UTF8_ONE_BYTE_CODE = 192; // 0xC0; 545db71995Sopenharmony_cistatic const unsigned char UTF8_ONE_BYTE_MASK = 224; // 0xE0; 555db71995Sopenharmony_cistatic const unsigned char UTF8_TWO_BYTE_CODE = 224; // 0xE0; 565db71995Sopenharmony_cistatic const unsigned char UTF8_TWO_BYTE_MASK = 240; // 0xF0; 575db71995Sopenharmony_cistatic const unsigned char UTF8_THREE_BYTE_CODE = 240; // 0xF0; 585db71995Sopenharmony_cistatic const unsigned char UTF8_THREE_BYTE_MASK = 248; // 0xF8; 595db71995Sopenharmony_cistatic const unsigned char UTF8_DATA_BYTE_CODE = 128; // 0x80; 605db71995Sopenharmony_cistatic const unsigned char UTF8_DATA_BYTE_MASK = 192; // 0xC0; 615db71995Sopenharmony_ci 625db71995Sopenharmony_ci// form of all dynamic lists/arrays 635db71995Sopenharmony_ci// only the list element should be changed 645db71995Sopenharmony_cistruct loader_generic_list { 655db71995Sopenharmony_ci size_t capacity; 665db71995Sopenharmony_ci uint32_t count; 675db71995Sopenharmony_ci void *list; 685db71995Sopenharmony_ci}; 695db71995Sopenharmony_ci 705db71995Sopenharmony_cistruct loader_string_list { 715db71995Sopenharmony_ci uint32_t allocated_count; 725db71995Sopenharmony_ci uint32_t count; 735db71995Sopenharmony_ci char **list; 745db71995Sopenharmony_ci}; 755db71995Sopenharmony_ci 765db71995Sopenharmony_cistruct loader_extension_list { 775db71995Sopenharmony_ci size_t capacity; 785db71995Sopenharmony_ci uint32_t count; 795db71995Sopenharmony_ci VkExtensionProperties *list; 805db71995Sopenharmony_ci}; 815db71995Sopenharmony_ci 825db71995Sopenharmony_cistruct loader_dev_ext_props { 835db71995Sopenharmony_ci VkExtensionProperties props; 845db71995Sopenharmony_ci struct loader_string_list entrypoints; 855db71995Sopenharmony_ci}; 865db71995Sopenharmony_ci 875db71995Sopenharmony_cistruct loader_device_extension_list { 885db71995Sopenharmony_ci size_t capacity; 895db71995Sopenharmony_ci uint32_t count; 905db71995Sopenharmony_ci struct loader_dev_ext_props *list; 915db71995Sopenharmony_ci}; 925db71995Sopenharmony_ci 935db71995Sopenharmony_cistruct loader_name_value { 945db71995Sopenharmony_ci char *name; 955db71995Sopenharmony_ci char *value; 965db71995Sopenharmony_ci}; 975db71995Sopenharmony_ci 985db71995Sopenharmony_cistruct loader_layer_functions { 995db71995Sopenharmony_ci char *str_gipa; 1005db71995Sopenharmony_ci char *str_gdpa; 1015db71995Sopenharmony_ci char *str_negotiate_interface; 1025db71995Sopenharmony_ci PFN_vkNegotiateLoaderLayerInterfaceVersion negotiate_layer_interface; 1035db71995Sopenharmony_ci PFN_vkGetInstanceProcAddr get_instance_proc_addr; 1045db71995Sopenharmony_ci PFN_vkGetDeviceProcAddr get_device_proc_addr; 1055db71995Sopenharmony_ci PFN_GetPhysicalDeviceProcAddr get_physical_device_proc_addr; 1065db71995Sopenharmony_ci}; 1075db71995Sopenharmony_ci 1085db71995Sopenharmony_ci// This structure is used to store the json file version in a more manageable way. 1095db71995Sopenharmony_citypedef struct { 1105db71995Sopenharmony_ci uint16_t major; 1115db71995Sopenharmony_ci uint16_t minor; 1125db71995Sopenharmony_ci uint16_t patch; 1135db71995Sopenharmony_ci} loader_api_version; 1145db71995Sopenharmony_ci 1155db71995Sopenharmony_ci// Enumeration used to clearly identify reason for library load failure. 1165db71995Sopenharmony_cienum loader_layer_library_status { 1175db71995Sopenharmony_ci LOADER_LAYER_LIB_NOT_LOADED = 0, 1185db71995Sopenharmony_ci 1195db71995Sopenharmony_ci LOADER_LAYER_LIB_SUCCESS_LOADED = 1, 1205db71995Sopenharmony_ci 1215db71995Sopenharmony_ci LOADER_LAYER_LIB_ERROR_WRONG_BIT_TYPE = 20, 1225db71995Sopenharmony_ci LOADER_LAYER_LIB_ERROR_FAILED_TO_LOAD = 21, 1235db71995Sopenharmony_ci LOADER_LAYER_LIB_ERROR_OUT_OF_MEMORY = 22, 1245db71995Sopenharmony_ci}; 1255db71995Sopenharmony_ci 1265db71995Sopenharmony_cienum layer_type_flags { 1275db71995Sopenharmony_ci VK_LAYER_TYPE_FLAG_INSTANCE_LAYER = 0x1, // If not set, indicates Device layer 1285db71995Sopenharmony_ci VK_LAYER_TYPE_FLAG_EXPLICIT_LAYER = 0x2, // If not set, indicates Implicit layer 1295db71995Sopenharmony_ci VK_LAYER_TYPE_FLAG_META_LAYER = 0x4, // If not set, indicates standard layer 1305db71995Sopenharmony_ci}; 1315db71995Sopenharmony_ci 1325db71995Sopenharmony_cistruct loader_layer_properties { 1335db71995Sopenharmony_ci VkLayerProperties info; 1345db71995Sopenharmony_ci enum layer_type_flags type_flags; 1355db71995Sopenharmony_ci enum loader_settings_layer_control settings_control_value; 1365db71995Sopenharmony_ci 1375db71995Sopenharmony_ci uint32_t interface_version; // PFN_vkNegotiateLoaderLayerInterfaceVersion 1385db71995Sopenharmony_ci char *manifest_file_name; 1395db71995Sopenharmony_ci char *lib_name; 1405db71995Sopenharmony_ci enum loader_layer_library_status lib_status; 1415db71995Sopenharmony_ci loader_platform_dl_handle lib_handle; 1425db71995Sopenharmony_ci struct loader_layer_functions functions; 1435db71995Sopenharmony_ci struct loader_extension_list instance_extension_list; 1445db71995Sopenharmony_ci struct loader_device_extension_list device_extension_list; 1455db71995Sopenharmony_ci struct loader_name_value disable_env_var; 1465db71995Sopenharmony_ci struct loader_name_value enable_env_var; 1475db71995Sopenharmony_ci struct loader_string_list component_layer_names; 1485db71995Sopenharmony_ci struct { 1495db71995Sopenharmony_ci char *enumerate_instance_extension_properties; 1505db71995Sopenharmony_ci char *enumerate_instance_layer_properties; 1515db71995Sopenharmony_ci char *enumerate_instance_version; 1525db71995Sopenharmony_ci } pre_instance_functions; 1535db71995Sopenharmony_ci struct loader_string_list override_paths; 1545db71995Sopenharmony_ci bool is_override; 1555db71995Sopenharmony_ci bool keep; 1565db71995Sopenharmony_ci struct loader_string_list blacklist_layer_names; 1575db71995Sopenharmony_ci struct loader_string_list app_key_paths; 1585db71995Sopenharmony_ci}; 1595db71995Sopenharmony_ci 1605db71995Sopenharmony_ci// Stores a list of loader_layer_properties 1615db71995Sopenharmony_cistruct loader_layer_list { 1625db71995Sopenharmony_ci size_t capacity; 1635db71995Sopenharmony_ci uint32_t count; 1645db71995Sopenharmony_ci struct loader_layer_properties *list; 1655db71995Sopenharmony_ci}; 1665db71995Sopenharmony_ci 1675db71995Sopenharmony_ci// Stores a list of pointers to loader_layer_properties 1685db71995Sopenharmony_ci// Used for app_activated_layer_list and expanded_activated_layer_list 1695db71995Sopenharmony_cistruct loader_pointer_layer_list { 1705db71995Sopenharmony_ci size_t capacity; 1715db71995Sopenharmony_ci uint32_t count; 1725db71995Sopenharmony_ci struct loader_layer_properties **list; 1735db71995Sopenharmony_ci}; 1745db71995Sopenharmony_ci 1755db71995Sopenharmony_citypedef VkResult(VKAPI_PTR *PFN_vkDevExt)(VkDevice device); 1765db71995Sopenharmony_ci 1775db71995Sopenharmony_cistruct loader_dev_dispatch_table { 1785db71995Sopenharmony_ci VkLayerDispatchTable core_dispatch; 1795db71995Sopenharmony_ci PFN_vkDevExt ext_dispatch[MAX_NUM_UNKNOWN_EXTS]; 1805db71995Sopenharmony_ci struct loader_device_terminator_dispatch extension_terminator_dispatch; 1815db71995Sopenharmony_ci}; 1825db71995Sopenharmony_ci 1835db71995Sopenharmony_ci// per CreateDevice structure 1845db71995Sopenharmony_cistruct loader_device { 1855db71995Sopenharmony_ci struct loader_dev_dispatch_table loader_dispatch; 1865db71995Sopenharmony_ci VkDevice chain_device; // device object from the dispatch chain 1875db71995Sopenharmony_ci VkDevice icd_device; // device object from the icd 1885db71995Sopenharmony_ci struct loader_physical_device_term *phys_dev_term; 1895db71995Sopenharmony_ci 1905db71995Sopenharmony_ci VkAllocationCallbacks alloc_callbacks; 1915db71995Sopenharmony_ci 1925db71995Sopenharmony_ci // List of activated device extensions that layers support (but not necessarily the driver which have functions that require 1935db71995Sopenharmony_ci // trampolines to work correctly. EX - vkDebugMarkerSetObjectNameEXT can name wrapped handles like instance, physical device, 1945db71995Sopenharmony_ci // or surface 1955db71995Sopenharmony_ci struct { 1965db71995Sopenharmony_ci bool ext_debug_marker_enabled; 1975db71995Sopenharmony_ci bool ext_debug_utils_enabled; 1985db71995Sopenharmony_ci } layer_extensions; 1995db71995Sopenharmony_ci 2005db71995Sopenharmony_ci // List of activated device extensions that have terminators implemented in the loader 2015db71995Sopenharmony_ci struct { 2025db71995Sopenharmony_ci bool khr_swapchain_enabled; 2035db71995Sopenharmony_ci bool khr_display_swapchain_enabled; 2045db71995Sopenharmony_ci bool khr_device_group_enabled; 2055db71995Sopenharmony_ci bool ext_debug_marker_enabled; 2065db71995Sopenharmony_ci bool ext_debug_utils_enabled; 2075db71995Sopenharmony_ci bool ext_full_screen_exclusive_enabled; 2085db71995Sopenharmony_ci } driver_extensions; 2095db71995Sopenharmony_ci 2105db71995Sopenharmony_ci struct loader_device *next; 2115db71995Sopenharmony_ci 2125db71995Sopenharmony_ci // Makes vkGetDeviceProcAddr check if core functions are supported by the current app_api_version. 2135db71995Sopenharmony_ci // Only set to true if VK_KHR_maintenance5 is enabled. 2145db71995Sopenharmony_ci bool should_ignore_device_commands_from_newer_version; 2155db71995Sopenharmony_ci}; 2165db71995Sopenharmony_ci 2175db71995Sopenharmony_ci// Per ICD information 2185db71995Sopenharmony_ci 2195db71995Sopenharmony_ci// Per ICD structure 2205db71995Sopenharmony_cistruct loader_icd_term { 2215db71995Sopenharmony_ci // pointers to find other structs 2225db71995Sopenharmony_ci const struct loader_scanned_icd *scanned_icd; 2235db71995Sopenharmony_ci const struct loader_instance *this_instance; 2245db71995Sopenharmony_ci struct loader_device *logical_device_list; 2255db71995Sopenharmony_ci VkInstance instance; // instance object from the icd 2265db71995Sopenharmony_ci struct loader_icd_term_dispatch dispatch; 2275db71995Sopenharmony_ci 2285db71995Sopenharmony_ci struct loader_icd_term *next; 2295db71995Sopenharmony_ci 2305db71995Sopenharmony_ci PFN_PhysDevExt phys_dev_ext[MAX_NUM_UNKNOWN_EXTS]; 2315db71995Sopenharmony_ci bool supports_get_dev_prop_2; 2325db71995Sopenharmony_ci}; 2335db71995Sopenharmony_ci 2345db71995Sopenharmony_ci// Per ICD library structure 2355db71995Sopenharmony_cistruct loader_icd_tramp_list { 2365db71995Sopenharmony_ci size_t capacity; 2375db71995Sopenharmony_ci uint32_t count; 2385db71995Sopenharmony_ci struct loader_scanned_icd *scanned_list; 2395db71995Sopenharmony_ci}; 2405db71995Sopenharmony_ci 2415db71995Sopenharmony_cistruct loader_instance_dispatch_table { 2425db71995Sopenharmony_ci VkLayerInstanceDispatchTable layer_inst_disp; // must be first entry in structure 2435db71995Sopenharmony_ci 2445db71995Sopenharmony_ci // Physical device functions unknown to the loader 2455db71995Sopenharmony_ci PFN_PhysDevExt phys_dev_ext[MAX_NUM_UNKNOWN_EXTS]; 2465db71995Sopenharmony_ci}; 2475db71995Sopenharmony_ci 2485db71995Sopenharmony_ci// Unique magic number identifier for the loader. 2495db71995Sopenharmony_ci#define LOADER_MAGIC_NUMBER 0x10ADED010110ADEDUL 2505db71995Sopenharmony_ci 2515db71995Sopenharmony_ci// Per instance structure 2525db71995Sopenharmony_cistruct loader_instance { 2535db71995Sopenharmony_ci struct loader_instance_dispatch_table *disp; // must be first entry in structure 2545db71995Sopenharmony_ci uint64_t magic; // Should be LOADER_MAGIC_NUMBER 2555db71995Sopenharmony_ci 2565db71995Sopenharmony_ci // Store all the terminators for instance functions in case a layer queries one *after* vkCreateInstance 2575db71995Sopenharmony_ci VkLayerInstanceDispatchTable terminator_dispatch; 2585db71995Sopenharmony_ci 2595db71995Sopenharmony_ci // Vulkan API version the app is intending to use. 2605db71995Sopenharmony_ci loader_api_version app_api_version; 2615db71995Sopenharmony_ci 2625db71995Sopenharmony_ci // We need to manually track physical devices over time. If the user 2635db71995Sopenharmony_ci // re-queries the information, we don't want to delete old data or 2645db71995Sopenharmony_ci // create new data unless necessary. 2655db71995Sopenharmony_ci uint32_t total_gpu_count; 2665db71995Sopenharmony_ci uint32_t phys_dev_count_term; 2675db71995Sopenharmony_ci struct loader_physical_device_term **phys_devs_term; 2685db71995Sopenharmony_ci uint32_t phys_dev_count_tramp; 2695db71995Sopenharmony_ci struct loader_physical_device_tramp **phys_devs_tramp; 2705db71995Sopenharmony_ci 2715db71995Sopenharmony_ci // We also need to manually track physical device groups, but we don't need 2725db71995Sopenharmony_ci // loader specific structures since we have that content in the physical 2735db71995Sopenharmony_ci // device stored internal to the public structures. 2745db71995Sopenharmony_ci uint32_t phys_dev_group_count_term; 2755db71995Sopenharmony_ci struct VkPhysicalDeviceGroupProperties **phys_dev_groups_term; 2765db71995Sopenharmony_ci 2775db71995Sopenharmony_ci struct loader_instance *next; 2785db71995Sopenharmony_ci 2795db71995Sopenharmony_ci uint32_t total_icd_count; 2805db71995Sopenharmony_ci struct loader_icd_term *icd_terms; 2815db71995Sopenharmony_ci struct loader_icd_tramp_list icd_tramp_list; 2825db71995Sopenharmony_ci 2835db71995Sopenharmony_ci // Must store the strings inside loader_instance directly - since the asm code will offset into 2845db71995Sopenharmony_ci // loader_instance to get the function name 2855db71995Sopenharmony_ci uint32_t dev_ext_disp_function_count; 2865db71995Sopenharmony_ci char *dev_ext_disp_functions[MAX_NUM_UNKNOWN_EXTS]; 2875db71995Sopenharmony_ci uint32_t phys_dev_ext_disp_function_count; 2885db71995Sopenharmony_ci char *phys_dev_ext_disp_functions[MAX_NUM_UNKNOWN_EXTS]; 2895db71995Sopenharmony_ci 2905db71995Sopenharmony_ci struct loader_msg_callback_map_entry *icd_msg_callback_map; 2915db71995Sopenharmony_ci 2925db71995Sopenharmony_ci struct loader_string_list enabled_layer_names; 2935db71995Sopenharmony_ci 2945db71995Sopenharmony_ci struct loader_layer_list instance_layer_list; 2955db71995Sopenharmony_ci bool override_layer_present; 2965db71995Sopenharmony_ci 2975db71995Sopenharmony_ci // List of activated layers. 2985db71995Sopenharmony_ci // app_ is the version based on exactly what the application asked for. 2995db71995Sopenharmony_ci // This is what must be returned to the application on Enumerate calls. 3005db71995Sopenharmony_ci // expanded_ is the version based on expanding meta-layers into their 3015db71995Sopenharmony_ci // individual component layers. This is what is used internally. 3025db71995Sopenharmony_ci struct loader_pointer_layer_list app_activated_layer_list; 3035db71995Sopenharmony_ci struct loader_pointer_layer_list expanded_activated_layer_list; 3045db71995Sopenharmony_ci 3055db71995Sopenharmony_ci VkInstance instance; // layers/ICD instance returned to trampoline 3065db71995Sopenharmony_ci 3075db71995Sopenharmony_ci struct loader_extension_list ext_list; // icds and loaders extensions 3085db71995Sopenharmony_ci struct loader_instance_extension_enables enabled_known_extensions; 3095db71995Sopenharmony_ci 3105db71995Sopenharmony_ci // Stores debug callbacks - used in the log. 3115db71995Sopenharmony_ci VkLayerDbgFunctionNode *current_dbg_function_head; // Current head 3125db71995Sopenharmony_ci VkLayerDbgFunctionNode *instance_only_dbg_function_head; // Only used for instance create/destroy 3135db71995Sopenharmony_ci 3145db71995Sopenharmony_ci VkAllocationCallbacks alloc_callbacks; 3155db71995Sopenharmony_ci 3165db71995Sopenharmony_ci // Set to true after vkCreateInstance has returned - necessary for loader_gpa_instance_terminator() 3175db71995Sopenharmony_ci bool instance_finished_creation; 3185db71995Sopenharmony_ci 3195db71995Sopenharmony_ci loader_settings settings; 3205db71995Sopenharmony_ci 3215db71995Sopenharmony_ci bool portability_enumeration_enabled; 3225db71995Sopenharmony_ci bool portability_enumeration_flag_bit_set; 3235db71995Sopenharmony_ci bool portability_enumeration_extension_enabled; 3245db71995Sopenharmony_ci 3255db71995Sopenharmony_ci bool wsi_surface_enabled; 3265db71995Sopenharmony_ci#if defined(VK_USE_PLATFORM_WIN32_KHR) 3275db71995Sopenharmony_ci bool wsi_win32_surface_enabled; 3285db71995Sopenharmony_ci#endif 3295db71995Sopenharmony_ci#if defined(VK_USE_PLATFORM_WAYLAND_KHR) 3305db71995Sopenharmony_ci bool wsi_wayland_surface_enabled; 3315db71995Sopenharmony_ci#endif 3325db71995Sopenharmony_ci#if defined(VK_USE_PLATFORM_XCB_KHR) 3335db71995Sopenharmony_ci bool wsi_xcb_surface_enabled; 3345db71995Sopenharmony_ci#endif 3355db71995Sopenharmony_ci#if defined(VK_USE_PLATFORM_XLIB_KHR) 3365db71995Sopenharmony_ci bool wsi_xlib_surface_enabled; 3375db71995Sopenharmony_ci#endif 3385db71995Sopenharmony_ci#if defined(VK_USE_PLATFORM_DIRECTFB_EXT) 3395db71995Sopenharmony_ci bool wsi_directfb_surface_enabled; 3405db71995Sopenharmony_ci#endif 3415db71995Sopenharmony_ci#if defined(VK_USE_PLATFORM_ANDROID_KHR) 3425db71995Sopenharmony_ci bool wsi_android_surface_enabled; 3435db71995Sopenharmony_ci#endif 3445db71995Sopenharmony_ci#if defined(VK_USE_PLATFORM_OHOS) 3455db71995Sopenharmony_ci bool wsi_ohos_surface_enabled; 3465db71995Sopenharmony_ci#endif 3475db71995Sopenharmony_ci#if defined(VK_USE_PLATFORM_MACOS_MVK) 3485db71995Sopenharmony_ci bool wsi_macos_surface_enabled; 3495db71995Sopenharmony_ci#endif 3505db71995Sopenharmony_ci#if defined(VK_USE_PLATFORM_IOS_MVK) 3515db71995Sopenharmony_ci bool wsi_ios_surface_enabled; 3525db71995Sopenharmony_ci#endif 3535db71995Sopenharmony_ci#if defined(VK_USE_PLATFORM_GGP) 3545db71995Sopenharmony_ci bool wsi_ggp_surface_enabled; 3555db71995Sopenharmony_ci#endif 3565db71995Sopenharmony_ci bool wsi_headless_surface_enabled; 3575db71995Sopenharmony_ci#if defined(VK_USE_PLATFORM_METAL_EXT) 3585db71995Sopenharmony_ci bool wsi_metal_surface_enabled; 3595db71995Sopenharmony_ci#endif 3605db71995Sopenharmony_ci#if defined(VK_USE_PLATFORM_FUCHSIA) 3615db71995Sopenharmony_ci bool wsi_imagepipe_surface_enabled; 3625db71995Sopenharmony_ci#endif 3635db71995Sopenharmony_ci#if defined(VK_USE_PLATFORM_SCREEN_QNX) 3645db71995Sopenharmony_ci bool wsi_screen_surface_enabled; 3655db71995Sopenharmony_ci#endif 3665db71995Sopenharmony_ci#if defined(VK_USE_PLATFORM_VI_NN) 3675db71995Sopenharmony_ci bool wsi_vi_surface_enabled; 3685db71995Sopenharmony_ci#endif 3695db71995Sopenharmony_ci bool wsi_display_enabled; 3705db71995Sopenharmony_ci bool wsi_display_props2_enabled; 3715db71995Sopenharmony_ci bool create_terminator_invalid_extension; 3725db71995Sopenharmony_ci bool supports_get_dev_prop_2; 3735db71995Sopenharmony_ci}; 3745db71995Sopenharmony_ci 3755db71995Sopenharmony_ci// VkPhysicalDevice requires special treatment by loader. Firstly, terminator 3765db71995Sopenharmony_ci// code must be able to get the struct loader_icd_term to call into the proper 3775db71995Sopenharmony_ci// driver (multiple ICD/gpu case). This can be accomplished by wrapping the 3785db71995Sopenharmony_ci// created VkPhysicalDevice in loader terminate_EnumeratePhysicalDevices(). 3795db71995Sopenharmony_ci// Secondly, the loader must be able to handle wrapped by layer VkPhysicalDevice 3805db71995Sopenharmony_ci// in trampoline code. This implies, that the loader trampoline code must also 3815db71995Sopenharmony_ci// wrap the VkPhysicalDevice object in trampoline code. Thus, loader has to 3825db71995Sopenharmony_ci// wrap the VkPhysicalDevice created object twice. In trampoline code it can't 3835db71995Sopenharmony_ci// rely on the terminator object wrapping since a layer may also wrap. Since 3845db71995Sopenharmony_ci// trampoline code wraps the VkPhysicalDevice this means all loader trampoline 3855db71995Sopenharmony_ci// code that passes a VkPhysicalDevice should unwrap it. 3865db71995Sopenharmony_ci 3875db71995Sopenharmony_ci// Unique identifier for physical devices 3885db71995Sopenharmony_ci#define PHYS_TRAMP_MAGIC_NUMBER 0x10ADED020210ADEDUL 3895db71995Sopenharmony_ci 3905db71995Sopenharmony_ci// Per enumerated PhysicalDevice structure, used to wrap in trampoline code and 3915db71995Sopenharmony_ci// also same structure used to wrap in terminator code 3925db71995Sopenharmony_cistruct loader_physical_device_tramp { 3935db71995Sopenharmony_ci struct loader_instance_dispatch_table *disp; // must be first entry in structure 3945db71995Sopenharmony_ci struct loader_instance *this_instance; 3955db71995Sopenharmony_ci uint64_t magic; // Should be PHYS_TRAMP_MAGIC_NUMBER 3965db71995Sopenharmony_ci VkPhysicalDevice phys_dev; // object from layers/loader terminator 3975db71995Sopenharmony_ci}; 3985db71995Sopenharmony_ci 3995db71995Sopenharmony_ci// Per enumerated PhysicalDevice structure, used to wrap in terminator code 4005db71995Sopenharmony_cistruct loader_physical_device_term { 4015db71995Sopenharmony_ci struct loader_instance_dispatch_table *disp; // must be first entry in structure 4025db71995Sopenharmony_ci struct loader_icd_term *this_icd_term; 4035db71995Sopenharmony_ci uint8_t icd_index; 4045db71995Sopenharmony_ci VkPhysicalDevice phys_dev; // object from ICD 4055db71995Sopenharmony_ci}; 4065db71995Sopenharmony_ci 4075db71995Sopenharmony_ci#if defined(LOADER_ENABLE_LINUX_SORT) 4085db71995Sopenharmony_ci// Structure for storing the relevant device information for selecting a device. 4095db71995Sopenharmony_ci// NOTE: Needs to be defined here so we can store this content in the term structure 4105db71995Sopenharmony_ci// for quicker sorting. 4115db71995Sopenharmony_cistruct LinuxSortedDeviceInfo { 4125db71995Sopenharmony_ci // Associated Vulkan Physical Device 4135db71995Sopenharmony_ci VkPhysicalDevice physical_device; 4145db71995Sopenharmony_ci bool default_device; 4155db71995Sopenharmony_ci 4165db71995Sopenharmony_ci // Loader specific items about the driver providing support for this physical device 4175db71995Sopenharmony_ci uint32_t icd_index; 4185db71995Sopenharmony_ci struct loader_icd_term *icd_term; 4195db71995Sopenharmony_ci 4205db71995Sopenharmony_ci // Some generic device properties 4215db71995Sopenharmony_ci VkPhysicalDeviceType device_type; 4225db71995Sopenharmony_ci char device_name[VK_MAX_PHYSICAL_DEVICE_NAME_SIZE]; 4235db71995Sopenharmony_ci uint32_t vendor_id; 4245db71995Sopenharmony_ci uint32_t device_id; 4255db71995Sopenharmony_ci 4265db71995Sopenharmony_ci // PCI information on this device 4275db71995Sopenharmony_ci bool has_pci_bus_info; 4285db71995Sopenharmony_ci uint32_t pci_domain; 4295db71995Sopenharmony_ci uint32_t pci_bus; 4305db71995Sopenharmony_ci uint32_t pci_device; 4315db71995Sopenharmony_ci uint32_t pci_function; 4325db71995Sopenharmony_ci}; 4335db71995Sopenharmony_ci#endif // LOADER_ENABLE_LINUX_SORT 4345db71995Sopenharmony_ci 4355db71995Sopenharmony_ci// Per enumerated PhysicalDeviceGroup structure, used to wrap in terminator code 4365db71995Sopenharmony_cistruct loader_physical_device_group_term { 4375db71995Sopenharmony_ci struct loader_icd_term *this_icd_term; 4385db71995Sopenharmony_ci uint8_t icd_index; 4395db71995Sopenharmony_ci VkPhysicalDeviceGroupProperties group_props; 4405db71995Sopenharmony_ci#if defined(LOADER_ENABLE_LINUX_SORT) 4415db71995Sopenharmony_ci struct LinuxSortedDeviceInfo internal_device_info[VK_MAX_DEVICE_GROUP_SIZE]; 4425db71995Sopenharmony_ci#endif // LOADER_ENABLE_LINUX_SORT 4435db71995Sopenharmony_ci}; 4445db71995Sopenharmony_ci 4455db71995Sopenharmony_cistruct loader_struct { 4465db71995Sopenharmony_ci struct loader_instance *instances; 4475db71995Sopenharmony_ci}; 4485db71995Sopenharmony_ci 4495db71995Sopenharmony_cistruct loader_scanned_icd { 4505db71995Sopenharmony_ci char *lib_name; 4515db71995Sopenharmony_ci loader_platform_dl_handle handle; 4525db71995Sopenharmony_ci uint32_t api_version; 4535db71995Sopenharmony_ci uint32_t interface_version; 4545db71995Sopenharmony_ci PFN_vkGetInstanceProcAddr GetInstanceProcAddr; 4555db71995Sopenharmony_ci PFN_GetPhysicalDeviceProcAddr GetPhysicalDeviceProcAddr; 4565db71995Sopenharmony_ci PFN_vkCreateInstance CreateInstance; 4575db71995Sopenharmony_ci PFN_vkEnumerateInstanceExtensionProperties EnumerateInstanceExtensionProperties; 4585db71995Sopenharmony_ci#if defined(VK_USE_PLATFORM_WIN32_KHR) 4595db71995Sopenharmony_ci PFN_vk_icdEnumerateAdapterPhysicalDevices EnumerateAdapterPhysicalDevices; 4605db71995Sopenharmony_ci#endif 4615db71995Sopenharmony_ci}; 4625db71995Sopenharmony_ci 4635db71995Sopenharmony_cienum loader_data_files_type { 4645db71995Sopenharmony_ci LOADER_DATA_FILE_MANIFEST_DRIVER = 0, 4655db71995Sopenharmony_ci LOADER_DATA_FILE_MANIFEST_EXPLICIT_LAYER, 4665db71995Sopenharmony_ci LOADER_DATA_FILE_MANIFEST_IMPLICIT_LAYER, 4675db71995Sopenharmony_ci LOADER_DATA_FILE_NUM_TYPES // Not a real field, used for possible loop terminator 4685db71995Sopenharmony_ci}; 4695db71995Sopenharmony_ci 4705db71995Sopenharmony_cistruct loader_icd_physical_devices { 4715db71995Sopenharmony_ci uint32_t device_count; 4725db71995Sopenharmony_ci VkPhysicalDevice *physical_devices; 4735db71995Sopenharmony_ci uint32_t icd_index; 4745db71995Sopenharmony_ci struct loader_icd_term *icd_term; 4755db71995Sopenharmony_ci#if defined(WIN32) 4765db71995Sopenharmony_ci LUID windows_adapter_luid; 4775db71995Sopenharmony_ci#endif 4785db71995Sopenharmony_ci}; 4795db71995Sopenharmony_ci 4805db71995Sopenharmony_cistruct loader_msg_callback_map_entry { 4815db71995Sopenharmony_ci VkDebugReportCallbackEXT icd_obj; 4825db71995Sopenharmony_ci VkDebugReportCallbackEXT loader_obj; 4835db71995Sopenharmony_ci}; 4845db71995Sopenharmony_ci 4855db71995Sopenharmony_citypedef enum loader_filter_string_type { 4865db71995Sopenharmony_ci FILTER_STRING_FULLNAME = 0, 4875db71995Sopenharmony_ci FILTER_STRING_SUBSTRING, 4885db71995Sopenharmony_ci FILTER_STRING_PREFIX, 4895db71995Sopenharmony_ci FILTER_STRING_SUFFIX, 4905db71995Sopenharmony_ci FILTER_STRING_SPECIAL, 4915db71995Sopenharmony_ci} loader_filter_string_type; 4925db71995Sopenharmony_ci 4935db71995Sopenharmony_cistruct loader_envvar_filter_value { 4945db71995Sopenharmony_ci char value[VK_MAX_EXTENSION_NAME_SIZE]; 4955db71995Sopenharmony_ci size_t length; 4965db71995Sopenharmony_ci loader_filter_string_type type; 4975db71995Sopenharmony_ci}; 4985db71995Sopenharmony_ci 4995db71995Sopenharmony_ci#define MAX_ADDITIONAL_FILTERS 16 5005db71995Sopenharmony_cistruct loader_envvar_filter { 5015db71995Sopenharmony_ci uint32_t count; 5025db71995Sopenharmony_ci struct loader_envvar_filter_value filters[MAX_ADDITIONAL_FILTERS]; 5035db71995Sopenharmony_ci}; 5045db71995Sopenharmony_cistruct loader_envvar_disable_layers_filter { 5055db71995Sopenharmony_ci struct loader_envvar_filter additional_filters; 5065db71995Sopenharmony_ci bool disable_all; 5075db71995Sopenharmony_ci bool disable_all_implicit; 5085db71995Sopenharmony_ci bool disable_all_explicit; 5095db71995Sopenharmony_ci}; 5105db71995Sopenharmony_ci 5115db71995Sopenharmony_cistruct loader_envvar_all_filters { 5125db71995Sopenharmony_ci struct loader_envvar_filter enable_filter; 5135db71995Sopenharmony_ci struct loader_envvar_disable_layers_filter disable_filter; 5145db71995Sopenharmony_ci struct loader_envvar_filter allow_filter; 5155db71995Sopenharmony_ci}; 516