Skip to content

Commit

Permalink
vkconfig3: Add 'Discard' layer control
Browse files Browse the repository at this point in the history
  • Loading branch information
christophe-lunarg committed Oct 29, 2024
1 parent 49fd2c3 commit dcb7d9f
Show file tree
Hide file tree
Showing 31 changed files with 414 additions and 193 deletions.
69 changes: 43 additions & 26 deletions vkconfig_core/configuration.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
static void AddApplicationEnabledParameters(std::vector<Parameter>& parameters) {
bool found_applications_api = false;
for (auto paramater : parameters) {
if (paramater.control != LAYER_CONTROL_APPLICATIONS_API) {
if (paramater.builtin != LAYER_BUILTIN_API) {
continue;
}

Expand All @@ -54,16 +54,16 @@ static void AddApplicationEnabledParameters(std::vector<Parameter>& parameters)

if (!found_applications_api) {
Parameter applications_enabled_layers_api;
applications_enabled_layers_api.key = ::GetLabel(LAYER_CONTROL_APPLICATIONS_API);
applications_enabled_layers_api.control = LAYER_CONTROL_APPLICATIONS_API;
applications_enabled_layers_api.key = ::GetLabel(LAYER_BUILTIN_API);
applications_enabled_layers_api.builtin = LAYER_BUILTIN_API;
applications_enabled_layers_api.control = LAYER_CONTROL_DISCARD; // Until the Vulkan Loader is fixed
applications_enabled_layers_api.overridden_rank = 998;
applications_enabled_layers_api.enabled = false;
parameters.push_back(applications_enabled_layers_api);
}

bool found_applications_env = false;
for (auto paramater : parameters) {
if (paramater.control != LAYER_CONTROL_APPLICATIONS_ENV) {
if (paramater.builtin != LAYER_BUILTIN_ENV) {
continue;
}

Expand All @@ -73,10 +73,10 @@ static void AddApplicationEnabledParameters(std::vector<Parameter>& parameters)

if (!found_applications_env) {
Parameter applications_enabled_layers_env;
applications_enabled_layers_env.key = ::GetLabel(LAYER_CONTROL_APPLICATIONS_ENV);
applications_enabled_layers_env.control = LAYER_CONTROL_APPLICATIONS_ENV;
applications_enabled_layers_env.key = ::GetLabel(LAYER_BUILTIN_ENV);
applications_enabled_layers_env.builtin = LAYER_BUILTIN_ENV;
applications_enabled_layers_env.control = LAYER_CONTROL_DISCARD; // Until the Vulkan Loader is fixed
applications_enabled_layers_env.overridden_rank = 999;
applications_enabled_layers_env.enabled = false;
parameters.push_back(applications_enabled_layers_env);
}
}
Expand Down Expand Up @@ -177,20 +177,35 @@ bool Configuration::Load(const Path& full_path, const LayerManager& layers) {
const QJsonObject& json_layer_object = json_layers_array[layer_index].toObject();

Parameter parameter;
parameter.control = GetLayerControl(ReadStringValue(json_layer_object, "control").c_str());
if (IsVisibleLayer(parameter.control)) {
parameter.key = ReadStringValue(json_layer_object, "name").c_str();
} else {
parameter.key = ::GetLabel(parameter.control);
if (json_layer_object.value("name") != QJsonValue::Undefined) {
parameter.key = json_layer_object.value("name").toString().toStdString();
}
parameter.overridden_rank = ReadIntValue(json_layer_object, "rank");
const std::string& version = ReadStringValue(json_layer_object, "version");
parameter.api_version = version == "latest" ? Version::LATEST : Version(version.c_str());
if (json_layer_object.value("manifest") != QJsonValue::Undefined) {
parameter.manifest = ReadString(json_layer_object, "manifest");
if (json_layer_object.value("builtin") != QJsonValue::Undefined) {
parameter.builtin = ::GetLayerBuiltin(json_layer_object.value("builtin").toString().toStdString().c_str());
parameter.key = ::GetLabel(parameter.builtin);
}
if (json_layer_object.value("control") != QJsonValue::Undefined) {
parameter.control = ::GetLayerControl(json_layer_object.value("control").toString().toStdString().c_str());
}
if (json_layer_object.value("rank") != QJsonValue::Undefined) {
parameter.overridden_rank = json_layer_object.value("rank").toInt();
}
if (json_layer_object.value("version") != QJsonValue::Undefined) {
const std::string& version = ReadStringValue(json_layer_object, "version");
parameter.api_version = version == "latest" ? Version::LATEST : Version(version.c_str());
}

const Layer* layer = layers.Find(parameter.key, parameter.api_version);

if (layer != nullptr) {
parameter.manifest = layer->manifest_path;
}
if (json_layer_object.value("enabled") != QJsonValue::Undefined) {
parameter.enabled = ReadBoolValue(json_layer_object, "enabled");

if (json_layer_object.value("manifest") != QJsonValue::Undefined) {
std::string manifest_path = ReadString(json_layer_object, "manifest");
if (layers.FindFromManifest(manifest_path) != nullptr) {
parameter.manifest = manifest_path;
}
}

const QJsonValue& json_platform_value = json_layer_object.value("platforms");
Expand All @@ -203,8 +218,6 @@ bool Configuration::Load(const Path& full_path, const LayerManager& layers) {
parameter.setting_tree_state = json_layer_object.value("expanded_states").toVariant().toByteArray();
}

const Layer* layer = layers.Find(parameter.key, parameter.api_version);

if (layer != nullptr) {
CollectDefaultSettingData(layer->settings, parameter.settings);
}
Expand Down Expand Up @@ -263,11 +276,15 @@ bool Configuration::Save(const Path& full_path, bool exporter) const {

QJsonObject json_layer;
json_layer.insert("name", parameter.key.c_str());
json_layer.insert("rank", parameter.overridden_rank);
if (parameter.builtin != LAYER_BUILTIN_NONE) {
json_layer.insert("builtin", GetToken(parameter.builtin));
}
json_layer.insert("control", GetToken(parameter.control));
json_layer.insert("rank", parameter.overridden_rank);
json_layer.insert("version", parameter.api_version == Version::LATEST ? "latest" : parameter.api_version.str().c_str());
json_layer.insert("manifest", parameter.manifest.RelativePath().c_str());
json_layer.insert("enabled", parameter.enabled);
if (parameter.builtin == LAYER_BUILTIN_NONE) {
json_layer.insert("manifest", parameter.manifest.RelativePath().c_str());
}
SaveStringArray(json_layer, "platforms", GetPlatformTokens(parameter.platform_flags));
if (!exporter && !parameter.setting_tree_state.isEmpty()) {
json_layer.insert("expanded_states", parameter.setting_tree_state.data());
Expand Down Expand Up @@ -400,7 +417,7 @@ bool Configuration::HasMissingLayer(const LayerManager& layers, std::vector<std:
continue; // If unsupported are missing, it doesn't matter
}

if (!IsVisibleLayer(it->control)) {
if (it->builtin != LAYER_BUILTIN_NONE) {
continue;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,7 @@
],
"layers": [
{
"control": "unordered_layer_location",
"enabled": false,
"builtin": "unordered_layer_location",
"platforms": [
"WINDOWS",
"LINUX",
Expand All @@ -36,8 +35,7 @@
"version": "latest"
},
{
"control": "application_enabled_layers",
"enabled": false,
"builtin": "application_enabled_layers",
"platforms": [
"WINDOWS",
"LINUX",
Expand Down
23 changes: 13 additions & 10 deletions vkconfig_core/configurator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -119,13 +119,15 @@ static QJsonObject CreateJsonSettingObject(const Configurator::LoaderSettings& l
const Configurator::LoaderLayerSettings& layer = loader_settings.layers[j];

QJsonObject json_layer;
if (layer.control != LAYER_CONTROL_APPLICATIONS_API && layer.control != LAYER_CONTROL_APPLICATIONS_ENV) {
if (layer.builtin == LAYER_BUILTIN_NONE) {
json_layer.insert("name", layer.key.c_str());
json_layer.insert("path", layer.path.c_str());
json_layer.insert("treat_as_implicit_manifest", layer.implicit);
json_layer.insert("control", ToLowerCase(::GetToken(layer.control)).c_str());
} else {
json_layer.insert("control", ::GetToken(layer.builtin));
}

json_layer.insert("control", ToLowerCase(::GetToken(layer.control)).c_str());
json_layers.append(json_layer);
}

Expand Down Expand Up @@ -168,17 +170,19 @@ void Configurator::BuildLoaderSettings(const std::string& configuration_key, con
LoaderLayerSettings loader_layer_settings;

const Parameter& parameter = configuration->parameters[i];
if (!parameter.enabled) {
if (!(parameter.platform_flags & (1 << VKC_PLATFORM))) {
continue;
}

if (!(parameter.platform_flags & (1 << VKC_PLATFORM))) {
if (parameter.control == LAYER_CONTROL_DISCARD) {
continue;
}

if (parameter.control == LAYER_CONTROL_APPLICATIONS_API || parameter.control == LAYER_CONTROL_APPLICATIONS_ENV) {
loader_layer_settings.control = parameter.control;
} else {
loader_layer_settings.key = parameter.key;
loader_layer_settings.builtin = parameter.builtin;
loader_layer_settings.control = parameter.control;

if (parameter.builtin == LAYER_BUILTIN_NONE) {
const Layer* layer = this->layers.Find(parameter.key, parameter.api_version);
if (layer == nullptr) {
continue;
Expand Down Expand Up @@ -347,8 +351,7 @@ bool Configurator::WriteLayersSettings(OverrideArea override_area, const Path& l
continue;
}

if (parameter.control == LAYER_CONTROL_APPLICATIONS_API || parameter.control == LAYER_CONTROL_APPLICATIONS_ENV ||
parameter.control == LAYER_CONTROL_OFF) {
if (parameter.control == LAYER_CONTROL_DISCARD || parameter.control == LAYER_CONTROL_OFF) {
continue;
}

Expand Down Expand Up @@ -727,7 +730,7 @@ bool Configurator::HasActiveSettings() const {
if (configuration != nullptr) {
const Parameter* parameter = configuration->GetActiveParameter();
if (parameter != nullptr && configuration->override_layers) {
if (!IsVisibleLayer(parameter->control)) {
if (parameter->builtin != LAYER_BUILTIN_NONE) {
return false;
} else if (parameter->settings.empty()) {
return false;
Expand Down
1 change: 1 addition & 0 deletions vkconfig_core/configurator.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ class Configurator : public Serialize {
std::string key;
std::string path;
LayerControl control = LAYER_CONTROL_AUTO;
LayerBuiltin builtin = LAYER_BUILTIN_NONE;
bool implicit = false;
};

Expand Down
66 changes: 64 additions & 2 deletions vkconfig_core/layer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,68 @@ bool Layer::IsValid() const {
!implementation_version.empty();
}

LayerControl Layer::GetActualControl() const {
if (this->type == LAYER_TYPE_IMPLICIT) {
if (!this->disable_env.empty()) {
if (this->disable_value.empty()) {
if (qEnvironmentVariableIsSet(this->disable_env.c_str())) {
return LAYER_CONTROL_OFF;
}
} else {
if (qgetenv(this->disable_env.c_str()).toStdString() == this->disable_value) {
return LAYER_CONTROL_OFF;
}
}
}

if (!this->enable_env.empty()) {
if (this->enable_value.empty()) {
if (qEnvironmentVariableIsSet(this->enable_env.c_str())) {
return LAYER_CONTROL_ON;
}
} else {
if (qgetenv(this->enable_env.c_str()).toStdString() == this->enable_value) {
return LAYER_CONTROL_ON;
}
}
}
}

return this->type == LAYER_TYPE_IMPLICIT ? LAYER_CONTROL_ON : LAYER_CONTROL_OFF;
}

std::string Layer::GetActualControlTooltip() const {
if (this->type == LAYER_TYPE_IMPLICIT) {
if (!this->disable_env.empty()) {
const std::string& value = qgetenv(this->disable_env.c_str()).toStdString();
if (this->disable_value.empty()) {
if (qEnvironmentVariableIsSet(this->disable_env.c_str())) {
return format("'%s' is set", this->disable_env.c_str());
}
} else if (value == this->disable_value) {
if (qgetenv(this->disable_env.c_str()).toStdString() == this->disable_value) {
return format("'%s' is set to '%s'", this->disable_env.c_str(), value.c_str());
}
}
}

if (!this->enable_env.empty()) {
const std::string& value = qgetenv(this->enable_env.c_str()).toStdString();
if (this->enable_value.empty()) {
if (qEnvironmentVariableIsSet(this->enable_env.c_str())) {
return format("'%s' is set", this->enable_env.c_str());
}
} else if (value == this->enable_value) {
if (qgetenv(this->enable_env.c_str()).toStdString() == this->enable_value) {
return format("'%s' is set to '%s'", this->enable_env.c_str(), value.c_str());
}
}
}
}

return ::GetDescription(LAYER_CONTROL_AUTO);
}

std::string Layer::FindPresetLabel(const SettingDataSet& settings) const {
for (std::size_t i = 0, n = this->presets.size(); i < n; ++i) {
if (HasPreset(settings, this->presets[i].settings)) return this->presets[i].label;
Expand Down Expand Up @@ -276,13 +338,13 @@ bool Layer::Load(const Path& full_path_to_file, LayerType type, bool request_val
const QJsonObject& json_env_object = json_layer_object.value("disable_environment").toObject();
const QStringList keys = json_env_object.keys();
this->disable_env = keys[0].toStdString();
this->disable_value = ReadStringValue(json_env_object, this->disable_env.c_str()) == "1";
this->disable_value = ReadStringValue(json_env_object, this->disable_env.c_str());
}
if (json_layer_object.value("enable_environment") != QJsonValue::Undefined) {
const QJsonObject& json_env_object = json_layer_object.value("enable_environment").toObject();
const QStringList keys = json_env_object.keys();
this->enable_env = keys[0].toStdString();
this->enable_value = ReadStringValue(json_env_object, this->enable_env.c_str()) == "1";
this->enable_value = ReadStringValue(json_env_object, this->enable_env.c_str());
}

const QJsonValue& json_features_value = json_layer_object.value("features");
Expand Down
8 changes: 6 additions & 2 deletions vkconfig_core/layer.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include "version.h"
#include "path.h"
#include "type_layer_type.h"
#include "type_layer_control.h"

#include <QObject>
#include <QJsonDocument>
Expand Down Expand Up @@ -55,6 +56,9 @@ class Layer {

bool IsValid() const;

LayerControl GetActualControl() const;
std::string GetActualControlTooltip() const;

std::string FindPresetLabel(const SettingDataSet& settings) const;

SettingMeta* Instantiate(SettingMetaSet& meta_set, const std::string& key, const SettingType type);
Expand All @@ -80,9 +84,9 @@ class Layer {
QJsonDocument profile;
std::string disable_env;
std::string enable_env;
std::string disable_value;
std::string enable_value;
bool is_32bits = false;
bool disable_value;
bool enable_value;
bool enabled = true;

std::vector<SettingMeta*> settings;
Expand Down
14 changes: 8 additions & 6 deletions vkconfig_core/layer_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,11 @@ std::vector<LayersPathInfo> GetImplicitLayerPaths() {

#if VKC_ENV == VKC_ENV_WIN32
const std::vector<LayersPathInfo> &admin_registry_paths =
LoadRegistrySoftwareLayers("HKEY_LOCAL_MACHINE\\Software\\Khronos\\Vulkan\\ImplicitLayers");
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<LayersPathInfo> &user_registry_paths =
LoadRegistrySoftwareLayers("HKEY_CURRENT_USER\\Software\\Khronos\\Vulkan\\ImplicitLayers");
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
Expand All @@ -58,6 +58,7 @@ std::vector<LayersPathInfo> GetImplicitLayerPaths() {

for (std::size_t i = 0, n = std::size(LAYERS_PATHS); i < n; ++i) {
LayersPathInfo info;
info.type = LAYER_TYPE_IMPLICIT;
info.path = LAYERS_PATHS[i];
result.push_back(info);
}
Expand All @@ -71,11 +72,11 @@ std::vector<LayersPathInfo> GetExplicitLayerPaths() {

#if VKC_ENV == VKC_ENV_WIN32
const std::vector<LayersPathInfo> &admin_registry_paths =
LoadRegistrySoftwareLayers("HKEY_LOCAL_MACHINE\\Software\\Khronos\\Vulkan\\ExplicitLayers");
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<LayersPathInfo> &user_registry_paths =
LoadRegistrySoftwareLayers("HKEY_CURRENT_USER\\Software\\Khronos\\Vulkan\\ExplicitLayers");
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
Expand All @@ -99,6 +100,7 @@ std::vector<LayersPathInfo> GetExplicitLayerPaths() {

for (std::size_t i = 0, n = std::size(LAYERS_PATHS); i < n; ++i) {
LayersPathInfo info;
info.type = LAYER_TYPE_EXPLICIT;
info.path = LAYERS_PATHS[i];
result.push_back(info);
}
Expand Down Expand Up @@ -327,11 +329,11 @@ void LayerManager::LoadAllInstalledLayers() {
this->selected_layers.clear();

for (std::size_t group_index = 0, group_count = this->paths.size(); group_index < group_count; ++group_index) {
const LayerType layer_type = ::GetLayerType(static_cast<LayersPaths>(group_index));
// const LayerType layer_type = ::GetLayerType(static_cast<LayersPaths>(group_index));

const std::vector<LayersPathInfo> &paths_group = this->paths[group_index];
for (std::size_t i = 0, n = paths_group.size(); i < n; ++i) {
this->LoadLayersFromPath(paths_group[i].path, layer_type);
this->LoadLayersFromPath(paths_group[i].path, paths_group[i].type);
}
}
}
Expand Down
Loading

0 comments on commit dcb7d9f

Please sign in to comment.