From 77265b14a6e1896a6c79665f7c50f95170c14d13 Mon Sep 17 00:00:00 2001 From: Christophe Date: Tue, 24 Mar 2026 16:19:34 +0100 Subject: [PATCH] vkconfig: Refactor layers tab and improve UI consistency --- vkconfig_cmd/main_layers.cpp | 25 +- vkconfig_core/configuration.cpp | 2 +- vkconfig_core/json.cpp | 10 +- vkconfig_core/layer.cpp | 32 +- vkconfig_core/layer.h | 23 +- vkconfig_core/layer_manager.cpp | 473 ++- vkconfig_core/layer_manager.h | 33 +- vkconfig_core/registry.cpp | 26 +- vkconfig_core/registry.h | 4 +- vkconfig_core/test/test_configuration.cpp | 46 +- .../test/test_configuration_built_in.cpp | 10 +- .../test/test_configuration_manager.cpp | 26 +- vkconfig_core/test/test_generate_settings.cpp | 3 +- vkconfig_core/test/test_layer.cpp | 32 +- vkconfig_core/test/test_layer_manager.cpp | 136 +- vkconfig_core/test/test_layer_preset.cpp | 10 +- vkconfig_core/test/test_parameter.cpp | 113 +- vkconfig_core/type_layers_paths.cpp | 18 +- vkconfig_core/type_layers_paths.h | 2 + vkconfig_core/type_tab.cpp | 2 +- vkconfig_gui/CHANGELOG.md | 7 + vkconfig_gui/mainwindow.cpp | 32 + vkconfig_gui/mainwindow.ui | 2748 +++++++++-------- vkconfig_gui/tab_applications.cpp | 12 +- vkconfig_gui/tab_configurations.cpp | 16 +- vkconfig_gui/tab_configurations.h | 1 + vkconfig_gui/tab_diagnostics.cpp | 27 +- vkconfig_gui/tab_diagnostics.h | 1 + vkconfig_gui/tab_drivers.cpp | 107 +- vkconfig_gui/tab_drivers.h | 7 + vkconfig_gui/tab_layers.cpp | 170 +- vkconfig_gui/tab_layers.h | 7 +- vkconfig_gui/tab_preferences.cpp | 15 +- vkconfig_gui/tab_preferences.h | 1 + vkconfig_gui/widget_tab_driver_path.cpp | 4 +- vkconfig_gui/widget_tab_layers_path.cpp | 51 +- vkconfig_gui/widget_tab_layers_path.h | 9 +- 37 files changed, 2207 insertions(+), 2034 deletions(-) diff --git a/vkconfig_cmd/main_layers.cpp b/vkconfig_cmd/main_layers.cpp index ad3ba9995b..674844bed7 100644 --- a/vkconfig_cmd/main_layers.cpp +++ b/vkconfig_cmd/main_layers.cpp @@ -87,22 +87,21 @@ static int RunLayersSurrender(Configurator& configurator, const CommandLine& com } static int RunLayersPath(Configurator& configurator, const CommandLine& command_line) { - printf("vkconfig: [INFO] Paths to find Vulkan Layers\n"); + printf("vkconfig: [INFO] Vulkan Layers paths:\n"); - for (int layers_paths_index = 0, layers_paths_count = LAYERS_PATHS_COUNT; layers_paths_index < layers_paths_count; - ++layers_paths_index) { - const std::vector& paths = configurator.layers.paths[layers_paths_index]; - printf("\n%s:\n", GetLabel(static_cast(layers_paths_index))); + const std::set& layer_display_list = configurator.layers.BuildLayerDisplayList(); - if (paths.empty()) { - printf(" - None\n"); - } else { - for (std::size_t i = 0, n = paths.size(); i < n; ++i) { - if (paths[i].enabled) { - printf(" - %s\n", paths[i].path.AbsolutePath().c_str()); - } - } + for (auto it = layer_display_list.begin(), end = layer_display_list.end(); it != end; ++it) { + const Layer* layer = configurator.layers.FindFromManifest(it->manifest_path, true); + if (layer == nullptr) { + continue; } + + const std::string status = layer->status == STATUS_STABLE ? "" : format(" (%s)", ::GetToken(layer->status)); + const std::string text = format("%s - %s%s, %s layer", layer->key.c_str(), layer->api_version.str().c_str(), status.c_str(), + ::GetToken(layer->type)); + + printf(" - %s\n", text.c_str()); } return 0; diff --git a/vkconfig_core/configuration.cpp b/vkconfig_core/configuration.cpp index 7656778023..2bbb65f16b 100644 --- a/vkconfig_core/configuration.cpp +++ b/vkconfig_core/configuration.cpp @@ -173,7 +173,7 @@ bool Configuration::Load(const Path& full_path, const LayerManager& layers) { if (layer != nullptr) { parameter.manifest = layer->manifest_path; - parameter.type = layer->type; + // parameter.type = layer->type; } if (parameter.api_version != Version::LATEST) { diff --git a/vkconfig_core/json.cpp b/vkconfig_core/json.cpp index 044079cf93..20af9301f7 100644 --- a/vkconfig_core/json.cpp +++ b/vkconfig_core/json.cpp @@ -25,12 +25,12 @@ #include -QJsonDocument ParseJsonFile(const char* file) { - QFile file_schema(file); - const bool result = file_schema.open(QIODevice::ReadOnly | QIODevice::Text); +QJsonDocument ParseJsonFile(const char* path) { + QFile file(path); + const bool result = file.open(QIODevice::ReadOnly | QIODevice::Text); if (result) { - const QString& data = file_schema.readAll(); - file_schema.close(); + const QString& data = file.readAll(); + file.close(); QJsonParseError json_parse_error; const QJsonDocument& json_document = QJsonDocument::fromJson(data.toUtf8(), &json_parse_error); diff --git a/vkconfig_core/layer.cpp b/vkconfig_core/layer.cpp index 919eb811bf..a1cb6238e9 100644 --- a/vkconfig_core/layer.cpp +++ b/vkconfig_core/layer.cpp @@ -49,11 +49,9 @@ #include #include -bool operator<(const LayersPathInfo& a, const LayersPathInfo& b) { return a.path.RelativePath() < b.path.RelativePath(); } - -bool Found(const std::vector& data, const Path& path) { +bool Found(const std::vector& data, const Path& path) { for (std::size_t i = 0, n = data.size(); i < n; ++i) { - if (data[i].path == path) { + if (data[i] == path) { return true; } } @@ -179,7 +177,7 @@ void Layer::FillPresetSettings(SettingDataSet& settings_data, const std::vector< } LayerLoadStatus Layer::Load(const Path& full_path_to_file, LayerType type, bool request_validate_manifest, - const std::map& layers_found, ConfiguratorMode configurator_mode) { + ConfiguratorMode configurator_mode) { this->type = type; // Set layer type, no way to know this from the json file if (full_path_to_file.Empty()) { @@ -197,13 +195,6 @@ LayerLoadStatus Layer::Load(const Path& full_path_to_file, LayerType type, bool this->manifest_path = full_path_to_file; this->last_modified = full_path_to_file.LastModified(); - auto it = layers_found.find(full_path_to_file.AbsolutePath().c_str()); - if (it != layers_found.end()) { - if (it->second.disabled && it->second.last_modified == this->last_modified) { - return LAYER_LOAD_FAILED; - } - } - // Convert the text to a JSON document & validate it. // It does need to be a valid json formatted file. QJsonParseError json_parse_error; @@ -252,7 +243,7 @@ LayerLoadStatus Layer::Load(const Path& full_path_to_file, LayerType type, bool this->key = ReadStringValue(json_layer_object, "name"); - if (this->key == "VK_LAYER_LUNARG_override") { + if (this->key == "VK_LAYER_LUNARG_override" || !(this->key.rfind("VK_", 0) == 0)) { return LAYER_LOAD_IGNORED; } @@ -260,12 +251,7 @@ LayerLoadStatus Layer::Load(const Path& full_path_to_file, LayerType type, bool JsonValidator validator; - std::string cached_last_modified; - if (it != layers_found.end()) { - cached_last_modified = it->second.last_modified; - } - const bool should_validate = request_validate_manifest && ((last_modified != cached_last_modified) || !it->second.validated); - const bool is_valid = should_validate ? validator.Check(json_text) : true; + const bool is_valid = request_validate_manifest ? validator.Check(json_text) : true; if (!is_valid) { switch (configurator_mode) { @@ -407,6 +393,14 @@ LayerLoadStatus Layer::Load(const Path& full_path_to_file, LayerType type, bool return this->IsValid() ? LAYER_LOAD_ADDED : LAYER_LOAD_INVALID; // Not all JSON file are layer JSON valid } +bool operator<(const Layer& layer_a, const Layer& layer_b) { + if (layer_a.key == layer_b.key) { + return layer_a.api_version < layer_b.api_version; + } else { + return layer_a.key < layer_b.key; + } +} + void CollectDefaultSettingData(const SettingMetaSet& meta_set, SettingDataSet& data_set) { for (std::size_t i = 0, n = meta_set.size(); i < n; ++i) { SettingMeta* setting_meta = meta_set[i]; diff --git a/vkconfig_core/layer.h b/vkconfig_core/layer.h index 8380149405..c4b64734b2 100644 --- a/vkconfig_core/layer.h +++ b/vkconfig_core/layer.h @@ -36,21 +36,15 @@ #include #include -struct LayerStatus { +struct LayerDescriptor { + LayerType type = LAYER_TYPE_EXPLICIT; std::string last_modified; bool validated = false; - bool disabled = false; -}; - -struct LayersPathInfo { - Path path; - LayerType type = LAYER_TYPE_EXPLICIT; bool enabled = true; + bool added = false; }; -bool operator<(const LayersPathInfo& a, const LayersPathInfo& b); - -bool Found(const std::vector& data, const Path& path); +bool Found(const std::vector& data, const Path& path); enum LayerLoadStatus { LAYER_LOAD_ADDED = 0, @@ -64,8 +58,8 @@ enum LayerLoadStatus { LAYER_LOAD_LAST = LAYER_LOAD_IGNORED, }; -inline bool IsDisabled(LayerLoadStatus status) { - return status == LAYER_LOAD_FAILED || status == LAYER_LOAD_INVALID || status == LAYER_LOAD_IGNORED; +inline bool IsEnabled(LayerLoadStatus status) { + return !(status == LAYER_LOAD_FAILED || status == LAYER_LOAD_INVALID || status == LAYER_LOAD_IGNORED); } enum { LAYER_LOAD_COUNT = LAYER_LOAD_LAST - LAYER_LOAD_FIRST + 1 }; @@ -115,13 +109,12 @@ class Layer { std::string enable_env; std::string enable_value; bool is_32bits = false; - bool enabled = true; std::vector settings; std::vector presets; LayerLoadStatus Load(const Path& full_path_to_file, LayerType type, bool request_validate_manifest, - const std::map& layers_found, ConfiguratorMode configurator_mode); + ConfiguratorMode configurator_mode); private: Layer& operator=(const Layer&) = delete; @@ -129,4 +122,6 @@ class Layer { std::vector > memory; // Settings are deleted when all layers instances are deleted. }; +bool operator<(const Layer& layer_a, const Layer& layer_b); + void CollectDefaultSettingData(const SettingMetaSet& meta_set, SettingDataSet& data_set); diff --git a/vkconfig_core/layer_manager.cpp b/vkconfig_core/layer_manager.cpp index 84ac360960..8c5e3cdb0b 100644 --- a/vkconfig_core/layer_manager.cpp +++ b/vkconfig_core/layer_manager.cpp @@ -25,36 +25,34 @@ #include -std::vector GetEnvVariablePaths(const char *variable_name, LayerType type) { - std::vector result; +static std::vector GetEnvVariablePaths(const char *variable_name, LayerType type) { + std::vector result; const char *SEPARATOR = GetToken(PARSE_ENV_VAR); const std::vector &paths = UniqueStrings(Split(qgetenv(variable_name).toStdString(), SEPARATOR)); result.resize(paths.size()); for (std::size_t i = 0, n = paths.size(); i < n; ++i) { - result[i].path = paths[i]; - result[i].enabled = true; - result[i].type = type; + result[i] = paths[i]; } return result; } -std::vector GetImplicitLayerPaths() { - std::vector result; +static std::vector GetImplicitLayerPaths() { + std::vector result; #if VKC_ENV == VKC_ENV_WIN32 - const std::vector &admin_registry_paths = + const std::vector &admin_registry_paths = LoadRegistrySoftwareLayers("HKEY_LOCAL_MACHINE\\Software\\Khronos\\Vulkan\\ImplicitLayers", LAYER_TYPE_IMPLICIT); result.insert(result.begin(), admin_registry_paths.begin(), admin_registry_paths.end()); - const std::vector &user_registry_paths = + const std::vector &user_registry_paths = LoadRegistrySoftwareLayers("HKEY_CURRENT_USER\\Software\\Khronos\\Vulkan\\ImplicitLayers", LAYER_TYPE_IMPLICIT); result.insert(result.begin(), user_registry_paths.begin(), user_registry_paths.end()); // Search for drivers specific layers - const std::vector &drivers_registry_paths = + const std::vector &drivers_registry_paths = LoadRegistrySystemLayers("HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Class\\...\\VulkanImplicitLayers"); result.insert(result.begin(), drivers_registry_paths.begin(), drivers_registry_paths.end()); #else @@ -89,32 +87,25 @@ std::vector GetImplicitLayerPaths() { paths.push_back(LAYERS_PATHS[i]); } } - - for (std::size_t i = 0, n = paths.size(); i < n; ++i) { - LayersPathInfo info; - info.type = LAYER_TYPE_IMPLICIT; - info.path = paths[i]; - result.push_back(info); - } #endif return result; } -std::vector GetExplicitLayerPaths() { - std::vector result; +std::vector GetExplicitLayerPaths() { + std::vector result; #if VKC_ENV == VKC_ENV_WIN32 - const std::vector &admin_registry_paths = + const std::vector &admin_registry_paths = LoadRegistrySoftwareLayers("HKEY_LOCAL_MACHINE\\Software\\Khronos\\Vulkan\\ExplicitLayers", LAYER_TYPE_EXPLICIT); result.insert(result.begin(), admin_registry_paths.begin(), admin_registry_paths.end()); - const std::vector &user_registry_paths = + const std::vector &user_registry_paths = LoadRegistrySoftwareLayers("HKEY_CURRENT_USER\\Software\\Khronos\\Vulkan\\ExplicitLayers", LAYER_TYPE_EXPLICIT); result.insert(result.begin(), user_registry_paths.begin(), user_registry_paths.end()); // Search for drivers specific layers - const std::vector &drivers_registry_paths = + const std::vector &drivers_registry_paths = LoadRegistrySystemLayers("HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Class\\...\\VulkanExplicitLayers"); result.insert(result.begin(), drivers_registry_paths.begin(), drivers_registry_paths.end()); #else @@ -149,39 +140,23 @@ std::vector GetExplicitLayerPaths() { paths.push_back(LAYERS_PATHS[i]); } } - - for (std::size_t i = 0, n = paths.size(); i < n; ++i) { - LayersPathInfo info; - info.type = LAYER_TYPE_EXPLICIT; - info.path = paths[i]; - result.push_back(info); - } #endif return result; } -static LayersPathInfo *FindPathInfo(std::array, LAYERS_PATHS_COUNT> &paths, const std::string &path) { - for (int paths_type_index = LAYERS_PATHS_FIRST; paths_type_index <= LAYERS_PATHS_LAST; ++paths_type_index) { - for (std::size_t i = 0, n = paths[paths_type_index].size(); i < n; ++i) { - if (paths[paths_type_index][i].path == path) { - return &paths[paths_type_index][i]; - } - } - } - - return nullptr; -} - -LayerManager::LayerManager() { this->InitSystemPaths(); } +LayerManager::LayerManager() {} bool LayerManager::Load(const QJsonObject &json_root_object, ConfiguratorMode configurator_mode) { + this->available_layers.clear(); + this->layers_found.clear(); + // LAYERS_PATHS_GUI if (json_root_object.value("layers") != QJsonValue::Undefined) { const QJsonObject &json_layers_object = json_root_object.value("layers").toObject(); - if (json_layers_object.value("last_layers_path") != QJsonValue::Undefined) { - this->last_layers_path = json_layers_object.value("last_layers_path").toString().toStdString(); + if (json_layers_object.value("last_layers_dir") != QJsonValue::Undefined) { + this->last_layers_dir = json_layers_object.value("last_layers_dir").toString().toStdString(); } if (json_layers_object.value("validate_manifests") != QJsonValue::Undefined) { @@ -195,26 +170,26 @@ bool LayerManager::Load(const QJsonObject &json_root_object, ConfiguratorMode co for (int i = 0, n = json_layers_found_keys.length(); i < n; ++i) { const QJsonObject &json_status_object = json_layers_found_object.value(json_layers_found_keys[i]).toObject(); - LayerStatus layer_status; - layer_status.last_modified = json_status_object.value("last_modified").toString().toStdString(); - layer_status.validated = json_status_object.value("validated").toBool(); - layer_status.disabled = json_status_object.value("disabled").toBool(); + LayerDescriptor descriptor; + if (json_status_object.value("type") != QJsonValue::Undefined) { + descriptor.type = ::GetLayerType(json_status_object.value("type").toString().toStdString().c_str()); + } + descriptor.last_modified = json_status_object.value("last_modified").toString().toStdString(); + descriptor.validated = json_status_object.value("validated").toBool(); + if (json_status_object.value("enabled") != QJsonValue::Undefined) { + descriptor.enabled = json_status_object.value("enabled").toBool(); + } const Path &manifest_path = json_layers_found_keys[i].toStdString(); - this->layers_found.insert(std::make_pair(manifest_path, layer_status)); + this->layers_found.insert(std::make_pair(manifest_path, descriptor)); } } - if (json_layers_object.value("paths") != QJsonValue::Undefined) { - const QJsonObject &json_paths_object = json_layers_object.value("paths").toObject(); - const QStringList &json_paths_keys = json_paths_object.keys(); - - for (int i = 0, n = json_paths_keys.length(); i < n; ++i) { - LayersPathInfo info; - info.path = json_paths_keys[i].toStdString(); - info.enabled = json_paths_object.value(json_paths_keys[i].toStdString().c_str()).toBool(); - this->AppendPath(info); + if (json_layers_object.value("removed") != QJsonValue::Undefined) { + const QJsonArray &array = json_layers_object.value("removed").toArray(); + for (int i = 0, n = array.size(); i < n; ++i) { + this->layers_removed.insert(array[i].toString().toStdString()); } } } @@ -225,30 +200,26 @@ bool LayerManager::Load(const QJsonObject &json_root_object, ConfiguratorMode co } bool LayerManager::Save(QJsonObject &json_root_object) const { - QJsonObject json_layers_status_object; + QJsonObject json_layers_found_object; for (auto it = this->layers_found.begin(); it != this->layers_found.end(); ++it) { - QJsonObject json_layer_status_object; - json_layer_status_object.insert("last_modified", it->second.last_modified.c_str()); - json_layer_status_object.insert("validated", it->second.validated); - json_layer_status_object.insert("disabled", it->second.disabled); - json_layers_status_object.insert(it->first.AbsolutePath().c_str(), json_layer_status_object); + QJsonObject object; + object.insert("last_modified", it->second.last_modified.c_str()); + object.insert("type", ::GetToken(it->second.type)); + object.insert("validated", it->second.validated); + object.insert("enabled", it->second.enabled); + json_layers_found_object.insert(it->first.AbsolutePath().c_str(), object); } - QJsonObject json_paths_object; - for (int paths_type_index = LAYERS_PATHS_FIRST; paths_type_index <= LAYERS_PATHS_LAST; ++paths_type_index) { - const std::vector &path_infos = this->paths[paths_type_index]; - - for (std::size_t i = 0, n = path_infos.size(); i < n; ++i) { - json_paths_object.insert(path_infos[i].path.RelativePath().c_str(), path_infos[i].enabled); - } + QJsonArray json_layers_removed_array; + for (auto it = this->layers_removed.begin(); it != this->layers_removed.end(); ++it) { + json_layers_removed_array.append(it->AbsolutePath().c_str()); } QJsonObject json_layers_object; json_layers_object.insert("validate_manifests", this->validate_manifests); - json_layers_object.insert("last_layers_path", this->last_layers_path.RelativePath().c_str()); - json_layers_object.insert("found", json_layers_status_object); - json_layers_object.insert("paths", json_paths_object); - + json_layers_object.insert("last_layers_dir", this->last_layers_dir.RelativePath().c_str()); + json_layers_object.insert("found", json_layers_found_object); + json_layers_object.insert("removed", json_layers_removed_array); json_root_object.insert("layers", json_layers_object); return true; @@ -257,48 +228,43 @@ bool LayerManager::Save(QJsonObject &json_root_object) const { std::string LayerManager::Log() const { std::string log; - for (std::size_t group_index = 0, group_count = this->paths.size(); group_index < group_count; ++group_index) { - const std::vector &paths_group = this->paths[group_index]; - if (paths_group.empty()) { - log += format(" %d. %s paths:\n", group_index + 1, ::GetLabel(static_cast(group_index))); - log += format(" - None\n"); + for (std::size_t i = 0, n = this->available_layers.size(); i < n; ++i) { + const Layer *layer = &this->available_layers[i]; + + auto it = this->layers_found.find(layer->manifest_path); + if (it == this->layers_found.end()) { + assert(0); + continue; + } + + const LayerDescriptor &descriptor = it->second; + + if (descriptor.type == LAYER_TYPE_IMPLICIT) { + log += format(" * %s - %s (Auto: %s)", layer->key.c_str(), layer->api_version.str().c_str(), + GetLabel(layer->GetActualControl())); } else { - log += format(" %d. %s paths:\n", group_index + 1, ::GetLabel(static_cast(group_index))); + log += format(" * %s - %s", layer->key.c_str(), layer->api_version.str().c_str()); } - for (std::size_t path_index = 0, path_count = paths_group.size(); path_index < path_count; ++path_index) { - log += format(" - %s (%s)\n", paths_group[path_index].path.AbsolutePath().c_str(), - paths_group[path_index].enabled ? "Enabled" : "Disabled"); + if (layer->status != STATUS_STABLE) { + log += format(" (%s)", GetToken(layer->status)); + } + log += "\n"; - const std::vector layers = this->GatherLayers(paths_group[path_index]); + log += format(" %s\n", layer->manifest_path.AbsolutePath().c_str()); + log += "\n"; - for (std::size_t i = 0, n = layers.size(); i < n; ++i) { - if (layers[i]->type == LAYER_TYPE_IMPLICIT) { - log += format(" * %s - %s (Auto: %s)", layers[i]->key.c_str(), layers[i]->api_version.str().c_str(), - GetLabel(layers[i]->GetActualControl())); + if (descriptor.type == LAYER_TYPE_IMPLICIT) { + if (!layer->disable_env.empty()) { + const std::string &value = qEnvironmentVariableIsSet(layer->disable_env.c_str()) ? "set" : "not set"; + log += format(" '%s' is %s\n", layer->disable_env.c_str(), value.c_str()); + } + if (!layer->enable_env.empty()) { + if (qEnvironmentVariableIsSet(layer->enable_env.c_str())) { + const std::string &value = qgetenv(layer->enable_env.c_str()).toStdString(); + log += format(" '%s' is set to '%s'\n", layer->enable_env.c_str(), value.c_str()); } else { - log += format(" * %s - %s", layers[i]->key.c_str(), layers[i]->api_version.str().c_str()); - } - - if (layers[i]->status != STATUS_STABLE) { - log += format(" (%s)", GetToken(layers[i]->status)); - } - log += "\n"; - - if (layers[i]->type == LAYER_TYPE_IMPLICIT) { - if (!layers[i]->disable_env.empty()) { - const std::string &value = qEnvironmentVariableIsSet(layers[i]->disable_env.c_str()) ? "set" : "not set"; - log += format(" '%s' is %s\n", layers[i]->disable_env.c_str(), value.c_str()); - } - if (!layers[i]->enable_env.empty()) { - if (qEnvironmentVariableIsSet(layers[i]->enable_env.c_str())) { - const std::string &value = qgetenv(layers[i]->enable_env.c_str()).toStdString(); - log += format(" '%s' is set to '%s'\n", layers[i]->enable_env.c_str(), value.c_str()); - } else { - log += format(" '%s' is not set to '%s'\n", layers[i]->enable_env.c_str(), - layers[i]->enable_value.c_str()); - } - } + log += format(" '%s' is not set to '%s'\n", layer->enable_env.c_str(), layer->enable_value.c_str()); } } } @@ -309,57 +275,25 @@ std::string LayerManager::Log() const { return log; } -void LayerManager::InitSystemPaths() { - this->available_layers.clear(); - this->layers_found.clear(); - - this->paths[LAYERS_PATHS_IMPLICIT_SYSTEM] = GetImplicitLayerPaths(); - - // LAYERS_PATHS_IMPLICIT_ENV_SET: VK_IMPLICIT_LAYER_PATH env variables - this->paths[LAYERS_PATHS_IMPLICIT_ENV_SET] = GetEnvVariablePaths("VK_IMPLICIT_LAYER_PATH", LAYER_TYPE_IMPLICIT); - - // LAYERS_PATHS_IMPLICIT_ENV_ADD: VK_ADD_IMPLICIT_LAYER_PATH env variables - this->paths[LAYERS_PATHS_IMPLICIT_ENV_ADD] = GetEnvVariablePaths("VK_ADD_IMPLICIT_LAYER_PATH", LAYER_TYPE_IMPLICIT); - - // LAYERS_PATHS_EXPLICIT_SYSTEM - this->paths[LAYERS_PATHS_EXPLICIT_SYSTEM] = GetExplicitLayerPaths(); - - // LAYERS_PATHS_EXPLICIT_ENV_SET: VK_LAYER_PATH env variables - this->paths[LAYERS_PATHS_EXPLICIT_ENV_SET] = GetEnvVariablePaths("VK_LAYER_PATH", LAYER_TYPE_EXPLICIT); - - // LAYERS_PATHS_EXPLICIT_ENV_ADD: VK_ADD_LAYER_PATH env variables - this->paths[LAYERS_PATHS_EXPLICIT_ENV_ADD] = GetEnvVariablePaths("VK_ADD_LAYER_PATH", LAYER_TYPE_EXPLICIT); - - // LAYERS_PATHS_GUI - this->paths[LAYERS_PATHS_GUI].clear(); - - // LAYERS_PATHS_SDK - this->paths[LAYERS_PATHS_SDK].clear(); - { - LayersPathInfo info; - info.path = Path(Path::SDK_EXPLICIT_LAYERS); - info.enabled = true; - this->paths[LAYERS_PATHS_SDK].push_back(info); - } -} - void LayerManager::Clear() { this->available_layers.clear(); } bool LayerManager::Empty() const { return this->available_layers.empty(); } std::size_t LayerManager::Size() const { return this->available_layers.size(); } -std::vector LayerManager::GatherManifests(const std::string &layer_name) const { +std::vector LayerManager::GatherManifests(const std::string &layer_key) const { std::vector result; for (std::size_t i = 0, n = this->available_layers.size(); i < n; ++i) { - if (!this->available_layers[i].enabled) { + if (this->available_layers[i].key != layer_key) { continue; } - if (this->available_layers[i].key == layer_name) { - result.push_back(this->available_layers[i].manifest_path); + if (!this->IsEnabled(this->available_layers[i].manifest_path)) { + continue; } + + result.push_back(this->available_layers[i].manifest_path); } std::sort(result.rbegin(), result.rend()); @@ -367,17 +301,19 @@ std::vector LayerManager::GatherManifests(const std::string &layer_name) c return result; } -std::vector LayerManager::GatherVersions(const std::string &layer_name) const { +std::vector LayerManager::GatherVersions(const std::string &layer_key) const { std::vector result; for (std::size_t i = 0, n = this->available_layers.size(); i < n; ++i) { - if (!this->available_layers[i].enabled) { + if (this->available_layers[i].key != layer_key) { continue; } - if (this->available_layers[i].key == layer_name) { - result.push_back(this->available_layers[i].api_version); + if (!this->IsEnabled(this->available_layers[i].manifest_path)) { + continue; } + + result.push_back(this->available_layers[i].api_version); } std::sort(result.rbegin(), result.rend()); @@ -422,15 +358,17 @@ const Layer *LayerManager::FindLastModified(const std::string &layer_name, const const Layer *result = nullptr; for (std::size_t i = 0, n = this->available_layers.size(); i < n; ++i) { - if (this->available_layers[i].enabled == false) { - continue; - } if (this->available_layers[i].key != layer_name) { continue; } if (this->available_layers[i].api_version != version) { continue; } + + if (!this->IsEnabled(this->available_layers[i].manifest_path)) { + continue; + } + if (result != nullptr) { if (result->last_modified > this->available_layers[i].last_modified) { continue; @@ -445,8 +383,10 @@ const Layer *LayerManager::FindLastModified(const std::string &layer_name, const const Layer *LayerManager::FindFromManifest(const Path &manifest_path, bool find_disabled_layers) const { for (std::size_t i = 0, n = this->available_layers.size(); i < n; ++i) { - if (!find_disabled_layers && this->available_layers[i].enabled == false) { - continue; + if (!find_disabled_layers) { + if (!this->IsEnabled(this->available_layers[i].manifest_path)) { + continue; + } } if (this->available_layers[i].manifest_path == manifest_path) { @@ -458,8 +398,10 @@ const Layer *LayerManager::FindFromManifest(const Path &manifest_path, bool find Layer *LayerManager::FindFromManifest(const Path &manifest_path, bool find_disabled_layers) { for (std::size_t i = 0, n = this->available_layers.size(); i < n; ++i) { - if (!find_disabled_layers && this->available_layers[i].enabled == false) { - continue; + if (!find_disabled_layers) { + if (!this->IsEnabled(this->available_layers[i].manifest_path)) { + continue; + } } if (this->available_layers[i].manifest_path == manifest_path) { @@ -471,24 +413,44 @@ Layer *LayerManager::FindFromManifest(const Path &manifest_path, bool find_disab // Find all installed layers on the system. void LayerManager::LoadAllInstalledLayers(ConfiguratorMode configurator_mode) { - this->available_layers.clear(); + std::array, LAYERS_PATHS_COUNT> paths; + + // Search new layers + paths[LAYERS_PATHS_IMPLICIT_SYSTEM] = GetImplicitLayerPaths(); + + // LAYERS_PATHS_IMPLICIT_ENV_SET: VK_IMPLICIT_LAYER_PATH env variables + paths[LAYERS_PATHS_IMPLICIT_ENV_SET] = GetEnvVariablePaths("VK_IMPLICIT_LAYER_PATH", LAYER_TYPE_IMPLICIT); + + // LAYERS_PATHS_IMPLICIT_ENV_ADD: VK_ADD_IMPLICIT_LAYER_PATH env variables + paths[LAYERS_PATHS_IMPLICIT_ENV_ADD] = GetEnvVariablePaths("VK_ADD_IMPLICIT_LAYER_PATH", LAYER_TYPE_IMPLICIT); + + // LAYERS_PATHS_EXPLICIT_SYSTEM + paths[LAYERS_PATHS_EXPLICIT_SYSTEM] = GetExplicitLayerPaths(); + + // LAYERS_PATHS_EXPLICIT_ENV_SET: VK_LAYER_PATH env variables + paths[LAYERS_PATHS_EXPLICIT_ENV_SET] = GetEnvVariablePaths("VK_LAYER_PATH", LAYER_TYPE_EXPLICIT); + + // LAYERS_PATHS_EXPLICIT_ENV_ADD: VK_ADD_LAYER_PATH env variables + paths[LAYERS_PATHS_EXPLICIT_ENV_ADD] = GetEnvVariablePaths("VK_ADD_LAYER_PATH", LAYER_TYPE_EXPLICIT); + + // LAYERS_PATHS_SDK + paths[LAYERS_PATHS_SDK].push_back(Path(Path::SDK_EXPLICIT_LAYERS)); - for (std::size_t group_index = 0, group_count = this->paths.size(); group_index < group_count; ++group_index) { + for (std::size_t group_index = 0, group_count = paths.size(); group_index < group_count; ++group_index) { const LayersPaths layers_path = static_cast(group_index); - const std::vector &paths_group = this->paths[group_index]; + const std::vector &paths_group = paths[group_index]; for (std::size_t i = 0, n = paths_group.size(); i < n; ++i) { - this->LoadLayersFromPath(paths_group[i].path, paths_group[i].type, configurator_mode); - this->UpdatePathEnabled(paths_group[i], layers_path); + const std::vector &layers_paths = ::CollectFilePaths(paths_group[i]); + + for (std::size_t p = 0, o = layers_paths.size(); p < o; ++p) { + this->AppendPath(layers_paths[p], ::GetLayerType(layers_path)); + } } } -} - -void LayerManager::LoadLayersFromPath(const Path &layers_path, LayerType type, ConfiguratorMode configurator_mode) { - const std::vector &layers_paths = CollectFilePaths(layers_path); - for (std::size_t i = 0, n = layers_paths.size(); i < n; ++i) { - this->LoadLayer(layers_paths[i], type, configurator_mode); + for (auto it = this->layers_found.begin(); it != this->layers_found.end(); ++it) { + this->LoadLayer(it->first, it->second.type, configurator_mode); } } @@ -506,134 +468,81 @@ LayerLoadStatus LayerManager::LoadLayer(const Path &layer_path, LayerType type, } // Modified to reload - LayerLoadStatus status = - already_loaded_layer->Load(layer_path, type, this->validate_manifests, this->layers_found, configurator_mode); + LayerLoadStatus status = already_loaded_layer->Load(layer_path, type, this->validate_manifests, configurator_mode); if (status == LAYER_LOAD_ADDED) { it->second.last_modified = already_loaded_layer->last_modified; return LAYER_LOAD_RELOADED; } else { - it->second.disabled = IsDisabled(status); + // it->second.enabled = ::IsEnabled(status); return status; } } else { Layer layer; - LayerLoadStatus status = layer.Load(layer_path, type, this->validate_manifests, this->layers_found, configurator_mode); + LayerLoadStatus status = layer.Load(layer_path, type, this->validate_manifests, configurator_mode); if (status == LAYER_LOAD_ADDED) { this->available_layers.push_back(layer); } auto it = this->layers_found.find(layer_path); + // assert(it != this->layers_found.end()); if (it != layers_found.end()) { - it->second.disabled = IsDisabled(status); - it->second.validated = this->validate_manifests && !it->second.disabled; + // it->second.enabled = ::IsEnabled(status); + // it->second.validated = this->validate_manifests && it->second.enabled; it->second.last_modified = layer.last_modified; } else { - LayerStatus found; - found.disabled = IsDisabled(status); - found.validated = this->validate_manifests && !found.disabled; - found.last_modified = layer.last_modified; - this->layers_found.insert(std::make_pair(layer.manifest_path, found)); + LayerDescriptor descriptor; + descriptor.type = layer.type; + descriptor.last_modified = layer.last_modified; + descriptor.validated = this->validate_manifests; + descriptor.enabled = true; + descriptor.added = true; + layers_found.insert(std::make_pair(layer.manifest_path, descriptor)); } return status; } } -bool LayerManager::AreLayersEnabled(const LayersPathInfo &path_info) const { - for (int paths_type_index = LAYERS_PATHS_FIRST; paths_type_index <= LAYERS_PATHS_LAST; ++paths_type_index) { - for (std::size_t i = 0, n = this->paths[paths_type_index].size(); i < n; ++i) { - if (this->paths[paths_type_index][i].path == path_info.path) { - if (this->paths[paths_type_index][i].enabled) { - return true; // If one path is enabled, then the layer remains enable - } - } +void LayerManager::AppendPath(const Path &path, LayerType type, bool added) { + if (added) { + auto it_removed = this->layers_removed.find(path); + if (it_removed != this->layers_removed.end()) { + this->layers_removed.erase(it_removed); } } - return false; -} - -void LayerManager::AppendPath(const LayersPathInfo &info) { - LayersPathInfo *existing_info = FindPathInfo(this->paths, info.path.RelativePath()); - if (existing_info != nullptr) { - existing_info->enabled = info.enabled; - } else { - this->paths[LAYERS_PATHS_GUI].push_back(info); + if (this->layers_removed.find(path) != this->layers_removed.end()) { + return; } - std::sort(this->paths[LAYERS_PATHS_GUI].begin(), this->paths[LAYERS_PATHS_GUI].end()); -} - -void LayerManager::RemovePath(const LayersPathInfo &path_info) { - const std::vector &layers_paths = CollectFilePaths(path_info.path); - - for (std::size_t i = 0, n = layers_paths.size(); i < n; ++i) { - Layer *layer = this->FindFromManifest(layers_paths[i]); - if (layer == nullptr) { - continue; - } - - layer->enabled = false; - } - - for (int paths_type_index = LAYERS_PATHS_FIRST; paths_type_index <= LAYERS_PATHS_LAST; ++paths_type_index) { - std::vector new_path_list; - for (std::size_t i = 0, n = this->paths[paths_type_index].size(); i < n; ++i) { - if (path_info.path == this->paths[paths_type_index][i].path) { - continue; - } - - new_path_list.push_back(this->paths[paths_type_index][i]); - } - this->paths[paths_type_index] = new_path_list; - } -} - -void LayerManager::UpdatePathEnabled(const LayersPathInfo &path_info, LayersPaths paths_type_index) { - for (std::size_t i = 0, n = this->paths[paths_type_index].size(); i < n; ++i) { - if (path_info.path == this->paths[paths_type_index][i].path) { - this->paths[paths_type_index][i].enabled = path_info.enabled; - break; - } - } - - this->UpdateLayersEnabled(path_info); -} - -void LayerManager::UpdateLayersEnabled(const LayersPathInfo &path_info) { - const bool are_enabled = this->AreLayersEnabled(path_info); - - const std::vector &layers_paths = ::CollectFilePaths(path_info.path); - - for (std::size_t i = 0, n = layers_paths.size(); i < n; ++i) { - Layer *layer = this->FindFromManifest(layers_paths[i], true); - if (layer == nullptr) { - continue; - } - - layer->enabled = are_enabled; + auto it = this->layers_found.find(path); + if (it == this->layers_found.end()) { + LayerDescriptor descriptor; + descriptor.type = type; + descriptor.added = added; + descriptor.last_modified = path.LastModified(); + this->layers_found.insert(std::make_pair(path, descriptor)); } } -std::vector LayerManager::CollectManifestPaths() const { - std::vector results; - - for (int paths_type_index = LAYERS_PATHS_FIRST; paths_type_index <= LAYERS_PATHS_LAST; ++paths_type_index) { - for (std::size_t i = 0, n = this->paths[paths_type_index].size(); i < n; ++i) { - const std::vector &layers_paths = ::CollectFilePaths(this->paths[paths_type_index][i].path); - results.insert(results.end(), layers_paths.begin(), layers_paths.end()); - } +void LayerManager::RemovePath(const Path &path) { + auto it_found = this->layers_found.find(path); + if (it_found != this->layers_found.end()) { + this->layers_found.erase(it_found); } - return results; + this->layers_removed.insert(path); } std::vector LayerManager::GatherLayerNames() const { std::vector result; for (std::size_t i = 0, n = this->available_layers.size(); i < n; ++i) { - if (this->available_layers[i].enabled == false) { - continue; + auto it = this->layers_found.find(this->available_layers[i].manifest_path); + if (it != this->layers_found.end()) { + if (!it->second.enabled) { + continue; + } } if (std::find(result.begin(), result.end(), this->available_layers[i].key) != result.end()) { @@ -646,17 +555,45 @@ std::vector LayerManager::GatherLayerNames() const { return result; } -std::vector LayerManager::GatherLayers(const LayersPathInfo &path_info) const { - std::vector result; +bool LayerManager::IsEnabled(const Path &manifest_path) const { + auto it = this->layers_found.find(manifest_path); + if (it != this->layers_found.end()) { + return it->second.enabled; + } + return false; +} - for (std::size_t i = 0, n = this->available_layers.size(); i < n; ++i) { - const std::string &layer_path = path_info.path.AbsolutePath(); - const std::string ¤t_layer_path = this->available_layers[i].manifest_path.AbsolutePath(); - if (current_layer_path.find(layer_path) == std::string::npos) { +void LayerManager::Enable(const Path &manifest_path, bool enabled) { + auto it = this->layers_found.find(manifest_path); + if (it != this->layers_found.end()) { + it->second.enabled = enabled; + } +} + +bool operator<(const LayerDisplay &a, const LayerDisplay &b) { + if (a.key == b.key) { + return a.api_version < b.api_version; + } else { + return a.key < b.key; + } +} + +std::set LayerManager::BuildLayerDisplayList() const { + std::set result; + + for (auto it = this->layers_found.begin(), end = this->layers_found.end(); it != end; ++it) { + const Layer *layer = this->FindFromManifest(it->first, true); + if (layer == nullptr) { continue; } - result.push_back(&this->available_layers[i]); + LayerDisplay layer_display; + layer_display.key = layer->key; + layer_display.manifest_path = it->first; + layer_display.api_version = layer->api_version; + layer_display.descriptor = it->second; + + result.insert(layer_display); } return result; diff --git a/vkconfig_core/layer_manager.h b/vkconfig_core/layer_manager.h index 888c608c15..b0fd537861 100644 --- a/vkconfig_core/layer_manager.h +++ b/vkconfig_core/layer_manager.h @@ -28,6 +28,16 @@ #include #include #include +#include + +struct LayerDisplay { + std::string key; + Path manifest_path; + Version api_version; + LayerDescriptor descriptor; +}; + +bool operator<(const LayerDisplay& a, const LayerDisplay& b); class LayerManager : public Serialize { public: @@ -49,26 +59,23 @@ class LayerManager : public Serialize { Layer* FindFromManifest(const Path& manifest_path, bool find_disabled_layers = false); void LoadAllInstalledLayers(ConfiguratorMode configurator_mode); - void LoadLayersFromPath(const Path& layers_path, LayerType type, ConfiguratorMode configurator_mode); LayerLoadStatus LoadLayer(const Path& layer_path, LayerType type, ConfiguratorMode configurator_mode); - bool AreLayersEnabled(const LayersPathInfo& path_info) const; - void AppendPath(const LayersPathInfo& path_info); - void RemovePath(const LayersPathInfo& path_info); - void UpdatePathEnabled(const LayersPathInfo& path_info, LayersPaths layers_paths); - std::vector CollectManifestPaths() const; + void AppendPath(const Path& path, LayerType type, bool added = false); + void RemovePath(const Path& path); + + bool IsEnabled(const Path& manifest_path) const; + void Enable(const Path& manifest_path, bool enabled); + + std::set BuildLayerDisplayList() const; std::vector GatherLayerNames() const; - std::vector GatherLayers(const LayersPathInfo& path_info) const; std::vector available_layers; - std::array, LAYERS_PATHS_COUNT> paths; - Path last_layers_path = Path(Path::HOME); + Path last_layers_dir = Path(Path::HOME); bool validate_manifests = false; + std::map layers_found; private: - void InitSystemPaths(); - void UpdateLayersEnabled(const LayersPathInfo& path_info); - - std::map layers_found; + std::set layers_removed; }; diff --git a/vkconfig_core/registry.cpp b/vkconfig_core/registry.cpp index 4ffb93fe31..444672860c 100644 --- a/vkconfig_core/registry.cpp +++ b/vkconfig_core/registry.cpp @@ -82,7 +82,7 @@ void RemoveRegistryEntriesForLayers() { } /// Look for device specific layers -static void LoadDeviceRegistry(DEVINST id, const QString &entry, std::vector &layers_paths) { +static void LoadDeviceRegistry(DEVINST id, const QString &entry, std::vector &layers_paths) { HKEY key; if (CM_Open_DevNode_Key(id, KEY_QUERY_VALUE, 0, RegDisposition_OpenExisting, &key, CM_REGISTRY_SOFTWARE) != CR_SUCCESS) return; @@ -102,11 +102,7 @@ static void LoadDeviceRegistry(DEVINST id, const QString &entry, std::vector LoadRegistrySystemLayers(const char *input_path) { - std::vector layers_paths; +std::vector LoadRegistrySystemLayers(const char *input_path) { + std::vector layers_paths; QString path(input_path); @@ -202,27 +198,25 @@ std::vector LoadRegistrySystemLayers(const char *input_path) { return layers_paths; } -std::vector LoadRegistrySoftwareLayers(const char *path, LayerType type) { - std::vector result; +std::vector LoadRegistrySoftwareLayers(const char *path, LayerType type) { + std::vector result; QSettings settings(path, QSettings::NativeFormat); const QStringList &files = settings.allKeys(); for (int i = 0, n = files.size(); i < n; ++i) { Path path(files[i].toStdString()); - LayersPathInfo info; - info.type = type; - info.path = path.IsFile() ? path.AbsoluteDir() : path.AbsolutePath(); + Path manifest_path = path.IsFile() ? path.AbsoluteDir() : path.AbsolutePath(); - if (!path.Exists()) { + if (!manifest_path.Exists()) { continue; } - if (::Found(result, info.path)) { + if (::Found(result, manifest_path)) { continue; } - result.push_back(info); + result.push_back(manifest_path); } return result; diff --git a/vkconfig_core/registry.h b/vkconfig_core/registry.h index 735dd836f4..8a1bdc5810 100644 --- a/vkconfig_core/registry.h +++ b/vkconfig_core/registry.h @@ -33,8 +33,8 @@ void AppendRegistryEntriesForLayers(QString override_file, QString settings_file void RemoveRegistryEntriesForLayers(); -std::vector LoadRegistrySystemLayers(const char* path); +std::vector LoadRegistrySystemLayers(const char* path); -std::vector LoadRegistrySoftwareLayers(const char* path, LayerType type); +std::vector LoadRegistrySoftwareLayers(const char* path, LayerType type); #endif // VKC_ENV == VKC_ENV_WIN32 diff --git a/vkconfig_core/test/test_configuration.cpp b/vkconfig_core/test/test_configuration.cpp index 8008de56f0..5d1c485bb1 100644 --- a/vkconfig_core/test/test_configuration.cpp +++ b/vkconfig_core/test/test_configuration.cpp @@ -27,6 +27,14 @@ #include +static void InitLayer(LayerManager& layer_manager) { + const std::vector& layers_paths = ::CollectFilePaths(":/layers"); + + for (std::size_t i = 0, n = layers_paths.size(); i < n; ++i) { + layer_manager.LoadLayer(layers_paths[i], LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + } +} + static bool operator==(const Configuration& a, const Configuration& b) { if (a.key != b.key) return false; @@ -194,7 +202,7 @@ TEST(test_configuration, make_duplicate_tagged_name_mix) { TEST(test_configuration, create) { LayerManager layer_manager; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(layer_manager); Configuration configuration = Configuration::Create(layer_manager, "New Configuration"); @@ -214,7 +222,7 @@ TEST(test_configuration, create) { TEST(test_configuration, create_disabled) { LayerManager layer_manager; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(layer_manager); Configuration configuration = Configuration::CreateDisabled(layer_manager); @@ -234,7 +242,7 @@ TEST(test_configuration, create_disabled) { TEST(test_configuration, SwitchLayerVersion) { LayerManager layer_manager; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(layer_manager); Configuration configuration = Configuration::Create(layer_manager, "New Configuration"); for (std::size_t i = 0, n = configuration.parameters.size(); i < n; ++i) { @@ -261,7 +269,7 @@ TEST(test_configuration, SwitchLayerVersion) { TEST(test_configuration, gather_parameters_exist) { LayerManager layer_manager; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(layer_manager); Configuration configuration; configuration.key = "New Configuration"; @@ -294,7 +302,7 @@ TEST(test_configuration, gather_parameters_exist) { TEST(test_configuration, gather_parameters_repeat) { LayerManager layer_manager; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(layer_manager); Configuration configuration; configuration.key = "New Configuration"; @@ -324,11 +332,11 @@ TEST(test_configuration, gather_parameters_repeat) { TEST(test_configuration, gather_parameters_missing) { LayerManager layer_manager; + ::InitLayer(layer_manager); Configuration configuration; configuration.key = "New Configuration"; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); configuration.GatherParameters(layer_manager); layer_manager.Clear(); @@ -361,11 +369,11 @@ TEST(test_configuration, gather_parameters_missing) { TEST(test_configuration, HasMissingLayer_UnsupportPlatform) { LayerManager layer_manager; + ::InitLayer(layer_manager); Configuration configuration; configuration.key = "New Configuration"; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); configuration.GatherParameters(layer_manager); layer_manager.Clear(); @@ -381,11 +389,11 @@ TEST(test_configuration, HasMissingLayer_UnsupportPlatform) { TEST(test_configuration, HasMissingLayer_Off) { LayerManager layer_manager; + ::InitLayer(layer_manager); Configuration configuration; configuration.key = "New Configuration"; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); configuration.GatherParameters(layer_manager); layer_manager.Clear(); @@ -401,11 +409,11 @@ TEST(test_configuration, HasMissingLayer_Off) { TEST(test_configuration, gather_parameters_missing_but_unsupported_platform) { LayerManager layer_manager; + ::InitLayer(layer_manager); Configuration configuration; configuration.key = "New Configuration"; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); configuration.GatherParameters(layer_manager); layer_manager.Clear(); @@ -421,7 +429,7 @@ TEST(test_configuration, gather_parameters_missing_but_unsupported_platform) { TEST(test_configuration, Reorder_full) { LayerManager layer_manager; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(layer_manager); Configuration configuration = Configuration::Create(layer_manager, "New Configuration"); @@ -457,7 +465,7 @@ TEST(test_configuration, Reorder_full) { TEST(test_configuration, Reorder_partial) { LayerManager layer_manager; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(layer_manager); Configuration configuration = Configuration::Create(layer_manager, "New Configuration"); @@ -485,7 +493,7 @@ TEST(test_configuration, Reorder_partial) { TEST(test_configuration, Reorder_missing) { LayerManager layer_manager; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(layer_manager); Configuration configuration = Configuration::Create(layer_manager, "New Configuration"); @@ -515,7 +523,7 @@ TEST(test_configuration, Reorder_missing) { TEST(test_configuration, Reorder_empty) { LayerManager layer_manager; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(layer_manager); Configuration configuration = Configuration::Create(layer_manager, "New Configuration"); std::size_t size = configuration.parameters.size(); @@ -527,19 +535,19 @@ TEST(test_configuration, Reorder_empty) { } TEST(test_configuration, IsDefault_True) { - LayerManager layers; - layers.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + LayerManager layer_manager; + ::InitLayer(layer_manager); Configuration configuration; - const bool loaded = configuration.Load(":/configurations/Validation.json", layers); + const bool loaded = configuration.Load(":/configurations/Validation.json", layer_manager); EXPECT_TRUE(loaded); EXPECT_TRUE(configuration.IsDefault()); } TEST(test_configuration, IsDefault_False) { - LayerManager layers; - layers.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + LayerManager layer_manager; + ::InitLayer(layer_manager); - Configuration configuration = Configuration::Create(layers, "New Configuration"); + Configuration configuration = Configuration::Create(layer_manager, "New Configuration"); EXPECT_FALSE(configuration.IsDefault()); } diff --git a/vkconfig_core/test/test_configuration_built_in.cpp b/vkconfig_core/test/test_configuration_built_in.cpp index 94fcc8ab05..a0099f0edf 100644 --- a/vkconfig_core/test/test_configuration_built_in.cpp +++ b/vkconfig_core/test/test_configuration_built_in.cpp @@ -55,11 +55,17 @@ static bool operator==(const Parameter& a, const Parameter& b) { static bool operator!=(const std::vector& a, const std::vector& b) { return !(a == b); } -std::map Dummy() { return std::map(); } +static void InitLayer(LayerManager& layer_manager) { + const std::vector& layers_paths = ::CollectFilePaths(":/sdk"); + + for (std::size_t i = 0, n = layers_paths.size(); i < n; ++i) { + layer_manager.LoadLayer(layers_paths[i], LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + } +} struct TestBuilin { TestBuilin() : layer_manager() { - this->layer_manager.LoadLayersFromPath(":/sdk", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(this->layer_manager); EXPECT_TRUE(!this->layer_manager.available_layers.empty()); } diff --git a/vkconfig_core/test/test_configuration_manager.cpp b/vkconfig_core/test/test_configuration_manager.cpp index d7e9e754ca..94c35bd7a0 100644 --- a/vkconfig_core/test/test_configuration_manager.cpp +++ b/vkconfig_core/test/test_configuration_manager.cpp @@ -22,6 +22,14 @@ #include +static void InitLayer(LayerManager& layer_manager, const char* dir) { + const std::vector& layers_paths = ::CollectFilePaths(dir); + + for (std::size_t i = 0, n = layers_paths.size(); i < n; ++i) { + layer_manager.LoadLayer(layers_paths[i], LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + } +} + TEST(test_configuration_manager, init_default) { ConfigurationManager configuration_manager; @@ -35,7 +43,7 @@ TEST(test_configuration_manager, init_default) { TEST(test_configuration_manager, create_remove) { LayerManager layer_manager; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(layer_manager, ":/layers"); ConfigurationManager configuration_manager; @@ -67,7 +75,7 @@ TEST(test_configuration_manager, create_remove) { TEST(test_configuration_manager, duplicate_names) { LayerManager layer_manager; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(layer_manager, ":/layers"); ConfigurationManager configuration_manager; @@ -93,7 +101,7 @@ TEST(test_configuration_manager, duplicate_names) { TEST(test_configuration_manager, duplicate_object) { LayerManager layer_manager; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(layer_manager, ":/layers"); ConfigurationManager configuration_manager; @@ -117,7 +125,7 @@ TEST(test_configuration_manager, duplicate_object) { TEST(test_configuration_manager, sort) { LayerManager layer_manager; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(layer_manager, ":/layers"); ConfigurationManager configuration_manager; @@ -138,7 +146,7 @@ TEST(test_configuration_manager, sort) { TEST(test_configuration_manager, default_configuration) { LayerManager layer_manager; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(layer_manager, ":/layers"); ConfigurationManager configuration_manager; configuration_manager.LoadDefaultConfigurations(layer_manager); @@ -149,7 +157,7 @@ TEST(test_configuration_manager, default_configuration) { TEST(test_configuration_manager, RenameConfiguration) { LayerManager layer_manager; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(layer_manager, ":/layers"); ConfigurationManager configuration_manager; configuration_manager.LoadDefaultConfigurations(layer_manager); @@ -172,7 +180,7 @@ TEST(test_configuration_manager, RenameConfiguration) { TEST(test_configuration_manager, SaveConfiguration) { LayerManager layer_manager; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(layer_manager, ":/layers"); ConfigurationManager configuration_manager; EXPECT_TRUE(configuration_manager.Empty()); @@ -202,7 +210,7 @@ TEST(test_configuration_manager, SaveConfiguration) { TEST(test_configuration_manager, ExportImport) { LayerManager layer_manager; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(layer_manager, ":/layers"); ConfigurationManager configuration_manager; configuration_manager.LoadDefaultConfigurations(layer_manager); @@ -237,7 +245,7 @@ TEST(test_configuration_manager, UpdateConfigurations) { EXPECT_STREQ(missing_layers_init[0].c_str(), "VK_LAYER_KHRONOS_validation"); EXPECT_EQ(2, configuration_init->parameters.size()); - layer_manager.LoadLayersFromPath(":/sdk", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(layer_manager, ":/sdk"); configuration_manager.UpdateConfigurations(layer_manager); std::size_t count_update = configuration_manager.available_configurations.size(); diff --git a/vkconfig_core/test/test_generate_settings.cpp b/vkconfig_core/test/test_generate_settings.cpp index d8adb545cb..309a709f4d 100644 --- a/vkconfig_core/test/test_generate_settings.cpp +++ b/vkconfig_core/test/test_generate_settings.cpp @@ -42,8 +42,7 @@ Configurator& GetTestConfigurator() { path.Create(); Configurator& configurator = Configurator::Get(); - configurator.layers.LoadLayersFromPath(":/layers/VK_LAYER_LUNARG_reference_1_2_1.json", LAYER_TYPE_EXPLICIT, - CONFIGURATOR_MODE_CMD); + configurator.layers.LoadLayer(":/layers/VK_LAYER_LUNARG_reference_1_2_1.json", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); configurator.configurations.CreateConfiguration(configurator.layers, "configuration"); configurator.SetActiveConfigurationName("configuration"); return configurator; diff --git a/vkconfig_core/test/test_layer.cpp b/vkconfig_core/test/test_layer.cpp index ccac948d2c..fad75dc56f 100644 --- a/vkconfig_core/test/test_layer.cpp +++ b/vkconfig_core/test/test_layer.cpp @@ -36,8 +36,6 @@ static SettingMetaString* InstantiateString(Layer& layer, const std::string& key return static_cast(layer.Instantiate(layer.settings, key, SETTING_STRING)); } -static std::map Dummy() { return std::map(); } - TEST(test_layer, collect_settings) { Layer layer; @@ -61,7 +59,7 @@ TEST(test_layer, collect_settings) { TEST(test_layer, load_header_overridden) { Layer layer; const LayerLoadStatus load_loaded = - layer.Load(":/layers/VK_LAYER_LUNARG_test_00.json", LAYER_TYPE_EXPLICIT, false, Dummy(), CONFIGURATOR_MODE_CMD); + layer.Load(":/layers/VK_LAYER_LUNARG_test_00.json", LAYER_TYPE_EXPLICIT, false, CONFIGURATOR_MODE_CMD); EXPECT_EQ(load_loaded, LAYER_LOAD_ADDED); EXPECT_EQ(Version(1, 2, 0), layer.file_format_version); @@ -76,7 +74,6 @@ TEST(test_layer, load_header_overridden) { EXPECT_EQ(true, layer.enable_env.empty()); EXPECT_EQ(true, layer.enable_value.empty()); EXPECT_EQ(false, layer.is_32bits); - EXPECT_EQ(true, layer.enabled); EXPECT_STREQ("${LUNARG_SDK}/layer_dummy.html", layer.url.RelativePath(false).c_str()); EXPECT_TRUE(layer.settings.empty()); EXPECT_TRUE(layer.presets.empty()); @@ -85,7 +82,7 @@ TEST(test_layer, load_header_overridden) { TEST(test_layer, load_header_default) { Layer layer; const LayerLoadStatus load_loaded = - layer.Load(":/layers/VK_LAYER_LUNARG_test_01.json", LAYER_TYPE_EXPLICIT, false, Dummy(), CONFIGURATOR_MODE_CMD); + layer.Load(":/layers/VK_LAYER_LUNARG_test_01.json", LAYER_TYPE_EXPLICIT, false, CONFIGURATOR_MODE_CMD); EXPECT_EQ(load_loaded, LAYER_LOAD_ADDED); EXPECT_EQ(Version(1, 2, 0), layer.file_format_version); @@ -104,7 +101,7 @@ TEST(test_layer, load_header_default) { TEST(test_layer, load_header_override) { Layer layer; const LayerLoadStatus load_loaded = - layer.Load(":/layers/VK_LAYER_LUNARG_test_02.json", LAYER_TYPE_EXPLICIT, false, Dummy(), CONFIGURATOR_MODE_CMD); + layer.Load(":/layers/VK_LAYER_LUNARG_test_02.json", LAYER_TYPE_EXPLICIT, false, CONFIGURATOR_MODE_CMD); EXPECT_EQ(load_loaded, LAYER_LOAD_ADDED); EXPECT_EQ(Version(1, 2, 0), layer.file_format_version); @@ -117,7 +114,7 @@ TEST(test_layer, load_header_override) { TEST(test_layer, load_setting_interit) { Layer layer; const LayerLoadStatus load_loaded = - layer.Load(":/layers/VK_LAYER_LUNARG_test_03.json", LAYER_TYPE_EXPLICIT, false, Dummy(), CONFIGURATOR_MODE_CMD); + layer.Load(":/layers/VK_LAYER_LUNARG_test_03.json", LAYER_TYPE_EXPLICIT, false, CONFIGURATOR_MODE_CMD); EXPECT_EQ(load_loaded, LAYER_LOAD_ADDED); EXPECT_EQ(Version(1, 2, 0), layer.file_format_version); @@ -140,7 +137,7 @@ TEST(test_layer, load_setting_interit) { TEST(test_layer, load_preset_interit) { Layer layer; const LayerLoadStatus load_loaded = - layer.Load(":/layers/VK_LAYER_LUNARG_test_04.json", LAYER_TYPE_EXPLICIT, false, Dummy(), CONFIGURATOR_MODE_CMD); + layer.Load(":/layers/VK_LAYER_LUNARG_test_04.json", LAYER_TYPE_EXPLICIT, false, CONFIGURATOR_MODE_CMD); EXPECT_EQ(load_loaded, LAYER_LOAD_ADDED); EXPECT_EQ(Version(1, 2, 0), layer.file_format_version); @@ -158,7 +155,7 @@ TEST(test_layer, load_preset_interit) { EXPECT_EQ(STATUS_ALPHA, layer.presets[2].status); const LayerLoadStatus reloaded = - layer.Load(":/layers/VK_LAYER_LUNARG_test_04.json", LAYER_TYPE_EXPLICIT, false, Dummy(), CONFIGURATOR_MODE_CMD); + layer.Load(":/layers/VK_LAYER_LUNARG_test_04.json", LAYER_TYPE_EXPLICIT, false, CONFIGURATOR_MODE_CMD); EXPECT_EQ(reloaded, LAYER_LOAD_ADDED); EXPECT_EQ(1, layer.settings.size()); EXPECT_EQ(3, layer.presets.size()); @@ -167,7 +164,7 @@ TEST(test_layer, load_preset_interit) { TEST(test_layer, load_setting_children_interit) { Layer layer; const LayerLoadStatus load_loaded = - layer.Load(":/layers/VK_LAYER_LUNARG_test_05.json", LAYER_TYPE_EXPLICIT, false, Dummy(), CONFIGURATOR_MODE_CMD); + layer.Load(":/layers/VK_LAYER_LUNARG_test_05.json", LAYER_TYPE_EXPLICIT, false, CONFIGURATOR_MODE_CMD); EXPECT_EQ(load_loaded, LAYER_LOAD_ADDED); EXPECT_EQ(Version(1, 2, 0), layer.file_format_version); @@ -191,7 +188,7 @@ TEST(test_layer, load_setting_children_interit) { TEST(test_layer, load_setting_enum_interit) { Layer layer; const LayerLoadStatus load_loaded = - layer.Load(":/layers/VK_LAYER_LUNARG_test_06.json", LAYER_TYPE_EXPLICIT, false, Dummy(), CONFIGURATOR_MODE_CMD); + layer.Load(":/layers/VK_LAYER_LUNARG_test_06.json", LAYER_TYPE_EXPLICIT, false, CONFIGURATOR_MODE_CMD); EXPECT_EQ(load_loaded, LAYER_LOAD_ADDED); EXPECT_EQ(Version(1, 2, 0), layer.file_format_version); @@ -234,7 +231,7 @@ TEST(test_layer, load_setting_enum_interit) { TEST(test_layer, load_setting_missing) { Layer layer; const LayerLoadStatus load_loaded = - layer.Load(":/layers/VK_LAYER_LUNARG_test_07.json", LAYER_TYPE_IMPLICIT, false, Dummy(), CONFIGURATOR_MODE_CMD); + layer.Load(":/layers/VK_LAYER_LUNARG_test_07.json", LAYER_TYPE_IMPLICIT, false, CONFIGURATOR_MODE_CMD); EXPECT_EQ(load_loaded, LAYER_LOAD_ADDED); EXPECT_EQ(Version(1, 2, 0), layer.file_format_version); @@ -247,7 +244,7 @@ TEST(test_layer, load_setting_missing) { EXPECT_EQ(layer_controlA, LAYER_CONTROL_ON); const LayerLoadStatus reloaded = - layer.Load(":/layers/VK_LAYER_LUNARG_test_07.json", LAYER_TYPE_IMPLICIT, false, Dummy(), CONFIGURATOR_MODE_CMD); + layer.Load(":/layers/VK_LAYER_LUNARG_test_07.json", LAYER_TYPE_IMPLICIT, false, CONFIGURATOR_MODE_CMD); EXPECT_EQ(1, layer.settings.size()); EXPECT_EQ(2, layer.presets.size()); } @@ -255,7 +252,7 @@ TEST(test_layer, load_setting_missing) { TEST(test_layer, load_env_variable) { Layer layer; const LayerLoadStatus load_loaded = - layer.Load(":/layers/VK_LAYER_LUNARG_test_08.json", LAYER_TYPE_IMPLICIT, false, Dummy(), CONFIGURATOR_MODE_CMD); + layer.Load(":/layers/VK_LAYER_LUNARG_test_08.json", LAYER_TYPE_IMPLICIT, false, CONFIGURATOR_MODE_CMD); EXPECT_EQ(load_loaded, LAYER_LOAD_ADDED); EXPECT_EQ(Version(1, 2, 0), layer.file_format_version); @@ -270,7 +267,6 @@ TEST(test_layer, load_env_variable) { EXPECT_STREQ("VK_LAYER_TEST08_ENABLE", layer.enable_env.c_str()); EXPECT_STREQ("1", layer.enable_value.c_str()); EXPECT_EQ(false, layer.is_32bits); - EXPECT_EQ(true, layer.enabled); EXPECT_STREQ("${LUNARG_SDK}/layer_dummy.html", layer.url.RelativePath(false).c_str()); EXPECT_TRUE(layer.settings.empty()); EXPECT_TRUE(layer.presets.empty()); @@ -304,7 +300,7 @@ TEST(test_layer, load_env_variable) { TEST(test_layer, load_setting_message) { Layer layer; const LayerLoadStatus load_loaded = - layer.Load(":/layers/VK_LAYER_LUNARG_test_09.json", LAYER_TYPE_IMPLICIT, false, Dummy(), CONFIGURATOR_MODE_CMD); + layer.Load(":/layers/VK_LAYER_LUNARG_test_09.json", LAYER_TYPE_IMPLICIT, false, CONFIGURATOR_MODE_CMD); EXPECT_EQ(load_loaded, LAYER_LOAD_ADDED); EXPECT_EQ(Version(1, 2, 0), layer.file_format_version); @@ -329,7 +325,7 @@ TEST(test_layer, load_setting_message) { TEST(test_layer, load_1_1_0_header) { Layer layer; const LayerLoadStatus load_loaded = - layer.Load(":/layers/VK_LAYER_LUNARG_reference_1_1_0.json", LAYER_TYPE_EXPLICIT, false, Dummy(), CONFIGURATOR_MODE_CMD); + layer.Load(":/layers/VK_LAYER_LUNARG_reference_1_1_0.json", LAYER_TYPE_EXPLICIT, false, CONFIGURATOR_MODE_CMD); EXPECT_EQ(load_loaded, LAYER_LOAD_ADDED); EXPECT_EQ(Version(1, 1, 0), layer.file_format_version); @@ -348,7 +344,7 @@ TEST(test_layer, load_1_1_0_header) { TEST(test_layer, load_1_2_0_preset_and_setting_type) { Layer layer; const LayerLoadStatus load_loaded = - layer.Load(":/layers/VK_LAYER_LUNARG_reference_1_2_0.json", LAYER_TYPE_EXPLICIT, false, Dummy(), CONFIGURATOR_MODE_CMD); + layer.Load(":/layers/VK_LAYER_LUNARG_reference_1_2_0.json", LAYER_TYPE_EXPLICIT, false, CONFIGURATOR_MODE_CMD); EXPECT_EQ(load_loaded, LAYER_LOAD_ADDED); // Preset Enum diff --git a/vkconfig_core/test/test_layer_manager.cpp b/vkconfig_core/test/test_layer_manager.cpp index 59054267a1..7e76be08e8 100644 --- a/vkconfig_core/test/test_layer_manager.cpp +++ b/vkconfig_core/test/test_layer_manager.cpp @@ -22,6 +22,14 @@ #include +static void InitLayer(LayerManager& layer_manager) { + const std::vector& layers_paths = ::CollectFilePaths(":/layers"); + + for (std::size_t i = 0, n = layers_paths.size(); i < n; ++i) { + layer_manager.LoadLayer(layers_paths[i], LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + } +} + TEST(test_layer_manager, clear) { LayerManager layer_manager; @@ -53,13 +61,12 @@ TEST(test_layer_manager, save_json) { const QJsonObject& json_layers_object = json_root_object.value("layers").toObject(); EXPECT_TRUE(json_layers_object.value("found") != QJsonValue::Undefined); - EXPECT_TRUE(json_layers_object.value("paths") != QJsonValue::Undefined); } } TEST(test_layer_manager, load_all) { LayerManager layer_manager; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(layer_manager); EXPECT_EQ(17, layer_manager.Size()); EXPECT_TRUE(!layer_manager.Empty()); @@ -72,7 +79,7 @@ TEST(test_layer_manager, load_dir) { LayerManager layer_manager; EXPECT_TRUE(layer_manager.Empty()); - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(layer_manager); EXPECT_TRUE(layer_manager.Find("VK_LAYER_LUNARG_reference_1_1_0", Version::LATEST) != nullptr); layer_manager.Clear(); @@ -85,7 +92,7 @@ TEST(test_layer_manager, load_file) { LayerManager layer_manager; EXPECT_TRUE(layer_manager.Empty()); - layer_manager.LoadLayersFromPath(":/layers/VK_LAYER_LUNARG_reference_1_1_0.json", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + layer_manager.LoadLayer(":/layers/VK_LAYER_LUNARG_reference_1_1_0.json", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); EXPECT_TRUE(!layer_manager.Empty()); EXPECT_EQ(1, layer_manager.Size()); @@ -98,8 +105,8 @@ TEST(test_layer_manager, load_file) { TEST(test_layer_manager, reset) { LayerManager layer_manager; + ::InitLayer(layer_manager); - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); EXPECT_FALSE(layer_manager.Empty()); layer_manager.Clear(); @@ -108,7 +115,7 @@ TEST(test_layer_manager, reset) { TEST(test_layer_manager, find_single) { LayerManager layer_manager; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(layer_manager); EXPECT_TRUE(layer_manager.Find("VK_LAYER_LUNARG_test_03", Version::LATEST) != nullptr); @@ -119,7 +126,7 @@ TEST(test_layer_manager, find_single) { TEST(test_layer_manager, reload) { LayerManager layer_manager; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(layer_manager); EXPECT_TRUE(layer_manager.Size() > 1); @@ -130,7 +137,6 @@ TEST(test_layer_manager, reload) { EXPECT_EQ(status1, LAYER_LOAD_UNMODIFIED); Layer* layer1 = layer_manager.FindFromManifest(":/layers/VK_LAYER_LUNARG_test_04.json", false); - layer1->enabled = false; const std::size_t reloaded_size1 = layer_manager.Size(); EXPECT_EQ(initial_size, reloaded_size1); @@ -145,7 +151,7 @@ TEST(test_layer_manager, reload) { TEST(test_layer_manager, find_multiple) { LayerManager layer_manager; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(layer_manager); const Layer* layer135 = layer_manager.Find("VK_LAYER_LUNARG_version", Version(1, 1, 135)); EXPECT_TRUE(layer135 != nullptr); @@ -182,7 +188,8 @@ TEST(test_layer_manager, find_multiple) { TEST(test_layer_manager, FindLastModified) { LayerManager layer_manager; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(layer_manager); + const std::size_t initial_count = layer_manager.Size(); Layer* layer204_modified = layer_manager.FindFromManifest(":/layers/VK_LAYER_LUNARG_version_204.json", false); @@ -190,7 +197,12 @@ TEST(test_layer_manager, FindLastModified) { Path modified_path = layer204_modified->manifest_path; layer204_modified->manifest_path = ":/layers/VK_LAYER_LUNARG_version_204_copy.json"; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + auto it = layer_manager.layers_found.find(":/layers/VK_LAYER_LUNARG_version_204.json"); + assert(it != layer_manager.layers_found.end()); + + layer_manager.layers_found.insert(std::make_pair(":/layers/VK_LAYER_LUNARG_version_204_copy.json", it->second)); + + ::InitLayer(layer_manager); const std::size_t reloaded_count = layer_manager.Size(); EXPECT_EQ(initial_count + 1, reloaded_count); @@ -210,44 +222,41 @@ TEST(test_layer_manager, FindLastModified) { TEST(test_layer_manager, FindFromManifest) { LayerManager layer_manager; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(layer_manager); + const std::size_t initial_count = layer_manager.Size(); Layer* layer204 = layer_manager.FindFromManifest(":/layers/VK_LAYER_LUNARG_version_204.json", false); EXPECT_TRUE(layer204 != nullptr); EXPECT_STREQ(layer204->key.c_str(), "VK_LAYER_LUNARG_version"); EXPECT_EQ(layer204->api_version, Version(1, 3, 204)); - EXPECT_TRUE(layer204->enabled); Layer* layer208 = layer_manager.FindFromManifest(":/layers/VK_LAYER_LUNARG_version_208.json", false); EXPECT_TRUE(layer208 == nullptr); - layer204->enabled = false; + layer_manager.layers_found.find(":/layers/VK_LAYER_LUNARG_version_204.json")->second.enabled = false; + Layer* layer204_disabledA = layer_manager.FindFromManifest(":/layers/VK_LAYER_LUNARG_version_204.json", false); EXPECT_TRUE(layer204_disabledA == nullptr); Layer* layer204_disabledB = layer_manager.FindFromManifest(":/layers/VK_LAYER_LUNARG_version_204.json", true); // find disabled layers anyway EXPECT_TRUE(layer204_disabledB != nullptr); - EXPECT_FALSE(layer204_disabledB->enabled); - layer204_disabledB->enabled = true; - Layer* layer204_disabledC = layer_manager.FindFromManifest(":/layers/VK_LAYER_LUNARG_version_204.json", false); + Layer* layer204_disabledC = layer_manager.FindFromManifest(":/layers/VK_LAYER_LUNARG_version_204.json", true); EXPECT_TRUE(layer204_disabledC != nullptr); - EXPECT_TRUE(layer204_disabledC->enabled); - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(layer_manager); const std::size_t enabled_count = layer_manager.Size(); EXPECT_EQ(initial_count, enabled_count); - layer204->enabled = false; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(layer_manager); const std::size_t disabled_count = layer_manager.Size(); EXPECT_EQ(initial_count, disabled_count); } TEST(test_layer_manager, GatherManifests) { LayerManager layer_manager; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(layer_manager); const std::vector& versions_notfound = layer_manager.GatherManifests("VK_LAYER_LUNARG_version_not_found"); EXPECT_TRUE(versions_notfound.empty()); @@ -265,11 +274,12 @@ TEST(test_layer_manager, GatherManifests) { const Layer* layer3 = layer_manager.FindFromManifest(versions_found[3]); EXPECT_EQ(layer3->api_version, Version(1, 1, 135)); + layer_manager.layers_found.find(versions_found[2])->second.enabled = false; + const Layer* layer193 = layer_manager.Find("VK_LAYER_LUNARG_version", Version(1, 2, 193)); EXPECT_TRUE(layer193 != nullptr); Layer* layer_edit = layer_manager.FindFromManifest(layer193->manifest_path); - layer_edit->enabled = false; const std::vector& versions_found_b = layer_manager.GatherManifests("VK_LAYER_LUNARG_version"); EXPECT_FALSE(versions_found_b.empty()); @@ -284,7 +294,7 @@ TEST(test_layer_manager, GatherManifests) { TEST(test_layer_manager, GatherVersions) { LayerManager layer_manager; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(layer_manager); const std::vector& versions_notfound = layer_manager.GatherVersions("VK_LAYER_LUNARG_version_not_found"); EXPECT_TRUE(versions_notfound.empty()); @@ -300,8 +310,7 @@ TEST(test_layer_manager, GatherVersions) { const Layer* layer193 = layer_manager.Find("VK_LAYER_LUNARG_version", Version(1, 2, 193)); EXPECT_TRUE(layer193 != nullptr); - Layer* layer_edit = layer_manager.FindFromManifest(layer193->manifest_path); - layer_edit->enabled = false; + layer_manager.layers_found.find(layer193->manifest_path)->second.enabled = false; const std::vector& versions_found_b = layer_manager.GatherVersions("VK_LAYER_LUNARG_version"); EXPECT_FALSE(versions_found_b.empty()); @@ -313,7 +322,7 @@ TEST(test_layer_manager, GatherVersions) { TEST(test_layer_manager, BuildLayerNameList) { LayerManager layer_manager; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(layer_manager); EXPECT_EQ(layer_manager.GatherLayerNames().size(), 14); } @@ -324,80 +333,11 @@ TEST(test_layer_manager, avoid_duplicate) { LayerManager layer_manager; EXPECT_TRUE(layer_manager.Empty()); - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(layer_manager); std::size_t first_load_count = layer_manager.Size(); - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); + ::InitLayer(layer_manager); std::size_t second_load_count = layer_manager.Size(); EXPECT_EQ(first_load_count, second_load_count); } - -TEST(test_layer_manager, custom_path_append_remove) { - LayerManager layer_manager; - - LayersPathInfo infoA; - infoA.path = ":/layers"; - LayersPathInfo infoB; - infoB.path = ":/layersB"; - LayersPathInfo infoC; - infoC.path = ":/layersC"; - - layer_manager.AppendPath(infoA); - layer_manager.AppendPath(infoB); - layer_manager.AppendPath(infoC); - - EXPECT_EQ(layer_manager.paths[LAYERS_PATHS_GUI].size(), 3); - - layer_manager.AppendPath(infoA); - EXPECT_EQ(layer_manager.paths[LAYERS_PATHS_GUI].size(), 3); - - layer_manager.RemovePath(infoA); - EXPECT_EQ(layer_manager.paths[LAYERS_PATHS_GUI].size(), 2); - - layer_manager.AppendPath(infoA); - EXPECT_EQ(layer_manager.paths[LAYERS_PATHS_GUI].size(), 3); - - layer_manager.RemovePath(infoA); - EXPECT_EQ(layer_manager.paths[LAYERS_PATHS_GUI].size(), 2); - - layer_manager.RemovePath(infoA); // Check that removing an already removed path doesn't cause any issue - EXPECT_EQ(layer_manager.paths[LAYERS_PATHS_GUI].size(), 2); - - layer_manager.RemovePath(infoB); - layer_manager.RemovePath(infoC); - - EXPECT_TRUE(layer_manager.paths[LAYERS_PATHS_GUI].empty()); -} - -TEST(test_layer_manager, custom_path_update_layers) { - LayerManager layer_manager; - layer_manager.LoadLayersFromPath(":/layers", LAYER_TYPE_EXPLICIT, CONFIGURATOR_MODE_CMD); - - LayersPathInfo info; - info.path = ":/layers"; - // info.enabled = true; default value - - layer_manager.AppendPath(info); - EXPECT_EQ(layer_manager.paths[LAYERS_PATHS_GUI].size(), 1); - EXPECT_EQ(layer_manager.paths[LAYERS_PATHS_GUI][0].enabled, true); - for (std::size_t i = 0, n = layer_manager.available_layers.size(); i < n; ++i) { - EXPECT_TRUE(layer_manager.available_layers[i].enabled); - } - - info.enabled = false; - layer_manager.UpdatePathEnabled(info, LAYERS_PATHS_GUI); - EXPECT_EQ(layer_manager.paths[LAYERS_PATHS_GUI][0].enabled, false); - for (std::size_t i = 0, n = layer_manager.available_layers.size(); i < n; ++i) { - EXPECT_FALSE(layer_manager.available_layers[i].enabled); - } - - info.enabled = true; - layer_manager.UpdatePathEnabled(info, LAYERS_PATHS_GUI); - EXPECT_EQ(layer_manager.paths[LAYERS_PATHS_GUI][0].enabled, true); - for (std::size_t i = 0, n = layer_manager.available_layers.size(); i < n; ++i) { - EXPECT_TRUE(layer_manager.available_layers[i].enabled); - } - - EXPECT_EQ(layer_manager.paths[LAYERS_PATHS_GUI].size(), 1); -} diff --git a/vkconfig_core/test/test_layer_preset.cpp b/vkconfig_core/test/test_layer_preset.cpp index 113e4bc202..8b5f919b49 100644 --- a/vkconfig_core/test/test_layer_preset.cpp +++ b/vkconfig_core/test/test_layer_preset.cpp @@ -26,8 +26,6 @@ #include -static std::map Dummy() { return std::map(); } - static SettingMetaString* InstantiateString(Layer& layer, const std::string& key) { return static_cast(layer.Instantiate(layer.settings, key, SETTING_STRING)); } @@ -68,7 +66,7 @@ TEST(test_layer_preset, has_preset) { TEST(test_layer_preset, find_preset_index_no_preset) { Layer layer; const LayerLoadStatus load_loaded = - layer.Load(":/layers/VK_LAYER_LUNARG_test_03.json", LAYER_TYPE_EXPLICIT, false, Dummy(), CONFIGURATOR_MODE_CMD); + layer.Load(":/layers/VK_LAYER_LUNARG_test_03.json", LAYER_TYPE_EXPLICIT, false, CONFIGURATOR_MODE_CMD); EXPECT_EQ(load_loaded, LAYER_LOAD_ADDED); SettingDataSet layer_settings; @@ -81,7 +79,7 @@ TEST(test_layer_preset, find_preset_index_no_preset) { TEST(test_layer_preset, find_preset_index_empty) { Layer layer; const LayerLoadStatus load_loaded = - layer.Load(":/layers/VK_LAYER_LUNARG_test_04.json", LAYER_TYPE_EXPLICIT, false, Dummy(), CONFIGURATOR_MODE_CMD); + layer.Load(":/layers/VK_LAYER_LUNARG_test_04.json", LAYER_TYPE_EXPLICIT, false, CONFIGURATOR_MODE_CMD); EXPECT_EQ(load_loaded, LAYER_LOAD_ADDED); SettingDataSet layer_settings; @@ -92,7 +90,7 @@ TEST(test_layer_preset, find_preset_index_empty) { TEST(test_layer_preset, find_preset_index_found) { Layer layer; const LayerLoadStatus load_loaded = - layer.Load(":/layers/VK_LAYER_LUNARG_test_04.json", LAYER_TYPE_EXPLICIT, false, Dummy(), CONFIGURATOR_MODE_CMD); + layer.Load(":/layers/VK_LAYER_LUNARG_test_04.json", LAYER_TYPE_EXPLICIT, false, CONFIGURATOR_MODE_CMD); EXPECT_EQ(load_loaded, LAYER_LOAD_ADDED); SettingDataSet layer_settings; @@ -118,7 +116,7 @@ TEST(test_layer_preset, find_preset_index_found) { TEST(test_layer_preset, find_preset_index_missing_value) { Layer layer; const LayerLoadStatus load_loaded = - layer.Load(":/layers/VK_LAYER_LUNARG_test_07.json", LAYER_TYPE_EXPLICIT, false, Dummy(), CONFIGURATOR_MODE_CMD); + layer.Load(":/layers/VK_LAYER_LUNARG_test_07.json", LAYER_TYPE_EXPLICIT, false, CONFIGURATOR_MODE_CMD); EXPECT_EQ(load_loaded, LAYER_LOAD_ADDED); SettingDataSet layer_settings; diff --git a/vkconfig_core/test/test_parameter.cpp b/vkconfig_core/test/test_parameter.cpp index 25a9dfe883..2e8acb1691 100644 --- a/vkconfig_core/test/test_parameter.cpp +++ b/vkconfig_core/test/test_parameter.cpp @@ -25,10 +25,33 @@ #include -inline SettingMetaString* InstantiateString(Layer& layer, const std::string& key) { +static SettingMetaString* InstantiateString(Layer& layer, const std::string& key) { return static_cast(layer.Instantiate(layer.settings, key, SETTING_STRING)); } +static void AddLayer(LayerManager& layers, const char* key, LayerType type) { + std::string path = format("./%s.json", key); + + layers.available_layers.push_back(Layer(key, Version(1, 0, 0), Version(1, 2, 148), "1", path.c_str())); + layers.available_layers[layers.available_layers.size() - 1].manifest_path = path; + layers.available_layers[layers.available_layers.size() - 1].type = type; + + LayerDescriptor descriptor; + descriptor.type = type; + layers.layers_found.insert(std::make_pair(path, descriptor)); +} + +static void InitLayers(LayerManager& layers) { + AddLayer(layers, "VK_LAYER_KHRONOS_implicit", LAYER_TYPE_IMPLICIT); + AddLayer(layers, "VK_LAYER_KHRONOS_explicit", LAYER_TYPE_EXPLICIT); + AddLayer(layers, "VK_LAYER_KHRONOS_validation", LAYER_TYPE_EXPLICIT); + AddLayer(layers, "VK_LAYER_KHRONOS_profiles", LAYER_TYPE_EXPLICIT); + AddLayer(layers, "VK_LAYER_KHRONOS_timeline_semaphore", LAYER_TYPE_EXPLICIT); + AddLayer(layers, "VK_LAYER_KHRONOS_synchronization2", LAYER_TYPE_EXPLICIT); + AddLayer(layers, "VK_LAYER_KHRONOS_shader_object", LAYER_TYPE_EXPLICIT); + AddLayer(layers, "VK_LAYER_KHRONOS_memory_decompression", LAYER_TYPE_EXPLICIT); +} + TEST(test_parameter, apply_settings) { Layer layer; @@ -65,47 +88,40 @@ TEST(test_parameter, apply_settings) { TEST(test_parameter, ordering_found_parameter_rank) { LayerManager layers; - layers.available_layers.push_back(Layer("VK_LAYER_KHRONOS_implicit", Version(1, 0, 0), Version(1, 2, 148), "1", "layer.json")); - layers.available_layers.push_back(Layer("VK_LAYER_KHRONOS_explicit", Version(1, 0, 0), Version(1, 2, 148), "1", "layer.json")); - layers.available_layers.push_back( - Layer("VK_LAYER_KHRONOS_validation", Version(1, 0, 0), Version(1, 2, 148), "1", "layer.json")); - layers.available_layers.push_back(Layer("VK_LAYER_KHRONOS_profiles", Version(1, 0, 0), Version(1, 2, 148), "1", "layer.json")); - layers.available_layers.push_back( - Layer("VK_LAYER_KHRONOS_timeline_semaphore", Version(1, 0, 0), Version(1, 2, 148), "1", "layer.json")); - layers.available_layers.push_back( - Layer("VK_LAYER_KHRONOS_synchronization2", Version(1, 0, 0), Version(1, 2, 148), "1", "layer.json")); - layers.available_layers.push_back( - Layer("VK_LAYER_KHRONOS_shader_object", Version(1, 0, 0), Version(1, 2, 148), "1", "layer.json")); - layers.available_layers.push_back( - Layer("VK_LAYER_KHRONOS_memory_decompression", Version(1, 0, 0), Version(1, 2, 148), "1", "layer.json")); + ::InitLayers(layers); + + Parameter parameter_validation("VK_LAYER_KHRONOS_validation", LAYER_CONTROL_AUTO); + EXPECT_EQ(PARAMETER_RANK_VALIDATION_LAYER, GetParameterOrdering(layers, parameter_validation)); + + Parameter parameter_profile("VK_LAYER_KHRONOS_profiles", LAYER_CONTROL_ON); + EXPECT_EQ(PARAMETER_RANK_PROFILES_LAYER, GetParameterOrdering(layers, parameter_profile)); + + Parameter parameter_timeline_semaphore("VK_LAYER_KHRONOS_timeline_semaphore", LAYER_CONTROL_OFF); + EXPECT_EQ(PARAMETER_RANK_EXTENSION_LAYER, GetParameterOrdering(layers, parameter_timeline_semaphore)); - layers.available_layers[0].type = LAYER_TYPE_IMPLICIT; + Parameter parameter_synchronization2("VK_LAYER_KHRONOS_synchronization2", LAYER_CONTROL_AUTO); + EXPECT_EQ(PARAMETER_RANK_EXTENSION_LAYER, GetParameterOrdering(layers, parameter_synchronization2)); + + Parameter parameter_shader_object("VK_LAYER_KHRONOS_shader_object", LAYER_CONTROL_ON); + EXPECT_EQ(PARAMETER_RANK_EXTENSION_LAYER, GetParameterOrdering(layers, parameter_shader_object)); + + Parameter parameter_memory_decompression("VK_LAYER_KHRONOS_memory_decompression", LAYER_CONTROL_OFF); + EXPECT_EQ(PARAMETER_RANK_EXTENSION_LAYER, GetParameterOrdering(layers, parameter_memory_decompression)); + + Parameter parameter_explicit("VK_LAYER_KHRONOS_explicit", LAYER_CONTROL_ON); + EXPECT_EQ(PARAMETER_RANK_EXPLICIT_LAYER, GetParameterOrdering(layers, parameter_explicit)); Parameter parameter_implicit("VK_LAYER_KHRONOS_implicit", LAYER_CONTROL_OFF); parameter_implicit.type = LAYER_TYPE_IMPLICIT; - - EXPECT_EQ(PARAMETER_RANK_VALIDATION_LAYER, - GetParameterOrdering(layers, Parameter("VK_LAYER_KHRONOS_validation", LAYER_CONTROL_AUTO))); - EXPECT_EQ(PARAMETER_RANK_PROFILES_LAYER, - GetParameterOrdering(layers, Parameter("VK_LAYER_KHRONOS_profiles", LAYER_CONTROL_ON))); - EXPECT_EQ(PARAMETER_RANK_EXTENSION_LAYER, - GetParameterOrdering(layers, Parameter("VK_LAYER_KHRONOS_timeline_semaphore", LAYER_CONTROL_OFF))); - EXPECT_EQ(PARAMETER_RANK_EXTENSION_LAYER, - GetParameterOrdering(layers, Parameter("VK_LAYER_KHRONOS_synchronization2", LAYER_CONTROL_AUTO))); - EXPECT_EQ(PARAMETER_RANK_EXTENSION_LAYER, - GetParameterOrdering(layers, Parameter("VK_LAYER_KHRONOS_shader_object", LAYER_CONTROL_ON))); - EXPECT_EQ(PARAMETER_RANK_EXTENSION_LAYER, - GetParameterOrdering(layers, Parameter("VK_LAYER_KHRONOS_memory_decompression", LAYER_CONTROL_OFF))); - EXPECT_EQ(PARAMETER_RANK_EXPLICIT_LAYER, - GetParameterOrdering(layers, Parameter("VK_LAYER_KHRONOS_explicit", LAYER_CONTROL_ON))); EXPECT_EQ(PARAMETER_RANK_IMPLICIT_LAYER, GetParameterOrdering(layers, parameter_implicit)); - EXPECT_EQ(PARAMETER_RANK_MISSING_LAYER, GetParameterOrdering(layers, Parameter("VK_LAYER_KHRONOS_missing", LAYER_CONTROL_OFF))); + + Parameter parameter_missing("VK_LAYER_KHRONOS_missing", LAYER_CONTROL_OFF); + EXPECT_EQ(PARAMETER_RANK_MISSING_LAYER, GetParameterOrdering(layers, parameter_missing)); } TEST(test_parameter, has_missing_layer) { LayerManager layers; - layers.available_layers.push_back(Layer("VK_LAYER_KHRONOS_implicit", Version(1, 0, 0), Version(1, 2, 148), "1", "layer.json")); - layers.available_layers.push_back(Layer("VK_LAYER_KHRONOS_explicit", Version(1, 0, 0), Version(1, 2, 148), "1", "layer.json")); + ::InitLayers(layers); std::vector parameters; parameters.push_back(Parameter("VK_LAYER_KHRONOS_implicit", LAYER_CONTROL_AUTO)); @@ -118,8 +134,7 @@ TEST(test_parameter, has_missing_layer) { TEST(test_parameter, no_missing_layer) { LayerManager layers; - layers.available_layers.push_back(Layer("VK_LAYER_KHRONOS_implicit", Version(1, 0, 0), Version(1, 2, 148), "1", "layer.json")); - layers.available_layers.push_back(Layer("VK_LAYER_KHRONOS_explicit", Version(1, 0, 0), Version(1, 2, 148), "1", "layer.json")); + ::InitLayers(layers); std::vector parameters; parameters.push_back(Parameter("VK_LAYER_KHRONOS_implicit", LAYER_CONTROL_AUTO)); @@ -132,20 +147,7 @@ TEST(test_parameter, no_missing_layer) { TEST(test_parameter, order_parameter_automatic) { LayerManager layers; - layers.available_layers.push_back(Layer("VK_LAYER_KHRONOS_implicit", Version(1, 0, 0), Version(1, 2, 148), "1", "layer.json")); - layers.available_layers.push_back(Layer("VK_LAYER_KHRONOS_explicit", Version(1, 0, 0), Version(1, 2, 148), "1", "layer.json")); - layers.available_layers.push_back( - Layer("VK_LAYER_KHRONOS_validation", Version(1, 0, 0), Version(1, 2, 148), "1", "layer.json")); - layers.available_layers.push_back(Layer("VK_LAYER_KHRONOS_profiles", Version(1, 0, 0), Version(1, 2, 148), "1", "layer.json")); - layers.available_layers.push_back( - Layer("VK_LAYER_KHRONOS_timeline_semaphore", Version(1, 0, 0), Version(1, 2, 148), "1", "layer.json")); - layers.available_layers.push_back( - Layer("VK_LAYER_KHRONOS_synchronization2", Version(1, 0, 0), Version(1, 2, 148), "1", "layer.json")); - layers.available_layers.push_back( - Layer("VK_LAYER_KHRONOS_shader_object", Version(1, 0, 0), Version(1, 2, 148), "1", "layer.json")); - layers.available_layers.push_back( - Layer("VK_LAYER_KHRONOS_memory_decompression", Version(1, 0, 0), Version(1, 2, 148), "1", "layer.json")); - layers.available_layers[0].type = LAYER_TYPE_IMPLICIT; + ::InitLayers(layers); Parameter unordered_layers(::GetToken(LAYER_BUILTIN_UNORDERED), LAYER_CONTROL_AUTO); unordered_layers.builtin = LAYER_BUILTIN_UNORDERED; @@ -193,18 +195,7 @@ TEST(test_parameter, order_parameter_automatic) { TEST(test_parameter, order_parameter_manual_partial) { LayerManager layers; - layers.available_layers.push_back(Layer("VK_LAYER_KHRONOS_implicit", Version(1, 0, 0), Version(1, 2, 148), "1", "layer.json")); - layers.available_layers.push_back(Layer("VK_LAYER_KHRONOS_explicit", Version(1, 0, 0), Version(1, 2, 148), "1", "layer.json")); - layers.available_layers.push_back( - Layer("VK_LAYER_KHRONOS_validation", Version(1, 0, 0), Version(1, 2, 148), "1", "layer.json")); - layers.available_layers.push_back(Layer("VK_LAYER_KHRONOS_profiles", Version(1, 0, 0), Version(1, 2, 148), "1", "layer.json")); - layers.available_layers.push_back( - Layer("VK_LAYER_KHRONOS_timeline_semaphore", Version(1, 0, 0), Version(1, 2, 148), "1", "layer.json")); - layers.available_layers.push_back( - Layer("VK_LAYER_KHRONOS_synchronization2", Version(1, 0, 0), Version(1, 2, 148), "1", "layer.json")); - layers.available_layers.push_back( - Layer("VK_LAYER_KHRONOS_memory_decompression", Version(1, 0, 0), Version(1, 2, 148), "1", "layer.json")); - layers.available_layers[0].type = LAYER_TYPE_IMPLICIT; + ::InitLayers(layers); std::vector parameters; parameters.push_back(Parameter("VK_LAYER_KHRONOS_implicit", LAYER_CONTROL_AUTO)); diff --git a/vkconfig_core/type_layers_paths.cpp b/vkconfig_core/type_layers_paths.cpp index a0f607536c..11ee9a9195 100644 --- a/vkconfig_core/type_layers_paths.cpp +++ b/vkconfig_core/type_layers_paths.cpp @@ -33,7 +33,23 @@ const char* GetLabel(LayersPaths Layers_paths_type) { "Vulkan Configurator", // LAYERS_PATHS_GUI "${VULKAN_SDK}", // LAYERS_PATHS_SDK }; - static_assert(std::size(TABLE) == LAYERS_PATHS_COUNT, "The tranlation table size doesn't match the enum number of elements"); + static_assert(std::size(TABLE) == LAYERS_PATHS_COUNT); + + return TABLE[Layers_paths_type]; +} + +LayerType GetLayerType(LayersPaths Layers_paths_type) { + static LayerType TABLE[] = { + LAYER_TYPE_IMPLICIT, // LAYERS_PATHS_IMPLICIT_SYSTEM + LAYER_TYPE_IMPLICIT, // LAYERS_PATHS_IMPLICIT_ENV_SET + LAYER_TYPE_IMPLICIT, // LAYERS_PATHS_IMPLICIT_ENV_ADD + LAYER_TYPE_EXPLICIT, // LAYERS_PATHS_EXPLICIT_SYSTEM + LAYER_TYPE_EXPLICIT, // LAYERS_PATHS_EXPLICIT_ENV_SET + LAYER_TYPE_EXPLICIT, // LAYERS_PATHS_EXPLICIT_ENV_ADD + LAYER_TYPE_EXPLICIT, // LAYERS_PATHS_GUI + LAYER_TYPE_EXPLICIT, // LAYERS_PATHS_SDK + }; + static_assert(std::size(TABLE) == LAYERS_PATHS_COUNT); return TABLE[Layers_paths_type]; } diff --git a/vkconfig_core/type_layers_paths.h b/vkconfig_core/type_layers_paths.h index 2b43cfaf90..6aa990639a 100644 --- a/vkconfig_core/type_layers_paths.h +++ b/vkconfig_core/type_layers_paths.h @@ -39,3 +39,5 @@ enum LayersPaths { enum { LAYERS_PATHS_COUNT = LAYERS_PATHS_LAST - LAYERS_PATHS_FIRST + 1 }; const char* GetLabel(LayersPaths Layers_paths_type); + +LayerType GetLayerType(LayersPaths Layers_paths_type); diff --git a/vkconfig_core/type_tab.cpp b/vkconfig_core/type_tab.cpp index b7f0371080..fbde0f0fc2 100644 --- a/vkconfig_core/type_tab.cpp +++ b/vkconfig_core/type_tab.cpp @@ -26,7 +26,7 @@ const char* GetLabel(TabType type) { static const char* TOKENS[]{ "Vulkan Layers Configuration", // TAB_CONFIGURATIONS - "Vulkan Layers Paths", // TAB_LAYERS_PATHS + "Vulkan Layers Available", // TAB_LAYERS_PATHS "Vulkan Drivers", // TAB_DRIVERS "Application Launcher", // TAB_APPLICATIONS "Diagnostics", // TAB_DIAGNOSTIC diff --git a/vkconfig_gui/CHANGELOG.md b/vkconfig_gui/CHANGELOG.md index 2883004517..4bf29248e5 100644 --- a/vkconfig_gui/CHANGELOG.md +++ b/vkconfig_gui/CHANGELOG.md @@ -15,6 +15,11 @@ - Add `vkconfig.json` backup when doing a "Reset To Default" #2570 - Add "Discard Ordering and Enabling Layers" default configuration #2596 - Improve Vulkan drivers loading, add all drivers in a part at once +- Refactor layers tab to display layer sorted by name and enabling them individually +- Add layer search bar in layer tab +- Show paths instead of Vulkan Configurator variables +- Improve UI consistency +- Move 'Validate Layer Manifest' settings to the preference tab ### Fixes: - Fix command line whitespace decoding #2625 @@ -24,6 +29,8 @@ - Fix "Validation with API Dump log" configuration not loaded - Fix high CPU usage on idle when no layers configuration is active #2603 - Fix UUID display in log, following the RFC9562 standard +- Fix icon to remove a Vulkan driver +- Fix key binding shortcuts (Eg: CTRL+F to search things on various tabs) ## Vulkan Configurator 3.4.2 - Febuary 2026 [Vulkan SDK 1.4.341.0](https://github.com/LunarG/VulkanTools/tree/vulkan-sdk-1.4.341) diff --git a/vkconfig_gui/mainwindow.cpp b/vkconfig_gui/mainwindow.cpp index 224ae30588..99dd15f7a5 100644 --- a/vkconfig_gui/mainwindow.cpp +++ b/vkconfig_gui/mainwindow.cpp @@ -42,6 +42,7 @@ #include #include #include +#include #include @@ -72,6 +73,9 @@ MainWindow::MainWindow(QApplication &app, QWidget *parent) } this->ui->tab_widget->setCurrentIndex(configurator.active_tab); + this->ui->tab_widget->installEventFilter(this); + + this->connect(ui->tab_widget, SIGNAL(currentChanged(int)), this, SLOT(on_tab_widget_currentChanged(int))); this->UpdateUI(UPDATE_REBUILD_UI); @@ -384,5 +388,33 @@ void MainWindow::on_tab_widget_currentChanged(int index) { Configurator &configurator = Configurator::Get(); configurator.active_tab = static_cast(index); + switch (configurator.active_tab) { + case TAB_CONFIGURATIONS: { + } break; + case TAB_LAYERS_PATHS: { + // QShortcut *shortcut_search = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_F), this->ui->tab_widget); + // this->connect(shortcut_search, SIGNAL(activated()), this, SLOT(on_focus_search())); + + // QShortcut *shortcut_open = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_O), this->ui->layers_list); + // this->connect(shortcut_open, SIGNAL(activated()), this, SLOT(on_layers_browse_pressed())); + } break; + case TAB_DRIVERS: { + // QShortcut *shortcut_search = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_F), this->ui->tab_widget); + // this->connect(shortcut_search, SIGNAL(activated()), this, SLOT(on_focus_search())); + } break; + case TAB_APPLICATIONS: { + // QShortcut *shortcut_search = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_F), this->ui->tab_widget); + // this->connect(shortcut_search, SIGNAL(activated()), this, SLOT(on_focus_search())); + } break; + case TAB_DIAGNOSTIC: { + } break; + case TAB_DOCUMENTATION: { + } break; + case TAB_PREFERENCES: { + } break; + case TAB_ABOUT: { + } break; + } + this->tabs[index]->UpdateUI(UPDATE_REBUILD_UI); } diff --git a/vkconfig_gui/mainwindow.ui b/vkconfig_gui/mainwindow.ui index 734d35eff6..4d5af1af73 100644 --- a/vkconfig_gui/mainwindow.ui +++ b/vkconfig_gui/mainwindow.ui @@ -128,8 +128,11 @@ true + + Check to control the Vulkan Layers used by running Vulkan Executables (Ctrl+Space) + - Control the Vulkan Layers used by running Vulkan applications + Configure System Vulkan Layers @@ -904,6 +907,13 @@ + + + Arial + 10 + true + + false @@ -913,9 +923,9 @@ Locate Vulkan Layers versions - + - 0 + 7 5 @@ -938,8 +948,11 @@ true + + List of Vulkan Layers found on the system + - System Vulkan Layers Paths + Vulkan Layers available on the system false @@ -975,7 +988,7 @@ 0 - + 16777215 @@ -989,11 +1002,31 @@ false + + Enter search text to filter layers in the list... (Ctrl+F) + + + + + + + + 24 + 24 + + + + + Arial + 10 + false + + - Check to validate the layer manifests wheen adding a user path. This may take some time... + Clear layer filter - Validate Layer Manifests + @@ -1060,7 +1093,7 @@ - Enter a Vulkan layers directory to control them in Vulkan Configurator + Add a Vulkan Layer manifests path... (Ctrl+O) @@ -1092,7 +1125,7 @@ - Append a user-defined layers path + Add Additional Layers (CTRL+O) @@ -1133,7 +1166,7 @@ - Reload all modified layer manifest + Reload all modified layer manifest (CTRL+R) @@ -1149,13 +1182,7 @@ - - - - 0 - 0 - - + Arial @@ -1166,29 +1193,9 @@ QFrame::NoFrame - - Qt::ScrollBarAlwaysOn - - - QAbstractScrollArea::AdjustToContents - true - - false - - - false - - - false - - - - 1 - - @@ -1231,8 +1238,11 @@ true + + Check to control Vulkan Physical Device used by all running Vulkan executables (Ctrl+Space) + - Control Vulkan Physical Device used by all running Vulkan applications + Configure System Vulkan Devices @@ -1245,7 +1255,7 @@ - 0 + 7 5 @@ -1349,25 +1359,6 @@ - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - @@ -1481,17 +1472,196 @@ + + + + + 0 + 0 + + + + + Arial + 10 + true + + + + Load Additional Vulkan Drivers + + + true + + + + 7 + + + 5 + + + 5 + + + 5 + + + 5 + + + + + 0 + + + 0 + + + + + + 16777215 + 24 + + + + + Arial + 10 + false + + + + Enter search text to filter drivers in the list... (Ctrl+F) + + + + + + + + 24 + 24 + + + + + + + + + + + + 16777215 + 24 + + + + + Arial + 10 + false + + + + Add Vulkan Driver manifests path... (Ctrl+O) + + + + + + + + 0 + 0 + + + + + 24 + 24 + + + + + 24 + 24 + + + + Append a user-defined driver path + + + + + + + + + + + + + Arial + 10 + false + + + + QFrame::NoFrame + + + Qt::ScrollBarAlwaysOn + + + true + + + + + + + + + + + + 0 + 0 + + + + false + + + Tab 4 + + + Vulkan executable launcher + + + + 11 + + + 5 + + + 5 + + + 5 + + + 5 + - - - - 0 - 0 - - + Arial @@ -1499,15 +1669,15 @@ true - - Add Vulkan Driver Paths + + Optional use to launch executables and store launch option - - true + + Optional Vulkan executables launcher - + - 7 + 0 5 @@ -1522,165 +1692,25 @@ 5 - + 0 + + 0 + 0 + + 0 + + + 0 + - - - - 16777215 - 24 - - - - - Arial - 10 - false - - - - Enter a Vulkan Driver manifest path to make it visible to Vulkan application - - - - - - - - 0 - 0 - - - - - 24 - 24 - - - - - 24 - 24 - - - - Append a user-defined driver path - - - - - - - - - - - - - Arial - 10 - false - - - - QFrame::NoFrame - - - Qt::ScrollBarAlwaysOn - - - - - - - - - - - - 0 - 0 - - - - false - - - Tab 4 - - - Vulkan executable launcher - - - - 11 - - - 5 - - - 5 - - - 5 - - - 5 - - - - - - Arial - 10 - true - - - - - - - - 0 - - - 5 - - - 5 - - - 5 - - - 5 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - + + 0 24 @@ -1817,7 +1847,7 @@ - Options: + List of Executable Launch Options: @@ -1951,12 +1981,9 @@ 0 - + 7 - - 0 - @@ -1992,6 +2019,9 @@ false + + Enter executable arguments passed at launch... + @@ -2020,6 +2050,9 @@ false + + Enter the Vulkan executable working directory... + @@ -2121,6 +2154,9 @@ false + + Enter environment variables set at executable launch... + @@ -2149,6 +2185,9 @@ false + + Enter log file path where standard outputs is captured... + @@ -2218,7 +2257,7 @@ - 0 + 7 0 @@ -2369,6 +2408,9 @@ 24 + + Export the application output log + @@ -2388,6 +2430,9 @@ 24 + + Enter search text in the current log... (Ctrl+F) + @@ -2410,6 +2455,9 @@ 24 + + Clear the Search Text + @@ -2435,6 +2483,12 @@ 24 + + Find next (F3) + + + + @@ -2460,6 +2514,12 @@ 24 + + Find previous (Shift+F3) + + + + @@ -2485,6 +2545,12 @@ 24 + + Match case (Alt+C) + + + + @@ -2513,6 +2579,12 @@ 24 + + Match while world (Alt+W) + + + + @@ -2541,6 +2613,12 @@ 24 + + Use regular expressions (Alt+R) + + + + @@ -2645,8 +2723,11 @@ true + + Check to produce Vulkan Loader Log to all running Vulkan executables (Ctrl+Space) + - Produce Vulkan Loader Log to all running Vulkan applications + Configure System Vulkan Loader Log @@ -2659,16 +2740,16 @@ - 11 + 5 - 0 + 5 - 0 + 5 - 0 + 5 @@ -2825,16 +2906,16 @@ 0 - 0 + 5 - 0 + 5 - 0 + 5 - 0 + 5 @@ -2961,23 +3042,23 @@ false - Diagnostic Logs + Vulkan System Diagnostic Logs - 10 + 7 - 0 + 5 - 0 + 5 - 0 + 5 - 0 + 5 @@ -3226,6 +3307,9 @@ false + + Enter search text in the current log... (Ctrl+F) + @@ -3480,16 +3564,16 @@ 11 - 0 + 5 - 0 + 5 - 0 + 5 - 0 + 5 @@ -3553,7 +3637,7 @@ Tab 7 - + 11 @@ -3570,16 +3654,32 @@ 5 - + + + + 0 + 0 + + + + + Arial + 10 + true + + false - + Vulkan Configurator Settings + + + false - + - 11 + 7 5 @@ -3594,832 +3694,862 @@ 5 - - - - 0 - 0 - + + + + 16777215 + 24 + Arial 10 - true + false - - false + + Keep Vulkan Configurator running in system tray when closing the main window - - Vulkan Configurator Settings: + + + + + + 0 - - false + + 0 - - - 0 - - - 5 - - - 5 - - - 5 - - - 5 - - - - - - 16777215 - 24 - - - - - Arial - 10 - false - - - - Keep Vulkan Configurator running in system tray when closing the main window - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 16777215 - 24 - - - - - Arial - 10 - false - - - - ${VULKAN_HOME} is the default environment variable for Vulkan SDK tools outputs implementing it. - + + 0 + + + 0 + + + 0 + + + + + + 16777215 + 24 + + + + + Arial + 10 + false + + + + ${VULKAN_HOME} is the default environment variable for Vulkan SDK tools outputs implementing it. + + + ${VULKAN_HOME}: + + + + + + + + 0 + 24 + + + + + 16777215 + 24 + + + + + Arial + 10 + false + + + + + + + + + 24 + 24 + + + + + 24 + 24 + + + + + Arial + 10 + false + + + + + + + + + + + + + 0 + + + 0 + + + + + + Arial + 10 + false + + + + Allows overriding Vulkan Layers only for selected Vulkan executable + + + Show "Vulkan Executables Scope" in Vulkan Layers tab + + + + + + + 0 + + + 0 + + + 0 + + + + + + 24 + 0 + + + + + + + + + + + + Arial + 10 + false + + + + All Enabled Vulkan Executables behavior: + + + + + + + + Arial + 10 + false + + + + QComboBox::AdjustToContents + + - ${VULKAN_HOME}: - - - - - - - - 0 - 24 - - - - - 16777215 - 24 - - - - - Arial - 10 - false - - - - - - - - - 24 - 24 - - - - - 24 - 24 - - - - - Arial - 10 - false - + Write vk_layer_settings.txt file in the global path (visible to all Vulkan executables) + + - + Write vk_layer_settings.txt file in the application launcher working directory - - - - - - - - - Arial - 10 - false - - - - Allows overriding Vulkan Layers only for selected Vulkan executable - + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + + Arial + 10 + true + + + + Vulkan Configurator Appearence + + + + 0 + + + 5 + + + 5 + + + 5 + + + 5 + + + + + 0 + + + 0 + + + 0 + + + + + + 16777215 + 24 + + + + + Arial + 10 + false + + + + Theme Mode: + + + + + + + + 0 + 0 + + + + + 16777215 + 24 + + + + + Arial + 10 + false + + + + QComboBox::AdjustToContents + + - Show "Vulkan Executables Scope" in Vulkan Layers tab - - - - - - - 0 - - - 0 - - - 0 + Use Desktop Theme - - - - - - - - - - - - Arial - 10 - false - - - - All Enabled Vulkan Executables behavior: - - - - - - - - Arial - 10 - false - - - - QComboBox::AdjustToContents - - - - Write vk_layer_settings.txt file in the global path (visible to all Vulkan executables) - - - - - Write vk_layer_settings.txt file in the application launcher working directory - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - 16777215 - 24 - - - - - Arial - 10 - false - - - - Show debug layer settings, for layer development + + + + Force Light Theme + + - Show Debug Layer Settings + Force Dark Theme - - - - + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + 0 + + + 0 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 24 + 24 + + + + + Arial + 10 + false + + + + + + + + + + + + 16777215 + 24 + + + + + Arial + 10 + false + + + + Use custom Dark mode alternate rows color + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 24 + 24 + + + + + Arial + 10 + false + + + + + + + + + + + + 16777215 + 24 + + + + + Arial + 10 + false + + + + Use custom Light mode alternate rows color + + + + + + + + 24 + 0 + + + + + + + + + + + + + + + + Arial + 10 + true + + + + This could be useful to check a layer manifest was edited correctly + + + Vulkan Layers Developer Settings + + + + 7 + + + 5 + + + 5 + + + 5 + + + 5 + - + Arial 10 - true + false - - Vulkan Configurator Appearence + + Check to validate the layer manifests wheen adding a user path. This may take some time... + + + Validate added layer manifests against Vulkan layer manifest schema (slow) - - - 0 - - - 5 - - - 5 - - - 5 - - - 5 - - - - - 0 - - - 0 - - - 0 - - - - - - 16777215 - 24 - - - - - Arial - 10 - false - - - - Theme Mode: - - - - - - - - 0 - 0 - - - - - 16777215 - 24 - - - - - Arial - 10 - false - - - - QComboBox::AdjustToContents - - - - Use Desktop Theme - - - - - Force Light Theme - - - - - Force Dark Theme - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - 0 - - - 0 - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 24 - 24 - - - - - Arial - 10 - false - - - - - - - - - - - - 16777215 - 24 - - - - - Arial - 10 - false - - - - Use custom Dark mode alternate rows color - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 24 - 24 - - - - - Arial - 10 - false - - - - - - - - - - - - 16777215 - 24 - - - - - Arial - 10 - false - - - - Use custom Light mode alternate rows color - - - - - - - - - - - - - - - - - 0 - 0 - + + + + 16777215 + 24 + Arial 10 - true + false - - false + + Show debug layer settings, for layer development - - Vulkan SDK Releases: + + Show debug layer settings - - false + + + + + + + + + + 0 + 0 + + + + + Arial + 10 + true + + + + false + + + Vulkan SDK Releases + + + false + + + false + + + + 7 + + + 5 + + + 5 + + + 5 + + + 5 + + + + + 0 - - false + + 0 - - - 0 - - - 5 - - - 5 - - - 5 - - - 5 - - - - - 0 - - - 0 - - - 0 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 16777215 - 24 - - - - - Arial - 10 - false - - - - ${VULKAN_DOWNLOAD}: - - - - - - - - 0 - 24 - - - - - 16777215 - 24 - - - - - Arial - 10 - false - - - - 0 - - - - - - - - 0 - 24 - - - - - 16777215 - 24 - - - - - Arial - 10 - false - - - - - - - - - 24 - 24 - - - - - 24 - 24 - - - - - Arial - 10 - false - - - - - - - - - - - - - - 0 - 24 - - - - - 16777215 - 24 - - - - - Arial - 10 - false - - - - Open Vulkan SDK download web page... - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 16777215 - 24 - - - - - Arial - 10 - false - - - - Notify new Vulkan SDK release at Vulkan Configurator launch - - - true - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - 0 - - - 0 - - - - - - 0 - 24 - - - - - 16777215 - 24 - - - - - Arial - 10 - false - - - - Download last Vulkan SDK - - - - - - - - - - - 24 - 24 - - - - - 24 - 24 - - - - - Arial - 10 - false - - - - Open Vulkan SDK download folder - - - - - - - - - - - - + + 7 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 16777215 + 24 + + + + + Arial + 10 + false + + + + ${VULKAN_DOWNLOAD}: + + + + + + + + 0 + 24 + + + + + 16777215 + 24 + + + + + Arial + 10 + false + + + + 0 + + + + + + + + 0 + 24 + + + + + 16777215 + 24 + + + + + Arial + 10 + false + + + + + + + + + 24 + 24 + + + + + 24 + 24 + + + + + Arial + 10 + false + + + + + + + + + + + + + + 0 + 24 + + + + + 16777215 + 24 + + + + + Arial + 10 + false + + + + Open Vulkan SDK download web page... + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 16777215 + 24 + + + + + Arial + 10 + false + + + + Notify new Vulkan SDK release at Vulkan Configurator launch + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + 0 + + + 0 + + + + + + 0 + 24 + + + + + 16777215 + 24 + + + + + Arial + 10 + false + + + + Download last Vulkan SDK + + + + + + + + + + + 24 + 24 + + + + + 24 + 24 + + + + + Arial + 10 + false + + + + Open Vulkan SDK download folder + + + + + + + + + @@ -4515,297 +4645,279 @@ 5 - + + + + 800 + 270 + + - false + true - - - 0 + + false + + + false + + + + + 650 + 0 + 141 + 61 + - - 5 + + - - 5 + + :/resourcefiles/lunarg_logo.png - - 5 + + Qt::NoTextInteraction - - 5 + + + + + 640 + 190 + 91 + 81 + - - - - - 800 - 270 - - - - true - - - - - - false - - - false - - - - - 640 - 20 - 141 - 61 - - - - - - - :/resourcefiles/lunarg_logo.png - - - Qt::NoTextInteraction - - - - - - 640 - 190 - 91 - 81 - - - - - - - :/resourcefiles/qt_logo.png - - - - - - 760 - 70 - 201 - 41 - - - - - Arial - 10 - false - - - - Vulkan Configurator licensed under Apache 2.0 - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - true - - - - - - 680 - 100 - 281 - 41 - - - - - Arial - 10 - false - - - - Qt::LeftToRight - - - Copyright (c) 2020-2026 LunarG, Inc. - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - true - - - - - - 880 - 200 - 81 - 24 - - - - - 0 - 24 - - - - - 16777215 - 24 - - - - About Qt - - - - - - 730 - 230 - 231 - 41 - - - - - Arial - 10 - false - - - - Qt licensed under LGPL 3.0 - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - true - - - - - - 10 - 10 - 600 - 245 - - - - - 0 - 0 - - - - - 600 - 245 - - - - - - - :/resourcefiles/vulkan_configurator.png - - - true - - - Qt::NoTextInteraction - - - - - - 840 - 30 - 121 - 24 - - - - - 0 - 24 - - - - - 16777215 - 24 - - - - About LunarG - - - - - - 420 - 20 - 141 - 16 - - - - - Arial - 14 - true - - - - Qt::LeftToRight - - - - - - - - - - - false - - - QFrame::NoFrame - - - Qt::ScrollBarAlwaysOn - - - QAbstractScrollArea::AdjustToContents - - - Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse - - - true - - - - + + + + + :/resourcefiles/qt_logo.png + + + + + + 730 + 70 + 231 + 41 + + + + + Arial + 10 + false + + + + Licensed under Apache 2.0 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + false + + + Qt::NoTextInteraction + + + + + + 660 + 100 + 301 + 41 + + + + + Arial + 10 + false + + + + Qt::LeftToRight + + + Copyright (c) 2020-2026 LunarG, Inc. + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + Qt::NoTextInteraction + + + + + + 880 + 200 + 81 + 24 + + + + + 0 + 24 + + + + + 16777215 + 24 + + + + About Qt + + + + + + 730 + 230 + 231 + 41 + + + + + Arial + 10 + false + + + + Qt licensed under LGPL 3.0 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + Qt::NoTextInteraction + + + + + + 10 + 10 + 600 + 245 + + + + + 0 + 0 + + + + + 600 + 245 + + + + + + + :/resourcefiles/vulkan_configurator.png + + + true + + + Qt::NoTextInteraction + + + + + + 840 + 30 + 121 + 24 + + + + + 0 + 24 + + + + + 16777215 + 24 + + + + About LunarG + + + + + + 420 + 20 + 141 + 16 + + + + + Arial + 14 + true + + + + Qt::LeftToRight + + + + + + + + + + + false + + + QFrame::NoFrame + + + Qt::ScrollBarAlwaysOn + + + QAbstractScrollArea::AdjustToContents + + + Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse + + + true + diff --git a/vkconfig_gui/tab_applications.cpp b/vkconfig_gui/tab_applications.cpp index e40fb1bd71..636daaa938 100644 --- a/vkconfig_gui/tab_applications.cpp +++ b/vkconfig_gui/tab_applications.cpp @@ -93,11 +93,11 @@ TabApplications::TabApplications(MainWindow &window, std::shared_ptrui->launch_log_text); this->connect(shortcut_prev, SIGNAL(activated()), this, SLOT(on_search_prev_pressed())); - QShortcut *shortcut_case = new QShortcut(QKeySequence(Qt::ALT | Qt::Key_C), this->ui->launch_log_text); + QShortcut *shortcut_case = new QShortcut(QKeySequence(Qt::ALT | Qt::Key_C), this->ui->launch_search_case); this->connect(shortcut_case, SIGNAL(activated()), this, SLOT(on_search_case_activated())); - QShortcut *shortcut_whole = new QShortcut(QKeySequence(Qt::ALT | Qt::Key_W), this->ui->launch_log_text); + QShortcut *shortcut_whole = new QShortcut(QKeySequence(Qt::ALT | Qt::Key_W), this->ui->launch_search_whole); this->connect(shortcut_whole, SIGNAL(activated()), this, SLOT(on_search_whole_activated())); - QShortcut *shortcut_regex = new QShortcut(QKeySequence(Qt::ALT | Qt::Key_R), this->ui->launch_log_text); + QShortcut *shortcut_regex = new QShortcut(QKeySequence(Qt::ALT | Qt::Key_R), this->ui->launch_search_regex); this->connect(shortcut_regex, SIGNAL(activated()), this, SLOT(on_search_regex_activated())); this->on_search_clear_pressed(); @@ -152,7 +152,7 @@ void TabApplications::UpdateUI(UpdateUIMode mode) { ui->launch_executable_list->blockSignals(true); ui->launch_executable_list->clear(); for (std::size_t i = 0, n = executables.size(); i < n; ++i) { - ui->launch_executable_list->addItem(executables[i].path.RelativePath().c_str()); + ui->launch_executable_list->addItem(executables[i].path.AbsolutePath().c_str()); } ui->launch_executable_list->setCurrentIndex(configurator.executables.GetActiveExecutableIndex()); ui->launch_executable_list->blockSignals(false); @@ -320,11 +320,11 @@ void TabApplications::on_launch_options_list_activated(int index) { const ExecutableOptions *options = executable->GetActiveOptions(); - ui->launch_options_dir_edit->setText(options->working_folder.RelativePath().c_str()); + ui->launch_options_dir_edit->setText(options->working_folder.AbsolutePath().c_str()); ui->launch_options_dir_edit->setToolTip(options->working_folder.AbsolutePath().c_str()); ui->launch_options_args_edit->setText(Merge(options->args, " ").c_str()); ui->launch_options_envs_edit->setText(Merge(options->envs, " ").c_str()); - ui->launch_options_log_edit->setText(options->log_file.RelativePath().c_str()); + ui->launch_options_log_edit->setText(options->log_file.AbsolutePath().c_str()); ui->launch_options_log_edit->setToolTip(options->log_file.AbsolutePath().c_str()); } diff --git a/vkconfig_gui/tab_configurations.cpp b/vkconfig_gui/tab_configurations.cpp index 8740e6122e..40e75bac23 100644 --- a/vkconfig_gui/tab_configurations.cpp +++ b/vkconfig_gui/tab_configurations.cpp @@ -35,6 +35,7 @@ #include #include #include +#include static std::string BuildPlatformsLog(int platforms) { std::string log; @@ -145,6 +146,10 @@ TabConfigurations::TabConfigurations(MainWindow &window, std::shared_ptrconnect(this->advanced_mode, SIGNAL(pressed()), this, SLOT(on_configurations_advanced_toggle_pressed())); + QShortcut *shortcut_override = + new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_Space), this->ui->configurations_group_box_override); + this->connect(shortcut_override, SIGNAL(activated()), this, SLOT(on_configurations_override_toggled())); + this->UpdateUI(UPDATE_REBUILD_UI); } @@ -313,12 +318,17 @@ void TabConfigurations::UpdateUI_Settings(UpdateUIMode mode) { } void TabConfigurations::UpdateUI(UpdateUIMode ui_update_mode) { + const Configurator &configurator = Configurator::Get(); + + this->ui->configurations_group_box_override->blockSignals(true); + this->ui->configurations_group_box_override->setChecked(configurator.layers_override_enabled); + this->ui->configurations_group_box_override->blockSignals(false); + this->UpdateUI_Configurations(ui_update_mode); this->UpdateUI_Applications(ui_update_mode); this->UpdateUI_Layers(ui_update_mode); this->UpdateUI_Settings(ui_update_mode); - const Configurator &configurator = Configurator::Get(); const ExecutableScope scope = configurator.GetExecutableScope(); const bool enabled_executable = ::EnabledExecutables(scope); @@ -1111,6 +1121,10 @@ void TabConfigurations::on_configurations_advanced_toggle_pressed() { this->UpdateUI(UPDATE_REBUILD_UI); } +void TabConfigurations::on_configurations_override_toggled() { + this->ui->configurations_group_box_override->setChecked(!this->ui->configurations_group_box_override->isChecked()); +} + void TabConfigurations::on_configurations_override_toggled(bool checked) { Configurator &configurator = Configurator::Get(); configurator.layers_override_enabled = checked; diff --git a/vkconfig_gui/tab_configurations.h b/vkconfig_gui/tab_configurations.h index 9af22ad6ca..d6f3e984b3 100644 --- a/vkconfig_gui/tab_configurations.h +++ b/vkconfig_gui/tab_configurations.h @@ -50,6 +50,7 @@ class TabConfigurations : public Tab { public Q_SLOTS: void on_configurations_advanced_toggle_pressed(); + void on_configurations_override_toggled(); void on_configurations_override_toggled(bool checked); void on_configurations_executable_scope_currentIndexChanged(int index); void on_configurations_executable_list_currentIndexChanged(int index); diff --git a/vkconfig_gui/tab_diagnostics.cpp b/vkconfig_gui/tab_diagnostics.cpp index 237945d1f2..c26da9971c 100644 --- a/vkconfig_gui/tab_diagnostics.cpp +++ b/vkconfig_gui/tab_diagnostics.cpp @@ -60,6 +60,9 @@ TabDiagnostics::TabDiagnostics(MainWindow &window, std::shared_ptrconnect(this->ui->diagnostic_dir_system, SIGNAL(clicked()), this, SLOT(on_diagnostic_dir_system_pressed())); this->connect(this->ui->diagnostic_dir_info, SIGNAL(clicked()), this, SLOT(on_diagnostic_dir_info_pressed())); + QShortcut *shortcut_override = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_Space), this->ui->diagnostic_group_box_loader_log); + this->connect(shortcut_override, SIGNAL(activated()), this, SLOT(on_diagnostic_loader_messages_toggled())); + QShortcut *shortcut_search = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_F), this->ui->diagnostic_status_text); this->connect(shortcut_search, SIGNAL(activated()), this, SLOT(on_focus_search())); QShortcut *shortcut_next = new QShortcut(QKeySequence(Qt::Key_F3), this->ui->diagnostic_status_text); @@ -67,11 +70,11 @@ TabDiagnostics::TabDiagnostics(MainWindow &window, std::shared_ptrui->diagnostic_status_text); this->connect(shortcut_prev, SIGNAL(activated()), this, SLOT(on_search_prev_pressed())); - QShortcut *shortcut_case = new QShortcut(QKeySequence(Qt::ALT | Qt::Key_C), this->ui->diagnostic_status_text); + QShortcut *shortcut_case = new QShortcut(QKeySequence(Qt::ALT | Qt::Key_C), this->ui->diagnostic_search_case); this->connect(shortcut_case, SIGNAL(activated()), this, SLOT(on_search_case_activated())); - QShortcut *shortcut_whole = new QShortcut(QKeySequence(Qt::ALT | Qt::Key_W), this->ui->diagnostic_status_text); + QShortcut *shortcut_whole = new QShortcut(QKeySequence(Qt::ALT | Qt::Key_W), this->ui->diagnostic_search_whole); this->connect(shortcut_whole, SIGNAL(activated()), this, SLOT(on_search_whole_activated())); - QShortcut *shortcut_regex = new QShortcut(QKeySequence(Qt::ALT | Qt::Key_R), this->ui->diagnostic_status_text); + QShortcut *shortcut_regex = new QShortcut(QKeySequence(Qt::ALT | Qt::Key_R), this->ui->diagnostic_search_regex); this->connect(shortcut_regex, SIGNAL(activated()), this, SLOT(on_search_regex_activated())); this->ui->diagnostic_search_next->setEnabled(false); @@ -309,6 +312,10 @@ bool TabDiagnostics::EventFilter(QObject *target, QEvent *event) { return false; } +void TabDiagnostics::on_diagnostic_loader_messages_toggled() { + this->ui->diagnostic_group_box_loader_log->setChecked(!this->ui->diagnostic_group_box_loader_log->isChecked()); +} + void TabDiagnostics::on_diagnostic_loader_messages_toggled(bool checked) { Configurator &configurator = Configurator::Get(); configurator.loader_log_enabled = checked; @@ -596,9 +603,16 @@ void TabDiagnostics::on_export_file() { } } -void TabDiagnostics::on_focus_search() { this->ui->diagnostic_search_edit->setFocus(); } +void TabDiagnostics::on_focus_search() { + this->ui->diagnostic_search_edit->setFocus(); + this->ui->diagnostic_status_text->moveCursor(QTextCursor::Start); +} void TabDiagnostics::on_search_textEdited(const QString &text) { + if (!this->ui->diagnostic_search_clear->isEnabled()) { + this->ui->diagnostic_status_text->moveCursor(QTextCursor::Start); + } + this->ui->diagnostic_search_next->setEnabled(!this->ui->diagnostic_search_edit->text().isEmpty()); this->ui->diagnostic_search_prev->setEnabled(!this->ui->diagnostic_search_edit->text().isEmpty()); @@ -608,7 +622,10 @@ void TabDiagnostics::on_search_textEdited(const QString &text) { void TabDiagnostics::on_search_clear_pressed() { this->diagnostic_search_text.clear(); + this->ui->diagnostic_export_file->setEnabled(false); this->ui->diagnostic_search_edit->clear(); + this->ui->diagnostic_search_next->setEnabled(false); + this->ui->diagnostic_search_prev->setEnabled(false); this->ui->diagnostic_search_clear->setEnabled(false); } @@ -667,7 +684,7 @@ void TabDiagnostics::on_context_menu(const QPoint &pos) { menu->addSeparator(); QAction *action_search = new QAction("Search...", nullptr); - action_search->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_F)); + // action_search->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_F)); action_search->setEnabled(true); menu->addAction(action_search); diff --git a/vkconfig_gui/tab_diagnostics.h b/vkconfig_gui/tab_diagnostics.h index 811a03a2b4..244eaab6cd 100644 --- a/vkconfig_gui/tab_diagnostics.h +++ b/vkconfig_gui/tab_diagnostics.h @@ -59,6 +59,7 @@ class TabDiagnostics : public Tab { void on_search_whole_activated(); void on_search_regex_activated(); + void on_diagnostic_loader_messages_toggled(); void on_diagnostic_loader_messages_toggled(bool checked); void on_diagnostic_loader_errors_toggled(bool checked); void on_diagnostic_loader_warns_toggled(bool checked); diff --git a/vkconfig_gui/tab_drivers.cpp b/vkconfig_gui/tab_drivers.cpp index bd5ea20060..a8895afed4 100644 --- a/vkconfig_gui/tab_drivers.cpp +++ b/vkconfig_gui/tab_drivers.cpp @@ -25,12 +25,12 @@ #include "style.h" #include "../vkconfig_core/configurator.h" +#include "../vkconfig_core/json.h" #include +#include TabDrivers::TabDrivers(MainWindow &window, std::shared_ptr ui) : Tab(TAB_DRIVERS, window, ui) { - this->ui->drivers_device_list->installEventFilter(&window); - Configurator &configurator = Configurator::Get(); if (configurator.vulkan_system_info.loaderVersion < Version(1, 4, 322) && false) { @@ -43,8 +43,24 @@ TabDrivers::TabDrivers(MainWindow &window, std::shared_ptr ui) : this->connect(this->ui->driver_forced_name, SIGNAL(currentIndexChanged(int)), this, SLOT(on_driver_name_changed(int))); this->connect(this->ui->driver_group_box_paths, SIGNAL(toggled(bool)), this, SLOT(on_driver_paths_toggled(bool))); - this->connect(this->ui->driver_browse_button, SIGNAL(clicked()), this, SLOT(on_driver_browse_pressed())); - this->connect(this->ui->driver_path_lineedit, SIGNAL(returnPressed()), this, SLOT(on_driver_append_pressed())); + this->connect(this->ui->driver_browse, SIGNAL(clicked()), this, SLOT(on_driver_browse_pressed())); + this->connect(this->ui->driver_path, SIGNAL(returnPressed()), this, SLOT(on_driver_append_pressed())); + + this->connect(this->ui->driver_search, SIGNAL(textEdited(QString)), this, SLOT(on_search_textEdited(QString))); + this->connect(this->ui->driver_search, SIGNAL(returnPressed()), this, SLOT(on_search_next_pressed())); + this->connect(this->ui->driver_search_clear, SIGNAL(clicked()), this, SLOT(on_search_clear_pressed())); + + QShortcut *shortcut_override = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_Space), this->ui->driver_group_box_override); + this->connect(shortcut_override, SIGNAL(activated()), this, SLOT(on_driver_override_toggled())); + + QShortcut *shortcut_search = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_F), this->ui->driver_paths_list); + this->connect(shortcut_search, SIGNAL(activated()), this, SLOT(on_focus_search())); + QShortcut *shortcut_browse = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_O), this->ui->driver_paths_list); + this->connect(shortcut_browse, SIGNAL(activated()), this, SLOT(on_driver_browse_pressed())); + + // this->ui->driver_group_box_override->installEventFilter(&window); + this->ui->drivers_device_list->installEventFilter(&window); + this->ui->driver_paths_list->installEventFilter(&window); this->UpdateUI(UPDATE_REBUILD_UI); } @@ -54,6 +70,9 @@ TabDrivers::~TabDrivers() {} void TabDrivers::UpdateUI(UpdateUIMode ui_update_mode) { Configurator &configurator = Configurator::Get(); + this->ui->driver_search_clear->setEnabled(!this->ui->driver_search->text().isEmpty()); + this->ui->driver_search->setFocus(); + switch (ui_update_mode) { case UPDATE_REFRESH_UI: case UPDATE_REBUILD_UI: { @@ -131,14 +150,23 @@ void TabDrivers::UpdateUI(UpdateUIMode ui_update_mode) { } this->ui->driver_group_box_paths->blockSignals(true); - this->ui->driver_group_box_paths->setChecked(configurator.driver_paths_enabled); + this->ui->driver_group_box_paths->setChecked(configurator.driver_paths_enabled && configurator.driver_override_enabled); this->ui->driver_group_box_paths->blockSignals(false); this->ui->driver_paths_list->clear(); - this->ui->driver_path_lineedit->setText(configurator.last_driver_dir.RelativePath().c_str()); this->ui->driver_paths_list->blockSignals(true); for (auto it = configurator.driver_paths.begin(); it != configurator.driver_paths.end(); ++it) { + if (!this->driver_filter.empty()) { + const std::string text = it->first.AbsolutePath(); + + std::string lower_text = ::ToLowerCase(text); + std::string driver_filter_search = ::ToLowerCase(this->driver_filter); + if (lower_text.find(driver_filter_search.c_str()) == std::string::npos) { + continue; + } + } + QListWidgetItem *item_state = new QListWidgetItem; item_state->setFlags(item_state->flags() | Qt::ItemIsSelectable); item_state->setSizeHint(QSize(0, ITEM_HEIGHT)); @@ -190,12 +218,38 @@ bool TabDrivers::EventFilter(QObject *target, QEvent *event) { return false; } +void TabDrivers::on_focus_search() { this->ui->driver_search->setFocus(); } + +void TabDrivers::on_search_textEdited(const QString &text) { + this->driver_filter = text.toStdString(); + + this->ui->driver_search_clear->setEnabled(!text.isEmpty()); + + this->UpdateUI(UPDATE_REBUILD_UI); +} + +void TabDrivers::on_search_clear_pressed() { + this->driver_filter.clear(); + + this->ui->driver_search->clear(); + this->ui->driver_search_clear->setEnabled(false); + + this->UpdateUI(UPDATE_REBUILD_UI); +} + +void TabDrivers::on_search_next_pressed() {} + +void TabDrivers::on_driver_override_toggled() { + this->ui->driver_group_box_override->setChecked(!this->ui->driver_group_box_override->isChecked()); +} + void TabDrivers::on_driver_override_toggled(bool checked) { Configurator &configurator = Configurator::Get(); + int index = std::max(this->ui->driver_forced_name->currentIndex(), 0); + configurator.driver_override_enabled = checked; - configurator.driver_override_info = - ::GetDeviceInfo(configurator.vulkan_system_info.physicalDevices[this->ui->driver_forced_name->currentIndex()]); + configurator.driver_override_info = ::GetDeviceInfo(configurator.vulkan_system_info.physicalDevices[index]); configurator.Override(OVERRIDE_AREA_LOADER_SETTINGS_BIT); this->UpdateUI(UPDATE_REBUILD_UI); @@ -244,7 +298,7 @@ void TabDrivers::on_paths_toggled() { void TabDrivers::on_driver_append_pressed() { Configurator &configurator = Configurator::Get(); - const Path &selected_path = this->ui->driver_path_lineedit->text().toStdString(); + const Path &selected_path = this->ui->driver_path->text().toStdString(); if (selected_path.Empty()) { return; @@ -277,16 +331,41 @@ void TabDrivers::on_driver_append_pressed() { void TabDrivers::on_driver_browse_pressed() { Configurator &configurator = Configurator::Get(); - const Path &selected_path = - QFileDialog::getExistingDirectory(this->ui->driver_browse_button, "Adding Driver Manifests Directory...", - configurator.last_driver_dir.AbsolutePath().c_str()) - .toStdString(); + const Path &selected_path = QFileDialog::getExistingDirectory(this->ui->driver_browse, "Adding Driver Manifests Directory...", + configurator.last_driver_dir.AbsolutePath().c_str()) + .toStdString(); if (selected_path.Empty()) { return; } + /* + QJsonDocument document = ParseJsonFile(selected_path.AbsolutePath().c_str()); + if (document.isNull() || document.isEmpty()) { + QMessageBox alert; + alert.setWindowTitle("Could not open the JSON file"); + alert.setText("The path"); + alert.setInformativeText(selected_path.AbsolutePath().c_str()); + alert.setStandardButtons(QMessageBox::Ok); + alert.setDefaultButton(QMessageBox::Ok); + alert.setIcon(QMessageBox::Warning); + alert.exec(); + return; + } - this->ui->driver_path_lineedit->setText(selected_path.AbsolutePath().c_str()); + const QJsonObject& json_root_object = document.object(); + if (json_root_object.value("ICD") == QJsonValue::Undefined) { + QMessageBox alert; + alert.setWindowTitle("Could not open the JSON file"); + alert.setText("The path"); + alert.setInformativeText(selected_path.AbsolutePath().c_str()); + alert.setStandardButtons(QMessageBox::Ok); + alert.setDefaultButton(QMessageBox::Ok); + alert.setIcon(QMessageBox::Warning); + alert.exec(); + return; + } + */ + this->ui->driver_path->setText(selected_path.AbsolutePath().c_str()); this->on_driver_append_pressed(); } diff --git a/vkconfig_gui/tab_drivers.h b/vkconfig_gui/tab_drivers.h index 5b3d0078c3..f2372e6a11 100644 --- a/vkconfig_gui/tab_drivers.h +++ b/vkconfig_gui/tab_drivers.h @@ -38,12 +38,19 @@ class TabDrivers : public Tab { void on_driver_mode_changed(int index); void on_driver_name_changed(int index); + void on_driver_override_toggled(); void on_driver_paths_toggled(bool checked); void on_paths_changed(); void on_paths_toggled(); void on_driver_append_pressed(); void on_driver_browse_pressed(); + void on_focus_search(); + void on_search_textEdited(const QString &text); + void on_search_clear_pressed(); + void on_search_next_pressed(); + private: std::string new_path; + std::string driver_filter; }; diff --git a/vkconfig_gui/tab_layers.cpp b/vkconfig_gui/tab_layers.cpp index fefd77001e..cc1fdc751c 100644 --- a/vkconfig_gui/tab_layers.cpp +++ b/vkconfig_gui/tab_layers.cpp @@ -28,6 +28,8 @@ #include #include +#include +#include #include #include @@ -38,13 +40,25 @@ TabLayers::TabLayers(MainWindow &window, std::shared_ptr ui) : T this->ui->layers_progress->setValue(0); this->ui->layers_progress->setVisible(false); this->ui->layers_path_lineedit->setVisible(true); - this->ui->layers_path_lineedit->setText(configurator.layers.last_layers_path.RelativePath().c_str()); - this->ui->layers_validate_checkBox->setChecked(configurator.layers.validate_manifests); + this->ui->layers_search_clear->setEnabled(false); this->connect(this->ui->layers_browse_button, SIGNAL(clicked()), this, SLOT(on_layers_browse_pressed())); this->connect(this->ui->layers_reload_button, SIGNAL(clicked()), this, SLOT(on_layers_reload_pressed())); this->connect(this->ui->layers_path_lineedit, SIGNAL(returnPressed()), this, SLOT(on_layers_append_pressed())); - this->connect(this->ui->layers_validate_checkBox, SIGNAL(toggled(bool)), this, SLOT(on_layers_validate_checkBox_toggled(bool))); + + this->connect(this->ui->layers_search, SIGNAL(textEdited(QString)), this, SLOT(on_search_textEdited(QString))); + this->connect(this->ui->layers_search_clear, SIGNAL(clicked()), this, SLOT(on_search_clear_pressed())); + + QShortcut *shortcut_search = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_F), this->ui->layers_list); + this->connect(shortcut_search, SIGNAL(activated()), this, SLOT(on_focus_search())); + QShortcut *shortcut_browse = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_O), this->ui->layers_list); + this->connect(shortcut_browse, SIGNAL(activated()), this, SLOT(on_layers_browse_pressed())); + QShortcut *shortcut_reload = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_R), this->ui->layers_list); + this->connect(shortcut_reload, SIGNAL(activated()), this, SLOT(on_layers_reload_pressed())); + + // this->ui->layers_browse_button->installEventFilter(&window); + // this->ui->layers_reload_button->installEventFilter(&window); + this->ui->layers_list->installEventFilter(&window); } TabLayers::~TabLayers() {} @@ -54,87 +68,63 @@ void TabLayers::UpdateUI_LayersPaths(UpdateUIMode ui_update_mode) { Configurator &configurator = Configurator::Get(); - this->ui->layers_paths_tree->blockSignals(true); + this->ui->layers_list->blockSignals(true); switch (ui_update_mode) { case UPDATE_REBUILD_UI: { - this->ui->layers_paths_tree->clear(); - for (std::size_t group_index = configurator.layers.paths.size(); group_index > 0; --group_index) { - const LayersPaths group_path = static_cast(group_index - 1); - - std::vector &paths_group = configurator.layers.paths[group_path]; - for (std::size_t i = 0, n = paths_group.size(); i < n; ++i) { - const std::string &layer_path = paths_group[i].path.AbsolutePath(); - const std::vector &manifest_paths = CollectFilePaths(layer_path); - /* - if (group_path != LAYERS_PATHS_GUI) { - if (manifest_paths.empty()) { - continue; - } - } - */ - QTreeWidgetItem *item_state = new QTreeWidgetItem; - item_state->setFlags(item_state->flags() | Qt::ItemIsSelectable); - item_state->setSizeHint(0, QSize(0, ITEM_HEIGHT)); - LayersPathWidget *layer_path_widget = - new LayersPathWidget(paths_group[i], group_path, group_path == LAYERS_PATHS_GUI); - this->connect(layer_path_widget, SIGNAL(itemChanged()), this, SLOT(on_paths_changed())); - this->connect(layer_path_widget, SIGNAL(itemToggled()), this, SLOT(on_paths_toggled())); - - ui->layers_paths_tree->addTopLevelItem(item_state); - ui->layers_paths_tree->setItemWidget(item_state, 0, layer_path_widget); - - for (std::size_t manifest_index = 0, manifest_count = manifest_paths.size(); manifest_index < manifest_count; - ++manifest_index) { - const Layer *layer = configurator.layers.FindFromManifest(manifest_paths[manifest_index], true); - if (layer == nullptr) { - continue; // When the directory has JSON files that are not layer manifest - } - - std::string label = layer->key; - - if (layer->is_32bits) { - label += " (32 bits)"; - } - - label += " - " + layer->api_version.str(); - - if (layer->status != STATUS_STABLE) { - label += format(" (%s)", GetToken(layer->status)); - } - - // label += " - " + layer->manifest_path.AbsolutePath(); - - QTreeWidgetItem *item = new QTreeWidgetItem; - item->setText(0, label.c_str()); - item->setToolTip(0, layer->manifest_path.AbsolutePath().c_str()); - item->setDisabled(!paths_group[i].enabled); - item_state->addChild(item); + this->ui->layers_list->clear(); + + const std::set &layer_display_list = configurator.layers.BuildLayerDisplayList(); + + for (auto it = layer_display_list.begin(), end = layer_display_list.end(); it != end; ++it) { + const Layer *layer = configurator.layers.FindFromManifest(it->manifest_path, true); + if (layer == nullptr) { + continue; + } + + if (!this->layer_filter.empty()) { + const std::string status = layer->status == STATUS_STABLE ? "" : format(" (%s)", ::GetToken(layer->status)); + const std::string text = format("%s - %s%s, %s layer", layer->key.c_str(), layer->api_version.str().c_str(), + status.c_str(), ::GetToken(layer->type)); + + std::string lower_text = ::ToLowerCase(text); + std::string layer_filter_search = ::ToLowerCase(this->layer_filter); + if (lower_text.find(layer_filter_search.c_str()) == std::string::npos) { + continue; } } - } - this->ui->layers_paths_tree->expandAll(); - } break; - case UPDATE_REFRESH_UI: { - for (int i = 0; i < this->ui->layers_paths_tree->topLevelItemCount(); ++i) { - QTreeWidgetItem *item = this->ui->layers_paths_tree->topLevelItem(i); - LayersPathWidget *widget = static_cast(ui->layers_paths_tree->itemWidget(item, 0)); - - for (int i = 0; i < item->childCount(); ++i) { - QTreeWidgetItem *child_item = item->child(i); - child_item->setDisabled(!widget->isChecked()); + QListWidgetItem *item = new QListWidgetItem; + item->setFlags(item->flags() | Qt::ItemIsSelectable); + item->setSizeHint(QSize(0, ITEM_HEIGHT)); + + LayerWidget *layer_widget = new LayerWidget(layer); + layer_widget->setChecked(it->descriptor.enabled); + if (it->descriptor.added) { + QPalette palette = layer_widget->palette(); + palette.setColor(QPalette::Active, QPalette::WindowText, QColor(255, 0, 0)); + layer_widget->setPalette(palette); } + + this->connect(layer_widget, SIGNAL(itemChanged()), this, SLOT(on_paths_changed())); + this->connect(layer_widget, SIGNAL(itemToggled()), this, SLOT(on_paths_toggled())); + + ui->layers_list->addItem(item); + ui->layers_list->setItemWidget(item, layer_widget); } } break; + default: { + } break; } - this->ui->layers_paths_tree->blockSignals(false); + this->ui->layers_list->blockSignals(false); } void TabLayers::UpdateUI(UpdateUIMode ui_update_mode) { const Configurator &configurator = Configurator::Get(); + this->ui->layers_search_clear->setEnabled(!this->ui->layers_search->text().isEmpty()); + this->ui->layers_search->setFocus(); this->ui->layers_progress->resetFormat(); this->ui->layers_progress->setValue(0); @@ -168,11 +158,6 @@ void TabLayers::on_paths_toggled() { this->UpdateUI_LayersPaths(UPDATE_REFRESH_UI); } -void TabLayers::on_layers_validate_checkBox_toggled(bool checked) { - Configurator &configurator = Configurator::Get(); - configurator.layers.validate_manifests = checked; -} - void TabLayers::on_layers_append_pressed() { this->LoadLayersManifest(this->ui->layers_path_lineedit->text()); } void TabLayers::on_layers_browse_pressed() { @@ -180,11 +165,30 @@ void TabLayers::on_layers_browse_pressed() { const QString selected_path = QFileDialog::getExistingDirectory(this->ui->layers_browse_button, "Select Layer Manifests Folder...", - configurator.layers.last_layers_path.AbsolutePath().c_str()); + configurator.layers.last_layers_dir.AbsolutePath().c_str()); this->LoadLayersManifest(selected_path); } +void TabLayers::on_focus_search() { this->ui->layers_search->setFocus(); } + +void TabLayers::on_search_textEdited(const QString &text) { + this->layer_filter = text.toStdString(); + + this->ui->layers_search_clear->setEnabled(!text.isEmpty()); + + this->UpdateUI_LayersPaths(UPDATE_REBUILD_UI); +} + +void TabLayers::on_search_clear_pressed() { + this->layer_filter.clear(); + + this->ui->layers_search->clear(); + this->ui->layers_search_clear->setEnabled(false); + + this->UpdateUI_LayersPaths(UPDATE_REBUILD_UI); +} + void TabLayers::on_layers_reload_pressed() { this->ui->layers_path_lineedit->setVisible(false); this->ui->layers_browse_button->setVisible(false); @@ -196,13 +200,11 @@ void TabLayers::on_layers_reload_pressed() { std::vector layers_count(LAYER_LOAD_COUNT, 0); - LayersPathInfo info; - info.path = new_path; - configurator.layers.AppendPath(info); - configurator.layers.UpdatePathEnabled(info, LAYERS_PATHS_GUI); + const std::vector &layers_paths = ::CollectFilePaths(new_path); - const std::vector layers_paths = - new_path.Empty() ? configurator.layers.CollectManifestPaths() : ::CollectFilePaths(new_path); + for (std::size_t i = 0, n = layers_paths.size(); i < n; ++i) { + configurator.layers.AppendPath(layers_paths[i], LAYER_TYPE_EXPLICIT, true); + } this->ui->layers_progress->setMaximum(static_cast(layers_paths.size())); this->ui->layers_progress->setValue(0); @@ -224,7 +226,7 @@ void TabLayers::on_layers_reload_pressed() { configurator.UpdateConfigurations(); configurator.Override(OVERRIDE_AREA_ALL); - std::string last_layers_path = configurator.layers.last_layers_path.AbsolutePath(); + std::string last_layers_path = configurator.layers.last_layers_dir.AbsolutePath(); if (!configurator.Get(HIDE_MESSAGE_NOTIFICATION_LAYERS_LOADED)) { std::string text = "Loading and reloading all located layers manifests:\n"; @@ -255,8 +257,10 @@ void TabLayers::LoadLayersManifest(const QString &selected_path) { Configurator &configurator = Configurator::Get(); if (!selected_path.isEmpty()) { - configurator.layers.last_layers_path = selected_path.toStdString(); - this->ui->layers_path_lineedit->setText(configurator.layers.last_layers_path.AbsolutePath().c_str()); + configurator.layers.last_layers_dir = selected_path.toStdString(); + if (!configurator.layers.last_layers_dir.Empty()) { + this->ui->layers_path_lineedit->setText(configurator.layers.last_layers_dir.AbsolutePath().c_str()); + } this->on_layers_reload_pressed(); diff --git a/vkconfig_gui/tab_layers.h b/vkconfig_gui/tab_layers.h index 7513a62b6f..aa55c1b3b8 100644 --- a/vkconfig_gui/tab_layers.h +++ b/vkconfig_gui/tab_layers.h @@ -38,11 +38,16 @@ class TabLayers : public Tab { public Q_SLOTS: void on_paths_changed(); void on_paths_toggled(); - void on_layers_validate_checkBox_toggled(bool checked); void on_layers_append_pressed(); void on_layers_browse_pressed(); void on_layers_reload_pressed(); + void on_focus_search(); + void on_search_textEdited(const QString &text); + void on_search_clear_pressed(); + private: void LoadLayersManifest(const QString &selected_path); + + std::string layer_filter; }; diff --git a/vkconfig_gui/tab_preferences.cpp b/vkconfig_gui/tab_preferences.cpp index 4424fbb397..e9cb33fa8b 100644 --- a/vkconfig_gui/tab_preferences.cpp +++ b/vkconfig_gui/tab_preferences.cpp @@ -48,6 +48,7 @@ TabPreferences::TabPreferences(MainWindow &window, std::shared_ptrconnect(this->ui->preferences_vk_download_open, SIGNAL(clicked()), this, SLOT(on_vk_download_open_pressed())); this->connect(this->ui->preferences_reset, SIGNAL(clicked()), this, SLOT(on_reset_hard_pressed())); this->connect(this->ui->preferences_show_debug_settings, SIGNAL(toggled(bool)), this, SLOT(on_layer_debug_mode_toggled(bool))); + this->connect(this->ui->preferences_validate_layer, SIGNAL(toggled(bool)), this, SLOT(on_layer_validate_toggled(bool))); this->connect(this->ui->preferences_open_page, SIGNAL(clicked()), this, SLOT(on_open_page_pressed())); this->connect(this->ui->preferences_notify_releases, SIGNAL(toggled(bool)), this, SLOT(on_notify_releases_toggled(bool))); this->connect(this->ui->preferences_download, SIGNAL(clicked()), this, SLOT(on_download_pressed())); @@ -85,8 +86,8 @@ TabPreferences::TabPreferences(MainWindow &window, std::shared_ptrui->preferences_progress->setVisible(false); this->ui->preferences_notify_releases->setChecked(configurator.GetUseNotifyReleases()); - this->ui->preferences_download->setText("Searching Latest Vulkan SDK..."); + this->ui->preferences_validate_layer->setChecked(configurator.layers.validate_manifests); #if WORKAROUND_WINARM_RELEASE_NOTIFICATION_BUG // Windows ARM crash, it looks like a Qt bug in 6.8.2... @@ -170,11 +171,13 @@ void TabPreferences::on_theme_mode_changed(int index) { this->ui->configurations_settings_reset->setIcon(::Get(new_theme_mode, ::ICON_RELOAD)); // Drivers - this->ui->driver_browse_button->setIcon(::Get(new_theme_mode, ::ICON_FOLDER_SEARCH)); + this->ui->driver_browse->setIcon(::Get(new_theme_mode, ::ICON_FOLDER_SEARCH)); + this->ui->driver_search_clear->setIcon(::Get(new_theme_mode, ::ICON_EXIT)); // Layers this->ui->layers_browse_button->setIcon(::Get(new_theme_mode, ::ICON_FOLDER_SEARCH)); this->ui->layers_reload_button->setIcon(::Get(new_theme_mode, ::ICON_FOLDER_RELOAD)); + this->ui->layers_search_clear->setIcon(::Get(new_theme_mode, ::ICON_EXIT)); // Applications this->ui->launch_executable_search->setIcon(::Get(new_theme_mode, ::ICON_FILE_SEARCH)); @@ -259,7 +262,8 @@ void TabPreferences::on_theme_mode_changed(int index) { this->ui->configurations_list->setPalette(palette); this->ui->configurations_settings->setPalette(palette); this->ui->configurations_layers_list->setPalette(palette); - this->ui->layers_paths_tree->setPalette(palette); + this->ui->layers_list->setPalette(palette); + this->ui->driver_paths_list->setPalette(palette); delete dummy_widget; } @@ -431,6 +435,11 @@ void TabPreferences::on_notify_releases_toggled(bool checked) { configurator.SetUseNotifyReleases(checked); } +void TabPreferences::on_layer_validate_toggled(bool checked) { + Configurator &configurator = Configurator::Get(); + configurator.layers.validate_manifests = checked; +} + void TabPreferences::on_layer_debug_mode_toggled(bool checked) { Configurator &configurator = Configurator::Get(); configurator.SetUseLayerDebugMode(checked); diff --git a/vkconfig_gui/tab_preferences.h b/vkconfig_gui/tab_preferences.h index 62431c434a..7bfa93543a 100644 --- a/vkconfig_gui/tab_preferences.h +++ b/vkconfig_gui/tab_preferences.h @@ -45,6 +45,7 @@ class TabPreferences : public Tab { void on_vk_download_browse_pressed(); void on_vk_download_open_pressed(); void on_reset_hard_pressed(); + void on_layer_validate_toggled(bool checked); void on_layer_debug_mode_toggled(bool checked); void on_open_page_pressed(); void on_download_pressed(); diff --git a/vkconfig_gui/widget_tab_driver_path.cpp b/vkconfig_gui/widget_tab_driver_path.cpp index 650bba6866..7d5e4b97b9 100644 --- a/vkconfig_gui/widget_tab_driver_path.cpp +++ b/vkconfig_gui/widget_tab_driver_path.cpp @@ -32,10 +32,10 @@ DriverPathWidget::DriverPathWidget(const Path& path, bool enabled) : path(path), const Configurator& configurator = Configurator::Get(); this->buttom_remove = new QPushButton(this); - this->buttom_remove->setIcon(::Get(configurator.current_theme_mode, ::ICON_FOLDER_REMOVE)); + this->buttom_remove->setIcon(::Get(configurator.current_theme_mode, ::ICON_FILE_REMOVE)); this->buttom_remove->setFixedSize(24, 24); - this->setText(format("%s", this->path.RelativePath().c_str()).c_str()); + this->setText(format("%s", this->path.AbsolutePath().c_str()).c_str()); this->setToolTip(format("%s", this->path.AbsolutePath().c_str()).c_str()); this->connect(this, SIGNAL(toggled(bool)), this, SLOT(on_toggled(bool))); diff --git a/vkconfig_gui/widget_tab_layers_path.cpp b/vkconfig_gui/widget_tab_layers_path.cpp index 8b3503e4da..d4b84eea4d 100644 --- a/vkconfig_gui/widget_tab_layers_path.cpp +++ b/vkconfig_gui/widget_tab_layers_path.cpp @@ -26,29 +26,27 @@ #include #include -LayersPathWidget::LayersPathWidget(const LayersPathInfo& path_info, LayersPaths layers_path, bool removabled) - : layers_path(layers_path), path_info(path_info) { - this->setChecked(this->path_info.enabled); - +LayerWidget::LayerWidget(const Layer* layer) + : layer_key(layer->key), api_version(layer->api_version), manifest_path(layer->manifest_path) { const Configurator& configurator = Configurator::Get(); + const std::string status = layer->status == STATUS_STABLE ? "" : format(" (%s)", ::GetToken(layer->status)); + const std::string text = format("%s - %s%s, %s layer", layer->key.c_str(), layer->api_version.str().c_str(), status.c_str(), + ::GetToken(layer->type)); + + this->setText(text.c_str()); + this->setToolTip(format("%s", manifest_path.AbsolutePath().c_str()).c_str()); + this->buttom_remove = new QPushButton(this); this->buttom_remove->setIcon(::Get(configurator.current_theme_mode, ::ICON_FOLDER_REMOVE)); - this->buttom_remove->setToolTip("Only layer paths manually added with Vulkan Configurator can be removed."); + this->buttom_remove->setToolTip("Remove the Vulkan layer from Vulkan Configurator"); this->buttom_remove->setFixedSize(24, 24); - this->buttom_remove->setEnabled(layers_path == LAYERS_PATHS_GUI); - - if (!removabled) { - this->buttom_remove->hide(); - } - - this->setText(format("[%s] %s", GetLabel(layers_path), path_info.path.AbsolutePath().c_str()).c_str()); this->connect(this, SIGNAL(toggled(bool)), this, SLOT(on_toggled(bool))); this->connect(this->buttom_remove, SIGNAL(clicked(bool)), this, SLOT(on_buttom_remove_clicked(bool))); } -void LayersPathWidget::resizeEvent(QResizeEvent* event) { +void LayerWidget::resizeEvent(QResizeEvent* event) { QSize size = event->size(); const QFontMetrics fm = this->buttom_remove->fontMetrics(); @@ -58,20 +56,22 @@ void LayersPathWidget::resizeEvent(QResizeEvent* event) { this->buttom_remove->setGeometry(remove_button_rect); } -void LayersPathWidget::on_buttom_remove_clicked(bool checked) { +void LayerWidget::on_buttom_remove_clicked(bool checked) { (void)checked; Configurator& configurator = Configurator::Get(); if (!(configurator.Get(HIDE_MESSAGE_QUESTION_REMOVING_LAYERS_PATH))) { QMessageBox alert; - alert.setWindowTitle("Removing a layers path..."); + alert.setWindowTitle(format("Removing %s %s layer...", this->layer_key.c_str(), this->api_version.str().c_str()).c_str()); alert.setIcon(QMessageBox::Question); alert.setDefaultButton(QMessageBox::No); alert.setStandardButtons(QMessageBox::Yes | QMessageBox::No); alert.setCheckBox(new QCheckBox("Do not show again.")); - alert.setText(format("Are you sure you want to remove the following path from %s?", VKCONFIG_NAME).c_str()); - alert.setInformativeText(this->path_info.path.AbsolutePath().c_str()); + alert.setText(format("Are you sure you want to remove %s %s from %s?", this->layer_key.c_str(), + this->api_version.str().c_str(), VKCONFIG_NAME) + .c_str()); + alert.setInformativeText(format("The layer is located: %s", this->manifest_path.AbsolutePath().c_str()).c_str()); int ret_val = alert.exec(); if (alert.checkBox()->isChecked()) { configurator.Set(HIDE_MESSAGE_QUESTION_REMOVING_LAYERS_PATH); @@ -81,21 +81,14 @@ void LayersPathWidget::on_buttom_remove_clicked(bool checked) { } } - configurator.layers.RemovePath(this->path_info); - - this->path_info.path.Clear(); + configurator.layers.RemovePath(this->manifest_path); emit itemChanged(); } -void LayersPathWidget::on_toggled(bool checked) { - // Check the path is not removed - if (!this->path_info.path.Empty()) { - this->path_info.enabled = checked; - - Configurator& configurator = Configurator::Get(); - configurator.layers.UpdatePathEnabled(this->path_info, this->layers_path); +void LayerWidget::on_toggled(bool checked) { + Configurator& configurator = Configurator::Get(); + configurator.layers.Enable(this->manifest_path, checked); - emit itemToggled(); - } + emit itemToggled(); } diff --git a/vkconfig_gui/widget_tab_layers_path.h b/vkconfig_gui/widget_tab_layers_path.h index 83f20332b2..d91da0f0e3 100644 --- a/vkconfig_gui/widget_tab_layers_path.h +++ b/vkconfig_gui/widget_tab_layers_path.h @@ -27,11 +27,11 @@ #include #include -class LayersPathWidget : public QCheckBox { +class LayerWidget : public QCheckBox { Q_OBJECT public: - LayersPathWidget(const LayersPathInfo &path_info, LayersPaths layers_path, bool removabled); + LayerWidget(const Layer *layer); protected: void resizeEvent(QResizeEvent *event) override; @@ -45,7 +45,8 @@ class LayersPathWidget : public QCheckBox { void itemToggled(); public: - LayersPaths layers_path; - LayersPathInfo path_info; + std::string layer_key; + Version api_version; + Path manifest_path; QPushButton *buttom_remove = nullptr; };