mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 04:20:08 +01:00
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:
parent
4c5b4f3f78
commit
844be91e70
5 changed files with 166 additions and 118 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
||||
%>
|
||||
|
|
|
|||
157
src/gallium/drivers/swr/rasterizer/codegen/templates/gen_knobs.h
Normal file
157
src/gallium/drivers/swr/rasterizer/codegen/templates/gen_knobs.h
Normal 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)
|
||||
%>
|
||||
Loading…
Add table
Reference in a new issue