vk_layer_config.cpp revision 329ca9eb16cdbee7a7644fb08ade7b3d3bb32e23
147e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn/**************************************************************************
247e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn *
3c5a5d63c7c7ef3d2238233fedf3be675934e30c9Jon Ashburn * Copyright 2014 Valve Software
49268944f0ecf9da8e9e49e014d2fb45faedb64ceMichael Lentine * Copyright 2015 Google Inc.
547e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn * All Rights Reserved.
647e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn *
747e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn * Permission is hereby granted, free of charge, to any person obtaining a copy
847e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn * of this software and associated documentation files (the "Software"), to deal
947e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn * in the Software without restriction, including without limitation the rights
1047e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1147e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn * copies of the Software, and to permit persons to whom the Software is
1247e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn * furnished to do so, subject to the following conditions:
1347e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn *
1447e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn * The above copyright notice and this permission notice shall be included in
1547e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn * all copies or substantial portions of the Software.
1647e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn *
1747e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1847e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1947e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
2047e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2147e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2247e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
2347e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn * THE SOFTWARE.
2447e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn *
25c5a5d63c7c7ef3d2238233fedf3be675934e30c9Jon Ashburn * Author: Jon Ashburn <jon@lunarg.com>
26c5a5d63c7c7ef3d2238233fedf3be675934e30c9Jon Ashburn * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
27c5a5d63c7c7ef3d2238233fedf3be675934e30c9Jon Ashburn * Author: Tobin Ehlis <tobin@lunarg.com>
2847e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn **************************************************************************/
2947e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn#include <fstream>
3047e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn#include <string>
3147e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn#include <map>
3247e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn#include <string.h>
33329ca9eb16cdbee7a7644fb08ade7b3d3bb32e23David Pinedo#include <vulkan/vk_layer.h>
34b4b6e7c2412a10c2df40493141229f79970e51bbTobin Ehlis#include <iostream>
3556d204acf07fe1639103ab9326886f3c06dbbb76Tobin Ehlis#include "vk_layer_config.h"
36329ca9eb16cdbee7a7644fb08ade7b3d3bb32e23David Pinedo#include "vulkan/vk_sdk_platform.h"
3747e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn
3847e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn#define MAX_CHARS_PER_LINE 4096
3947e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn
4047e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburnclass ConfigFile
4147e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn{
4247e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburnpublic:
4347e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn    ConfigFile();
4447e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn    ~ConfigFile();
4547e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn
4647e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn    const char *getOption(const std::string &_option);
470f1dbf15031846dee079e13a243de1ddfb65aaffJon Ashburn    void setOption(const std::string &_option, const std::string &_val);
480f1dbf15031846dee079e13a243de1ddfb65aaffJon Ashburn
4947e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburnprivate:
5047e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn    bool m_fileIsParsed;
5147e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn    std::map<std::string, std::string> m_valueMap;
5247e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn
5347e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn    void parseFile(const char *filename);
5447e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn};
5547e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn
5647e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburnstatic ConfigFile g_configFileObj;
570f1dbf15031846dee079e13a243de1ddfb65aaffJon Ashburn
581c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchterstatic VkLayerDbgAction stringToDbgAction(const char *_enum)
590f1dbf15031846dee079e13a243de1ddfb65aaffJon Ashburn{
600f1dbf15031846dee079e13a243de1ddfb65aaffJon Ashburn    // only handles single enum values
619cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    if (!strcmp(_enum, "VK_DBG_LAYER_ACTION_IGNORE"))
629cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        return VK_DBG_LAYER_ACTION_IGNORE;
639cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    else if (!strcmp(_enum, "VK_DBG_LAYER_ACTION_LOG_MSG"))
649cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        return VK_DBG_LAYER_ACTION_LOG_MSG;
65b94f051b39bc65e1110f1250b2ef0404f7104ab0Courtney Goeltzenleuchter#ifdef WIN32
66b94f051b39bc65e1110f1250b2ef0404f7104ab0Courtney Goeltzenleuchter    else if (!strcmp(_enum, "VK_DBG_LAYER_ACTION_DEBUG_OUTPUT"))
67b94f051b39bc65e1110f1250b2ef0404f7104ab0Courtney Goeltzenleuchter        return VK_DBG_LAYER_ACTION_DEBUG_OUTPUT;
68b94f051b39bc65e1110f1250b2ef0404f7104ab0Courtney Goeltzenleuchter#endif
699cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter    else if (!strcmp(_enum, "VK_DBG_LAYER_ACTION_BREAK"))
709cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        return VK_DBG_LAYER_ACTION_BREAK;
711c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter    return (VkLayerDbgAction) 0;
721c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter}
731c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter
741c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchterstatic VkFlags stringToDbgReportFlags(const char *_enum)
751c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter{
761c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter    // only handles single enum values
771c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter    if (!strcmp(_enum, "VK_DBG_REPORT_INFO"))
781c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter        return VK_DBG_REPORT_INFO_BIT;
791c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter    else if (!strcmp(_enum, "VK_DBG_REPORT_WARN"))
801c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter        return VK_DBG_REPORT_WARN_BIT;
811c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter    else if (!strcmp(_enum, "VK_DBG_REPORT_PERF_WARN"))
821c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter        return VK_DBG_REPORT_PERF_WARN_BIT;
831c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter    else if (!strcmp(_enum, "VK_DBG_REPORT_ERROR"))
841c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter        return VK_DBG_REPORT_ERROR_BIT;
8535b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter    else if (!strcmp(_enum, "VK_DBG_REPORT_DEBUG"))
8635b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter        return VK_DBG_REPORT_DEBUG_BIT;
871c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter    return (VkFlags) 0;
881c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter}
891c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter
901c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchterstatic unsigned int convertStringEnumVal(const char *_enum)
911c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter{
921c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter    unsigned int ret;
931c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter
941c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter    ret = stringToDbgAction(_enum);
951c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter    if (ret)
961c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter        return ret;
971c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter
981c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter    return stringToDbgReportFlags(_enum);
990f1dbf15031846dee079e13a243de1ddfb65aaffJon Ashburn}
1001c7c65d3f9d68d5869da97ceb1a365a739623fe9Courtney Goeltzenleuchter
10147e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburnconst char *getLayerOption(const char *_option)
10247e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn{
10347e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn    return g_configFileObj.getOption(_option);
10447e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn}
10547e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn
106b4b6e7c2412a10c2df40493141229f79970e51bbTobin Ehlis// If option is NULL or stdout, return stdout, otherwise try to open option
107b4b6e7c2412a10c2df40493141229f79970e51bbTobin Ehlis//  as a filename. If successful, return file handle, otherwise stdout
108b4b6e7c2412a10c2df40493141229f79970e51bbTobin EhlisFILE* getLayerLogOutput(const char *_option, const char *layerName)
109b4b6e7c2412a10c2df40493141229f79970e51bbTobin Ehlis{
110b4b6e7c2412a10c2df40493141229f79970e51bbTobin Ehlis    FILE* log_output = NULL;
111b4b6e7c2412a10c2df40493141229f79970e51bbTobin Ehlis    if (!_option || !strcmp("stdout", _option))
112b4b6e7c2412a10c2df40493141229f79970e51bbTobin Ehlis        log_output = stdout;
113b4b6e7c2412a10c2df40493141229f79970e51bbTobin Ehlis    else {
114b4b6e7c2412a10c2df40493141229f79970e51bbTobin Ehlis        log_output = fopen(_option, "w");
115b4b6e7c2412a10c2df40493141229f79970e51bbTobin Ehlis        if (log_output == NULL) {
116b4b6e7c2412a10c2df40493141229f79970e51bbTobin Ehlis            if (_option)
117b4b6e7c2412a10c2df40493141229f79970e51bbTobin Ehlis                std::cout << std::endl << layerName << " ERROR: Bad output filename specified: " << _option << ". Writing to STDOUT instead" << std::endl << std::endl;
118b4b6e7c2412a10c2df40493141229f79970e51bbTobin Ehlis            log_output = stdout;
119b4b6e7c2412a10c2df40493141229f79970e51bbTobin Ehlis        }
120b4b6e7c2412a10c2df40493141229f79970e51bbTobin Ehlis    }
121866bb9c87ab16a0055978eff4e9ebd9c2a828b04Cody Northrop    return log_output;
122b4b6e7c2412a10c2df40493141229f79970e51bbTobin Ehlis}
123b4b6e7c2412a10c2df40493141229f79970e51bbTobin Ehlis
12435b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchteruint32_t getLayerOptionFlags(const char *_option, uint32_t optionDefault)
12535b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter{
12635b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter    uint32_t flags = optionDefault;
12735b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter    const char *option = (g_configFileObj.getOption(_option));
12835b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter
12935b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter    /* parse comma-separated options */
13035b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter    while (option) {
13135b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter        const char *p = strchr(option, ',');
13235b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter        size_t len;
13335b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter
13435b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter        if (p)
13535b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter            len = p - option;
13635b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter        else
13735b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter            len = strlen(option);
13835b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter
13935b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter        if (len > 0) {
14035b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter            if (strncmp(option, "warn", len) == 0) {
14135b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter                flags |= VK_DBG_REPORT_WARN_BIT;
14235b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter            } else if (strncmp(option, "info", len) == 0) {
14335b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter                flags |= VK_DBG_REPORT_INFO_BIT;
14435b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter            } else if (strncmp(option, "perf", len) == 0) {
14535b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter                flags |= VK_DBG_REPORT_PERF_WARN_BIT;
14635b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter            } else if (strncmp(option, "error", len) == 0) {
14735b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter                flags |= VK_DBG_REPORT_ERROR_BIT;
14835b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter            } else if (strncmp(option, "debug", len) == 0) {
14935b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter                flags |= VK_DBG_REPORT_DEBUG_BIT;
15035b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter            }
15135b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter        }
15235b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter
15335b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter        if (!p)
15435b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter            break;
15535b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter
15635b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter        option = p + 1;
15735b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter    }
15835b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter    return flags;
15935b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter}
16035b4da96505de43ebb11978acf9859ca4bbdbe3bCourtney Goeltzenleuchter
161e4722391d23e3d4127f527c9ea046ac4bfe74766Jon Ashburnbool getLayerOptionEnum(const char *_option, uint32_t *optionDefault)
162c5eaea6af58e5c83c1ec48ca066e30ea0a020d2cMark Lobodzinski{
163e4722391d23e3d4127f527c9ea046ac4bfe74766Jon Ashburn    bool res;
164c5eaea6af58e5c83c1ec48ca066e30ea0a020d2cMark Lobodzinski    const char *option = (g_configFileObj.getOption(_option));
165c5eaea6af58e5c83c1ec48ca066e30ea0a020d2cMark Lobodzinski    if (option != NULL) {
166e4722391d23e3d4127f527c9ea046ac4bfe74766Jon Ashburn        *optionDefault = convertStringEnumVal(option);
167e4722391d23e3d4127f527c9ea046ac4bfe74766Jon Ashburn        res = false;
1681ee9f3ab923d677625e744d7fd70cb9db097a245Mark Lobodzinski    } else {
169e4722391d23e3d4127f527c9ea046ac4bfe74766Jon Ashburn        res = true;
170c5eaea6af58e5c83c1ec48ca066e30ea0a020d2cMark Lobodzinski    }
171e4722391d23e3d4127f527c9ea046ac4bfe74766Jon Ashburn    return res;
172c5eaea6af58e5c83c1ec48ca066e30ea0a020d2cMark Lobodzinski}
173c5eaea6af58e5c83c1ec48ca066e30ea0a020d2cMark Lobodzinski
1740f1dbf15031846dee079e13a243de1ddfb65aaffJon Ashburnvoid setLayerOptionEnum(const char *_option, const char *_valEnum)
1750f1dbf15031846dee079e13a243de1ddfb65aaffJon Ashburn{
1760f1dbf15031846dee079e13a243de1ddfb65aaffJon Ashburn    unsigned int val = convertStringEnumVal(_valEnum);
1770f1dbf15031846dee079e13a243de1ddfb65aaffJon Ashburn    char strVal[24];
1780f1dbf15031846dee079e13a243de1ddfb65aaffJon Ashburn    snprintf(strVal, 24, "%u", val);
1790f1dbf15031846dee079e13a243de1ddfb65aaffJon Ashburn    g_configFileObj.setOption(_option, strVal);
1800f1dbf15031846dee079e13a243de1ddfb65aaffJon Ashburn}
1810f1dbf15031846dee079e13a243de1ddfb65aaffJon Ashburn
1820f1dbf15031846dee079e13a243de1ddfb65aaffJon Ashburnvoid setLayerOption(const char *_option, const char *_val)
1830f1dbf15031846dee079e13a243de1ddfb65aaffJon Ashburn{
1840f1dbf15031846dee079e13a243de1ddfb65aaffJon Ashburn    g_configFileObj.setOption(_option, _val);
1850f1dbf15031846dee079e13a243de1ddfb65aaffJon Ashburn}
1860f1dbf15031846dee079e13a243de1ddfb65aaffJon Ashburn
18747e9289b849a08f0830ddf729fe6637ec081c731Jon AshburnConfigFile::ConfigFile() : m_fileIsParsed(false)
18847e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn{
18947e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn}
19047e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn
19147e9289b849a08f0830ddf729fe6637ec081c731Jon AshburnConfigFile::~ConfigFile()
19247e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn{
19347e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn}
19447e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn
19547e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburnconst char *ConfigFile::getOption(const std::string &_option)
19647e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn{
19747e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn    std::map<std::string, std::string>::const_iterator it;
19847e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn    if (!m_fileIsParsed)
19947e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn    {
2009cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        parseFile("vk_layer_settings.txt");
20147e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn    }
20247e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn
20347e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn    if ((it = m_valueMap.find(_option)) == m_valueMap.end())
20447e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn        return NULL;
20547e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn    else
20647e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn        return it->second.c_str();
20747e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn}
20847e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn
2090f1dbf15031846dee079e13a243de1ddfb65aaffJon Ashburnvoid ConfigFile::setOption(const std::string &_option, const std::string &_val)
2100f1dbf15031846dee079e13a243de1ddfb65aaffJon Ashburn{
2110f1dbf15031846dee079e13a243de1ddfb65aaffJon Ashburn    if (!m_fileIsParsed)
2120f1dbf15031846dee079e13a243de1ddfb65aaffJon Ashburn    {
2139cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter        parseFile("vk_layer_settings.txt");
2140f1dbf15031846dee079e13a243de1ddfb65aaffJon Ashburn    }
2150f1dbf15031846dee079e13a243de1ddfb65aaffJon Ashburn
2160f1dbf15031846dee079e13a243de1ddfb65aaffJon Ashburn    m_valueMap[_option] = _val;
2170f1dbf15031846dee079e13a243de1ddfb65aaffJon Ashburn}
2180f1dbf15031846dee079e13a243de1ddfb65aaffJon Ashburn
21947e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburnvoid ConfigFile::parseFile(const char *filename)
22047e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn{
22147e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn    std::ifstream file;
22247e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn    char buf[MAX_CHARS_PER_LINE];
22347e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn
22447e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn    m_fileIsParsed = true;
22547e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn    m_valueMap.clear();
22647e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn
22747e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn    file.open(filename);
22847e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn    if (!file.good())
22947e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn        return;
23047e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn
23147e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn    // read tokens from the file and form option, value pairs
23247e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn    file.getline(buf, MAX_CHARS_PER_LINE);
23347e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn    while (!file.eof())
23447e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn    {
23547e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn        char option[512];
23647e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn        char value[512];
23747e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn
23847e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn        char *pComment;
23947e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn
24047e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn        //discard any comments delimited by '#' in the line
24147e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn        pComment = strchr(buf, '#');
24247e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn        if (pComment)
24347e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn            *pComment = '\0';
24447e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn
24547e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn        if (sscanf(buf, " %511[^\n\t =] = %511[^\n \t]", option, value) == 2)
24647e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn        {
24747e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn            std::string optStr(option);
24847e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn            std::string valStr(value);
24947e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn            m_valueMap[optStr] = valStr;
25047e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn        }
25147e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn        file.getline(buf, MAX_CHARS_PER_LINE);
25247e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn    }
25347e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn}
25447e9289b849a08f0830ddf729fe6637ec081c731Jon Ashburn
255065843de24ab65bd78d4eae587661db57ef78af7Courtney Goeltzenleuchtervoid print_msg_flags(VkFlags msgFlags, char *msg_flags)
256065843de24ab65bd78d4eae587661db57ef78af7Courtney Goeltzenleuchter{
257065843de24ab65bd78d4eae587661db57ef78af7Courtney Goeltzenleuchter    bool separator = false;
258065843de24ab65bd78d4eae587661db57ef78af7Courtney Goeltzenleuchter
259065843de24ab65bd78d4eae587661db57ef78af7Courtney Goeltzenleuchter    msg_flags[0] = 0;
260065843de24ab65bd78d4eae587661db57ef78af7Courtney Goeltzenleuchter    if (msgFlags & VK_DBG_REPORT_DEBUG_BIT) {
261065843de24ab65bd78d4eae587661db57ef78af7Courtney Goeltzenleuchter        strcat(msg_flags, "DEBUG");
262065843de24ab65bd78d4eae587661db57ef78af7Courtney Goeltzenleuchter        separator = true;
263065843de24ab65bd78d4eae587661db57ef78af7Courtney Goeltzenleuchter    }
264065843de24ab65bd78d4eae587661db57ef78af7Courtney Goeltzenleuchter    if (msgFlags & VK_DBG_REPORT_INFO_BIT) {
265065843de24ab65bd78d4eae587661db57ef78af7Courtney Goeltzenleuchter        if (separator) strcat(msg_flags, ",");
266065843de24ab65bd78d4eae587661db57ef78af7Courtney Goeltzenleuchter        strcat(msg_flags, "INFO");
267065843de24ab65bd78d4eae587661db57ef78af7Courtney Goeltzenleuchter        separator = true;
268065843de24ab65bd78d4eae587661db57ef78af7Courtney Goeltzenleuchter    }
269065843de24ab65bd78d4eae587661db57ef78af7Courtney Goeltzenleuchter    if (msgFlags & VK_DBG_REPORT_WARN_BIT) {
270065843de24ab65bd78d4eae587661db57ef78af7Courtney Goeltzenleuchter        if (separator) strcat(msg_flags, ",");
271065843de24ab65bd78d4eae587661db57ef78af7Courtney Goeltzenleuchter        strcat(msg_flags, "WARN");
272065843de24ab65bd78d4eae587661db57ef78af7Courtney Goeltzenleuchter        separator = true;
273065843de24ab65bd78d4eae587661db57ef78af7Courtney Goeltzenleuchter    }
274065843de24ab65bd78d4eae587661db57ef78af7Courtney Goeltzenleuchter    if (msgFlags & VK_DBG_REPORT_PERF_WARN_BIT) {
275065843de24ab65bd78d4eae587661db57ef78af7Courtney Goeltzenleuchter        if (separator) strcat(msg_flags, ",");
276065843de24ab65bd78d4eae587661db57ef78af7Courtney Goeltzenleuchter        strcat(msg_flags, "PERF");
277065843de24ab65bd78d4eae587661db57ef78af7Courtney Goeltzenleuchter        separator = true;
278065843de24ab65bd78d4eae587661db57ef78af7Courtney Goeltzenleuchter    }
279065843de24ab65bd78d4eae587661db57ef78af7Courtney Goeltzenleuchter    if (msgFlags & VK_DBG_REPORT_ERROR_BIT) {
280065843de24ab65bd78d4eae587661db57ef78af7Courtney Goeltzenleuchter        if (separator) strcat(msg_flags, ",");
281065843de24ab65bd78d4eae587661db57ef78af7Courtney Goeltzenleuchter        strcat(msg_flags, "ERROR");
282065843de24ab65bd78d4eae587661db57ef78af7Courtney Goeltzenleuchter    }
283065843de24ab65bd78d4eae587661db57ef78af7Courtney Goeltzenleuchter}
284065843de24ab65bd78d4eae587661db57ef78af7Courtney Goeltzenleuchter
285