swr/rast: split gen_knobs templates into .h/.cpp

Switch to a 1:1 mapping template:generated for future maintenance.

Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
Reviewed-by: Bruce Cherniak <bruce.cherniak@intel.com>
This commit is contained in:
Tim Rowley 2017-07-31 17:22:12 -05:00
parent 4c5b4f3f78
commit 844be91e70
5 changed files with 166 additions and 118 deletions

View file

@ -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

View file

@ -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',

View file

@ -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

View file

@ -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 <string>
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 <typename T>
static T expandEnvironmentVariables(T const &input)
{
return input;
}
};
template <typename T>
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)
%>

View file

@ -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 <string>
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 <typename T>
static T expandEnvironmentVariables(T const &input)
{
return input;
}
};
template <typename T>
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)
%>