/* * * Copyright (c) 2023 The Khronos Group Inc. * Copyright (c) 2023 Valve Corporation * Copyright (c) 2023 LunarG, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * * Author: Charles Giessen <[email protected]> * */ #pragma once #include <stdio.h> #include <stddef.h> #include <stdbool.h> #include <stdint.h> #include "vulkan/vulkan_core.h" #include "log.h" struct loader_instance; struct loader_layer_list; struct loader_pointer_layer_list; struct loader_envvar_all_filters; log_configuration; loader_settings_layer_control; // If a loader_settings_layer_configuration has a name of loader_settings_unknown_layers_location, then it specifies that the // layer configuration it was found in shall be the location all layers not listed in the settings file that are enabled. #define LOADER_SETTINGS_UNKNOWN_LAYERS_LOCATION … #define LOADER_SETTINGS_MAX_NAME_SIZE … loader_settings_layer_configuration; loader_settings; // Call this function to get the current settings that the loader should use. // It will open up the current loader settings file and return a loader_settings in out_loader_settings if it. // It should be called on every call to the global functions excluding vkGetInstanceProcAddr // Caller is responsible for cleaning up by calling free_loader_settings() VkResult get_loader_settings(const struct loader_instance* inst, loader_settings* out_loader_settings); void free_loader_settings(const struct loader_instance* inst, loader_settings* loader_settings); // Log the settings to the console void log_settings(const struct loader_instance* inst, loader_settings* settings); // Every global function needs to call this at startup to insure that VkResult update_global_loader_settings(void); // Needs to be called during startup - void init_global_loader_settings(void); void teardown_global_loader_settings(void); // Check the global settings and return true if msg_type does not correspond to the active global loader settings bool should_skip_logging_global_messages(VkFlags msg_type); // Query the current settings (either global or per-instance) and return the list of layers contained within. // should_search_for_other_layers tells the caller if the settings file should be used exclusively for layer searching or not VkResult get_settings_layers(const struct loader_instance* inst, struct loader_layer_list* settings_layers, bool* should_search_for_other_layers); // Take the provided list of settings_layers and add in the layers from regular search paths // Only adds layers that aren't already present in the settings_layers and in the location of the // layer configuration with LOADER_SETTINGS_LAYER_UNORDERED_LAYER_LOCATION set VkResult combine_settings_layers_with_regular_layers(const struct loader_instance* inst, struct loader_layer_list* settings_layers, struct loader_layer_list* regular_layers, struct loader_layer_list* output_layers); // Fill out activated_layer_list with the layers that should be activated, based on environment variables, VkInstanceCreateInfo, and // the settings VkResult enable_correct_layers_from_settings(const struct loader_instance* inst, const struct loader_envvar_all_filters* filters, uint32_t app_enabled_name_count, const char* const* app_enabled_names, const struct loader_layer_list* instance_layers, struct loader_pointer_layer_list* target_layer_list, struct loader_pointer_layer_list* activated_layer_list);