Also, modify gen_knobs.py so that each invocation creates a single generated file. This is more similar to how the other generators behave. --- src/gallium/SConscript | 1 + src/gallium/drivers/swr/Makefile.am | 15 +- src/gallium/drivers/swr/SConscript | 216 +++++++++++++++++++++ .../drivers/swr/rasterizer/scripts/gen_knobs.py | 51 ++--- 4 files changed, 257 insertions(+), 26 deletions(-) create mode 100644 src/gallium/drivers/swr/SConscript
diff --git a/src/gallium/SConscript b/src/gallium/SConscript index f98268f..9273db7 100644 --- a/src/gallium/SConscript +++ b/src/gallium/SConscript @@ -18,6 +18,7 @@ SConscript([ 'drivers/softpipe/SConscript', 'drivers/svga/SConscript', 'drivers/trace/SConscript', + 'drivers/swr/SConscript', ]) # diff --git a/src/gallium/drivers/swr/Makefile.am b/src/gallium/drivers/swr/Makefile.am index dd1c2e6..b22ded0 100644 --- a/src/gallium/drivers/swr/Makefile.am +++ b/src/gallium/drivers/swr/Makefile.am @@ -71,11 +71,21 @@ swr_context_llvm.h: rasterizer/jitter/scripts/gen_llvm_types.py swr_context.h --input $(srcdir)/swr_context.h \ --output swr_context_llvm.h -rasterizer/scripts/gen_knobs.cpp rasterizer/scripts/gen_knobs.h: rasterizer/scripts/gen_knobs.py rasterizer/scripts/knob_defs.py rasterizer/scripts/templates/knobs.template +rasterizer/scripts/gen_knobs.cpp: rasterizer/scripts/gen_knobs.py rasterizer/scripts/knob_defs.py rasterizer/scripts/templates/knobs.template $(MKDIR_GEN) $(PYTHON_GEN) \ $(srcdir)/rasterizer/scripts/gen_knobs.py \ - rasterizer/scripts + --input $(srcdir)/rasterizer/scripts/templates/knobs.template \ + --output rasterizer/scripts/gen_knobs.cpp \ + --gen_cpp + +rasterizer/scripts/gen_knobs.h: rasterizer/scripts/gen_knobs.py rasterizer/scripts/knob_defs.py rasterizer/scripts/templates/knobs.template + $(MKDIR_GEN) + $(PYTHON_GEN) \ + $(srcdir)/rasterizer/scripts/gen_knobs.py \ + --input $(srcdir)/rasterizer/scripts/templates/knobs.template \ + --output rasterizer/scripts/gen_knobs.h \ + --gen_h rasterizer/jitter/state_llvm.h: rasterizer/jitter/scripts/gen_llvm_types.py rasterizer/core/state.h $(MKDIR_GEN) @@ -235,6 +245,7 @@ libswrAVX2_la_LDFLAGS = \ include $(top_srcdir)/install-gallium-links.mk EXTRA_DIST = \ + SConscript \ rasterizer/archrast/events.proto \ rasterizer/jitter/scripts/gen_llvm_ir_macros.py \ rasterizer/jitter/scripts/gen_llvm_types.py \ diff --git a/src/gallium/drivers/swr/SConscript b/src/gallium/drivers/swr/SConscript new file mode 100644 index 0000000..0de51a7 --- /dev/null +++ b/src/gallium/drivers/swr/SConscript @@ -0,0 +1,216 @@ +Import('*') + +from sys import executable as python_cmd +import os.path +import distutils.version + +if not env['swr']: + Return() + +if not env['llvm']: + print 'warning: LLVM disabled: not building swr' + env['swr'] = False + Return() + +if env['LLVM_VERSION'] < distutils.version.LooseVersion('3.9'): + print "warning: swr requires LLVM >= 3.9: not building swr" + env['swr'] = False + Return() + +if env['platform'] != 'windows': + print "warning: swr scons build only supports windows: not building swr" + env['swr'] = False + Return() + +env.MSVC2013Compat() + +env = env.Clone() + +# construct llvm include dir +if env['platform'] == 'windows': + # on windows there is no llvm-config, so LLVM is defined + llvm_includedir = os.path.join(os.environ['LLVM'], 'include') +else: + llvm_includedir = env.backtick('llvm-config --includedir').rstrip() + print "llvm include dir %s" % llvm_includedir + +# the loader is included in the mesa lib itself +# All the remaining files are in loadable modules +loadersource = env.ParseSourceList('Makefile.sources', [ + 'LOADER_SOURCES' +]) + +env.Append(CPPDEFINES = [ + '__STDC_CONSTANT_MACROS', + '__STDC_LIMIT_MACROS' + ]) + +if not env['msvc'] : + env.Append(CCFLAGS = [ + '-std=c++11', + ]) + +swrroot = '#src/gallium/drivers/swr/' + +env.CodeGenerate( + target = 'rasterizer/scripts/gen_knobs.cpp', + script = swrroot + 'rasterizer/scripts/gen_knobs.py', + source = 'rasterizer/scripts/templates/knobs.template', + command = python_cmd + ' $SCRIPT --input $SOURCE --output $TARGET --gen_cpp' +) + +env.CodeGenerate( + target = 'rasterizer/scripts/gen_knobs.h', + script = swrroot + 'rasterizer/scripts/gen_knobs.py', + source = 'rasterizer/scripts/templates/knobs.template', + command = python_cmd + ' $SCRIPT --input $SOURCE --output $TARGET --gen_h' +) + +env.CodeGenerate( + target = 'rasterizer/jitter/state_llvm.h', + script = swrroot + 'rasterizer/jitter/scripts/gen_llvm_types.py', + source = 'rasterizer/core/state.h', + command = python_cmd + ' $SCRIPT --input $SOURCE --output $TARGET' +) + +env.CodeGenerate( + target = 'rasterizer/jitter/builder_gen.h', + script = swrroot + 'rasterizer/jitter/scripts/gen_llvm_ir_macros.py', + source = os.path.join(llvm_includedir, 'llvm/IR/IRBuilder.h'), + command = python_cmd + ' $SCRIPT --input $SOURCE --output $TARGET --gen_h' +) + +env.CodeGenerate( + target = 'rasterizer/jitter/builder_gen.cpp', + script = swrroot + 'rasterizer/jitter/scripts/gen_llvm_ir_macros.py', + source = os.path.join(llvm_includedir, 'llvm/IR/IRBuilder.h'), + command = python_cmd + ' $SCRIPT --input $SOURCE --output $TARGET --gen_cpp' +) + +env.CodeGenerate( + target = 'rasterizer/jitter/builder_x86.h', + script = swrroot + 'rasterizer/jitter/scripts/gen_llvm_ir_macros.py', + source = '', + command = python_cmd + ' $SCRIPT --output $TARGET --gen_x86_h' +) + +env.CodeGenerate( + target = 'rasterizer/jitter/builder_x86.cpp', + script = swrroot + 'rasterizer/jitter/scripts/gen_llvm_ir_macros.py', + source = '', + command = python_cmd + ' $SCRIPT --output $TARGET --gen_x86_cpp' +) + +env.CodeGenerate( + target = 'swr_context_llvm.h', + script = swrroot + 'rasterizer/jitter/scripts/gen_llvm_types.py', + source = 'swr_context.h', + command = python_cmd + ' $SCRIPT --input $SOURCE --output $TARGET' +) + +env.CodeGenerate( + target = 'rasterizer/archrast/gen_ar_event.h', + script = swrroot + 'rasterizer/scripts/gen_archrast.py', + source = 'rasterizer/archrast/events.proto', + command = python_cmd + ' $SCRIPT --proto $SOURCE --output $TARGET --gen_event_h' +) + +env.CodeGenerate( + target = 'rasterizer/archrast/gen_ar_event.cpp', + script = swrroot + 'rasterizer/scripts/gen_archrast.py', + source = 'rasterizer/archrast/events.proto', + command = python_cmd + ' $SCRIPT --proto $SOURCE --output $TARGET --gen_event_cpp' +) + +env.CodeGenerate( + target = 'rasterizer/archrast/gen_ar_eventhandler.h', + script = swrroot + 'rasterizer/scripts/gen_archrast.py', + source = 'rasterizer/archrast/events.proto', + command = python_cmd + ' $SCRIPT --proto $SOURCE --output $TARGET --gen_eventhandler_h' +) + +env.CodeGenerate( + target = 'rasterizer/archrast/gen_ar_eventhandlerfile.h', + script = swrroot + 'rasterizer/scripts/gen_archrast.py', + source = 'rasterizer/archrast/events.proto', + command = python_cmd + ' $SCRIPT --proto $SOURCE --output $TARGET --gen_eventhandlerfile_h' +) + +# Auto-generated .cpp files (that need to generate object files) +built_sources = [ + 'rasterizer/scripts/gen_knobs.cpp', + 'rasterizer/jitter/builder_gen.cpp', + 'rasterizer/jitter/builder_x86.cpp', + 'rasterizer/archrast/gen_ar_event.cpp', + ] + +source = built_sources +source += env.ParseSourceList(swrroot + 'Makefile.sources', [ + 'CXX_SOURCES', + 'ARCHRAST_CXX_SOURCES', + 'COMMON_CXX_SOURCES', + 'CORE_CXX_SOURCES', + 'JITTER_CXX_SOURCES', + 'MEMORY_CXX_SOURCES' +]) + +env.Prepend(LIBS = [ mesautil, mesa, gallium ]) + +env.Prepend(CPPPATH = [ + '.', + 'rasterizer', + 'rasterizer/scripts', + 'rasterizer/core', + 'rasterizer/jitter', + 'rasterizer/archrast', + ]) + +# AVX lib +envavx = env.Clone() + +envavx.Append(CPPDEFINES = ['KNOB_ARCH=KNOB_ARCH_AVX']) +if env['platform'] == 'windows': + envavx.Append(CCFLAGS = ['/arch:AVX']) +else: + envavx.Append(CCFLAGS = ['-mavx']) + +swrAVX = envavx.SharedLibrary( + target = 'swrAVX', + source = source, + OBJPREFIX = 'avx_' + ) +env.Alias('swrAVX', swrAVX) + +# AVX2 lib +envavx2 = env.Clone() + +envavx2.Append(CPPDEFINES = ['KNOB_ARCH=KNOB_ARCH_AVX2']) +if env['platform'] == 'windows': + envavx2.Append(CCFLAGS = ['/arch:AVX2']) +else: + envavx2.Append(CCFLAGS = ['-mavx2']) + +swrAVX2 = envavx2.SharedLibrary( + target = 'swrAVX2', + source = source, + OBJPREFIX = 'avx2_' + ) +env.Alias('swrAVX2', swrAVX2) + + +# main SWR lib +swr = env.ConvenienceLibrary( + target = 'swr', + source = loadersource, + ) + + +# treat arch libs as dependencies, even though they are not linked +# into swr, so we don't have to build them separately +Depends(swr, ['swrAVX', 'swrAVX2']) + +env.Alias('swr', swr) + +env.Prepend(LIBS = [swr]) + +Export('swr') diff --git a/src/gallium/drivers/swr/rasterizer/scripts/gen_knobs.py b/src/gallium/drivers/swr/rasterizer/scripts/gen_knobs.py index 3d003fb..225082e 100644 --- a/src/gallium/drivers/swr/rasterizer/scripts/gen_knobs.py +++ b/src/gallium/drivers/swr/rasterizer/scripts/gen_knobs.py @@ -23,13 +23,14 @@ from __future__ import print_function import os import sys +import argparse import knob_defs from mako.template import Template from mako.exceptions import RichTraceback def write_template_to_string(template_filename, **kwargs): try: - template = Template(filename=template_filename) + template = Template(filename=os.path.abspath(template_filename)) # Split + Join fixes line-endings for whatever platform you are using return '\n'.join(template.render(**kwargs).splitlines()) except: @@ -40,37 +41,39 @@ def write_template_to_string(template_filename, **kwargs): print("%s: %s" % (str(traceback.error.__class__.__name__), traceback.error)) def write_template_to_file(template_filename, output_filename, **kwargs): + output_dirname = os.path.dirname(output_filename) + if not os.path.exists(output_dirname): + os.makedirs(output_dirname) with open(output_filename, "w") as outfile: print(write_template_to_string(template_filename, **kwargs), file=outfile) def main(args=sys.argv[1:]): - if len(args) != 1: - print('Usage:', sys.argv[0], '<output_directory>', file=sys.stderr) - return 1 - output_dir = args[0] - if not os.path.isdir(output_dir): - if os.path.exists(output_dir): - print('ERROR: Invalid output directory:', output_dir, file=sys.stderr) - return 1 + # parse args + parser = argparse.ArgumentParser() + parser.add_argument("--input", "-i", help="Path to knobs.template", required=True) + parser.add_argument("--output", "-o", help="Path to output file", required=True) + parser.add_argument("--gen_h", "-gen_h", help="Generate gen_knobs.h", action="store_true", default=False) + parser.add_argument("--gen_cpp", "-gen_cpp", help="Generate gen_knobs.cpp", action="store_true", required=False) - try: - os.makedirs(output_dir) - except: - print('ERROR: Could not create output directory:', output_dir, file=sys.stderr) - return 1 + args = parser.parse_args() - # Output path exists, now just run the template - template_file = os.sep.join([sys.path[0], 'templates', 'knobs.template']) - output_file = os.sep.join([output_dir, 'gen_knobs.cpp']) - output_header = os.sep.join([output_dir, 'gen_knobs.h']) + if args.input: + if args.gen_h: + write_template_to_file(args.input, + args.output, + filename='gen_knobs', + knobs=knob_defs.KNOBS, + includes=['core/knobs_init.h', 'common/os.h', 'sstream', 'iomanip'], + gen_header=True) - for f in [output_header, output_file]: - write_template_to_file(template_file, f, - filename='gen_knobs', - knobs=knob_defs.KNOBS, - includes=['core/knobs_init.h', 'common/os.h', 'sstream', 'iomanip'], - gen_header=True if f == output_header else False) + if args.gen_cpp: + write_template_to_file(args.input, + args.output, + filename='gen_knobs', + knobs=knob_defs.KNOBS, + includes=['core/knobs_init.h', 'common/os.h', 'sstream', 'iomanip'], + gen_header=False) return 0 -- 2.10.0.windows.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev