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