1b8e80941SmrgImport('*') 2b8e80941Smrg 3b8e80941Smrgfrom sys import executable as python_cmd 4b8e80941Smrgimport os.path 5b8e80941Smrgimport distutils.version 6b8e80941Smrg 7b8e80941Smrgif not env['swr']: 8b8e80941Smrg Return() 9b8e80941Smrg 10b8e80941Smrgif not env['llvm']: 11b8e80941Smrg print('warning: LLVM disabled: not building swr') 12b8e80941Smrg env['swr'] = False 13b8e80941Smrg Return() 14b8e80941Smrg 15b8e80941Smrgif env['LLVM_VERSION'] < distutils.version.LooseVersion('6.0'): 16b8e80941Smrg print("warning: swr requires LLVM >= 6.0: not building swr") 17b8e80941Smrg env['swr'] = False 18b8e80941Smrg Return() 19b8e80941Smrg 20b8e80941Smrgenv.MSVC2013Compat() 21b8e80941Smrg 22b8e80941Smrgenv = env.Clone() 23b8e80941Smrg 24b8e80941Smrg# construct llvm include dir 25b8e80941Smrgif env['platform'] == 'windows': 26b8e80941Smrg # on windows there is no llvm-config, so LLVM is defined 27b8e80941Smrg llvm_includedir = os.path.join(os.environ['LLVM'], 'include') 28b8e80941Smrgelse: 29b8e80941Smrg llvm_config = os.environ.get('LLVM_CONFIG', 'llvm-config') 30b8e80941Smrg llvm_includedir = env.backtick('%s --includedir' % llvm_config).rstrip() 31b8e80941Smrg print("llvm include dir %s" % llvm_includedir) 32b8e80941Smrg 33b8e80941Smrgif not env['msvc'] : 34b8e80941Smrg env.Append(CCFLAGS = [ 35b8e80941Smrg '-std=c++11', 36b8e80941Smrg ]) 37b8e80941Smrg 38b8e80941Smrgswrroot = '#src/gallium/drivers/swr/' 39b8e80941Smrgsrcroot = Dir(swrroot).abspath 40b8e80941Smrgbldroot = Dir('.').abspath 41b8e80941Smrg 42b8e80941Smrgenv.CodeGenerate( 43b8e80941Smrg target = 'rasterizer/codegen/gen_knobs.cpp', 44b8e80941Smrg script = swrroot + 'rasterizer/codegen/gen_knobs.py', 45b8e80941Smrg source = '', 46b8e80941Smrg command = python_cmd + ' $SCRIPT --output $TARGET --gen_cpp' 47b8e80941Smrg) 48b8e80941SmrgDepends('rasterizer/codegen/gen_knobs.cpp', 49b8e80941Smrg swrroot + 'rasterizer/codegen/templates/gen_knobs.cpp') 50b8e80941Smrg 51b8e80941Smrgenv.CodeGenerate( 52b8e80941Smrg target = 'rasterizer/codegen/gen_knobs.h', 53b8e80941Smrg script = swrroot + 'rasterizer/codegen/gen_knobs.py', 54b8e80941Smrg source = '', 55b8e80941Smrg command = python_cmd + ' $SCRIPT --output $TARGET --gen_h' 56b8e80941Smrg) 57b8e80941SmrgDepends('rasterizer/codegen/gen_knobs.h', 58b8e80941Smrg swrroot + 'rasterizer/codegen/templates/gen_knobs.h') 59b8e80941Smrg 60b8e80941Smrgenv.CodeGenerate( 61b8e80941Smrg target = 'rasterizer/jitter/gen_state_llvm.h', 62b8e80941Smrg script = swrroot + 'rasterizer/codegen/gen_llvm_types.py', 63b8e80941Smrg source = 'rasterizer/core/state.h', 64b8e80941Smrg command = python_cmd + ' $SCRIPT --input $SOURCE --output $TARGET' 65b8e80941Smrg) 66b8e80941SmrgDepends('rasterizer/jitter/gen_state_llvm.h', 67b8e80941Smrg swrroot + 'rasterizer/codegen/templates/gen_llvm.hpp') 68b8e80941Smrg 69b8e80941Smrgenv.CodeGenerate( 70b8e80941Smrg target = 'rasterizer/jitter/gen_builder.hpp', 71b8e80941Smrg script = swrroot + 'rasterizer/codegen/gen_llvm_ir_macros.py', 72b8e80941Smrg source = os.path.join(llvm_includedir, 'llvm/IR/IRBuilder.h'), 73b8e80941Smrg command = python_cmd + ' $SCRIPT --input $SOURCE --output ' + bldroot + '/rasterizer/jitter --gen_h' 74b8e80941Smrg) 75b8e80941SmrgDepends('rasterizer/jitter/gen_builder.hpp', 76b8e80941Smrg swrroot + 'rasterizer/codegen/templates/gen_builder.hpp') 77b8e80941Smrg 78b8e80941Smrgenv.CodeGenerate( 79b8e80941Smrg target = 'rasterizer/jitter/gen_builder_meta.hpp', 80b8e80941Smrg script = swrroot + 'rasterizer/codegen/gen_llvm_ir_macros.py', 81b8e80941Smrg source = '', 82b8e80941Smrg command = python_cmd + ' $SCRIPT --output ' + bldroot + '/rasterizer/jitter --gen_meta_h' 83b8e80941Smrg) 84b8e80941SmrgDepends('rasterizer/jitter/gen_builder.hpp', 85b8e80941Smrg swrroot + 'rasterizer/codegen/templates/gen_builder.hpp') 86b8e80941Smrg 87b8e80941Smrgenv.CodeGenerate( 88b8e80941Smrg target = 'rasterizer/jitter/gen_builder_intrin.hpp', 89b8e80941Smrg script = swrroot + 'rasterizer/codegen/gen_llvm_ir_macros.py', 90b8e80941Smrg source = '', 91b8e80941Smrg command = python_cmd + ' $SCRIPT --output ' + bldroot + '/rasterizer/jitter --gen_intrin_h' 92b8e80941Smrg) 93b8e80941SmrgDepends('rasterizer/jitter/gen_builder.hpp', 94b8e80941Smrg swrroot + 'rasterizer/codegen/templates/gen_builder.hpp') 95b8e80941Smrg 96b8e80941Smrgenv.CodeGenerate( 97b8e80941Smrg target = './gen_swr_context_llvm.h', 98b8e80941Smrg script = swrroot + 'rasterizer/codegen/gen_llvm_types.py', 99b8e80941Smrg source = 'swr_context.h', 100b8e80941Smrg command = python_cmd + ' $SCRIPT --input $SOURCE --output $TARGET' 101b8e80941Smrg) 102b8e80941SmrgDepends('rasterizer/jitter/gen_state_llvm.h', 103b8e80941Smrg swrroot + 'rasterizer/codegen/templates/gen_llvm.hpp') 104b8e80941Smrg 105b8e80941Smrgenv.CodeGenerate( 106b8e80941Smrg script = swrroot + 'rasterizer/codegen/gen_archrast.py', 107b8e80941Smrg target = ['rasterizer/archrast/gen_ar_event.hpp', 108b8e80941Smrg 'rasterizer/archrast/gen_ar_event.cpp', 109b8e80941Smrg 'rasterizer/archrast/gen_ar_eventhandler.hpp', 110b8e80941Smrg 'rasterizer/archrast/gen_ar_eventhandlerfile.hpp'], 111b8e80941Smrg source = [srcroot + '/rasterizer/archrast/events.proto', 112b8e80941Smrg srcroot + '/rasterizer/archrast/events_private.proto'], 113b8e80941Smrg command = python_cmd + ' $SCRIPT --proto $SOURCES --output-dir ' + bldroot + '/rasterizer/archrast') 114b8e80941SmrgDepends('rasterizer/archrast/gen_ar_event.hpp', 115b8e80941Smrg swrroot + 'rasterizer/archrast/events_private.proto') 116b8e80941SmrgDepends('rasterizer/jitter/gen_state_llvm.h', 117b8e80941Smrg swrroot + 'rasterizer/codegen/templates/gen_ar_event.hpp') 118b8e80941SmrgDepends('rasterizer/archrast/gen_ar_event.cpp', 119b8e80941Smrg swrroot + 'rasterizer/archrast/events_private.proto') 120b8e80941SmrgDepends('rasterizer/jitter/gen_state_llvm.h', 121b8e80941Smrg swrroot + 'rasterizer/codegen/templates/gen_ar_event.cpp') 122b8e80941SmrgDepends('rasterizer/archrast/gen_ar_eventhandler.hpp', 123b8e80941Smrg swrroot + 'rasterizer/archrast/events_private.proto') 124b8e80941SmrgDepends('rasterizer/jitter/gen_state_llvm.h', 125b8e80941Smrg swrroot + 'rasterizer/codegen/templates/gen_ar_eventhandler.hpp') 126b8e80941SmrgDepends('rasterizer/archrast/gen_ar_eventhandlerfile.hpp', 127b8e80941Smrg swrroot + 'rasterizer/archrast/events_private.proto') 128b8e80941SmrgDepends('rasterizer/jitter/gen_state_llvm.h', 129b8e80941Smrg swrroot + 'rasterizer/codegen/templates/gen_ar_eventhandlerfile.hpp') 130b8e80941Smrg 131b8e80941Smrg# 5 SWR_MULTISAMPLE_TYPE_COUNT 132b8e80941Smrg# 2 SWR_MSAA_SAMPLE_PATTERN_COUNT 133b8e80941Smrg# 3 SWR_INPUT_COVERAGE_COUNT 134b8e80941Smrg# 2 centroid 135b8e80941Smrg# 2 forcedSampleCount 136b8e80941Smrg# 2 canEarlyZ 137b8e80941SmrgbackendPixelRateFileCount = 4 138b8e80941SmrgbackendPixelRateFilePat = "rasterizer/core/backends/gen_BackendPixelRate%s.cpp" 139b8e80941SmrgbackendPixelRateFiles = list(backendPixelRateFilePat % x for x in range(0, backendPixelRateFileCount)) 140b8e80941Smrgenv.CodeGenerate( 141b8e80941Smrg target = 'rasterizer/core/backends/gen_BackendPixelRate.hpp', 142b8e80941Smrg script = swrroot + 'rasterizer/codegen/gen_backends.py', 143b8e80941Smrg source = '', 144b8e80941Smrg command = python_cmd + ' $SCRIPT --outdir ' + bldroot + '/rasterizer/core/backends --dim 5 2 3 2 2 2 --numfiles ' + str(backendPixelRateFileCount) + ' --cpp --hpp' 145b8e80941Smrg ) 146b8e80941SmrgDepends(backendPixelRateFiles, 147b8e80941Smrg ['rasterizer/core/backends/gen_BackendPixelRate.hpp', 148b8e80941Smrg 'rasterizer/archrast/gen_ar_event.hpp', 149b8e80941Smrg 'rasterizer/archrast/gen_ar_eventhandler.hpp', 150b8e80941Smrg 'rasterizer/codegen/gen_knobs.h'] 151b8e80941Smrg ) 152b8e80941Smrg 153b8e80941Smrg# 5 SWR_MULTISAMPLE_TYPE_COUNT 154b8e80941Smrg# 2 CenterPattern 155b8e80941Smrg# 2 Conservative 156b8e80941Smrg# 3 SWR_INPUT_COVERAGE_COUNT 157b8e80941Smrg# 5 STATE_VALID_TRI_EDGE_COUNT 158b8e80941Smrg# 2 RasterScissorEdges 159b8e80941SmrggenRasterizerFileCount = 4 160b8e80941SmrggenRasterizerFilePat = "rasterizer/core/backends/gen_rasterizer%s.cpp" 161b8e80941SmrggenRasterizerFiles = list(genRasterizerFilePat % x for x in range(0, genRasterizerFileCount)) 162b8e80941Smrgenv.CodeGenerate( 163b8e80941Smrg target = 'rasterizer/core/backends/gen_rasterizer.hpp', 164b8e80941Smrg script = swrroot + 'rasterizer/codegen/gen_backends.py', 165b8e80941Smrg source = '', 166b8e80941Smrg command = python_cmd + ' $SCRIPT --outdir ' + bldroot + '/rasterizer/core/backends --rast --dim 5 2 2 3 5 2 --numfiles ' + str(genRasterizerFileCount) + ' --cpp --hpp' 167b8e80941Smrg ) 168b8e80941SmrgDepends(genRasterizerFiles, 169b8e80941Smrg ['rasterizer/core/backends/gen_rasterizer.hpp', 170b8e80941Smrg 'rasterizer/archrast/gen_ar_event.hpp', 171b8e80941Smrg 'rasterizer/archrast/gen_ar_eventhandler.hpp', 172b8e80941Smrg 'rasterizer/codegen/gen_knobs.h'] 173b8e80941Smrg ) 174b8e80941Smrg 175b8e80941SmrgDepends('rasterizer/jitter/gen_state_llvm.h', 176b8e80941Smrg swrroot + 'rasterizer/codegen/templates/gen_backend.cpp') 177b8e80941Smrg 178b8e80941Smrg# Auto-generated .cpp files (that need to generate object files) 179b8e80941Smrgbuilt_sources = [ 180b8e80941Smrg 'rasterizer/codegen/gen_knobs.cpp', 181b8e80941Smrg 'rasterizer/archrast/gen_ar_event.cpp', 182b8e80941Smrg ] 183b8e80941Smrg 184b8e80941Smrgbuilt_sources += [backendPixelRateFiles, genRasterizerFiles] 185b8e80941Smrg 186b8e80941Smrgsource = built_sources 187b8e80941Smrgsource += env.ParseSourceList(swrroot + 'Makefile.sources', [ 188b8e80941Smrg 'ARCHRAST_CXX_SOURCES', 189b8e80941Smrg 'COMMON_CXX_SOURCES', 190b8e80941Smrg 'CORE_CXX_SOURCES', 191b8e80941Smrg 'MEMORY_CXX_SOURCES' 192b8e80941Smrg]) 193b8e80941Smrg 194b8e80941Smrgenv.Prepend(CPPPATH = [ 195b8e80941Smrg '.', 196b8e80941Smrg 'rasterizer', 197b8e80941Smrg 'rasterizer/codegen', 198b8e80941Smrg 'rasterizer/core', 199b8e80941Smrg 'rasterizer/jitter', 200b8e80941Smrg 'rasterizer/archrast', 201b8e80941Smrg ]) 202b8e80941Smrg 203b8e80941Smrg# AVX lib 204b8e80941Smrgenvavx = env.Clone() 205b8e80941Smrg 206b8e80941Smrgenvavx.Append(CPPDEFINES = ['KNOB_ARCH=KNOB_ARCH_AVX']) 207b8e80941Smrgif env['platform'] == 'windows': 208b8e80941Smrg envavx.Append(CCFLAGS = ['/arch:AVX']) 209b8e80941Smrgelse: 210b8e80941Smrg envavx.Append(CCFLAGS = ['-mavx']) 211b8e80941Smrg 212b8e80941SmrgswrAVX = envavx.SharedLibrary( 213b8e80941Smrg target = 'swrAVX', 214b8e80941Smrg source = source, 215b8e80941Smrg OBJPREFIX = 'avx_' 216b8e80941Smrg ) 217b8e80941Smrgenv.Alias('swrAVX', swrAVX) 218b8e80941Smrg 219b8e80941Smrg# AVX2 lib 220b8e80941Smrgenvavx2 = env.Clone() 221b8e80941Smrg 222b8e80941Smrgenvavx2.Append(CPPDEFINES = ['KNOB_ARCH=KNOB_ARCH_AVX2']) 223b8e80941Smrgif env['platform'] == 'windows': 224b8e80941Smrg envavx2.Append(CCFLAGS = ['/arch:AVX2']) 225b8e80941Smrgelse: 226b8e80941Smrg envavx2.Append(CCFLAGS = ['-mavx2', '-mfma', '-mbmi2', '-mf16c']) 227b8e80941Smrg 228b8e80941SmrgswrAVX2 = envavx2.SharedLibrary( 229b8e80941Smrg target = 'swrAVX2', 230b8e80941Smrg source = source, 231b8e80941Smrg OBJPREFIX = 'avx2_' 232b8e80941Smrg ) 233b8e80941Smrgenv.Alias('swrAVX2', swrAVX2) 234b8e80941Smrg 235b8e80941Smrgsource = env.ParseSourceList(swrroot + 'Makefile.sources', [ 236b8e80941Smrg 'CXX_SOURCES', 237b8e80941Smrg 'COMMON_CXX_SOURCES', 238b8e80941Smrg 'JITTER_CXX_SOURCES', 239b8e80941Smrg 'LOADER_SOURCES' 240b8e80941Smrg]) 241b8e80941Smrgsource += [ 242b8e80941Smrg 'rasterizer/codegen/gen_knobs.cpp', 243b8e80941Smrg 'rasterizer/archrast/gen_ar_event.cpp', 244b8e80941Smrg ] 245b8e80941Smrg 246b8e80941Smrg# main SWR lib 247b8e80941SmrgenvSWR = envavx.Clone() # pick up the arch flag for intrinsic usage 248b8e80941SmrgenvSWR.Append(CPPDEFINES = ['HAVE_SWR_AVX', 'HAVE_SWR_AVX2']) 249b8e80941Smrgswr = envSWR.ConvenienceLibrary( 250b8e80941Smrg target = 'swr', 251b8e80941Smrg source = source, 252b8e80941Smrg ) 253b8e80941Smrg 254b8e80941Smrg# treat arch libs as dependencies, even though they are not linked 255b8e80941Smrg# into swr, so we don't have to build them separately 256b8e80941SmrgDepends(swr, ['swrAVX', 'swrAVX2']) 257b8e80941Smrg 258b8e80941Smrgenv.Alias('swr', swr) 259b8e80941Smrg 260b8e80941Smrgenv.Prepend(LIBS = [swr]) 261b8e80941Smrg 262b8e80941SmrgExport('swr') 263