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