From 844be91e70413c1c3871d5f93b1e4766eb495df9 Mon Sep 17 00:00:00 2001 From: Tim Rowley Date: Mon, 31 Jul 2017 17:22:12 -0500 Subject: [PATCH] swr/rast: split gen_knobs templates into .h/.cpp Switch to a 1:1 mapping template:generated for future maintenance. Reviewed-by: Emil Velikov Reviewed-by: Bruce Cherniak --- src/gallium/drivers/swr/Makefile.am | 3 +- src/gallium/drivers/swr/SConscript | 2 +- .../swr/rasterizer/codegen/gen_knobs.py | 14 +- .../codegen/templates/gen_knobs.cpp | 108 ------------ .../rasterizer/codegen/templates/gen_knobs.h | 157 ++++++++++++++++++ 5 files changed, 166 insertions(+), 118 deletions(-) create mode 100644 src/gallium/drivers/swr/rasterizer/codegen/templates/gen_knobs.h diff --git a/src/gallium/drivers/swr/Makefile.am b/src/gallium/drivers/swr/Makefile.am index 73fe904a7d5..b20f128bd2b 100644 --- a/src/gallium/drivers/swr/Makefile.am +++ b/src/gallium/drivers/swr/Makefile.am @@ -115,7 +115,7 @@ rasterizer/codegen/gen_knobs.cpp: rasterizer/codegen/gen_knobs.py rasterizer/cod --output rasterizer/codegen/gen_knobs.cpp \ --gen_cpp -rasterizer/codegen/gen_knobs.h: rasterizer/codegen/gen_knobs.py rasterizer/codegen/knob_defs.py rasterizer/codegen/templates/gen_knobs.cpp rasterizer/codegen/gen_common.py +rasterizer/codegen/gen_knobs.h: rasterizer/codegen/gen_knobs.py rasterizer/codegen/knob_defs.py rasterizer/codegen/templates/gen_knobs.h rasterizer/codegen/gen_common.py $(MKDIR_GEN) $(PYTHON_GEN) \ $(srcdir)/rasterizer/codegen/gen_knobs.py \ @@ -347,5 +347,6 @@ EXTRA_DIST = \ rasterizer/codegen/templates/gen_builder.hpp \ rasterizer/codegen/templates/gen_header_init.hpp \ rasterizer/codegen/templates/gen_knobs.cpp \ + rasterizer/codegen/templates/gen_knobs.h \ rasterizer/codegen/templates/gen_llvm.hpp \ rasterizer/codegen/templates/gen_rasterizer.cpp diff --git a/src/gallium/drivers/swr/SConscript b/src/gallium/drivers/swr/SConscript index c578d7a648f..b394cbc17e3 100644 --- a/src/gallium/drivers/swr/SConscript +++ b/src/gallium/drivers/swr/SConscript @@ -54,7 +54,7 @@ env.CodeGenerate( command = python_cmd + ' $SCRIPT --output $TARGET --gen_h' ) Depends('rasterizer/codegen/gen_knobs.h', - swrroot + 'rasterizer/codegen/templates/gen_knobs.cpp') + swrroot + 'rasterizer/codegen/templates/gen_knobs.h') env.CodeGenerate( target = 'rasterizer/jitter/gen_state_llvm.h', diff --git a/src/gallium/drivers/swr/rasterizer/codegen/gen_knobs.py b/src/gallium/drivers/swr/rasterizer/codegen/gen_knobs.py index 2c271c7f5c5..33f62a28ceb 100644 --- a/src/gallium/drivers/swr/rasterizer/codegen/gen_knobs.py +++ b/src/gallium/drivers/swr/rasterizer/codegen/gen_knobs.py @@ -37,27 +37,25 @@ def main(args=sys.argv[1:]): args = parser.parse_args() cur_dir = os.path.dirname(os.path.abspath(__file__)) - template_file = os.path.join(cur_dir, 'templates', 'gen_knobs.cpp') + template_cpp = os.path.join(cur_dir, 'templates', 'gen_knobs.cpp') + template_h = os.path.join(cur_dir, 'templates', 'gen_knobs.h') if args.gen_h: MakoTemplateWriter.to_file( - template_file, + template_h, args.output, cmdline=sys.argv, filename='gen_knobs', - knobs=knob_defs.KNOBS, - includes=['core/knobs_init.h', 'common/os.h', 'sstream', 'iomanip'], - gen_header=True) + knobs=knob_defs.KNOBS) if args.gen_cpp: MakoTemplateWriter.to_file( - template_file, + template_cpp, args.output, cmdline=sys.argv, filename='gen_knobs', knobs=knob_defs.KNOBS, - includes=['core/knobs_init.h', 'common/os.h', 'sstream', 'iomanip'], - gen_header=False) + includes=['core/knobs_init.h', 'common/os.h', 'sstream', 'iomanip']) return 0 diff --git a/src/gallium/drivers/swr/rasterizer/codegen/templates/gen_knobs.cpp b/src/gallium/drivers/swr/rasterizer/codegen/templates/gen_knobs.cpp index a9506434c62..2f4c47a92e8 100644 --- a/src/gallium/drivers/swr/rasterizer/codegen/templates/gen_knobs.cpp +++ b/src/gallium/drivers/swr/rasterizer/codegen/templates/gen_knobs.cpp @@ -20,11 +20,7 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. * -% if gen_header: -* @file ${filename}.h -% else: * @file ${filename}.cpp -% endif * * @brief Dynamic Knobs for Core. * @@ -35,105 +31,6 @@ * ******************************************************************************/ <% calc_max_knob_len(knobs) %> -%if gen_header: -#pragma once -#include - -struct KnobBase -{ -private: - // Update the input string. - static void autoExpandEnvironmentVariables(std::string &text); - -protected: - // Leave input alone and return new string. - static std::string expandEnvironmentVariables(std::string const &input) - { - std::string text = input; - autoExpandEnvironmentVariables(text); - return text; - } - - template - static T expandEnvironmentVariables(T const &input) - { - return input; - } -}; - -template -struct Knob : KnobBase -{ -public: - const T& Value() const { return m_Value; } - const T& Value(T const &newValue) - { - m_Value = expandEnvironmentVariables(newValue); - return Value(); - } - -protected: - Knob(T const &defaultValue) : - m_Value(expandEnvironmentVariables(defaultValue)) - { - } - -private: - T m_Value; -}; - -#define DEFINE_KNOB(_name, _type, _default) \\ - - struct Knob_##_name : Knob<_type> \\ - - { \\ - - Knob_##_name() : Knob<_type>(_default) { } \\ - - static const char* Name() { return "KNOB_" #_name; } \\ - - } _name; - -#define GET_KNOB(_name) g_GlobalKnobs._name.Value() -#define SET_KNOB(_name, _newValue) g_GlobalKnobs._name.Value(_newValue) - -struct GlobalKnobs -{ - % for knob in knobs: - //----------------------------------------------------------- - // KNOB_${knob[0]} - // - % for line in knob[1]['desc']: - // ${line} - % endfor - % if knob[1].get('choices'): - <% - choices = knob[1].get('choices') - _max_len = calc_max_name_len(choices) %>// - % for i in range(len(choices)): - // ${choices[i]['name']}${space_name(choices[i]['name'], _max_len)} = ${format(choices[i]['value'], '#010x')} - % endfor - % endif - // - % if knob[1]['type'] == 'std::string': - DEFINE_KNOB(${knob[0]}, ${knob[1]['type']}, "${repr(knob[1]['default'])[1:-1]}"); - % else: - DEFINE_KNOB(${knob[0]}, ${knob[1]['type']}, ${knob[1]['default']}); - % endif - - % endfor - GlobalKnobs(); - std::string ToString(const char* optPerLinePrefix=""); -}; -extern GlobalKnobs g_GlobalKnobs; - -#undef DEFINE_KNOB - -% for knob in knobs: -#define KNOB_${knob[0]}${space_knob(knob[0])} GET_KNOB(${knob[0]}) -% endfor - -% else: % for inc in includes: #include <${inc}> % endfor @@ -233,9 +130,6 @@ std::string GlobalKnobs::ToString(const char* optPerLinePrefix) return str.str(); } - -% endif - <%! # Globally available python max_len = 0 @@ -262,6 +156,4 @@ std::string GlobalKnobs::ToString(const char* optPerLinePrefix) def space_name(name, max_len): name_len = len(name) return ' '*(max_len - name_len) - - %> diff --git a/src/gallium/drivers/swr/rasterizer/codegen/templates/gen_knobs.h b/src/gallium/drivers/swr/rasterizer/codegen/templates/gen_knobs.h new file mode 100644 index 00000000000..b02870be464 --- /dev/null +++ b/src/gallium/drivers/swr/rasterizer/codegen/templates/gen_knobs.h @@ -0,0 +1,157 @@ +/****************************************************************************** +* Copyright (C) 2015-2017 Intel Corporation. All Rights Reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a +* copy of this software and associated documentation files (the "Software"), +* to deal in the Software without restriction, including without limitation +* the rights to use, copy, modify, merge, publish, distribute, sublicense, +* and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice (including the next +* paragraph) shall be included in all copies or substantial portions of the +* Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +* IN THE SOFTWARE. +* +* @file ${filename}.h +* +* @brief Dynamic Knobs for Core. +* +* ======================= AUTO GENERATED: DO NOT EDIT !!! ==================== +* +* Generation Command Line: +* ${'\n* '.join(cmdline)} +* +******************************************************************************/ +<% calc_max_knob_len(knobs) %> +#pragma once +#include + +struct KnobBase +{ +private: + // Update the input string. + static void autoExpandEnvironmentVariables(std::string &text); + +protected: + // Leave input alone and return new string. + static std::string expandEnvironmentVariables(std::string const &input) + { + std::string text = input; + autoExpandEnvironmentVariables(text); + return text; + } + + template + static T expandEnvironmentVariables(T const &input) + { + return input; + } +}; + +template +struct Knob : KnobBase +{ +public: + const T& Value() const { return m_Value; } + const T& Value(T const &newValue) + { + m_Value = expandEnvironmentVariables(newValue); + return Value(); + } + +protected: + Knob(T const &defaultValue) : + m_Value(expandEnvironmentVariables(defaultValue)) + { + } + +private: + T m_Value; +}; + +#define DEFINE_KNOB(_name, _type, _default) \\ + + struct Knob_##_name : Knob<_type> \\ + + { \\ + + Knob_##_name() : Knob<_type>(_default) { } \\ + + static const char* Name() { return "KNOB_" #_name; } \\ + + } _name; + +#define GET_KNOB(_name) g_GlobalKnobs._name.Value() +#define SET_KNOB(_name, _newValue) g_GlobalKnobs._name.Value(_newValue) + +struct GlobalKnobs +{ + % for knob in knobs: + //----------------------------------------------------------- + // KNOB_${knob[0]} + // + % for line in knob[1]['desc']: + // ${line} + % endfor + % if knob[1].get('choices'): + <% + choices = knob[1].get('choices') + _max_len = calc_max_name_len(choices) %>// + % for i in range(len(choices)): + // ${choices[i]['name']}${space_name(choices[i]['name'], _max_len)} = ${format(choices[i]['value'], '#010x')} + % endfor + % endif + // + % if knob[1]['type'] == 'std::string': + DEFINE_KNOB(${knob[0]}, ${knob[1]['type']}, "${repr(knob[1]['default'])[1:-1]}"); + % else: + DEFINE_KNOB(${knob[0]}, ${knob[1]['type']}, ${knob[1]['default']}); + % endif + + % endfor + GlobalKnobs(); + std::string ToString(const char* optPerLinePrefix=""); +}; +extern GlobalKnobs g_GlobalKnobs; + +#undef DEFINE_KNOB + +% for knob in knobs: +#define KNOB_${knob[0]}${space_knob(knob[0])} GET_KNOB(${knob[0]}) +% endfor + +<%! + # Globally available python + max_len = 0 + def calc_max_knob_len(knobs): + global max_len + max_len = 0 + for knob in knobs: + if len(knob[0]) > max_len: max_len = len(knob[0]) + max_len += len('KNOB_ ') + if max_len % 4: max_len += 4 - (max_len % 4) + + def space_knob(knob): + knob_len = len('KNOB_' + knob) + return ' '*(max_len - knob_len) + + def calc_max_name_len(choices_array): + _max_len = 0 + for choice in choices_array: + if len(choice['name']) > _max_len: _max_len = len(choice['name']) + + if _max_len % 4: _max_len += 4 - (_max_len % 4) + return _max_len + + def space_name(name, max_len): + name_len = len(name) + return ' '*(max_len - name_len) +%> -- 2.30.2