aboutsummaryrefslogtreecommitdiff
path: root/layers
diff options
context:
space:
mode:
authorLenny Komow <lenny@lunarg.com>2016-09-30 14:15:25 -0600
committerLenny Komow <lenny@lunarg.com>2016-10-05 17:33:39 -0600
commit94decf7327ef2530cb7b623a2d261df21be4fa55 (patch)
tree1cf0f518edb5b203f60d37d24928cbc46fbb6bf4 /layers
parentaf9e373c49efaeb87c5bc54d31385e788508e461 (diff)
downloadusermoji-94decf7327ef2530cb7b623a2d261df21be4fa55.tar.xz
layers: Add environment var for settings file
Change-Id: I8a614f915ab9b61eca5b3b94f4cf43a33cacf250
Diffstat (limited to 'layers')
-rw-r--r--layers/README.md19
-rw-r--r--layers/vk_layer_config.cpp56
2 files changed, 60 insertions, 15 deletions
diff --git a/layers/README.md b/layers/README.md
index b496e750..8de8f181 100644
--- a/layers/README.md
+++ b/layers/README.md
@@ -21,13 +21,14 @@ vkXXXXGetProcAddr is used internally by the Layers and Loader to initialize disp
Layers can also be activated via the VK_INSTANCE_LAYERS environment variable.
All validation layers work with the DEBUG_REPORT extension to provide validation feedback.
-When a validation layer is enabled, it will look for a vk_layer_settings.txt file to define
-its logging behavior, which can include sending output to a file, stdout, or debug output (Windows).
-Applications can also register debug callback functions via the DEBUG_REPORT extension to receive
-callbacks when validation events occur. Application callbacks are independent of settings in a
-vk_layer_settings.txt file which will be carried out separately. If no vk_layer_settings.txt
-file is present and no application callbacks are registered, error messages will be output
-through default logging callbacks.
+When a validation layer is enabled, it will look for a vk_layer_settings.txt file (see"Using
+Layers" section below for more details) to define its logging behavior, which can include
+sending output to a file, stdout, or debug output (Windows). Applications can also register
+debug callback functions via the DEBUG_REPORT extension to receive callbacks when validation
+events occur. Application callbacks are independent of settings in a vk_layer_settings.txt
+file which will be carried out separately. If no vk_layer_settings.txt file is present and
+no application callbacks are registered, error messages will be output through default
+logging callbacks.
### Layer library example code
@@ -72,9 +73,9 @@ layers/swapchain.cpp (name=`VK_LAYER_LUNARG_swapchain`) - Check that WSI extensi
This is required for the Loader to be able to scan and enumerate your library.
Alternatively, use the `VK_LAYER_PATH` environment variable to specify where the layer libraries reside.
-3. Create a vk_layer_settings.txt file in the same directory to specify how your layers should behave.
+3. To specify how your layers should behave, create a vk_layer_settings.txt file. This file can exist in the same directory as your app or in a directory given by the `VK_LAYER_SETTINGS_PATH` environment variable. Alternatively, you can use any filename you want if you set `VK_LAYER_SETTINGS_PATH` to the full path of the file, rather than the directory that contains it.
- Model it after the following example: [*vk_layer_settings.txt*](vk_layer_settings.txt)
+ Model the file after the following example: [*vk_layer_settings.txt*](vk_layer_settings.txt)
4. Specify which layers to activate using environment variables.
diff --git a/layers/vk_layer_config.cpp b/layers/vk_layer_config.cpp
index ec50744d..d8fe87d2 100644
--- a/layers/vk_layer_config.cpp
+++ b/layers/vk_layer_config.cpp
@@ -21,14 +21,15 @@
* Author: Tobin Ehlis <tobin@lunarg.com>
* Author: Mark Lobodzinski <mark@lunarg.com>
**************************************************************************/
+#include "vk_layer_config.h"
+#include "vulkan/vk_sdk_platform.h"
#include <fstream>
-#include <string>
+#include <iostream>
#include <map>
#include <string.h>
+#include <string>
+#include <sys/stat.h>
#include <vulkan/vk_layer.h>
-#include <iostream>
-#include "vk_layer_config.h"
-#include "vulkan/vk_sdk_platform.h"
#define MAX_CHARS_PER_LINE 4096
@@ -49,6 +50,25 @@ class ConfigFile {
static ConfigFile g_configFileObj;
+std::string getEnvironment(const char *variable) {
+#if !defined(__ANDROID__) && !defined(_WIN32)
+ const char *output = getenv(variable);
+ return output == NULL ? "" : output;
+#elif defined(_WIN32)
+ int size = GetEnvironmentVariable(variable, NULL, 0);
+ if (size == 0) {
+ return "";
+ }
+ char *buffer = new char[size];
+ GetEnvironmentVariable(variable, buffer, size);
+ std::string output = buffer;
+ delete[] buffer;
+ return output;
+#else
+ return "";
+#endif
+}
+
const char *getLayerOption(const char *_option) { return g_configFileObj.getOption(_option); }
// If option is NULL or stdout, return stdout, otherwise try to open option
@@ -155,7 +175,19 @@ ConfigFile::~ConfigFile() {}
const char *ConfigFile::getOption(const std::string &_option) {
std::map<std::string, std::string>::const_iterator it;
if (!m_fileIsParsed) {
- parseFile("vk_layer_settings.txt");
+ std::string envPath = getEnvironment("VK_LAYER_SETTINGS_PATH");
+
+ // If the path exists use it, else use vk_layer_settings
+ struct stat info;
+ if (stat(envPath.c_str(), &info) == 0) {
+ // If this is a directory, look for vk_layer_settings within the directory
+ if (info.st_mode & S_IFDIR) {
+ envPath += "/vk_layer_settings.txt";
+ }
+ parseFile(envPath.c_str());
+ } else {
+ parseFile("vk_layer_settings.txt");
+ }
}
if ((it = m_valueMap.find(_option)) == m_valueMap.end())
@@ -166,7 +198,19 @@ const char *ConfigFile::getOption(const std::string &_option) {
void ConfigFile::setOption(const std::string &_option, const std::string &_val) {
if (!m_fileIsParsed) {
- parseFile("vk_layer_settings.txt");
+ std::string envPath = getEnvironment("VK_LAYER_SETTINGS_PATH");
+
+ // If the path exists use it, else use vk_layer_settings
+ struct stat info;
+ if (stat(envPath.c_str(), &info) == 0) {
+ // If this is a directory, look for vk_layer_settings within the directory
+ if (info.st_mode & S_IFDIR) {
+ envPath += "/vk_layer_settings.txt";
+ }
+ parseFile(envPath.c_str());
+ } else {
+ parseFile("vk_layer_settings.txt");
+ }
}
m_valueMap[_option] = _val;